Arduino教程——编写Arduino类库(1)-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 51392|回复: 28

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

[复制链接]
发表于 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函数代码如下:

  1. void init_SR04(int TrigPin,int EchoPin)
  2. {
  3.         //初始化超声波
  4. pinMode(TrigPin, OUTPUT);
  5.         pinMode(EchoPin, INPUT);
  6. }
复制代码

将发送触发信号,获取并计算结果的过程封装成GetDistance函数。
函数最后需要返回测出的距离,即一个float类型的变量,因此在该函数我们使用float类型声明函数的返回值,并在函数中添加return语句,返回变量并退出函数。

GetDistance函数代码如下:

[mw_shl_code=cpp,true]
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;
}[/mw_shl_code]


现在你只需要在setup和loop中调用这两个函数,就可以完成之前的功能了:
[mw_shl_code=cpp,true]
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);
}[/mw_shl_code]
这样设计程序后,程序的整体可读性增强了不少。这是简单的函数建立与调用,有C语言基础后,应该可以轻松掌握。


完整的程序代码如下:
[mw_shl_code=cpp,true]
/*
通过函数实现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);
}[/mw_shl_code]

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

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





发表于 2016-12-8 08:46 | 显示全部楼层
已PY,求速更
发表于 2018-8-17 15:10 | 显示全部楼层
好好玩。

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

点评

这个帖子只是测试收费功能,等其他大佬来写收费教程  详情 回复 发表于 2018-8-17 21:06
 楼主| 发表于 2018-8-17 21:06 | 显示全部楼层
skypup 发表于 2018-8-17 15:10
好好玩。

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

这个帖子只是测试收费功能,等其他大佬来写收费教程
发表于 2018-8-22 16:18 | 显示全部楼层
private和public什么意思

点评

访问修饰符,public后的变量函数可以被外部调用,private后的变量函数只能在这个类中被调用  详情 回复 发表于 2018-8-24 23:40
发表于 2018-8-24 23:02 | 显示全部楼层
还要先购买~哈巴~
 楼主| 发表于 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
 楼主| 发表于 2018-9-3 18:00 | 显示全部楼层
bayinglong 发表于 2018-9-3 17:27
编写内容有bug
//产生一个10ms的高脉冲去触发TrigPin
        digitalWrite(TrigPin, LOW);

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

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 09:43 , Processed in 0.182774 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表