树莓派使用WiringPi库配合时间函数实现超声波测距

2024-09-07 10:04

本文主要是介绍树莓派使用WiringPi库配合时间函数实现超声波测距,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

树莓派使用WiringPi库配合时间函数实现超声波测距

文章目录

  • 树莓派使用WiringPi库配合时间函数实现超声波测距
    • 一、HR-04超声波模块原理
      • 1.1 超声波测距原理:
      • 1.2 超声波时序图:
    • 二、树莓派与超声波模块硬件连接
    • 三、时间函数
      • 3.1 时间函数gettimeofday()原型和头文件:
    • 四、实现超声波测距
      • 4.1 使用wiringOP库和时间函数实现超声波测距:
    • 五、实现超声波测距并触发警报
      • 5.1 硬件接线:
      • 5.2 实现超声波测距(距离小于10cm时蜂鸣器发出警报):

一、HR-04超声波模块原理

1.1 超声波测距原理:

  • 让它发送波:给Trig端口至少10us的高电平

  • 开始发送波:Echo信号由低电平跳转到高电平

  • 接收返回波:Echo信号由高电平跳转回低电平

  • 计算时间 :Echo引脚维持高电平的时间!

  • 开始发送波,启动定时器,接收到返回波,停止计时器

  • 计算距离 :测试距离=(高电平时间*声速(340m/s))/2

1.2 超声波时序图:

在这里插入图片描述

二、树莓派与超声波模块硬件连接

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

三、时间函数

3.1 时间函数gettimeofday()原型和头文件:

#include <sys/time.h>int gettimeofday(struct timeval *tv, struct timezone *tz);int 					函数返回值,如果成功,gettimeofday 返回 0。如果失败,它返回 -1 并设置 errno 以指示错误。struct timeval *tv		这是一个指向 timeval 结构体的指针,该结构体用于存储当前时间。timeval 的定义如下:struct timeval {  time_t      tv_sec;   /* 秒 */  suseconds_t tv_usec;  /* 微秒 */  
};time_t      tv_sec		是一个整数,表示自 Unix 纪元(19701100:00:00 UTC)以来的秒数。
suseconds_t tv_usec		是一个整数,表示微秒数(0999,999)。struct timezone *tz		这是一个指向 timezone 结构体的指针,用于存储时区信息。但在现代系统中,这个参数通常被忽略,因为大多					      数系统都使用 UTC 时间,并且不再使用本地时区偏移。这个参数我们通常设置为NULL/*函数说明:
gettimeofday 是一个 Unix 和 Linux 系统调用,用于获取当前的时间(包括秒和微秒)和时区信息(尽管时区信息在大多数现代系统中可能不太常用)
*/

四、实现超声波测距

4.1 使用wiringOP库和时间函数实现超声波测距:

#include <stdio.h>
#include <wiringPi.h>
#include <sys/time.h>
#include <unistd.h>#define TRIG 2                                      //定义超声波的TRIG引脚为2
#define ECHO 3                                      //定义超声波的ECHO引脚为3void SR04_GPIO_Init()                               //初始化GPIO
{pinMode(TRIG, OUTPUT);                          //设置TRIG引脚为输出模式pinMode(ECHO, INPUT);                           //设置ECHO引脚为输入模式
}void sendTriggerPulse()                             //发送触发脉冲
{digitalWrite(TRIG, LOW);                        //拉低TRIG引脚usleep(2);                                     //延时2微秒  digitalWrite(TRIG, HIGH);                       //拉高TRIG引脚usleep(10);                                    //延时10微秒digitalWrite(TRIG, LOW);                        //拉低TRIG引脚
}double getDistance()                                //获取超声波距离
{double distance;                                //定义距离变量struct timeval Start;                           //定义开始时间变量struct timeval Stop;                            //定义结束时间变量sendTriggerPulse();                             //发送触发脉冲while(!digitalRead(ECHO));                      //等待接收到回波gettimeofday(&Start, NULL);                     //获取开始时间while(digitalRead(ECHO));                       //等待发送结束gettimeofday(&Stop, NULL);                      //获取结束时间//计算时间差(单位:微秒)long diffTime = 1000000 * (Stop.tv_sec - Start.tv_sec) + (Stop.tv_usec - Start.tv_usec); distance = (double)diffTime/1000000 * 34000 / 2;                    //计算距离(单位:厘米)return distance;                                //返回距离值
}int main()
{double dis;                                     //定义距离变量if(wiringPiSetup() == -1){                      //初始化wiringPi库printf("初始化wiringPi库失败!\n");return -1;}SR04_GPIO_Init();                               //初始化GPIOwhile(1){dis = getDistance();                        //获取超声波距离printf("当前超声波距离为:%.2f cm\n",dis);usleep(500000);                             //没500ms采集一次}return 0;
}

在这里插入图片描述

五、实现超声波测距并触发警报

5.1 硬件接线:

在这里插入图片描述

在这里插入图片描述

5.2 实现超声波测距(距离小于10cm时蜂鸣器发出警报):

#include <stdio.h>
#include <wiringPi.h>
#include <sys/time.h>
#include <unistd.h>#define TRIG 2                                      //定义超声波的TRIG引脚为2
#define ECHO 3                                      //定义超声波的ECHO引脚为3
#define BEEP 7                                      //定义蜂鸣器的引脚为7void SR04_BEEP_SGPIO_Init()                         //初始化GPIO
{pinMode(TRIG, OUTPUT);                          //设置TRIG引脚为输出模式pinMode(ECHO, INPUT);                           //设置ECHO引脚为输入模式pinMode(BEEP, OUTPUT);                          //设置BEEP引脚为输出模式
}void sendTriggerPulse()                             //发送触发脉冲
{digitalWrite(TRIG, LOW);                        //拉低TRIG引脚usleep(2);                                     //延时2微秒  digitalWrite(TRIG, HIGH);                       //拉高TRIG引脚usleep(10);                                    //延时10微秒digitalWrite(TRIG, LOW);                        //拉低TRIG引脚
}double getDistance()                                //获取超声波距离
{double distance;                                //定义距离变量struct timeval Start;                           //定义开始时间变量struct timeval Stop;                            //定义结束时间变量sendTriggerPulse();                             //发送触发脉冲while(!digitalRead(ECHO));                      //等待接收到回波gettimeofday(&Start, NULL);                     //获取开始时间while(digitalRead(ECHO));                       //等待发送结束gettimeofday(&Stop, NULL);                      //获取结束时间//计算时间差(单位:微秒)long diffTime = 1000000 * (Stop.tv_sec - Start.tv_sec) + (Stop.tv_usec - Start.tv_usec);    distance = (double)diffTime/1000000 * 34000 / 2;                    //计算距离(单位:厘米)return distance;                                //返回距离值
}int main()
{double dis;                                     //定义距离变量if(wiringPiSetup() == -1){                      //初始化wiringPi库printf("初始化wiringPi库失败!\n");return -1;}SR04_BEEP_SGPIO_Init();                         //初始化GPIOwhile(1){dis = getDistance();                        //获取超声波距离printf("当前超声波距离为:%.2f cm\n",dis);usleep(500000);                             //没500ms采集一次if(dis < 10){                               //如果距离小于10cm,则蜂鸣器发出警报printf("警报!超声波距离为:%.2f cm\n",dis);digitalWrite(BEEP, LOW); delay(200);digitalWrite(BEEP, HIGH);}else{digitalWrite(BEEP, HIGH);               //超声波距离大于10cm,则关闭蜂鸣器}}return 0;
}

在这里插入图片描述

这篇关于树莓派使用WiringPi库配合时间函数实现超声波测距的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1144750

相关文章

Python如何使用seleniumwire接管Chrome查看控制台中参数

《Python如何使用seleniumwire接管Chrome查看控制台中参数》文章介绍了如何使用Python的seleniumwire库来接管Chrome浏览器,并通过控制台查看接口参数,本文给大家... 1、cmd打开控制台,启动谷歌并制定端口号,找不到文件的加环境变量chrome.exe --rem

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将

Redis延迟队列的实现示例

《Redis延迟队列的实现示例》Redis延迟队列是一种使用Redis实现的消息队列,本文主要介绍了Redis延迟队列的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、什么是 Redis 延迟队列二、实现原理三、Java 代码示例四、注意事项五、使用 Redi

C#实现WinForm控件焦点的获取与失去

《C#实现WinForm控件焦点的获取与失去》在一个数据输入表单中,当用户从一个文本框切换到另一个文本框时,需要准确地判断焦点的转移,以便进行数据验证、提示信息显示等操作,本文将探讨Winform控件... 目录前言获取焦点改变TabIndex属性值调用Focus方法失去焦点总结最后前言在一个数据输入表单

基于C#实现PDF文件合并工具

《基于C#实现PDF文件合并工具》这篇文章主要为大家详细介绍了如何基于C#实现一个简单的PDF文件合并工具,文中的示例代码简洁易懂,有需要的小伙伴可以跟随小编一起学习一下... 界面主要用于发票PDF文件的合并。经常出差要报销的很有用。代码using System;using System.Col

redis-cli命令行工具的使用小结

《redis-cli命令行工具的使用小结》redis-cli是Redis的命令行客户端,支持多种参数用于连接、操作和管理Redis数据库,本文给大家介绍redis-cli命令行工具的使用小结,感兴趣的... 目录基本连接参数基本连接方式连接远程服务器带密码连接操作与格式参数-r参数重复执行命令-i参数指定命

PyTorch使用教程之Tensor包详解

《PyTorch使用教程之Tensor包详解》这篇文章介绍了PyTorch中的张量(Tensor)数据结构,包括张量的数据类型、初始化、常用操作、属性等,张量是PyTorch框架中的核心数据结构,支持... 目录1、张量Tensor2、数据类型3、初始化(构造张量)4、常用操作5、常用属性5.1 存储(st