2017年6月15日星期四

Arduino手机控制冷气,普通遥控空调变远程空调part1

所需材料

  • Arduino UNO
  • IR LED 需要的是發射端
  • Arduino_DY_IRDaikin 這是適用於Arduino的Library


  • 將紅外線發射LED接至Arduino PWM 脚3


    为了加强发射能力可以加NPN電路具有電流放大的功能,讓紅外線LED亮度可以達到最亮的程度讓搖控的範圍較大一點。

    下載 Arduino_DY_IRDaikin

    Arduino_DY_IRDaikin,這是將許多資訊整合後的版本給大金冷氣使用:

    下载并安装

    接下來就會開啟一個視窗並且會看到範例程式的內容:

    按下上傳(Upload)鍵上傳就完成基本動作。 首先解說一下範例程式,程式載入至Arduino開發版時,你開啟Arduino內建的Serial Monitor後,傳送New line(\nEnter)就能傳送開、關的遙控訊息至大金冷氣,此時你要確認一下大金冷氣是不是會有這樣的動作(發射正確、接收也正確時,大金冷氣會嗶嗶2聲),並且Serial Monitor也會看到訊息:

    Arduino_DY_IRDaikin Library

    最基本的遙控函數如下:
     on();
     setSwing_off();
     setMode(1);
     setFan(4);//FAN speed to MAX
     setTemp(25);
     //----everything is ok and to execute send command-----
     sendCommand();
    
    

    函數設計成當你所有的參數都設定完成時,再執行sendCommand()才會將資料轉成紅外線訊號出去,使用時必需要先在setup()中自行設定一組預設值,像上面的範例一樣,之後就能在loop()根據你的方式去變更,但一定要記住一點,你都變更完成時,一定要執行sendCommand(),否則紅外線訊號是不會發送的。

    2017年6月6日星期二

    Arduino 红外遥控解码方法

    红外接受管采用5V电压,需注意部分GND和VCC是对调通电如发烫立刻断开电源对调即可

    将Vout连接至DigitalPin 2 作为信号输入

    程式碼如下,也非常簡單,收到紅外線訊號後便輸出到序列埠。

    #include <IRremote.h>

    int RECV_PIN = 2; // 使用數位腳位2接收紅外線訊號
    IRrecv irrecv(RECV_PIN); // 初始化紅外線訊號輸入
    decode_results results; // 儲存訊號的結構


    void setup()
    {
      Serial.begin(115200);
      irrecv.blink13(true); // 設為true的話,當收到訊號時,腳位13的LED便會閃爍
      irrecv.enableIRIn(); // 啟動接收
    }

    void loop() {
      if (irrecv.decode(&results)) { // 接收紅外線訊號並解碼
        Serial.print("results value is "); // 輸出解碼後的資料
        Serial.print(results.value, HEX);
        Serial.print(", bits is ");
        Serial.print(results.bits);
        Serial.print(", decode_type is ");
        Serial.println(results.decode_type);
        irrecv.resume(); // 準備接收下一個訊號
      }
    }
    上传至Arduino UNO 然后按下键盘ctrl+shrift+M打开串口监视器

    然後,請拿著紅外線遙控器,對著紅外線接收器隨便按一些按鈕。 

    将获取的解码HEX 记录下来




    2017年6月1日星期四

    Arduino C语言常用語法

    一般会先做这几个重要步骤

    (1) Pin腳的宣告,

    (2) void setup (),//初始化

    (3) void loop ()//循环

    然後跟資料定義有關的:int, unsigned int, log, const, #define
    跟loop結構有關的:if...else架構,while迴圈,for迴圈




    int
    整數是基底資料型別,佔用2位元組。
    整數的範圍為-32,76832,767 -2^15 ~2^15)-1
    整數類型使用2的補數方式存儲負數。
    最高位元通常為符號位元,表示數的正負。
    其餘位被取反加1”(此處請參考補數相關資料,不再贅述)
    unsigned int
    unsigned int(無符號整型)與整型資料同樣大小,佔據2位元組。
    它只能用於存儲正數而不能存儲負數,範圍 0~65,535 (2^16) - 1)


    無符號整型和整型最重要的區別是它們的最高位元不同,既符號位元。
    Arduino整型類型中,如果最高位是1,則此數被認為是負數,
    剩下的15位為按2的補數計算所得值。

    long
    長整數型變數是擴展的數位存儲變數,它可以存儲32位元(4位元組)大小的變數,
    -2,147,483,6482,147,483,647


    const
    const關鍵字代表常數。
    它是一個變數限定詞,用於修改變數的性質,使其變為唯讀狀態。
    這表示該變數就像任何相同類型的其他變數一樣使用,但不能改變其值。
    如果嘗試為一個const變數賦值,編譯時將會報錯。
    const關鍵字定義的常數,遵守 variable scoping 管轄的其他變數的規則。
    這一點加上使用 #define 的易犯錯誤,使 const 關鍵字成為定義常量的一個的首選方法。
    #define
    #define它允許程式設計師在程式編譯之前給常數命名。
    Arduino中,定義的常數不會佔用晶片上的任何程式記憶體空間。
    在編譯時編譯器會用事先定義的值來取代這些常數。
    然而這樣做會產生一些副作用, 例如,一個已被定義的常量名已經包含在了其他常數名或者變數名中。 在這種情況下,程式內的常數將被 #defined 定義的數值或字串所取代。
    通常情況下,優先考慮使用 const 關鍵字替代 #define 來定義常數。
    例子
    #define ledPin 3
    //在編譯時,編譯器將使用數值 3 取代任何用到 ledPin 的地方。
    注意:
    #define 聲明後不能有分號。
    如果存在分號,編譯器會拋出語義不明的錯誤,甚至關閉程式。
    #define ledPin 3; //這是一種錯誤寫法
    同樣的,在 #define 聲明中包含等號也會產生語義不明的編譯錯誤從而導致關閉程式。
    #define ledPin = 3 //這是一種錯誤寫法

    if(條件判斷語句)和 ==!=<>(比較運算子)
    if 語句與比較運算子一起用於檢測某個條件是否達成,如某輸入值是否在特定值之上等。

    if 語句的語法是:
    if (someVariable > 50);
    {
      // 執行某些語句;
    }


    if / else
    if/else是比if更為高級的流程控制語句,它可以進行多次條件測試。 比如,檢測模擬輸入的值,當它小於500時該執行哪些操作, 大於或等於500時執行另外的操作。代碼如下:
    if (pinFiveInput < 500)
    {
      // 執行A操作;
    }
    else
    {
      // 執行B操作;
    }
    警告:
    此時該測試相關的執行語句塊將被運行,然後程式就跳過剩下的檢測, 直接執行到if/else的下一條語句。注意: 當所有檢測都為假時,若存在else語句塊,將執行預設的else語句塊。
    注意else if語句塊可以沒有else語句塊。else if分支語句的數量無限制。
    if (pinFiveInput < 500) {
      // 執行A操作;
    }
    else if (pinFiveInput >= 1000) {
      // 執行B操作;
    }
    else {
      // 執行C操作;
    }

    while迴圈
    while迴圈會無限的循環,直到括弧內的判斷語句變為假。
    必須要有能改變判斷語句的程式,要不然 while迴圈 將永遠不會結束。
    這在您的程式裡面表現為一個遞增的變數,或一個外部條件,如感測器的返回值。
    語法
    while(expression){
       //語句
    }
    參數
    expression:為真或為假的一個計算結果
    例子
    var = 0;
    while(var < 200){
      //重複一件事200
      var++
    }

    for迴圈
    for語句用於重複執行一段在花括弧之內的代碼。
    通常使用一個增量計數器計數並終止迴圈。
    for
    語句用於重複性的操作非常有效,通常與陣列結合起來使用來運算數據、針腳。
    for迴圈開頭有3個部分:
    for (初始化;條件;增量計數){
    //語句
    }
    初始化只在迴圈開始執行一次。
    每次迴圈,都會檢測一次條件;如果條件為真,則執行語句和增量計數
    之後再檢測條件。當條件為假時,迴圈終止。

    例子://PWM引腳將LED變暗
    int PWMpin = 10;            //將一個LED47Ω電阻串聯接在10
     void setup()    {               //無需設置
            }
     void loop()      {
            for (int i=0; i <= 255; i++){
            analogWrite(PWMpin, i);
            delay(10);
            }
    }
    程式設計提示
    1. 增量計數不只可以"++",還有其它做法,例如
     for(int x = 2; x < 100; x = x * 1.5)
    2. 另使用if for迴圈裡,可以產生持續反轉的效果。
            int x = 1;
            for (int i = 0; i > -1; i = i + x) {
                    analogWrite(PWMpin, i);
                    if (i == 255) x = -1;            
     // 在峰值轉變方向

            }

    继电器控制220V家电源码


    一个具体的应用例子,比如:用单片机去打开或关闭一个电压220V的电灯,由于单片机工作在5V, 而电灯是220V,因此需要由单片机控制一个继电器,通过控制这个继电器充当电灯的开关。


    继电器的输出回路一般有三个触点,中间的触点是动触点(公共端),其它两个触点是静触点。
    输入回路不通电时,动触点(公共端)总是和一个静触点断开(称为常开),与另一个静触点闭合(称为常闭)
    输入回路通电后,原来闭合的成断开状态。即:动触点(公共端)与和常开触点闭合,与常闭触点断开。


    1. int pinRelay = 3; //管脚D3连接到继电器模块的信号脚  
    2.   
    3. void setup() {  
    4.   pinMode(pinRelay, OUTPUT); //设置pinRelay脚为输出状态  
    5. }  
    6.   
    7. void loop() {   
    8.    digitalWrite(pinRelay, HIGH);//输出HIGH电平,继电器模块闭合  
    9.    delay(5000); //等待5000毫秒  
    10.   
    11.    digitalWrite(pinRelay, LOW);//输出LOW电平,继电器模块断开  
    12.    delay(8000); //等待8000毫秒  
    13. }