查看: 10631|回复: 14

Arduino教程——编写Arduino类库(3)

[复制链接]
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

    发表于 2016-12-7 23:49 | 显示全部楼层 |阅读模式


    上一篇:Arduino教程——编写Arduino类库(2) http://www.arduino.cn/thread-31722-1-1.html

    [sf]
    关键字高亮
    一个SR04超声波类库编写完成了,但它还不是一个完美的Arduino类库,因为他没有一个可以让Arduino IDE识别并高亮关键字的keywords.txt文件,我们再建立一个keywords.txt文件,并键入以下代码:

    kittenblock中小学创客名师推荐的图形化编程软件

    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库

    图4-5 一个完整的Arduino库

    图4-5 一个完整的Arduino库




    建立示例程序
    为了方便其他用户学习和使用你编写的类库,你还可以在SR04文件夹中新建一个examples文件夹,并放入你提供的示例程序,方便其他使用者学习和使用这个类库。这里,我在examples文件夹中新建了一个SR04_Example文件夹,并放入了一个SR04_Example.ino文件(如图4-6)。需注意的是ino文件所在文件夹需要与该ino文件同名。
    图4-6 添加示例程序.png

    图4-6 添加示例程序


    SR04_Example.ino完整程序代码如下:

    kittenblock中小学创客名师推荐的图形化编程软件

    #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) 检测脉冲宽度,通过限定检测脉冲超时时间来限定超声波传感器的检测距离。


    最后,希望你秉承开源共享的精神,将你的类库发布到开源社区与大家分享。
    [/sf]







    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

  • TA的每日心情
    擦汗
    2019-1-26 16:31
  • 签到天数: 446 天

    [LV.9]以坛为家II

    发表于 2016-12-8 08:44 | 显示全部楼层
    已PY,求速更

    该用户从未签到

    发表于 2017-12-15 18:25 | 显示全部楼层
    写得很详细,已学习,谢谢楼主

    该用户从未签到

    发表于 2018-4-14 02:28 | 显示全部楼层
    shangying111 发表于 2017-12-15 18:25
    写得很详细,已学习,谢谢楼主

    楼主你好,看了你的教程我收获颇丰,我自己尝试着写了个库,但是好像出了点问题,你可以帮我看看么?比如说我自己写的这个库,调用myiput()函数后,从串口可以读取我输入的值,比如我输入了90,再输入60,它的输出时9060,我没有办法把它的值给清零。求教一下,我应该怎么做?感激不尽。

    头文件

    头文件

    cpp文件

    cpp文件

    实验程序

    实验程序
    90.png
    9060.png

    该用户从未签到

    发表于 2018-4-14 02:32 | 显示全部楼层

    楼主你好,看了你的教程我收获颇丰,我自己尝试着写了个库,但是好像出了点问题,你可以帮我看看么?比如说我自己写的这个库,调用myiput()函数后,从串口可以读取我输入的值,比如我输入了90,它输出了90,但再输入60,它的输出是9060,我没有办法把它的值给清零。这个myinput函数里面的变量的值时存储在哪里啊,求教一下,我应该怎么把函数的值初始化?感激不尽。

    头文件

    头文件

    cpp文件

    cpp文件

    实验程序

    实验程序

    结果

    结果
    9060.png

    点评

    可以用\n做结束符,收到结束符就认为数据重发了一次  详情 回复 发表于 2018-4-14 12:20
  • TA的每日心情
    开心
    2018-6-22 23:06
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2018-4-14 11:23 | 显示全部楼层
    谢谢,十分受益。
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

     楼主| 发表于 2018-4-14 12:20 | 显示全部楼层
    英雄树 发表于 2018-4-14 02:32
    楼主你好,看了你的教程我收获颇丰,我自己尝试着写了个库,但是好像出了点问题,你可以帮我看看么?比如 ...

    可以用\n做结束符,收到结束符就认为数据重发了一次
  • TA的每日心情
    难过
    2019-5-14 23:23
  • 签到天数: 103 天

    [LV.6]常住居民II

    发表于 2018-4-18 11:25 | 显示全部楼层
    不错的教程
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    Blynk与m5stack basic以及uiflow的交互玩法
    Blynk与m5stack basic以及
    Blynk与m5stack basic以及uiflow的交互玩法 [准备工作我们假设玩家已经熟悉下面的准备
    求助oled显示屏 中间有一条不显示 折腾好久没明白是咋回事
    求助oled显示屏 中间有一
    以下是源代码,课程做东西需要,卡在了这一环节,求大神指教(跪 #include #i
    中文 字库 的8针 OLED 12864模块 arduino
    中文 字库 的8针 OLED 128
    屏幕电路SPI连线: 中文字库OLED Arduino UNO GND GND
    DIY X-Y 平面激光器
    DIY X-Y 平面激光器
    DIY X-Y 平面激光器 总成本不到50元,性能一点不比市面的差. Arduino UNO x1 舵机 x2
    【干货分享】mega2560原理图PCB图纸altium designer18
    【干货分享】mega2560原理
    分享一下mega2560的板子 AD版本 **** 本内容被作者隐藏 **** ergo
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表