2016年6月23日 星期四

[Arduino] DIY窮人版的日光自動感應捲簾

每年夏天的早上都會被無情的陽光給剌醒,很不甘願的爬起來拉下窗簾,然後繼續爬回去睡,但這樣總是覺得很麻煩,於是發揮Maker的精神,自己來DIY一個自動感應日光的遮陽捲簾,也可以按下手動鍵,改成手動控制捲簾上升或下降,準備材料如下

光線感應器(其實就是光敏電阻啦)


 捲簾的馬達(360度的伺服馬達)

 不想要的arduino lenonardo(難用)

紅外線反射感應器(也叫循跡感應器)裝在下方當成捲簾下降的極限位置

窗子中間放光線感應器用來感應白天或晚上

上方的紅外線感應器,裝在上方當成捲簾上升的極限位置

控制器部份

5V/2A電源模組

手動控制按鍵

程式如下
#include <Servo.h>
#define DownIRsensor 6         //下降的極限位置(紅外線感應pin腳)
#define UpIRsensor 4           //上升的極限位置(紅外線感應pin腳)
#define DayNightSensor 7       //光敏電阻信號讀取腳位
#define AutoManual 8           //Auto=0, Manual=1
#define ManualUp 11            //手動上升捲簾
#define ManualDown 10         //手動下降捲簾

Servo myservo;


bool debug = 1;
bool AutoFlag = 1;  //AutoFlag = 0代表手動, AutoFlag = 1代表自動

unsigned char action_times = 0xFF;
unsigned char last_action_times = action_times;
bool ManualUpPressed = 0, ManualDownPressed = 0;

void setup() {
  pinMode(DownIRsensor, INPUT);
  pinMode(UpIRsensor, INPUT);
  pinMode(AutoManual, INPUT);             //Auto=0, Manual=1
  pinMode(DayNightSensor, INPUT);
  digitalWrite(DayNightSensor, HIGH);
  pinMode(ManualUp, INPUT);
  pinMode(ManualDown, INPUT);
  pinMode(13, OUTPUT);
  Serial.begin(9600);
}

void loop() {

  if (AutoFlag) {
    if (digitalRead(AutoManual) == 0) {
      action_times = 0x01;
    }
    else if (digitalRead(DayNightSensor) == 0) { //代表白天
      action_times = 0x04;
    }
    else if (digitalRead(DayNightSensor) == 1) { //代表晚上
      action_times = 0x05;
      }
    else {
      action_times = 0xFF;
    }
  }
  else {
    if (digitalRead(AutoManual) == 0) {
      action_times = 0x01;
    }
    else if (digitalRead(ManualUp) == 0 && ManualDownPressed == 0) {    //捲簾上升
      action_times = 0x02;
    }
    else if (digitalRead(ManualDown) == 0 && ManualUpPressed == 0) {    //捲簾下降
      action_times = 0x03;
    }
    else {
      action_times = 0xFF;
    }
  }

  if (action_times != last_action_times) {
    last_action_times = action_times;
    if (action_times == 0x01) {                         //手動或自動
      AutoFlag = !AutoFlag;
      if (AutoFlag) {
        myservo.detach();
        ManualUpPressed = 0;
        ManualDownPressed = 0;
        digitalWrite(13, LOW);
        if (debug) {
          Serial.println("Switch to Auto Mode");
        }
      }
      else {
        digitalWrite(13, HIGH);
        if (debug) {
          Serial.println("Switch to Manual Mode");
        }
      }
    }
    else if (action_times == 0x02) {            //手動上升按鍵程序
      ManualUpPressed = !ManualUpPressed;
      if (ManualUpPressed) {
        myservo.attach(9);                       //連接servo
        myservo.write(180);                      //捲簾上升
        if (debug) {
          Serial.println("Electric Shutter is going up...");
        }
      }
      else {
        myservo.detach();
        if (debug) {
          Serial.println("Electric Shutter is stop");
        }
      }
    }
    else if (action_times == 0x03) {            //手動下降按鍵程序
      ManualDownPressed = !ManualDownPressed;
      if (ManualDownPressed) {
        myservo.attach(9);                       //連接servo
        myservo.write(0);                        //捲簾下降
        if (debug) {
          Serial.println("Electric Shutter is going down...");
          delay(500);
        }
      }
      else {
        myservo.detach();
        if (debug) {
          Serial.println("Electric Shutter is stop");
     
        }
      }
    }
    else if (action_times == 0x04) {              //白天處理程序
      if (debug) {
        Serial.println("Now is day...");
      }
      if (digitalRead(DownIRsensor) == 1) {
        myservo.attach(9);                       //連接servo
        myservo.write(0);                        //捲簾下降
        do {
          if (debug) {
           Serial.println("Electric Shutter is going down...");
       
          }
        } while (digitalRead(DownIRsensor) == 1);
      }
      if (debug) {
        Serial.println("down Electric Shutter is stop...");
      }
      myservo.detach();
    } // EOF- 0x04
    else if (action_times == 0x05) {              //晚上處理程序
      if (debug) {
        Serial.println("Now is night...");
      }
      if (digitalRead(UpIRsensor) == 0) {
        myservo.attach(9);                    
        myservo.write(180);                  
        do {
          if (debug) {                      
            Serial.println("Electric Shutter is going up...");
         
          }
        } while (digitalRead(UpIRsensor) == 0);
      }
      if (debug) {
        Serial.println("Up Electric Shutter is stop...");
      }
   
      myservo.detach();
    } // EOF- 0x05
  }

} // EOF- Loop

實際操作影片

37 則留言:

  1. 我是新手請問可以提供 所有的套件、零件名稱嗎?
    好想做

    回覆刪除
    回覆
    1. 這需要花時間整理一下...

      刪除
    2. 麻煩版主有機會能整理出來,自己也好想DIY^^

      刪除
    3. 可以先看看程式, 程式沒問題了, 接線很快的

      刪除
  2. 是否也可以提供接線的方式

    謝謝

    回覆刪除
    回覆
    1. 這個也要花時間畫圖, 我目前是憑空想像做的...XD

      刪除
    2. 憑空想像就這樣厲害....佩服佩服

      刪除
  3. 材料篇請看這裡http://nhs-tw.blogspot.tw/2016/06/arduino-electricshutter1.html

    回覆刪除
  4. 請問板主是如何讓伺服馬達與捲簾齒輪咬合的?
    我也像做這類控制,但是不知道如何讓與伺服馬達結合控制

    回覆刪除
    回覆
    1. 你好, 我把有齒輪的那一邊換掉, 換上我自己用3D印表機印的零件, 直接和伺服馬達結合, 不用多此一舉用原來捲簾的齒輪, 簡單好用快速, 你可以試試看

      刪除
    2. 感謝板主回覆~
      原本也是希望可以直接與捲簾齒輪結合,但是應該沒辦法直接與伺服馬達直接咬合吧?
      其實我也還沒直接購買捲簾來觀察他的齒輪機構,所以想說先跟您請益看看~~

      刪除
    3. 我下班回家後拍給你看,你就懂了

      刪除
    4. 啊...這blog不能貼照片, 你寄mail給我, 我再把照片寄給你看

      刪除
    5. 我也想研究如何讓齒輪與伺服馬達結合控制, 可以分享給我嗎??謝謝

      刪除
    6. 我已po上照片和簡單說明, 請點下列連結
      http://nhs-tw.blogspot.com/2018/10/arduino-diy.html

      刪除
  5. Sorry~~~前幾天剛好在忙~~一直沒回來這邊看
    urmgand35@gmail.com
    麻煩囉~~~謝謝!!

    回覆刪除
  6. 版主
    請問如果想加入arduino藍芽模組
    有程式嗎?

    回覆刪除
  7. 可以請問您的紅外線極限開關怎麼寫的嗎?

    回覆刪除
    回覆
    1. 上面已有程式啊...而且後來覺得用紅外線不好, 太陽太大反射時, 會誤動作, 改用時間計算可能比較好...

      刪除
  8. 作者已經移除這則留言。

    回覆刪除
  9. 板主大大 這是我的gmail vincent52078@gmail.com 有些問題想請教你 希望能和我聯絡一下 謝謝~~~

    回覆刪除
  10. 板主大大我有幾個問題想問,已發email了,謝謝~

    回覆刪除
  11. 可以用esp8266ex D1的模組來做嗎

    回覆刪除
  12. 有半開的程式,有的話怎麼改
    可以自動感光讓窗簾開關嗎??
    希望有更詳細的解說
    感謝版主

    回覆刪除
  13. 有半開的程式,有的話怎麼改
    可以自動感光讓窗簾開關嗎??
    希望有更詳細的解說
    感謝版主

    回覆刪除
  14. 你好我想做光感窗簾,用的是伺服馬達,但不會打程式,可以請教你程式嗎??

    回覆刪除
  15. 能拜託版主提供電路圖嗎?因為對線路實在不太懂但又想動手做一個出來,感恩版主

    回覆刪除
  16. 版主請問我用的MG996R 好像是不可以控制角度的,請問你用的也是嘛,如果用不可控角度的,要怎麼定義開或關或者是轉多久 ,版主可以私訊你嗎

    回覆刪除
  17. 請問版主大大有接線圖嗎

    回覆刪除
  18. 版主有接線圖嗎謝謝

    回覆刪除
  19. 版主~可以給接線圖嗎~

    回覆刪除

歡迎大家來討論交流一下~~~