Arduino类库封装编写-以超声波测距举例

目录

一、前言

二、类封装

1、创建头文件

2、创建源文件

3、条件编译说明

(1)头文件重复定义

(2)版本兼容性预处理

4、用户程序中使用封装的类

5、测试

三、将封装的类制作成库文件

1、创建SR04库文件目录

2、库文件中提供样例程序

3、关键字高亮显示设置


一、前言

将程序封装成类增加了程序代码的移植性和代码可复用性,比如一个系统中使用多个同一类型传感器,使用类的方式只需要将功能写一次即可多次使用。本文以超声波测距举例说明在Arduino中怎么封装类,超声波测距(没有使用封装)可以参见博客:

Arduino超声波测距-CSDN博客

二、类封装

1、创建头文件

创建头文件,命名SR04.h

添加代码

#ifndef SR04_H
#define SR04_H
#if defined(ARDUINO) && ARDUINO >=100
#include "Arduino.h"
#else
#include "WProgram.h"
#endifclass SR04
{public:SR04(int TrigPin, int EchoPin);float Get();private:int Trig_Pin;int Echo_Pin;//float distance;
};#endif

2、创建源文件

创建源文件,命名SR04.cpp

添加代码

#if defined(ARDUINO) && ARDUINO >=100#include "Arduino.h"#else#include "WProgram.h"
#endif
#include "SR04.h"SR04::SR04(int trig,int echo)
{pinMode(echo, INPUT); pinMode(trig, OUTPUT);Trig_Pin=trig;Echo_Pin=echo;}float SR04::Get()
{digitalWrite(Trig_Pin, LOW); delayMicroseconds(2); digitalWrite(Trig_Pin, HIGH);              //输出高电平,延时10msdelayMicroseconds(10);digitalWrite(Trig_Pin, LOW);float distance = pulseIn(Echo_Pin, HIGH);  //接受返回信号return distance /58.00;                  //计算距离
}

3、条件编译说明

(1)头文件重复定义

代码

#ifndef SR04_H
#define SR04_H……#endif

条件编译命令,#ifndef SR04_H语句会查找标识符SR04_H是否在程序的其它位置被#define定义过。若没有定义过,则定义该标识符。这种写法主要是放置重复定义,编译报错。

(2)版本兼容性预处理

代码

#if defined(ARDUINO) && ARDUINO >=100#include "Arduino.h"#else#include "WProgram.h"
#endif

此编译命令的作用是增加Arduino IDE版本的兼容性。

Arduino IDE编译器1.0之前的版本核心库文件使用的主要函数声明头文件为WProgram.h,1.0以后的版本中核心库文件使用的主要函数声明头文件为Arduino.h。添加这段预编译语句,可以使编译器自动判断正在使用的IDE版本,从而正确使用头文件。

4、用户程序中使用封装的类

在用户程序中需要添加引用头文件SR04.h,然后实例化SR04类、选择对应的传感器引脚。具体实现方式见下面代码。

代码:


#include "SR04.h"
const long _1000msTime = 1000;    // 1000 milli seconds
unsigned long _1000msLastTime;
const long _100msTime = 100;      // 100 milli seconds
unsigned long _100msLastTime; 
const long _10msTime = 10;        // 10 milli seconds
unsigned long _10msLastTime;SR04 sr04=SR04(9,8);
int currDistance = 0; // 距离void setup()
{Serial.begin(9600);
}void loop() 
{currDistance=sr04.Get();TimeProc();}void TimeProc()
{//1000ms执行一次if ((millis() - _1000msLastTime) >= _1000msTime){_1000msLastTime = millis( );    //Serial.print("Distance is: "); Serial.print(currDistance);Serial.println(" cm;");}//100ms执行一次if ((millis() - _100msLastTime) >= _100msTime){_100msLastTime = millis( );  //}//10ms执行一次if ((millis() - _10msLastTime) >= _10msTime){_10msLastTime = millis( );  //}}

5、测试

测试的硬件

串口获取数据

三、将封装的类制作成库文件

1、创建SR04库文件目录

在编译器libraries文件夹中创建SR04文件夹,在SR04文件夹文件夹中存储下面三个文件:头文件、源文件、关键字文件。(keywords.txt文件说明如下所示)

至此,一个超声波测距的库文件就制作成功了。重启一下Arduino IDE编译器即可生效。此时关键字高亮显示、库文件中多出了SR04库

2、库文件中提供样例程序

作为封装好了的库文件,还需要在库文件中提供样例程序,以方便其它用知道该库文件是如何被使用的。

在SR04文件夹中创建examples文件夹,在examples文件夹中添加样例程序。

在examples中,文件夹名和程序名必须相同。

设置完成以后重新启动Arduino IDE编译器,在示例中即可看到添加的样例程序。打开示例程序,下载、运行,正常。

3、关键字高亮显示设置

类封装完了以后,Arduino IDE还无法识别并高亮显示关键字,如类名SR04、Get函数名并没有高亮显示。需要新建一个keywords.txt文本文件,标出需要高亮显示的关键字。

(如果封装的类不制作成库文件,保存在程序文件夹中。则不用设置关键字高亮)

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

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

相关文章

智能网联汽车网络安全测试:渗透测试,模糊测试详细讲解

1. 基础知识 1.1 智能网联汽车架构 车内网络系统架构 随着智能网联汽车电子系统的复杂化,电子电气架构( Electrical/Electronic Architecture, EEA )由分布式向集中式架构演进,如图 2.1 所示。 在汽车 EEA 演进的…

构建免费的Dokan和WooCommerce构建线上课程市场在线销售数字课程

我们知道创建良好的学习说明和材料很困难。但当涉及到销售时,就变得更加困难。如果您无法出售您的课程,那么没有什么比这更令人沮丧的了。 幸运的是,如果您使用的是 WordPress 网站,那么您可以非常轻松且免费地完成此操作。借助L…

统信UOS虚拟机安装VirtualBox扩展使用USB功能

为什么要安装VirtualBox扩展包? 安装 Oracle VM VirtualBox 扩展包的原因是,它提供了对 USB 2.0、USB 3.0、远程桌面协议 VRDP(VirtualBox Remote Desktop Protocol)等实用功能的支持,以增强 VirtualBox 的功能。这些…

JavaScript高级程序设计读书记录(八):对象的使用及创建

ECMA-262 将对象定义为一组属性的无序集合。严格来说,这意味着对象就是一组没有特定顺序的 值。对象的每个属性或方法都由一个名称来标识,这个名称映射到一个值。正因为如此(以及其他还未 讨论的原因),可以把 ECMAScri…

区块链金融科技:技术融合与挑战应对【文末送书-16】

文章目录 前言一.区块链与金融科技的融合:革新金融格局的技术之光1.1区块链技术简介1.2 区块链在金融科技中的应用 二.智能合约2.1 去中心化金融(DeFi)2.2区块链对金融科技的影响2.3数据安全性 三.区块链与金融科技【文末送书-16】3.1 粉丝福…

计算机配件杂谈-鼠标

目录 基础知识鼠标的发展鼠标的左右手鼠标的显示样式鼠标的移动和可见性移动可见性 现在的我们的生活工作都基本上离不开电脑了,不管是你平时玩玩游戏,上班工作等等; 今天将关于鼠标的一些小的技巧分享出来,共勉! 基础…

系列三十五、获取Excel中的总记录数

一、获取Excel中的总记录数 1.1、概述 使用EasyExcel开发进行文件上传时,通常会碰到一个问题,那就是Excel中的记录数太多,使用传统的方案进行文件上传,很容易就超时了,这时可以通过对用户上传的Excel中的数量进行限制…

FDA食品接触材料测试项目接触

1. FDA介绍: 美国食品和药品管理局(FDA)负责监管食品接触材料,此类材料必须经过检测,确保达到食品接触安全标准。美国联邦法规(CFR)第21章对此类材料作出具体规定,并将此类材料视…

笔试案例2

文章目录 1、笔试案例22、思维导图 1、笔试案例2 09)查询学过「张三」老师授课的同学的信息 selects.*,c.cname,t.tname,sc.score from t_mysql_teacher t, t_mysql_course c, t_mysql_student s, t_mysql_score sc where t.tidc.cid and c.cidsc.cid and sc.sids…

Spring 见解 7 基于注解的AOP控制事务

8.基于注解的AOP控制事务 8.1.拷贝上一章代码 8.2.applicationContext.xml <!-- 开启spring对注解事务的支持 --> <tx:annotation-driven transaction-manager"transactionManager"/> 8.3.service Service Transactional(readOnlytrue,propagation Pr…

Qt之基本数据类型

Qt 基本数据类型定义在#include <QtGlobal>中&#xff0c;如表下表所示。 (1)打开Qt Creator&#xff0c;新建一个控制台项目&#xff0c;项目名为test。 (2)在 main.cpp 中输入如下代码: #include <QCoreApplication> #include <QtGlobal> int main(int…

web端播放rtsp视频流(摄像头监控视频)教程

文章目录 前言一、ffmpeg是什么&#xff1f;二、ffmpeg安装1.下载2.安装 三、node搭建websocket服务四、web客户端播放视频 前言 像海康大华一些摄像头或者直播源 为rtsp视频流&#xff0c;想在web上播放必须进行协议转换。已知一些方案例如rtsp转rtmp需要flash&#xff0c;现…