在上一节中使用他人开发的类库,是不是感觉编程变得格外简单?有了这些库文件,你不必过多的理会各种模块是如何驱动的,只需调用库提供的类和函数,就可以轻松使用各类模块了。 但是一个优秀的Arduino玩家或者开发者,当然不能仅仅满足于使用别人提供的库,纯粹的拿来主义不是开源精神,真正的开源精神在于分享。 掌握本节的内容后,你也可以将你编写的库文件发表到互联网上,让众多Arduino用户来使用。
在编写类库前,还需要掌握函数的编写方法,这里我们仍以SR04超声波传感器为例。 [sf] 编写函数
在上一章中,我们学习了超声波模块的使用,你已经知道运行相应的程序,就可以让串口输出超声波测距的数值。但你是否思考过,如果程序中需要实现的功能不仅仅是获取超声波传感器读数和串口输出,那程序的可读性会变得怎样呢?或者需要同时控制多个超声波模块,是否需要重复书写多次语句呢?
为了使程序看起来更清晰明了,可以将超声波驱动对端口的配置过程封装成init_SR04函数。该函数仅完成超声波相关初始化,无需返回值,因此可以使用void来声明该函数。而超声波的Trig引脚和Echo引脚,是其初始化必须使用两个变量,我们将其设置为两个参数。
init_SR04函数代码如下:
- void init_SR04(int TrigPin,int EchoPin)
- {
- //初始化超声波
- pinMode(TrigPin, OUTPUT);
- pinMode(EchoPin, INPUT);
- }
复制代码
将发送触发信号,获取并计算结果的过程封装成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
|