zoukankan      html  css  js  c++  java
  • 超声波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
    ", distance);
    31 }
    32 
    33 int main()
    34 {
    35     if(wiringPiSetup() == -1)
    36     {
    37         printf("Error!
    ");
    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
    ", 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!
    ");
    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 }
  • 相关阅读:
    自定义控制器的View(loadView)及其注意点
    多控制器之UIWindow
    多控制器之UIApplication
    浅谈Xcode5和Xcode7在系统创建的文件夹和文件中的区别
    自动计算label字体的高度和图片拉伸处理(封装成分类分享)
    左滑功能和多选功能(在一些列表都会用到的功能)
    数据刷新
    字典转模型第三方框架---MJExtension
    UI之UItableView重用机制的性能问题
    如何设置苹果电脑自带的wife连接手机
  • 原文地址:https://www.cnblogs.com/demo-lv/p/14020463.html
Copyright © 2011-2022 走看看