
开源协议
:GPL 3.0
描述
立创地文星开发板(CW32C8T8)测距尺子
需求和设计
实时监测障碍物距离并显示在oled屏幕上
物料成本
- 立创地文星开发板(CW32F030C8T6) 9.9元,活动价1元
- 0.96寸oled 7.9元
- HC-SR04模块 4.98元
- IP5306 1.53元
- 微动按键 忽略不计
- 电容电阻若干 忽略不计
- PCB板 免费打样
- 3D打样外壳 免费打样
原理
超声波
超声波是频率高于人类听觉极限的高音调声波,人耳可以听到的声波振动范围从每秒20次左右(隆隆的隆隆声)到每秒20,000次左右(尖锐的啸叫声)。但是,超声波的频率超过20,000 Hz,因此人类听不到。
HC-SR04超声波距离传感器的核心是两个超声波传感器。一个用作发射器,将电信号转换为40 KHz超声波脉冲。接收器监听发射的脉冲。如果接收到它们,它将产生一个输出脉冲,其宽度可用于确定脉冲传播的距离。HC-SR04超声波测距模块提供2cm~400cm的测距功能,精度达3mm
以我们可以直接通过GPIO口来输出以及输入时序所需的电平信号。脉冲被反射回去,则在收到信号后,Echo引脚就会变低。这会产生一个脉冲,其宽度在150 µS至25 mS之间变化,具体取决于接收信号所花费时间。众所周知,声音的速度为340m/s,因此我们将回响电平的时间除340再除2之后得到的就是单位为米的测距结果。
通过时序图我们可以知道,我们给HC-SR04发送长达10us的TTL脉冲,然后模块就会进行测距,测距的结果通过回响信号传达,回响的TTL电平信号时间即是超声波从HC-SR04模块发出,触碰到障碍物后返回到HC-SR04模块的时间总和。
```C
float Hcsr04GetLength(void)
{
/*测5次数据计算一次平均值*/
float length = 0;
float t = 0;
float sum = 0;
unsigned int i = 0;
while(i != 10)
{
SR04_TRIG(1);//trig拉高信号,发出高电平
delay_1us(20);//持续时间超过10us
SR04_TRIG(0);//trig拉低信号,发出低电平
/*Echo发出信号 等待回响信号*/
/*输入方波后,模块会自动发射8个40KHz的声波,与此同时回波引脚(echo)端的电平会由0变为1;
(此时应该启动定时器计时);当超声波返回被模块接收到时,回波引 脚端的电平会由1变为0;
(此时应该停止定时器计数),定时器记下的这个时间即为
超声波由发射到返回的总时长;*/
while(SR04_ECHO() == GPIO_Pin_RESET);//echo等待回响
Open_Timer(); //打开定时器
i++;
while(SR04_ECHO() == GPIO_Pin_SET);
Close_Timer(); // 关闭定时器
t = Get_TIMER_Count(); // 获取时间,分辨率为1us
length = (float)t / 58.0f; // cm
sum += length;
}
length = sum/10;//五次平均值
distance = length;
return length;
}

### 最后把数据显示在oled上
```C
OLED_Init(); //初始化OLED
OLED_Clear();
Ultrasonic_Init();
float length = 0.0;
char len[6];
delay_ms(1000);
while(1)
{
length = Hcsr04GetLength();
snprintf(len, sizeof(len), "%.2f", length);
OLED_ShowString(46,0,(uint8_t *)"length",16,1);
OLED_ShowString(0,22,(uint8_t *)len,24,1);
OLED_ShowString(64,22,(uint8_t *)"CM",24,1);
OLED_Refresh();
delay_ms(500);
}
源码与烧录文件已经上传
设计图

BOM


评论