目录
将程序封装成类增加了程序代码的移植性和代码可复用性,比如一个系统中使用多个同一类型传感器,使用类的方式只需要将功能写一次即可多次使用。本文以超声波测距举例说明在Arduino中怎么封装类,超声波测距(没有使用封装)可以参见博客:
创建头文件,命名SR04.h
添加代码
#ifndef SR04_H
#define SR04_H
#if defined(ARDUINO) && ARDUINO >=100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
class SR04
{
public:
SR04(int TrigPin, int EchoPin);
float Get();
private:
int Trig_Pin;
int Echo_Pin;
//float distance;
};
#endif
创建源文件,命名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); //输出高电平,延时10ms
delayMicroseconds(10);
digitalWrite(Trig_Pin, LOW);
float distance = pulseIn(Echo_Pin, HIGH); //接受返回信号
return distance /58.00; //计算距离
}
代码
#ifndef SR04_H
#define SR04_H
……
#endif
条件编译命令,#ifndef SR04_H语句会查找标识符SR04_H是否在程序的其它位置被#define定义过。若没有定义过,则定义该标识符。这种写法主要是放置重复定义,编译报错。
代码
#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版本,从而正确使用头文件。
在用户程序中需要添加引用头文件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( );
//
}
}
测试的硬件
串口获取数据
在编译器libraries文件夹中创建SR04文件夹,在SR04文件夹文件夹中存储下面三个文件:头文件、源文件、关键字文件。(keywords.txt文件说明如下所示)
至此,一个超声波测距的库文件就制作成功了。重启一下Arduino IDE编译器即可生效。此时关键字高亮显示、库文件中多出了SR04库
作为封装好了的库文件,还需要在库文件中提供样例程序,以方便其它用知道该库文件是如何被使用的。
在SR04文件夹中创建examples文件夹,在examples文件夹中添加样例程序。
在examples中,文件夹名和程序名必须相同。
设置完成以后重新启动Arduino IDE编译器,在示例中即可看到添加的样例程序。打开示例程序,下载、运行,正常。
类封装完了以后,Arduino IDE还无法识别并高亮显示关键字,如类名SR04、Get函数名并没有高亮显示。需要新建一个keywords.txt文本文件,标出需要高亮显示的关键字。
(如果封装的类不制作成库文件,保存在程序文件夹中。则不用设置关键字高亮)