Arduino自定义库的编写

level
发布于 2020-11-6 15:05
浏览
1收藏

前言:

一开始写Arduino 的时候很不习惯,没有main函数,因为好多东西都被隐藏了。

一直想搞清楚,以便编写自己的库文件。于是研究一下午,下面是一些总结。

 

下面是打开一个arduino的工程结构:

每一个Arduino程序(Sketch)都有1个主文件,后缀为 .ino ,它是程序的setup 函数和 loop函数所在的文件。

 

void setup() {
  // put your setup code here, to run once:
  //这里主要用来初始化、所有内容只执行一次
}
 
void loop() {
  // put your main code here, to run repeatedly:
  //这里就是相当于C语言的main函数、在这里将反复执行}

 

在项目中使用多文件

 

有时会程序越写越大,越大越乱。多文件管理可以解决这个麻烦。Arduino程序叫 Sketch。 一个Sketch可以有多个源代码文件,分离的源代码便于管理。但只有 1个 主文件,也就是存放 setup loop函数的文件。

让主文件用来控制程序的主要逻辑部分,而把具体的细节封装成单个模块,存放在其他的文件中,这样方便管理。那么怎么创建其他的文件呢???
下面开始介绍。

使用无后缀的文件(其实是以.ino为后缀的,只是在IDE中不会显示后缀,而在电脑的资源管理器中会显示.ino , 以下都称为无后缀)

点击下图中标记的按钮,选择第一个选项 【新建标签】,输入文件名即可。

Arduino自定义库的编写-鸿蒙开发者社区

这样我们的工程就有了2个文件了。如下,一个主文件和一个名为LED的文件。这就是最简单的多文件方法。

Arduino自定义库的编写-鸿蒙开发者社区

这里作者不推荐使用这种方法,这是为没有C/C++编程经验的小白准备的,他们不懂函数定义 后还要声明才能使用,不懂得头文件的包含。

这些都被Arduino IDE帮他们做了。

IDE的具体处理是在编译前期,Arduino IDE会将无后缀的文件 和 主文件合并成为1个文件,效果就像是写在主文件中一样。

并在主文件第一行添加 #include "Arduino.h" 。 Arduino.h是 Arduino程序的核心头文件。

然后,IDE将扫描合并后文件的函数定义,并对已经定义的函数添加函数的声明。(这个就是为什么即便我们定义的函数不声明也能编译通过的原因了)

但是官方明确说了,这个自动插入函数声明的机制是不完美的!所以我也建议大家养成手动声明函数的习惯。

 

手动申明(传统方式申明)

 

这种方式下我们需要一对文件: .c 和.h 或者 .cpp 和 .h 。前者是C语言风格,后者是对会使用C++来说的。官方貌似推崇我们使用C++编写Arduino代码,无论是Arduino 的从标准库,还是教程中,都透露出一股强烈的OOP气息。所以我下面使用C++风格来举例子。(用C的朋友可以自己动手写)

例如我们想要将LED的控制封装成一个模块。

一开始我们需要创建2个文件 :LED.h 、 LED.cpp

Arduino自定义库的编写-鸿蒙开发者社区

Arduino自定义库的编写-鸿蒙开发者社区

然后是想清楚我们需要让提供LED控制的哪些操作。发挥你的想象力时候到了。

规定操作后,我们先写出头文件,然后写出实现,最后在主文件中使用这个模块。

在主文件中使用

LED.h源代码如下:

/**
 * 名字:LED.h
 * 功能:实现自定义库头文件
 * 
 * 作者:单胜凌
 * 时间:2016.12.05
 */
 
 
 #ifndef _LED_H__
 #define _LED_H__
 
 //导入arduino核心头文件
 #include "Arduino.h"
 
 class LED
 {
    private:
      byte pin; //控制led使用的引脚
 
    public:
      LED(byte p,bool state=LOW); //构造函数
      ~LED();                     //析构函数
      byte getPin();              //获取控制的引脚
      void on();                  //打开led
      void off();                 //关闭led
      boolean getState();         //获取led的状态
      void disattach();           //释放引脚与led的绑定
      
 };
 
#endif

 

LED.cpp代码如下:

 

/**
 * 名字:led.cpp
 * 功能:led控制源文件
 * 
 * 作者:单胜凌
 * 时间:2016.12.05
 */
 
 #include "LED.h"
 #include "Arduino.h"
 
 LED::LED(byte p,bool state):pin(p)
 {
    pinMode(pin,OUTPUT);
    digitalWrite(pin,state);
 }
 LED::~LED()
 {
    disattach();
 }
 
 void LED::on()
 {
    digitalWrite(pin,HIGH);
 }
void LED::off()
{
    digitalWrite(pin,LOW);
}
bool LED::getState()
{
    return digitalRead(pin);
}
void LED::disattach()
{
    digitalWrite(pin,LOW);
    pinMode(pin,INPUT);
}

 

LED_Test.ino源代码如下:

 

#include "LED.h"
LED led(13);
byte count =0;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}
 
void loop() {
  // put your main code here, to run repeatedly:
  if(count<10)
  {
      led.on();
      delay(300);
      Serial.print("LED state:");
      Serial.println(led.getState(),DEC);
      led.off();
      delay(300);
      Serial.print("LED state:");
      Serial.println(led.getState(),DEC);
 
      ++count;
      if(count==10)
      {
        led.disattach();
      }
  }
}

 

让它成为我们自己的库

 

如果上面的模块你觉得好用,符合自己的使用习惯,而且经常要用到,那么你可以将它变成你自己的库文件。这样以后就可以直接拿来用啦。

 

Arduino的扩展库都是放在 libraries目录下的。

Arduino自定义库的编写-鸿蒙开发者社区

这里于是我创建了 My_LED文件夹(前面加My是为了和官方库区分开,看各自的习惯而已)。然后把写好的.cpp 和 .h文件拷贝到里面去,这样就OK了。

Arduino自定义库的编写-鸿蒙开发者社区

细心的同学会发现 和 LED.cpp 、 LED.h 一起有个 keywords.txt文件,这个是什么用呢? 其实它没有太大的实用性,只是为了配置自定义库的语法高亮。让我们自己的库能在IDE下显示不同的颜色而已。如果不配置,Arduino IDE不能渲染出颜色的。

 

下面是keywords.txt 的内容,其中#开头的是注释,完全可以不写。格式:word【tab】DESCRIPTION
word就是你要高亮的关键字接着1 个 tab 键 ,然后就是DESCRIPTION。
DESCRIPTION可以取的值:
KEYWORD1    高亮类名
KEYWORD2    高亮方法名
LITERAL1       高亮常量
 
注意中间使用的是 1  个  tab 键 隔开的

Arduino自定义库的编写-鸿蒙开发者社区

关于arduino自定义库的知识讲解到此结束!!!

 

原文作者:单胜凌

 

 

分类
标签
已于2020-11-6 15:05:55修改
1
收藏 1
回复
举报
回复
    相关推荐