天天看點

arduino通過紅外遙控和蜂鳴器制作一個小鬧鐘程式

本人最近在學習arduino,利用空閑時間制作一些小程式來自娛自樂,也和大家一起交流分享

本次arduino遙控器控制全彩燈珠主要是用到兩個名為Timer庫和IRremote庫,你可以在https://download.csdn.net/download/m0_37738838/10645108下載下傳到這兩個庫檔案及下面提到的源碼案例。

#include "Timer.h"        //計時器頭檔案
Timer t;                //計時器對象
int PIN_RECV = ;      //紅外接收
int buzzer_pin=;     //蜂鳴器的pin
boolean buzzer_state=true;       //蜂鳴器狀态
boolean hours_state=false;      //小時設定
boolean minutes_state=false;   //分鐘設定
#include <IRremote.h>        //紅外頭檔案
IRrecv irrecv(PIN_RECV);   //pin設定為接收
decode_results results;  //解碼結果
long hours=;   //預設0小時
long minutes=; //預設十分鐘
long Ttime;    //定時總時間
int a=;  //count方法傳入個數
void setup()
{
    Serial.begin();
    irrecv.enableIRIn();           //開啟紅外
    pinMode(buzzer_pin,OUTPUT);   //設定蜂鳴器的pin為輸出模式
}
void loop()
{
    t.update();         //必須在loop中調用,它會服務于計時器相關的事件
    if (irrecv.decode(&results)) {
      Serial.print(results.value,HEX);
     switch(results.value)
    {
        //2
      case :
      setTime();//進入鬧鐘模式
        break;
    }
    irrecv.resume();
  }
}
void callbackfun(){
  boolean state = true;
  while(state){
        for(int i=;i<;i++)//輸出一個頻率的聲音
        {
            digitalWrite(buzzer_pin,HIGH);//發聲音
            delay();//延時1ms
            digitalWrite(buzzer_pin,LOW);
            delay();
        }
         for(int i=;i<;i++)//輸出另一個頻率的聲音,這裡的100與前面的80一樣,用來控制頻率,可以自己調節
        {
          digitalWrite(buzzer_pin,HIGH);
          delay();
          digitalWrite(buzzer_pin,LOW);
          delay();
        }
        if (irrecv.decode(&results)) {
          if(results.value==) {
            state=false;
          }
        }
}
}
void  setTime(){            //unsigned long 0-4,294,967,295
  boolean settime_state = true; //定時狀态

   while(settime_state){
          if (irrecv.decode(&results)) {
                 switch(results.value){
                    //*
                  case :Hours();break;
                    //#
                  case :Minutes();break;
                    //OK
                  case :StarClock();settime_state = false;break;
                }
          irrecv.resume();
    }
   }
}
void Hours(){   //小時
  Serial.println();
  boolean hours_state = true; 
  while(hours_state){
        if (irrecv.decode(&results)) {
          switch(results.value){
               //1
            case :hours=;break;
              //2 
            case :hours=;break;
              //3
            case :hours=;break;
              //4
            case :hours=;break;
              //5
            case :hours=;break;
              //6
            case :hours=;break;
              //7
            case :hours=;break;
              //8
            case :hours=;break;
              //9
            case :hours=;break;
              //0
           case :hours=;break;
           //OK
           case :hours_state = false;break;
          }
    irrecv.resume();
     }
  }
    Serial.println();
}
void Minutes(){    //分鐘
  boolean minutes_state = true; 

  while(minutes_state){
     if (irrecv.decode(&results)) {
          switch(results.value){
                  //1
                case :count();break;
                  //2 
                case :count();break;
                  //3
                case :count();break;
                  //4
                case :count();break;
                  //5
                case :count();break;
                  //6
                case :count();break;
                  //7
                case :count();break;
                  //8
                case :count();break;
                  //9
                case :count();break;
                  //0
               case :count();break;
                //OK
               case :minutes_state = false;a=;break;
          }
    irrecv.resume();
     }
  }
}
void StarClock(){       //開始定時
  Ttime = hours+minutes;
 t.after(Ttime,callbackfun);   //1000mm=1s   60000=1min;
 Serial.println(Ttime);
 Serial.println();

}
void count(int num){
  Serial.println(num);
  if(a==){minutes =  * num;a++;}    
  else if(a==){int shi =minutes* ;int ge = *num; minutes = shi + ge;a++;}  
  Serial.println(minutes);
}


           

我的紅外接收引腳是D2,蜂鳴器信号引腳是D8。要準備好一個紅外接收子產品,一個紅外遙控器,一個蜂鳴器以及一張arduino闆。

使用定時鬧鐘時,先按下遙控器2,進入鬧鐘設定功能,按下*鍵則設定時鐘時間,将我們要設定的時間0~9遙控輸入,按下OK鍵表示确定,接下來設定分鐘時間,按下#鍵後将我們要設定的時間0~9遙控輸入,按下OK鍵表示确定,最後确認按下OK,這樣arduino開始執行我們的定時鬧鐘的程式啦

當然因為我們的遙控器版本不一樣,是以大家首先先将自己的遙控器編碼輸出來,修改一下紅外接收部分的代碼便可用啦,如果我們想在更好玩一點,可以在蜂鳴器上花點心思,通過音樂的節拍來設計蜂鳴器的聲響,這樣就更有意思了

繼續閱讀