查看: 23364|回复: 27

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

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

    [LV.5]常住居民I

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

    上一篇:Arduino教程——手动添加库并使用 http://www.arduino.cn/thread-31720-1-1.html

    在上一节中使用他人开发的类库,是不是感觉编程变得格外简单?有了这些库文件,你不必过多的理会各种模块是如何驱动的,只需调用库提供的类和函数,就可以轻松使用各类模块了。
    但是一个优秀的Arduino玩家或者开发者,当然不能仅仅满足于使用别人提供的库,纯粹的拿来主义不是开源精神,真正的开源精神在于分享。
    掌握本节的内容后,你也可以将你编写的库文件发表到互联网上,让众多Arduino用户来使用。

    在编写类库前,还需要掌握函数的编写方法,这里我们仍以SR04超声波传感器为例。
    [sf]
    编写函数

    在上一章中,我们学习了超声波模块的使用,你已经知道运行相应的程序,就可以让串口输出超声波测距的数值。但你是否思考过,如果程序中需要实现的功能不仅仅是获取超声波传感器读数和串口输出,那程序的可读性会变得怎样呢?或者需要同时控制多个超声波模块,是否需要重复书写多次语句呢?

    为了使程序看起来更清晰明了,可以将超声波驱动对端口的配置过程封装成init_SR04函数。该函数仅完成超声波相关初始化,无需返回值,因此可以使用void来声明该函数。而超声波的Trig引脚和Echo引脚,是其初始化必须使用两个变量,我们将其设置为两个参数。

    init_SR04函数代码如下:

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

    
    void init_SR04(int TrigPin,int EchoPin)
    {
            //初始化超声波
    pinMode(TrigPin, OUTPUT);
            pinMode(EchoPin, INPUT);
    }
    将发送触发信号,获取并计算结果的过程封装成GetDistance函数。
    函数最后需要返回测出的距离,即一个float类型的变量,因此在该函数我们使用float类型声明函数的返回值,并在函数中添加return语句,返回变量并退出函数。

    GetDistance函数代码如下:

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

    
    float GetDistance (int TrigPin,int EchoPin)
    {
    //产生一个10μs的高脉冲去触发TrigPin
            digitalWrite(TrigPin, LOW);
            delayMicroseconds(2);
            digitalWrite(TrigPin, HIGH);
            delayMicroseconds(10);
            digitalWrite(TrigPin, LOW);
            float distance = pulseIn(EchoPin, HIGH) / 58.00;
            return distance;
    }



    现在你只需要在setup和loop中调用这两个函数,就可以完成之前的功能了:

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

    
    float distance;
    void setup()
    {
            init_SR04(2,3);
            Serial.begin(9600);
    }
    void loop()
    {
            distance= GetDistance (2,3);
            Serial.print(distance);
            Serial.print("cm");
            Serial.println();
            delay(1000);
    }

    这样设计程序后,程序的整体可读性增强了不少。这是简单的函数建立与调用,有C语言基础后,应该可以轻松掌握。


    完整的程序代码如下:

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

    
    /*
    通过函数实现SR04超声波模块驱动
    */
    float distance;
    void init_SR04(int TrigPin,int EchoPin)
    {
      pinMode(TrigPin, OUTPUT);
      pinMode(EchoPin, INPUT);
    }
    float GetDistance (int TrigPin,int EchoPin)
    {
      digitalWrite(TrigPin, LOW);
      delayMicroseconds(2);
      digitalWrite(TrigPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(TrigPin, LOW);
      float distance = pulseIn(EchoPin, HIGH) / 58.0;
      return distance;
    }
    void setup()
    {
      init_SR04(2,3);
      Serial.begin(9600);
    }
    void loop()
    {
      distance= GetDistance (2,3);
      Serial.print(distance);
      Serial.print("cm");
      Serial.println();
      delay(1000);
    }


    [/sf]
    掌握了函数的编写方法后,我们即可开始编写类库。

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




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

    [LV.9]以坛为家II

    发表于 2016-12-8 08:46 | 显示全部楼层
    已PY,求速更
  • TA的每日心情
    开心
    2018-11-18 00:25
  • 签到天数: 238 天

    [LV.7]常住居民III

    发表于 2018-8-17 15:10 | 显示全部楼层
    好好玩。

    从哪儿能搜到这种收费的贴子?

    点评

    这个帖子只是测试收费功能,等其他大佬来写收费教程  详情 回复 发表于 2018-8-17 21:06
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

     楼主| 发表于 2018-8-17 21:06 | 显示全部楼层
    skypup 发表于 2018-8-17 15:10
    好好玩。

    从哪儿能搜到这种收费的贴子?

    这个帖子只是测试收费功能,等其他大佬来写收费教程
  • TA的每日心情
    开心
    2018-4-5 17:28
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    发表于 2018-8-22 16:18 | 显示全部楼层
    private和public什么意思

    点评

    访问修饰符,public后的变量函数可以被外部调用,private后的变量函数只能在这个类中被调用  详情 回复 发表于 2018-8-24 23:40

    该用户从未签到

    发表于 2018-8-24 23:02 | 显示全部楼层
    还要先购买~哈巴~
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

     楼主| 发表于 2018-8-24 23:40 | 显示全部楼层
    jgbsxx20130315 发表于 2018-8-22 16:18
    private和public什么意思

    访问修饰符,public后的变量函数可以被外部调用,private后的变量函数只能在这个类中被调用

    该用户从未签到

    发表于 2018-9-3 08:53 | 显示全部楼层
    裤子都脱了,你给我看这个,够一次,py一次

    该用户从未签到

    发表于 2018-9-3 17:27 | 显示全部楼层
    编写内容有bug
    //产生一个10ms的高脉冲去触发TrigPin
            digitalWrite(TrigPin, LOW);
            delayMicroseconds(2);


    是  
    10微秒

    点评

    已修改,感谢指正  详情 回复 发表于 2018-9-3 18:00
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

     楼主| 发表于 2018-9-3 18:00 | 显示全部楼层
    bayinglong 发表于 2018-9-3 17:27
    编写内容有bug
    //产生一个10ms的高脉冲去触发TrigPin
            digitalWrite(TrigPin, LOW);

    已修改,感谢指正
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    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!   
    快速回复 返回顶部 返回列表