Arduino教程——编写Arduino类库(3)
上一篇:Arduino教程——编写Arduino类库(2) http://www.arduino.cn/thread-31722-1-1.html
关键字高亮
一个SR04超声波类库编写完成了,但它还不是一个完美的Arduino类库,因为他没有一个可以让Arduino IDE识别并高亮关键字的keywords.txt文件,我们再建立一个keywords.txt文件,并键入以下代码:
SR04 KEYWORD1
GetDistance KEYWORD2
需要注意的是“SR04 KEYWORD1”及“GetDistance KEYWORD2”之间的空格,应由键盘“Tab”键输入。
在Arduino IDE的关键字高亮中,会识别KEYWORD1为数据类型高亮方式,KEYWORD2为函数高亮方式。
有了keywords.txt,在Arduino IDE里使用该类库,你就能看到代码高亮效果了。
一个完整的Arduino类库就建立好了。
使用该类库,你需要在Arduino IDE安装目录下的libraries文件夹中新建一个名为SR04的文件夹,并将SR04.h、SR04.cpp、keywords.txt三个文件放入该文件夹中(如图4-5)。
图4-5 一个完整的Arduino库
建立示例程序
为了方便其他用户学习和使用你编写的类库,你还可以在SR04文件夹中新建一个examples文件夹,并放入你提供的示例程序,方便其他使用者学习和使用这个类库。这里,我在examples文件夹中新建了一个SR04_Example文件夹,并放入了一个SR04_Example.ino文件(如图4-6)。需注意的是ino文件所在文件夹需要与该ino文件同名。
图4-6 添加示例程序
SR04_Example.ino完整程序代码如下:
#include <SR04.h>
SR04 ultrasonic = SR04(2,3);
void setup()
{
Serial.begin(9600);
}
void loop()
{
float distance = ultrasonic.GetDistance();
Serial.print(distance);
Serial.print("cm");
Serial.println();
}
至此,一个完整的Arduino类库就建立完成了,重启Arduino IDE后,在Arduino IDE菜单>文件>示例 中可以找到该示例程序。编译并下载示例程序到你的Arduino控制器,验证你的类库是否还需要修改。
类库优化与发布
为了方便理解和学习Arduino类库的编写方法,笔者在教学中将库进行了一定简化。你可能会在使用过程中遇到一些检测出错的情况,例如检测到的距离过大或为0等。你可以对这个库进行更多的优化,使之达到更好的检测效果。
这里给出三种优化思路,大家可以自己尝试优化这个类库:
1.当检测到的距离超出了SR04超声波模块可检测的范围时(3cm-450cm),输出错误信息或者重新检测;
2.每次检测时,检测两次或者多次,将得到的值做比较,如果偏差较大,则认为是检测出错,并放弃检测结果,重新检测距离;
3.使用pulseIn(pin, value, timeout) 取代pulseIn(pin, value) 检测脉冲宽度,通过限定检测脉冲超时时间来限定超声波传感器的检测距离。
最后,希望你秉承开源共享的精神,将你的类库发布到开源社区与大家分享。
Arduino教程——使用和编写类库 http://www.arduino.cn/thread-22293-1-1.html
Arduino教程——通过 库管理器 添加库 http://www.arduino.cn/thread-31719-1-1.html
Arduino教程——手动添加库并使用 http://www.arduino.cn/thread-31720-1-1.html
Arduino教程——编写Arduino类库(1) http://www.arduino.cn/thread-31721-1-1.html
Arduino教程——编写Arduino类库(2) http://www.arduino.cn/thread-31722-1-1.html
Arduino教程——编写Arduino类库(3) http://www.arduino.cn/thread-31723-1-1.html
已PY,求速更 写得很详细,已学习,谢谢楼主 shangying111 发表于 2017-12-15 18:25
写得很详细,已学习,谢谢楼主
楼主你好,看了你的教程我收获颇丰,我自己尝试着写了个库,但是好像出了点问题,你可以帮我看看么?比如说我自己写的这个库,调用myiput()函数后,从串口可以读取我输入的值,比如我输入了90,再输入60,它的输出时9060,我没有办法把它的值给清零。求教一下,我应该怎么做?感激不尽。 syl312 发表于 2016-12-8 08:44
已PY,求速更
楼主你好,看了你的教程我收获颇丰,我自己尝试着写了个库,但是好像出了点问题,你可以帮我看看么?比如说我自己写的这个库,调用myiput()函数后,从串口可以读取我输入的值,比如我输入了90,它输出了90,但再输入60,它的输出是9060,我没有办法把它的值给清零。这个myinput函数里面的变量的值时存储在哪里啊,求教一下,我应该怎么把函数的值初始化?感激不尽。
谢谢,十分受益。:lol 英雄树 发表于 2018-4-14 02:32
楼主你好,看了你的教程我收获颇丰,我自己尝试着写了个库,但是好像出了点问题,你可以帮我看看么?比如 ...
可以用\n做结束符,收到结束符就认为数据重发了一次 学习了:) 不错的教程 编写库。。。
页:
[1]
2