超声波hc_sr04模块——树莓派基于C语言程序
产品特点
HC-SR04 超声波测距模块可提供 2cm-400cm 的非接触式距离感测功能, 测距精度可达高到 3mm;模块包括超声波发射器、接收器与控制电路。
基本工作原理:
(1)采用 IO 口 TRIG 触发测距,给最少 10us 的高电平信呈。
(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回。
(3)有信号返回, 通过 IO 口 ECHO 输出一个高电平, 高电平持续的时间就是超声波从发射到返回的时间。 测试距离=(高电平时间*声速(340M/S))/2。
电气参数
超声波时序图
以上时序图表明你只需要提供一个 10uS 以上脉冲触发信号,该模块内部将发出 8 个 40kHz 周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。 由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。 公式: uS/58=厘米或者 uS/148=英寸; 或是: 距离=高电平时间*声速(340M/S) /2; 建议测量周期为 60ms 以上, 以防止发射信号对回响信号的影响。
1 #include <stdio.h> 2 #include <wiringPi.h> 3 4 const int Trig_Pin = 1; //Trig输出 5 const int Echo_Pin = 4; //Echo输入 6 7 void hc_sr04_init(void) 8 { 9 pinMode(Trig_Pin, OUTPUT); 10 pinMode(Echo_Pin, INPUT); 11 } 12 13 void hc_distance() 14 { 15 unsigned int start_time = 0; 16 unsigned int end_time = 0; 17 unsigned int real_time = 0; 18 float distance = 0.0; 19 digitalWrite(Trig_Pin, HIGH); 20 delayMicroseconds(10); //10us延时 21 digitalWrite(Trig_Pin, LOW); 22 23 while(digitalRead(Echo_Pin) == LOW) //发射前Echo一直为低电平 24 start_time = micros(); 25 while(digitalRead(Echo_Pin) == HIGH) //HC_SR04发射超声波时,Echo至为高电平 26 end_time = micros(); 27 28 real_time = end_time - start_time; //时间精度为us级 29 distance = (real_time * 0.0343) / 2; 30 printf("distance: %.1fcm\n", distance); 31 } 32 33 int main() 34 { 35 if(wiringPiSetup() == -1) 36 { 37 printf("Error!\n"); 38 return 1; 39 } 40 hc_sr04_init(); 41 while(1) 42 { 43 hc_distance(); 44 delay(2000); 45 } 46 return 0; 47 }
HC_SR04超声波模块与RGB全彩LED程序,实现不同距离显示不同的颜色。
1 #include <stdio.h> 2 #include <wiringPi.h> 3 #include <softPwm.h> 4 5 const int Trig_Pin = 1; //Trig输出 6 const int Echo_Pin = 4; //Echo输入 7 8 const int Red_Pin = 9; 9 const int Green_Pin = 10; 10 const int Blue_Pin = 11; 11 12 int colors[] = {0x00ff00, 0x228b22, 0xff4500, 13 0xff00ff, 0xffff00, 0xff0000}; 14 15 void RGB_Color_Init() 16 { 17 softPwmCreate(Red_Pin, 0, 100); 18 softPwmCreate(Green_Pin, 0, 100); 19 softPwmCreate(Blue_Pin, 0, 100); 20 } 21 22 void Set_Color(int color) 23 { 24 int Red_color, Green_color, Blue_color; 25 26 Red_color = (color & 0xff0000) >> 16; 27 Green_color = (color & 0x00ff00) >> 8; 28 Blue_color = (color & 0x0000ff) >> 0; 29 30 softPwmWrite(Red_Pin, Red_color); 31 softPwmWrite(Green_Pin, Green_color); 32 softPwmWrite(Blue_Pin, Blue_color); 33 } 34 35 void hc_sr04_init(void) 36 { 37 pinMode(Trig_Pin, OUTPUT); 38 pinMode(Echo_Pin, INPUT); 39 } 40 41 float hc_distance() 42 { 43 unsigned int start_time = 0; 44 unsigned int end_time = 0; 45 unsigned int real_time = 0; 46 float distance = 0.0; 47 digitalWrite(Trig_Pin, HIGH); 48 delayMicroseconds(10); //10us延时 49 digitalWrite(Trig_Pin, LOW); 50 51 while(digitalRead(Echo_Pin) == LOW) 52 start_time = micros(); 53 while(digitalRead(Echo_Pin) == HIGH) 54 end_time = micros(); 55 56 real_time = end_time - start_time; //时间精度为us级 57 distance = (real_time * 0.0343) / 2; 58 printf("distance: %.1fcm\n", distance); 59 60 return distance; 61 } 62 63 64 int main() 65 { 66 int i=0; 67 int distance; 68 float distance_1; 69 if(wiringPiSetup() == -1) 70 { 71 printf("Error!\n"); 72 return 1; 73 } 74 RGB_Color_Init(); 75 hc_sr04_init(); 76 while(1) 77 { 78 distance_1 = hc_distance(); 79 distance = (int)distance_1; 80 81 i = sizeof(colors)/sizeof(int); 82 if(distance >= 0 && distance <= 5) 83 Set_Color(colors[i-6]); 84 else if(distance > 5 && distance <= 10) 85 Set_Color(colors[i-5]); 86 else if(distance > 10 && distance <= 20) 87 Set_Color(colors[i-4]); 88 else if(distance > 20 && distance <= 30) 89 Set_Color(colors[i-3]); 90 else if(distance > 30 && distance <= 40) 91 Set_Color(colors[i-2]); 92 else 93 Set_Color(colors[i-1]); 94 95 delay(1500); 96 } 97 return 0; 98 }