超声波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 }

 

posted @ 2020-11-22 19:01  .ivan  阅读(612)  评论(0编辑  收藏  举报