Orangepi Zero2使用外设驱动库wiringOP配合时间函数驱动HC-SR04超声波测距模块

目录

一、HC-SR04超声波模块原理和硬件接线

1.1 超声波测距原理:

1.2 超声波时序图:

1.3 HC-SR04超声波模块硬件接线:

二、时间函数

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

2.2 使用gettimeofday()函数获取当前时间的秒数和微妙数:

2.3 使用gettimeofday()函数计算全志H616数10万次的耗时:

三、实现超声波测距

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

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


一、HC-SR04超声波模块原理和硬件接线

1.1 超声波测距原理:

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

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

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

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

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

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

1.2 超声波时序图:

1.3 HC-SR04超声波模块硬件接线:

  • 超声波的VCC接到板子上的5V

  • 超声波的GND接到板子上的GND

  • 超声波的Trig口对应的物理引脚的3号,其对应的wPi的第0号

  • 超声波的Echo口对应的物理引脚的5号,其对应的wPi的第1号

二、时间函数

2.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 纪元(1970年1月1日 00:00:00 UTC)以来的秒数。
suseconds_t tv_usec		是一个整数,表示微秒数(0 到 999,999)。struct timezone *tz		这是一个指向 timezone 结构体的指针,用于存储时区信息。但在现代系统中,这个参数通常被忽略,因为大多					      数系统都使用 UTC 时间,并且不再使用本地时区偏移。这个参数我们通常设置为NULL/*函数说明:
gettimeofday 是一个 Unix 和 Linux 系统调用,用于获取当前的时间(包括秒和微秒)和时区信息(尽管时区信息在大多数现代系统中可能不太常用)
*/

2.2 使用gettimeofday()函数获取当前时间的秒数和微妙数:

#include <stdio.h>
#include <sys/time.h>int main()
{struct timeval tv;//int gettimeofday(struct timeval *tv, struct timezone *tz);if(gettimeofday( &tv, NULL) == 0){                              //获取当前时间的秒数和微妙数printf("自1970-01-01 00:00:00的秒数:%ld\n",tv.tv_sec);printf("微妙:%ld\n",tv.tv_usec);}else{perror("gettimeofday");                                     //打印出错信息}return 0;
}

2.3 使用gettimeofday()函数计算全志H616数10万次的耗时:

#include <stdio.h>
#include <sys/time.h>void cntTest()                      //全志H616数数十万次
{int i;int j;for(i=0; i<100; i++)for(j=0; j<1000; j++);
}int main()
{struct timeval timeStart;       struct timeval timeStop;long diffTime;//int gettimeofday(struct timeval *tv, struct timezone *tz);gettimeofday( &timeStart, NULL);    //获取数数之前的时间cntTest();                          //数数十万次gettimeofday( &timeStop, NULL);     //获取数数之后的时间//秒之所以要乘以1000000是因为后面加了微妙,所以要将秒转化为微秒						//获取数数十万次的时间diffTime = 1000000 * (timeStop.tv_sec - timeStart.tv_sec) + (timeStop.tv_usec - timeStart.tv_usec); printf("全志H616数10万次耗时:%ldus\n",diffTime);return 0;
}

三、实现超声波测距

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

#include <stdio.h>                  // 包含标准输入输出库头文件
#include <sys/time.h>               // 包含时间相关函数的头文件
#include <wiringPi.h>               // 包含wiringPi库的头文件,用于GPIO控制
#include <unistd.h>                 // 包含标准库函数,如sleep
#include <stdlib.h>                 // 包含标准库函数,如malloc和free#define Trig 0                      // 定义Trig引脚为0
#define Echo 1                      // 定义Echo引脚为1void startHC()
{digitalWrite(Trig, LOW);        //给Trig端口发送低电平信号    usleep(5);                                                                                   digitalWrite(Trig, HIGH);       //给Trig端口发送高电平信号 usleep(10);                                                                                                 digitalWrite(Trig, LOW);        //给Trig端口发送低电平信号    
}double getDistance()
{double dis;                     //距离struct timeval Start;           //开始时间  struct timeval Stop;            //结束时间startHC();                      //给Trig端口10us的高电平while(!digitalRead(Echo));      //Echo信号由低电平跳转到高电平gettimeofday(&Start, NULL);     //获取时间while(digitalRead(Echo));       //Echo信号由高电平跳转回低电平gettimeofday(&Stop, NULL);      //获取时间long diffTime = 1000000 * (Stop.tv_sec - Start.tv_sec) + (Stop.tv_usec - Start.tv_usec);  //计算时间差   dis = (double)diffTime/1000000 * 34000 / 2;                                              //计算距离            return dis;
}int main()
{double dis;                                     //距离if(wiringPiSetup() == -1){                      //初始化wiringPi库printf("初始化wiringPi库失败\n");exit(-1);}                                pinMode(Trig, OUTPUT);                          //设置超声波Trig引脚为输出模式pinMode(Echo, INPUT);                           //设置超声波Echo引脚为输入模式while(1){dis = getDistance();                        //获取超声波距离printf("当前超声波距离是:%.2lf\n",dis);usleep(500000);                             //每500ms获取一次}return 0;
}

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

#include <stdio.h>                  // 包含标准输入输出库头文件
#include <sys/time.h>               // 包含时间相关函数的头文件
#include <wiringPi.h>               // 包含wiringPi库的头文件,用于GPIO控制
#include <unistd.h>                 // 包含标准库函数,如sleep
#include <stdlib.h>                 // 包含标准库函数,如malloc和free#define Trig 0                      // 定义Trig引脚为0
#define Echo 1                      // 定义Echo引脚为1
#define Beep 2                      // 定义Beep引脚为2void startHC()
{digitalWrite(Trig, LOW);        //给Trig端口发送低电平信号    usleep(5);                                                                                   digitalWrite(Trig, HIGH);       //给Trig端口发送高电平信号 usleep(10);                                                                                                 digitalWrite(Trig, LOW);        //给Trig端口发送低电平信号    
}double getDistance()
{double dis;                     //距离struct timeval Start;           //开始时间  struct timeval Stop;            //结束时间startHC();                      //给Trig端口10us的高电平while(!digitalRead(Echo));      //Echo信号由低电平跳转到高电平gettimeofday(&Start, NULL);     //获取时间while(digitalRead(Echo));       //Echo信号由高电平跳转回低电平gettimeofday(&Stop, NULL);      //获取时间long diffTime = 1000000 * (Stop.tv_sec - Start.tv_sec) + (Stop.tv_usec - Start.tv_usec);  //计算时间差   dis = (double)diffTime/1000000 * 34000 / 2;                                              //计算距离            return dis;
}int main()
{double dis;                                     //距离if(wiringPiSetup() == -1){                      //初始化wiringPi库printf("初始化wiringPi库失败\n");exit(-1);}                                pinMode(Trig, OUTPUT);                          //设置超声波Trig引脚为输出模式pinMode(Echo, INPUT);                           //设置超声波Echo引脚为输入模式pinMode(Beep, OUTPUT);                          //设置蜂鸣器Beep引脚为输出模式while(1){dis = getDistance();                        //获取超声波距离printf("当前超声波距离是:%.2lf\n",dis);usleep(500000);                             //每500ms获取一次if(dis < 10){                              //当距离小于10cm时,蜂鸣器发出警报){printf("警报!当前距离:%.2lf\n",dis);digitalWrite(Beep, LOW);               //打开蜂鸣器usleep(500000);                         //延时500msdigitalWrite(Beep, HIGH);              //关闭蜂鸣器}else{digitalWrite(Beep, HIGH);              //关闭蜂鸣器}                                        }return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/35848.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【osgEarth】Ubuntu 22.04 源码编译osgEarth 3.5

下载源代码 git clone --depth1 https://dgithub.xyz/gwaldron/osgearth -b osgearth-3.5 下载子模块 git submodule update --init 如果下载不过来&#xff0c;就手动修改下.git/config文件&#xff0c;将子模块的地址替换成加速地址 (base) yeqiangyeqiang-Default-string…

打印一张A4纸多少钱?打印a4多少钱一张

在数字化日益发展的今天&#xff0c;打印服务依然是办公、学习和生活中不可或缺的一部分。对于广大用户来说&#xff0c;了解A4纸打印的价格成为选择打印服务的重要参考因素。那么&#xff0c;A4纸打印到底多少钱一张呢&#xff1f; 在琢贝云打印平台&#xff0c;打印价格非常实…

Arcengine 添加字段时,显示General function failuer

一、现象 Arcengine开发的时候&#xff0c;在addfield&#xff08;添加字段&#xff09;操作时&#xff0c;显示General function failuer。如下图所示&#xff1a; 二、问题原因 General function failuer是常规故障&#xff0c;问题原因是文件占用&#xff0c;只要把文件在…

文华wh6均线交易策略多空波段止盈止损提示主图指标公式源码

文华wh6均线交易策略多空波段止盈止损提示主图指标公式源码&#xff1a; EMA120:EMA(C,120); RSV:(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*100; K:SMA(RSV,3,1); D:SMA(K,3,1); J:3*K-2*D; DRAWTEXT(C>EMA120&&J<0,L,多),VALIGN0; DRAWTEXT(C<EMA…

AcWing算法基础课笔记——求组合数3

求组合数Ⅲ 20万组数据&#xff0c; 1 ≤ b ≤ a ≤ 1 0 18 , 1 ≤ p ≤ 1 0 5 1 \le b \le a \le 10^{18}, 1\le p \le 10 ^5 1≤b≤a≤1018,1≤p≤105&#xff0c;使用卢卡斯定理。 卢卡斯定理&#xff1a; C a b ≡ C a m o d p b m o d p C a / p b / p ( m o d p ) C_a…

SSI 注入漏洞

0x00漏洞描述 SSI 英文是 Server Side Includes 的缩写&#xff0c;翻译成中文就是服务器端包含的意思。从技术角度上说&#xff0c;SSI 就是在 HTML 文件中&#xff0c;可以通过注入注释调用的命令或指针。SSI 具有强大的功能&#xff0c;只要使用一条简单的 SSI 命令就可以实…

day2-web安全漏洞攻防-基础-弱口令、HTML注入(米斯特web渗透测试)

day2-web安全漏洞攻防-基础-弱口令、HTML注入&#xff08;米斯特web渗透测试&#xff09; 1&#xff0c;漏洞2&#xff0c;弱口令3&#xff0c;爆破&#xff08;1&#xff09;Burpsuite&#xff08;2&#xff09;攻击类型 4&#xff0c;HTML针剂注入 1&#xff0c;漏洞 挖掘和利…

批量打造怀旧风情:视频批量剪辑将现代视频打造成怀旧经典老视频效果

在繁忙的现代生活中&#xff0c;我们时常怀念那些旧时光&#xff0c;那些充满岁月痕迹的老电影片段。它们不仅记录了一个时代的风貌&#xff0c;更承载了无数人的情感与记忆。你是否想过&#xff0c;将现代的视频素材打造成这种怀旧经典的老视频效果&#xff0c;让每一帧都充满…

【手眼标定】使用kalibr对imu和双目摄像头进行联合标定

使用kalibr对imu和双目摄像头进行联合标定 前言一、IMU标定二、双目摄像头标定三、手眼标定&#xff08;imu和双目摄像头的联合标定&#xff09; 前言 由于本文的imu、双目摄像头都是在ros2环境下开发&#xff0c;数据传输自然也是在ros2中。 但想要使用kalibr进行标定&#x…

骑马与砍杀战团mod制作-基础-军队笔记(一)

骑马与砍杀战团mod制作-基础-军队装备笔记&#xff08;一&#xff09; 资料来源 学习的资料来源&#xff1a; b站【三啸解说】手把手教你做【骑砍】MOD&#xff0c;基础篇&#xff0c;链接为&#xff1a; https://www.bilibili.com/video/BV19x411Q7No?p4&vd_sourcea507…

VOC格式转YOLO格式,xml文件转txt文件简单通用代码

目录 前言 思路介绍 代码 完整代码 拓展代码 前言 很多人在进行目标检测训练时习惯将得到的数据标注为XML文件的VOC格式&#xff0c;或者在网上获取的数据集被标注为XML文件&#xff0c;但是不同的标注工具进行的标注会产生不同的标注xml文件&#xff0c;这里我写了一种通用…

边缘混合计算智慧矿山视频智能综合管理方案:矿山安全生产智能转型升级之路

一、智慧矿山方案介绍 智慧矿山是以矿山数字化、信息化为前提和基础&#xff0c;通过物联网、人工智能等技术进行主动感知、自动分析、快速处理&#xff0c;实现安全矿山、高效矿山的矿山智能化建设。旭帆科技TSINGSEE青犀基于图像的前端计算、边缘计算技术&#xff0c;结合煤…

Java预约家政5.0服务本地服务源码(APP+小程序+公众号+H5)

预约家政本地服务平台系统&#xff1a;一站式解决家居需求&#x1f3e0;&#x1f4bc; 一、引言&#xff1a;开启便捷家居新时代 在快节奏的现代生活中&#xff0c;我们渴望拥有更多的时间和精力去享受生活&#xff0c;而不是被繁琐的家务所困扰。预约家政本地服务平台系统应…

创意设计师,如何在AIGC时代寻找价值?

在当今AIGC&#xff08;人工智能生成内容&#xff09;时代&#xff0c;技术的浪潮席卷了各个行业&#xff0c;创意设计领域也不例外。对于创意设计师来说&#xff0c;这既是一个充满挑战的时代&#xff0c;也是一个蕴藏无限机遇的时代。在这个时代背景下&#xff0c;如何寻找并…

MindSpore中NumPy变量转换为Tensor张量使用的Tensor.from_numpy()函数到底是深拷贝还是浅拷贝

在NumPy转换为Tensor使用的Tensor.from_numpy()函数到底是深拷贝还是浅拷贝 使用Tensor()将NumPy变量转换为Tensor变量。 类似数组转换张量的方法 n np.ones(5) t Tensor.from_numpy(n) print(f"t: {t}", type(t)) np.add(n, 1, outn) print(f"n: {n}"…

PHP 界的扛把子 Swoole 异步通信利器

大家好&#xff0c;我是码农先森。 引言 我今天主要介绍的内容是包括但不仅限于 Swoole &#xff0c;也有一部分 Go 语言的内容。 为什么要介绍 Swoole ? 先说一说背景吧&#xff0c;我们项目组之前要为《香港 01》开发一个积分系统的项目&#xff0c;这个系统的主要功能包…

做PPT时素材图片不清晰怎么办?

做 PPT 时&#xff0c;总会遇到很多尴尬事&#xff0c;比方说需要一张素材图&#xff0c;却怎么也下载不到高清的&#xff0c;这在现实生活中是经常会遇到的。那么遇到这种情况我们到底该如何处理&#xff1f;今天就教给大家几个方法&#xff0c;轻松应对素材图不清晰这个难题&…

内网一键部署k8s-kubeshpere,1.22.12版本

1.引言 本文档旨在指导读者在内网环境中部署 Kubernetes 集群。Kubernetes 是一种用于自动化容器化应用程序部署、扩展和管理的开源平台&#xff0c;其在云原生应用开发和部署中具有广泛的应用。然而&#xff0c;由于一些安全或网络限制&#xff0c;一些组织可能选择在内部网络…

python f.write中文乱码怎么解决

举个例子&#xff1a; #coding:utf-8 s u中文 f open("test.txt","w") f.write(s) f.close() 原因是编码方式错误&#xff0c;应该改为utf-8编码。 解决方案一&#xff1a; #coding:utf-8 s u中文 f open("test.txt","w") f.writ…

nacos在k8s上的集群安装实践

目录 概述实践nfs安装使用 k8s持久化nacos安装创建角色部署数据库执行数据库初始化语句部署nacos ingress效果展示 结束 概述 本文主要对 nacos 在k8s上的集群安装 进行说明与实践。主要版本信息&#xff0c;k8s: 1.27.x&#xff0c;nacos: 2.0.3。运行环境为 centos 7.x。 实…