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

发布时间:2024年01月09日

目录

一、前言

二、类封装

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"
#endif

class 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);              //输出高电平,延时10ms
  delayMicroseconds(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文本文件,标出需要高亮显示的关键字。

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

文章来源:https://blog.csdn.net/panjinliang066333/article/details/135476151
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。