上周我们介绍了arduino的数字端口的输入输出的操作,这周的课程我们开始了解arduino对模拟口的操作。
具体我们这里使用呼吸灯、声控小夜灯来呈现。
首先我们通过呼吸灯的程序来熟悉模拟量输出的指令analogWrite(pin,value), 其中pin为端口号,value为模拟量的值。analogWrite与digitalWrite非常相似,第二个参数不同点在于,前者给出的是一个数值,后者给出的是一个逻辑值(LOW或者HIGH)。下面我们来看看呼吸灯。
一、呼吸灯
常规的呼吸灯我们采用两套for循环或者while循环,代码如下:
void setup() {
pinMode(9,OUTPUT);
}
void loop() {
// 从暗到亮,以每次加3的形式逐渐亮起来
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=3) {
// 输出PWM
analogWrite(9, fadeValue);
delay(15);
}
// 从亮到暗,以每次减5的形式逐渐暗下来
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=3) {
// 输出PWM
analogWrite(9, fadeValue);
delay(15);
}
}
当然,我们也可以用一套循环来实现,代码如下:
int brightness =0;
bool turn=true;
void setup() {
// put your setup code here, to run once:
pinMode(9,OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
while(true)
{
if(temp>250)
turn=false;
if(temp<3)
turn=true;
if(turn)
{
temp=temp+3;
analogWrite(9,temp);
delay(15);
}
else
{
temp=temp-3;
analogWrite(9,temp);
delay(15);
}
}
}
实际这里不要while也是可以的,只不过对于51单片机而言用while更切合实际,arduino就不需要了,loop本身就是一个while循环了。这里关键点在用250和3的边界值来实现亮灭方向的翻转。实际我们可以对翻转方向的bool值赋值条件判断部分进行改进:
if(temp>250 || temp<3)
turn=~turn
如此就轻松实现了翻转;
同时,我们还可以发现,temp变量的递增量3前面的符合实际与翻转方向turn的bool值是统一的,即为true的时候为正(+),为false时为负(-)。那么我们直接可以将翻转方向和地增量进行合并。代码如下:
int temp= 0;
int fadeIntensity=3;
void setup() {
pinMode(9, OUTPUT);
}
void loop() {
analogWrite(9, temp);
temp= temp+ fadeIntensity;
if (temp==3 || temp== 250) {
fadeIntensity= -fadeIntensity;
}
delay(15);
}
用一个if语句,将亮灭的方向自动翻转即可。
二、声控小夜灯
模拟量除了输出,还是要输入的,那么输入也是和数字输入很类似,负责数字读入的函数digitalRead只有一个参数,同样,负责模拟量读入的函数analogRead的参数也只有一个,analogRead(pin),这里pin就是读入的管脚。
需要注意的是,能够接收模拟量输入的就只有A0~A5六个端口,其余的是不行的。
下面我们听过声控灯来熟悉analogRead的用法,代码如下:
void setup()
{
pinMode(A0, OUTPUT);
}
void loop(){
//读取传感器的值
int soundState = analogRead(A0);
//如果声音值大于 10,亮灯,并持续 10s,否则关灯
if (soundState > 10)
{
analoglWrite(9, 250);
delay(10000);
}
else
analoglWrite(9, 0);
}
通过上面的呼吸灯和声控灯,我们熟悉了模拟量的输入输出的基本指令。