2.3 Arduino C语言开发示例
2.3.1 数字输出
如图2-15所示,这是Arduino一个最基本的“hello world”程序,将LED连接到数字引脚13,让LED每秒钟闪一次。Arduino有内置的电阻,所以220Ω的电阻不用在外部连接。
代码清单2-18:digital output应用示例
/********************************************
digital output应用示例
This example code is in the public domain.
*********************************************/
int ledPin = 13;
/**********************************************
初始化部分——setup函数
**********************************************/
void setup()
{
pinMode(ledPin,OUTPUT);
}
/**********************************************
执行部分——loop函数
**********************************************/
void loop()
{
digitalWrite(ledPin,HIGH);
delay(1000);
digitalWrite(ledPin,LOW);
delay(1000);
}
2.3.2 数字输入
如图2-16所示,这是一个最简单的数字输入例子,在例子中将一个开关或者按键连接至数字引脚2,当开关闭合或者按键按下的时候,点亮LED。
代码清单2-19:digital input应用示例
/*********************************************
digital input应用示例
This example code is in the public domain.
*********************************************/
int ledPin = 13;
int inPin =2;
/**********************************************
初始化部分——setup函数
**********************************************/
void setup()
{
pinMode(ledPin,OUTPUT);
pinMode(inPin,INPUT);
}
/**********************************************
执行部分——loop函数
**********************************************/
void loop()
{
if(digitalRead(inPin) == HIGH)
{
?digitalWrite(ledPin,HIGH);
delay(1000);
?digitalWrite(ledPin,LOW);
delay(1000);
}
}
2.3.3 大电流输出
如图2-17所示,有时候需要使用Arduino控制超过40mA电流的设备。这个时候需要使用一个MOSFET或者晶体管来开关大电流负载。代码清单2-20中,Arduino每秒快速地开关MOSFET 5次。
代码清单2-20:high current output应用示例
/********************************************
high current output应用示例
This example code is in the public domain.
*********************************************/
int outPin = 5;
/**********************************************
初始化部分——setup函数
**********************************************/
void setup()
{
pinMode(outPin,OUTPUT);
}
/**********************************************
执行部分——loop函数
**********************************************/
void loop()
{
for(int i=0;i<=5;i++)
{
digitalWrite(outPin,HIGH);
delay(250);
?digitalWrite(outPin,LOW);
delay(250);
}
delay(1000);
}
2.3.4 PWM输出
PWM(Pulse Width Modulation)可以产生类似于模拟输出的效果,可以用PWM控制LED逐渐由暗变亮,也可以由PWM控制伺服电机。代码清单2-21是使用for循环语句让LED逐渐由暗变亮,再由亮变暗。电路示例如图2-18所示。
代码清单2-21:pwm output应用示例
/********************************************
pwm output应用示例
This example code is in the public domain.
*********************************************/
int ledPin = 9;
/**********************************************
初始化部分——setup函数
**********************************************/
void setup(){}
/**********************************************
执行部分——loop函数
**********************************************/
void loop()
{
for(int i=0;i<=255;i++)
{
analoglWrite(ledPin,i);
delay(100);
}
for(int i=255;i>=0;i--)
{
analoglWrite(ledPin,i);
delay(100);
}
}
2.3.5 电位器模拟输入
如图2-19所示,使用一个电位计以及Arduino的一个模拟输入端口可以读取0~1024范围的模拟值。代码清单2-22中使用一个电位计来控制LED的闪烁频率。
代码清单2-22:potentiometer input应用示例
/********************************************
potentiometer input应用示例
This example code is in the public domain.
*********************************************/
int potPin = 0;
int ledPin = 13;
/**********************************************
初始化部分——setup函数
**********************************************/
void setup()
{
pinMode(ledPin,OUTPUT);
}
/**********************************************
执行部分——loop函数
**********************************************/
void loop()
{
digitalWrite(ledPin,HIGH);
delay(analogRead(potPin));
digitalWrite(ledPin,LOW);
delay(analogRead(potPin));
}
2.3.6 可变电阻输入
很多种传感器都使用可变电阻,代码清单2-23中使用一个函数读取模拟输入端口,并使用函数返回值控制LED的渐变过程。示例电路如图2-20所示。
代码清单2-23:variable resistor input应用示例
/********************************************
variable resistor input应用示例
This example code is in the public domain.
*********************************************/
int ledPin = 9;
int analogPin = 0;
/**********************************************
初始化部分——setup函数
**********************************************/
void setup(){}
/**********************************************
执行部分——loop函数
**********************************************/
void loop()
{
for(int i=0;i<=255;i++)
{
analoglWrite(ledPin,i);
delay(delayVal());
}
for(int i=255;i>=0;i--)
{
analoglWrite(ledPin,i);
delay(delayVal());
}
}
int delayVal()
{
int v;
v = analogRead(analogPin);
v /= 8;
return v;
}```
**2.3.7 伺服输出**
Hobby Servo是一种可以独立工作的电机,只要每隔20ms给它一个脉冲,就可以让它在0~180°范围内进行旋转。示例电路如图2-21所示。代码清单2-24中使用一个servoPulse()函数让电机从10°转到170°,然后再返回0°。
![image](https://yqfile.alicdn.com/f58560204a151315783de7393d22c822b60f8ccb.png)
代码清单2-24:servo output应用示例
/**
servo output应用示例
This example code is in the public domain.
*/
int servoPin = 2;
int myAngle;
int pulseWidth;
/**
初始化部分——setup函数
**/
void setup()
{
pinMode(servoPin,OUTPUT);
}
/**
执行部分——loop函数
**/
void servoPulse(int servoPin, int myAngle)
{
pulseWidth = (myAngle * 10) + 600;
digitalWrite(servoPin,HIGH);
delayMicroseconds(pulseWidth);
digitalWrite(servoPin,LOW);
}
void loop()
{
for(myAngle =10;myAngle<=170;myAngle++)
{
servoPulse(servoPin,myAngle);
delay(20);
}
for(myAngle =170;myAngle>=10;myAngle--)
{
servoPulse(servoPin,myAngle);
delay(20);
}
}