制作Arduino库——摩斯码
前沿
Arduino的库文件由.h和.cpp组成。.h头文件用来声明变量、函数、类等;.cpp源文件用来写具体实现。即库文件里就完成了变量的定义、函数的定义。这样的话当引用库以后,就可以直接使用库里面的函数,而不用了解其中复杂的过程。这大大简化的编程过程。
本博客以摩斯码(morse)代码为例子进行制作Arduino库及讲解。
1、文件结构
Arduino库文件的基本结构:
|--My_morse
|--morse.h
|--morse.cpp
|--keywords.txt
文件作用说明:
morse.h文件: 声明变量、函数、类等。
morse.cpp文件: 定义函数,即写具体实现。
keywords.txt文件:配置自定义库的语法高亮。
我创建的文件结构如下所示:
2、主文件代码
主文件代码即.ino文件中的代码。摩斯码的实现实际就是使用LED亮灭的长短的组合来表示不同的意思。代码如下:
int pin = 13; //使用13引脚
void setup()
{
pinMode(pin,OUTPUT);//引脚初始化为输出的pinMode()函数。
}
void loop()
{
dot();dot();dot();
dash();dash();dash();
dot();dot();dot();
delay(3000);
}
void dot() //表示短促的点信号“・”的函数
{
digitalWrite(pin,HIGH);
delay(250);
digitalWrite(pin,LOW);
delay(250);
}
void dash() //表示保持一定时间的长信号“—”的函数
{
digitalWrite(pin,HIGH);
delay(1000);
digitalWrite(pin,LOW);
delay(250);
}
3、自定义Arduino库
3.1、编写.h头文件
头文件的核心包括:把库的每一个函数列出来;声明需要变量的类。
morse.h文件内容如下:
#ifndef _morse_h__
#define _morse_h__
//导入Arduino核心头文件,声明调用了Arduino语言的标准类型和变量(这个会自动在普通的工程中进行声明,但是不会在库中自动声明)
#include"Arduino.h"
class morse //标签名即类名,类名和文件名必须统一。
{
public: //函数外部用
morse(int pin); //构造函数
void dot(); //.ino主文件中的函数
void dash();
private: //函数内部用
int _pin; //控制led使用的引脚
};
#endif
- 一个类是把所有的函数和变量都集中到了一个地方。这些函数和变量可以是公共的(public),意味着能让使用你的库的人来调用这些函数和变量;也可以是私有的(private),意味着这些函数和变量只能在类里面进行调用。
- 每个类都有一个特殊的函数被叫做构造器(constructor),一个用来创建类的实例的函数。这个构造器有着和类一样的名字,同时不能有返回类型。
3.2、编写.cpp源文件
.cpp源文件则包含着真实的代码。把原工程的代码转换成库的代码,即在原工程的函数前加类名::,这里为morse::。
morse.cpp文件内容如下:
#include "Arduino.h"
#include "morse.h"
//格式为【标签名(.h文件中定义的标签)::函数名】
morse::morse(int pin) //
{
pinMode(pin,OUTPUT);
_pin=pin;
}
void morse::dot()
{
digitalWrite(_pin,HIGH);
delay(250);
digitalWrite(_pin,LOW);
delay(250);
}
void morse::dash()
{
digitalWrite(_pin,HIGH);
delay(1000);
digitalWrite(_pin,LOW);
delay(250);
}
- 构造器解释了当使用类创建了一个实例后会发生什么。
- morse::说明这个函数是morse类的一部分。
- _pin表示在名字的前面加下划线是一种清楚地表示它是一个私有变量的惯例,同时也能让它和函数的参数区分开来(这个例子中的pin)。
3.3、编写keywords.txt文件
keywords.txt文件的作用是配置自定义库的语法高亮,使软件对函数等进行高亮处理。
keywords.txt文件内容如下:
#以Tab键隔开,而不是空格键。
morse KEYWORD1
dash KEYWORD2
dot KEYWORD2
- #开头的是注释。
- 一行一句,格式如下:
关键字 [Tab键] 关键字的类型
关键字的类型的值:
类型 | 含义 |
---|---|
KEYWORD1 | 高亮类名(橙色) |
KEYWORD2 | 高亮方法名(褐色) |
LITERAL1 | 高亮常量 |
4、使自定义的库变成自己的库
方法一:将自定义的库添加进libraries目录
只有将自定义的库文件放在Arduino的库文件中,Arduino才会自动识别并导入自定义的库文件,那样才能在使用相应的库函数时而不会出现报错。Arduino的扩展库都是放在
libraries目录(路径:{arduino安装位置}./arduino/libraries)下,所以只需将总文件夹(包含.h、.cpp、keywords.txt三个文件)放在libraries目录下即可使自定义的库变成自己的库,就可以方便以后需要时直接拿来使用。
如下图所示:
方法二:每次使用自定义库时把库文件包含进工程中
使用这种方法时,.ino主代码中引用库文件使用双引号""的,即
#include "morse.h"
。
注意:.h和.cpp文件要与.ino主文件放在同一目录下。Arduino工程要求.ino名字要与工程名称一致。
如下图所示:
<>:表示先去系统目录中找头文件,如果没有则再到当前目录下找。所以像标准的头文件 stdio.h和 stdlib.h等用这个方法。
“”:表示首先在当前目录下寻找,如果找不到,再到系统目录中寻找。 这个用于include自定义的头文件,让系统优先使用当前目录中定义的。
5、使用自定义库后的主文件代码
5.1、使用方法一编写.ino主文件代码
使用自定义库后.ino文件中的代码可以改写为如下形式:
#include <morse.h>
morse morse1(13);//morse类的实例
void setup()
{
}
void loop()
{
morse1.dot();morse1.dot();morse1.dot();
morse1.dash();morse1.dash();morse1.dash();
morse1.dot();morse1.dot();morse1.dot();
delay(3000);
}
结果如下:
5.2、使用方法二编写.ino主文件代码
使用自定义库后.ino文件中的代码可以改写为如下形式:
#include "morse.h"
morse morse1(13);//morse类的实例
void setup()
{
}
void loop()
{
morse1.dot();morse1.dot();morse1.dot();
morse1.dash();morse1.dash();morse1.dash();
morse1.dot();morse1.dot();morse1.dot();
delay(3000);
}
结果如下: