如何编写自己的Arduino库?

一开始写Arduino 的时候很不习惯,没有main函数,因为好多东西都被隐藏了。一直想搞清楚,以便编写自己的库文件。于是研究一下午,下面是一些总结。

Arduino工程的初步认识

一、目录规范

当创建一个空的工程,先按下ctrl+s保存一下。这个时候弹出对话框,命名工程。假如命名为LED,并保存在 我自己的Arduino工作目录下  H:\Arduino\workspace\。

于是IDE会自动帮我们在workspace下创建1个文件夹,并将sketch主文件放在里面,而且主文件和文件夹同名。

 H:\Arduino\workspace\
    LED\
      LED.ino
 

二、主文件代码框架规范

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

代码框架如下:

void setup() {
// put your setup code here, to run once:
//初始化操作代码放在setup函数中,他们将在程序启动的第一步得到执行 并只执行一次
} void loop() {
// put your main code here, to run repeatedly:
//将程序的主要逻辑代码,放在loop里。他们将会反复执行下去。
}

有C/C++开发经验的人看到这个程序框架会愣住:我的main函数去哪里呢?

Arduino  为了让更多的人能够使用Arduino平台开发出好玩的东西出来,绞尽脑汁降低门槛,它隐藏了程序的细节,使得开发者将注意力放在实现上。

在Arduino IDE的安装目录下可以找到main.cpp这个代码模板文件,main函数就位于此。文件位置:{Arduino安装目录}\hardware\arduino\avr\cores\arduino\main.cpp,内容如下:

/*
main.cpp - Main loop for Arduino sketches
Copyright (c) 2005-2013 Arduino Team. All right reserved. This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/ #include <Arduino.h> // Declared weak in Arduino.h to allow user redefinitions.
int atexit(void (* /*func*/ )()) { return ; } // Weak empty variant initialization function.
// May be redefined by variant files.
void initVariant() __attribute__((weak));
void initVariant() { } void setupUSB() __attribute__((weak));
void setupUSB() { } int main(void)
{
init(); //硬件初始化 initVariant(); //特有硬件初始化。因为不同的开发板有自己独特的初始化逻辑。 #if defined(USBCON)
USBDevice.attach();
#endif setup(); for (;;) {
loop();
if (serialEventRun) serialEventRun();
} return ;
}

在项目中使用多文件

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

为了使得代码更清晰,我们让主文件用来控制程序的主要逻辑部分,而把具体的细节封装成单个模块,存放在其他的文件中,这样方便管理。

那么怎么创建其他的文件呢???下面开始介绍。

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

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

如何编写自己的Arduino库?

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

aaarticlea/png;base64,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" alt="" />

我不推荐使用这种方法,这是为没有C/C++编程经验的小白准备的,他们不懂函数定义 后还要声明才能使用,不懂得头文件的包含。这些都被Arduino IDE帮他们做了。IDE的具体处理是

在编译前期,Arduino IDE会将无后缀的文件 和 主文件合并成为1个文件,效果就像是写在主文件中一样。并在主文件第一行添加  #include "Arduino.h" 。 Arduino.h是 Arduino程序的核心头文件。然后,IDE将扫描合并后文件的函数定义,并对已经定义的函数添加函数的声明。(这个就是为什么即便我们定义的函数不声明也能编译通过的原因了)
但是官方明确说了,这个自动插入函数声明的机制是不完美的!所以我也建议大家养成手动声明函数的习惯。

Also, this generation isn't perfect: it won't create prototypes for functions that have default argument values, or which are declared within a namespace or class.

使用传统的 C/C++分离式文件

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

例如我们想要将LED的控制封装成一个模块。一开始我们需要创建2个文件 :LED.h   、 LED.cpp

如何编写自己的Arduino库?

然后是想清楚我们需要让提供LED控制的哪些操作。发挥你的想象力时候到了。规定操作后,我们先写出头文件,然后写出实现,最后在主文件中使用这个模块。在主文件中使用

#include"LED.h"预处理指令包含。

/*******************
LED.h *******************/ #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 bool getState(); //获取LED状态
void disattach(); //释放引脚与LED的绑定,使得引脚可以控制其他的东西 }; #endif
/*****************
LED.cpp ******************/ #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);
}
/**********************
实例化1个LED对象,用7号叫控制,让他闪烁10次,并在串口打印出它的状态。
10次完毕后释放回收引脚
**********************/ #include"LED.h" LED led();
byte count =; void setup() { Serial.begin(); } void loop() { if(count<)
{
led.on();
delay();
Serial.print("LED state:");Serial.println(led.getState(),DEC); led.off();
delay();
Serial.print("LED state:");Serial.println(led.getState(),DEC); ++count;
if(count==)
led.disattach();
} }

让它成为你自己的库!

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

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

如何编写自己的Arduino库?

所以我们需要在这个目录下创建一个文件夹,比如上面的例子是LED控制,于是我创建了 m_LED文件夹(前面加m是为了和官方库区分开,这只是我自己的习惯而已)。然后把写好的.cpp 和 .h文件拷贝到里面去,这样就OK了。

如何编写自己的Arduino库?

这样我们 的主文件就变成了下面这样,是不是很简洁干净呢。

#include<LED.h>     
//注意,由于LED控制模块已经是标准库了,所以使用尖括号<> 包含 LED led();
byte count =; void setup() {
Serial.begin();
} void loop() { if(count<){
led.on();
delay();
Serial.println(led.getState(),DEC); led.off();
delay();
Serial.println(led.getState(),DEC); ++count;
if(count==)
led.disattach();
}
}

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

aaarticlea/png;base64,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" alt="" />

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

如果你觉得这个库非常不错,你还可以把它分享给别人使用。我们好像一直都在使用别人的东西,把自己的劳动成果分享出去,也为别人做出贡献,岂不更好?

上一篇:QStandardItemModel角色控制及QTreeView加入不同的右键菜单


下一篇:第二十五章 Centos7下二进制安装Mysql-5.7.34