暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【Arduino】如何开发调用自己的库文件

修电脑的杂货店 2021-09-08
3215

 如何编写自己的Arduino库?


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



01


目录规范


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


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


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



02



主文件代码框架规范


每一个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里。他们将会反复执行下去。
}



03



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


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


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



然后是想清楚我们需要让提供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(7);
byte count =0;


void setup() {


Serial.begin(9600);


}


void loop() {


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();
}




}



04



让它成为自己的库


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

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



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



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


#include<LED.h>                      //注意,由于LED控制模块已经是标准库了,所以使用尖括号<> 包含


LED led(7);
byte count =0;


void setup() {
Serial.begin(9600);
}


void loop() {


if(count<10){
led.on();
delay(300);
Serial.println(led.getState(),DEC);

led.off();
delay(300);
Serial.println(led.getState(),DEC);

++count;
if(count==10)
led.disattach();
}
}



05



完善它~


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



下面是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


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


如果遇到技术问题,可在后台留言咨询,

后台回复较慢,

捉急的小伙伴可进QQ群交流:559369389 


纸上得来终觉浅,绝知此事要coding...


文章转载自修电脑的杂货店,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论