创客联盟网

标题: Arduino小白自学教程006——从闪灯程序到“闪”声程序+视频! [打印本页]

作者: CCFIVE    时间: 2013-7-23 21:32
标题: Arduino小白自学教程006——从闪灯程序到“闪”声程序+视频!
有了上节课的实验,这节课的实验就非常简单了,因为他们一脉相传

这节学习蜂鸣器,什么是蜂鸣器呢其实就是一个喇叭了,最简单的就是我们小时候玩那些什么圣诞贺卡里面,不是有个扁扁的圆圆的,那个也算是一个最简单的蜂鸣器了(实际叫压电片)。
大家都知道,“一个巴掌拍不响”这句话,其实它就通俗的说明了发声的原理,振动的物体就会产生声音。蜂鸣器的结构是这样的,长脚接正,短脚接负,当蜂鸣器通电时,蜂鸣器吸合那个小弹片,不通电时,释放那个小弹片,当这循环的一吸一放,就会产生振动,自然就会声音的。不要以为控制蜂鸣器很难,其实我们可以把控制蜂鸣器发生认为控制一个led闪烁。
(, 下载次数: 159)
void setup()
{
    pinMode(7,OUTPUT);
}
void loop()
{
    digitalWrite(7,HIGH);
    delay(100);
    digitalWrite(7,LOW);
    delay(100);
}
(, 下载次数: 155)
我们尝试改下延时,不同的时间,导致振动的频率不同发出的声音也就不同了,但是当你延时得太长的时候,如delay(1000); 可能就没有声音发出来了

本节实验到此就结束,你自己可以试下改改delay里面的数字,看下改变延时音调是不是发生变化。只要多练就很容易学会arduino,让我们继续加油吧!



作者: segichen    时间: 2013-7-28 01:02
响了没?哈哈
作者: CCFIVE    时间: 2013-7-29 14:55
segichen 发表于 2013-7-28 01:02
响了没?哈哈

蜂鸣器的响声如果要想增大点就要加上三极管驱动电路,因为是入门教程,所以不搞那么复杂怕吓着大家

作者: 爷灬淡定    时间: 2013-8-12 18:55
void setup ()
 {
   pinMode(3,INPUT);
   pinMode(5,OUTPUT);
   pinMode(6,OUTPUT);
 }
 void loop()
 {
   if(digitalRead(3)==LOW)
   {
     for(int t=0;t<255;t++)
     {
       analogWrite(5,t);
       delay(10);
       digitalWrite(6,LOW);
       {
       digitalWrite(1,HIGH);
       delay(1000);
       }
     for(int t=255;t<255;t--)
     {
       analogWrite(5,t);
       delay(10);
     }
   }
   }
     else
     {
       digitalWrite(5,LOW) ;
       {
       digitalWrite(6,HIGH);
       delay(1000);
       }
        digitalWrite(1,LOW);
        delay(1000);
     }
   }


//这是我写的一个警报器,可是为什么如果 pinMode(1)就是蜂鸣器只有在一开始才亮
作者: CCFIVE    时间: 2013-8-12 20:24
爷灬淡定 发表于 2013-8-12 18:55
//这是我写的一个警报器,可是为什么如果 pinMode(1)就是蜂鸣器只有在一开始才亮

请问你是如何接线的?   D3,D5,D6是分别接什么?


另外你如果要用 digitalWrite(1, HIGH);,你在初始化的时候要设置 pinMode(1,INPUT/OUTPUT)

我发现你程序有个错误,你看是不是
for(int t = 255; t < 255; t--)
            {
                analogWrite(5, t);
                delay(10);
            }


t < 255应该改为 t>0吧?



作者: 爷灬淡定    时间: 2013-8-13 10:33
CCFIVE 发表于 2013-8-12 20:24
请问你是如何接线的?   D3,D5,D6是分别接什么?

谢谢啦,一开始的pinMode确实粗心
不过后面的 t >0确实没考虑
不过我昨晚写了个警报器的代码,已经觉得像个样子了,能不能看一下,顺便问一下,怎么让警报器按下之后一直响,再按一下就停了?
// 这是警报器
void setup ()
{
   pinMode(3,INPUT); //检测低电平高电平
   pinMode(5,OUTPUT);//警报灯红
   pinMode(6,OUTPUT);//安全绿灯
   pinMode(1,OUTPUT);//蜂鸣器
}
void loop()
{
   if(digitalRead(3)==LOW)
   {
     digitalWrite(6,LOW);  
     digitalWrite(5,HIGH);
     {
       digitalWrite(1,HIGH);
       delay(700);
       digitalWrite(1,LOW);
       delay(200);
        digitalWrite(1,HIGH);
       delay(700);
       digitalWrite(1,LOW);
       delay(200);
        digitalWrite(1,HIGH);
       delay(700);
       digitalWrite(1,LOW);
       delay(200);
           digitalWrite(1,HIGH);
       delay(700);
       digitalWrite(1,LOW);
       delay(200);
           digitalWrite(1,HIGH);
       delay(500);
       digitalWrite(1,LOW);
       delay(200);
       }
            digitalWrite(1,LOW);
   }
     else
     {
       digitalWrite(5,LOW) ;
       digitalWrite(6,HIGH);
       digitalWrite(1,LOW);
     }
   }


作者: CCFIVE    时间: 2013-8-13 13:07
爷灬淡定 发表于 2013-8-13 10:33
谢谢啦,一开始的pinMode确实粗心
不过后面的 t >0确实没考虑
不过我昨晚写了个警报器的代码,已经觉得 ...

对应改改你接线,代码还可以优化下,自己尝试优化啦{:soso_e113:}

(, 下载次数: 68)
[mw_shl_code=cpp,true]int flag=0;
int buttonstate=0;

void setup()
{
   pinMode(3,INPUT); //检测低电平高电平
   pinMode(5,OUTPUT);//警报灯红
   pinMode(6,OUTPUT);//安全绿灯
   pinMode(A0,OUTPUT);//蜂鸣器

}


void keyscan()//按键扫描程序
{
  buttonstate=digitalRead(3);//读回按键状态,按下低电平
  if(buttonstate==LOW)
  {
      delay(8); //按键感觉不灵敏,可以修改下左右时间
      buttonstate=digitalRead(3);//再读一次,为了躲过按键抖动干扰
      if(buttonstate==LOW)
      {
        if(flag==0)//改变标志位
        {
          flag=1;
        }
        else
        {
          flag=0;
        }
        while(!digitalRead(3));//检测按键释放
      }
  }
}

void loop()
{
  keyscan();
  if(flag==0)
  {
    digitalWrite(5,LOW);//平时绿亮 红暗
    digitalWrite(6,HIGH);
  }
  else
  {
    digitalWrite(5,HIGH);
    digitalWrite(6,LOW);

    digitalWrite(A0,HIGH);
    delay(100);
    digitalWrite(A0,LOW);
    delay(50);
  }
}[/mw_shl_code]

作者: 爷灬淡定    时间: 2013-8-13 19:01
CCFIVE 发表于 2013-8-13 13:07
对应改改你接线,代码还可以优化下,自己尝试优化啦

不愧是大神啊,崇拜啊!!!{:soso_e179:}
我还有好多看不懂,毕竟是菜鸟啊,代码已收,慢慢学,慢慢看。
顺便这是我用我的水平写出来的代码。不知道视频怎么发。

//中间一边闪,一边叫的程序觉得这样有点麻烦,能不能用for 循环?

作者: 爷灬淡定    时间: 2013-8-13 19:01
void setup ()
 {
   pinMode(3,INPUT);//Check
   pinMode(5,OUTPUT);//Warn Led
   pinMode(6,OUTPUT);//Safe Led
   pinMode(1,OUTPUT);//Bee
 }
 void loop()
 {
   if(digitalRead(3)==LOW)
   {
     digitalWrite(6,LOW);  
   
     digitalWrite(5,HIGH);
     delay(150);
     digitalWrite(1,HIGH);
     delay(150);
     digitalWrite(5,LOW);
     delay(200);
     digitalWrite(1,LOW);
     delay(200);
      
       digitalWrite(5,HIGH);
     delay(150);
     digitalWrite(1,HIGH);
     delay(150);
     digitalWrite(5,LOW);
     delay(200);
     digitalWrite(1,LOW);
     delay(200);
     
      digitalWrite(5,HIGH);
     delay(150);
     digitalWrite(1,HIGH);
     delay(150);
     digitalWrite(5,LOW);
     delay(200);
     digitalWrite(1,LOW);
     delay(200);
     
       digitalWrite(5,HIGH);
     delay(150);
     digitalWrite(1,HIGH);
     delay(150);
     digitalWrite(5,LOW);
     delay(200);
     digitalWrite(1,LOW);
     delay(200);
     
     digitalWrite(5,HIGH);
     delay(150);
     digitalWrite(1,HIGH);
     delay(150);
     digitalWrite(5,LOW);
     delay(200);
     digitalWrite(1,LOW);
     delay(200);

   }
   else
     {
       digitalWrite(5,LOW) ;
       digitalWrite(6,HIGH);
       digitalWrite(1,LOW);
     }
   }


重发一遍




欢迎光临 创客联盟网 (https://immaker.org/) Powered by Discuz! X3.3