Arduino制作实践课程(3)呼吸灯与声控小夜灯

上周我们介绍了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);

}

通过上面的呼吸灯和声控灯,我们熟悉了模拟量的输入输出的基本指令。

发布了116 篇原创文章 · 获赞 79 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/haigear/article/details/101274881