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 }
  • 相关阅读:
    241. Different Ways to Add Parentheses java solutions
    89. Gray Code java solutions
    367. Valid Perfect Square java solutions
    46. Permutations java solutions
    116. Populating Next Right Pointers in Each Node java solutions
    153. Find Minimum in Rotated Sorted Array java solutions
    判断两颗树是否相同
    求二叉树叶子节点的个数
    求二叉树第k层的结点个数
    将二叉排序树转换成排序的双向链表
  • 原文地址:https://www.cnblogs.com/demo-lv/p/14020463.html
Copyright © 2011-2022 走看看