zoukankan      html  css  js  c++  java
  • 树莓派超声波测距+蜂鸣器(c语言)

      前边我们已经详细的讲解了树莓派控制超声波模块测距(http://www.cnblogs.com/yuemo/p/8888342.html)和超声波控制蜂鸣器模块发声(http://www.cnblogs.com/yuemo/p/8906111.html)。

      今天我们就来看看怎么把两个模块全都应用起来,做一个防盗装置。

      先来看一下各个引脚的连接方式(需要七根母对母的杜邦线):

      超声波模块:

        1.Vcc:接5V电源(接1号引脚)

        2.Trig:输出端口(接16号引脚)

        3.Echo:输入端口(接18号端口)

        4.Gnd:接地端(接6号端口)

      蜂鸣器模块

        1.GND 接地引脚(接树莓派14号引脚)

        2.I/O     输入输出引脚(接树莓派11号引脚——GPIO.0)

        3.VCC  接电源引脚(接树莓派4号引脚)


      接下来附上c语言代码:

    #include <wiringPi.h>
    #include <stdio.h>
    #include <sys/time.h>
    #define Trig 4
    #define Echo 5
    #define VOICE 0
    
    void ultraInit(void){
      pinMode(Echo,INPUT);
      pinMode(Trig,OUTPUT);
      pinMode(VOICE,OUTPUT);
    }
    
    float disMeasure(void){
      struct timeval tv1;
      /*
        struct timeval{
          time_t tv_sec;
          suseconds_t tv_usec;
        }
       */
    
      struct timeval tv2;
      long start=0,stop=0;
    
      digitalWrite(VDICE,LOW);
      digitalWrite(Trig,LOW);
      delayMicroseconds(2);
    
      digitalWrite(Trig,HIGH);
      delayMicroseconds(10);
      digitalWrite(Trig,LOW);
    
      while(!(digitalRead(Echo) == 1));
      gettimeofday(&tv1,NULL);
    
      while(!(digitalRead(Echo) == 0));
      gettimeofday(&tv2,NULL);
    
      start = tv1.tv_sec * 1000000 + tv1.tv_usec;
      stop  = tv2.tv_sec * 1000000 + tv2.tv_usec;
    
      return (float)(stop - start) / 1000000*34000 / 2;
    }
    
    void doVoice(void){
      for(int i=1;i<=6;i++){
        digitalWrite(VOICE,HIGH);
        delay(500);
        digitalWrite(VOICE,LOW);
        delay(1000);
      }
    }
    
    int main(){
      float dis;
      float olddis=0;
     
      if(wiringPiSetup() == -1){
        printf("setup wiringPi failed!");
        return 1;
      }
    
      ultraInit();
    
      while(1){
        dis = disMeasure();
        printf("disMeasure = %0.2f cm
    ",dis);
         if(olddis==0){
           olddis=dis;
           continue;
         }else{
           int s=dis-olddis;
           if(s<-30||s>30){
         doVoice();
           }
           olddis=dis;
         }
        delay(1000);
      }
      return 0;
    }

      我们这个程序的思想为利用超声波测距,记录上一次超声波测距的距离,和本次超声波测距的距离比较,如果距离相差在30cm以上,则蜂鸣器报警。思想和编程都相对简单。

      如果大家在阅读程序的过程中发现有的函数不清楚效果,请移步博客:https://www.cnblogs.com/lulipro/p/5992172.html


        本次实验是在一个新的领域的第一次尝试,以前从来没有接触过基于树莓派的程序开发。刚开始时遇到了许多的问题:
        1.树莓派系统烧录错误,当时搞了很长时间。
        2.实验器材的选择,对于我来说选择强迫症真是一个可怕的东西,买了一大堆没用的东西回来,包括但不限于3.5寸屏幕、树莓派引脚扩展板、170孔面包板(太小了)、摇杆模块、4*4薄膜键盘、温度传感器、一路继电器、电风扇。开始之前心很大,想做一些了不起的东西,到最后时间不够了才反应过来还是从简单的做起吧
        3.公对公、母对母,公对母的杜邦线各40条……根本用不上这么多,QWQ,难受
        4.c语言的代码以及教程是真的难找,好不容易找到一篇介绍wiringPi的博客,顿时如获至宝,现在市面上的树莓派教材基本是基于python的,python是一门很好用的语言,但是老师要求使用c语言我也没有办法呀
        5.github很有用,但是你要会用。学会合理且优雅的移植代码是一个程序猿的必修课。

      作者联系方式:sjtyuemos@foxmail.com 博客中有什么不懂的问题欢迎来信。

  • 相关阅读:
    Playwright安装及基本用法
    生成随机数、随机字符串
    xmind2testcase使用
    jmeter5.0二次开发环境搭建(IDEA)
    pytest配置文件pytest.ini
    pytest+allure2生成测试报告
    pytest生成html报告-使用pytest-html插件方式
    pytest一些简单参数
    pytest简单搭建和入门
    python3学习-元组
  • 原文地址:https://www.cnblogs.com/yuemo/p/8909231.html
Copyright © 2011-2022 走看看