2016年5月24日 星期二

Arduino 路燈自動開關--使用LinkIt Smart 7688 Duo

Arduino  路燈自動開關 --使用LinkIt Smart 7688 Duo  

****注意 LinkIt 7688 Duo 在 Arduino IDE 1.6.9 有問題 Arduino IDE 要用1.6.7***** 

      小雪幼兒園都使用Grove 套件 + LinkIt Smart 7688 Duo


本實驗使用材料 :

LinkIt Smart 7688 Duo   X  1
Grove - Light Sensor       X  1
Grove - OLED Display   X  1
Grove - Relay                  X 1
Grove 7688 Duo 底座    X 1
LinkIt Smart 7688 Duo  X1


Light Sensor 接在 A0 OLED Display 接在 I2C  Relay 接在 D5




      光感應器Light Sensor 最常應用在路燈或庭園燈自動開關上當白天光線較亮就將燈關閉 當光線較暗時就將燈開啟。從Light Sensor讀取的數據最大為630用手遮在上方時讀取的數據200~400為了實驗方便臨界值就設為250用if 來判斷Light Sensor讀取的數據大於250燈就關閉Light Sensor讀取的數據小於250燈就開啟

        
/*********以下為程式**************/

  #include <Wire.h>
  #include <SeeedOLED.h>
  #define LIGHT_SENSOR  A0      // Light Sensor 接在 A2

void setup()
{

  pinMode(5, OUTPUT);                 //設定 Pin5 為輸出
  Wire.begin();              
  SeeedOled.init();                    //初始化 OLED
  SeeedOled.setNormalDisplay();      //設定 OLED 正常顯示
  SeeedOled.setPageMode();           //設定 OLED 為頁模式
  SeeedOled.clearDisplay();           //清除OLED

   }
void loop()
{

    int sensorValue = analogRead(LIGHT_SENSOR);  //感測器的值 = 類比輸入腳的值

    if(sensorValue < 250)          // 如果感測器的值小於250
    digitalWrite(5, 1);            //將燈打開

    else                          //如果不是
    digitalWrite(5, 0);           //將燈關閉
    
    SeeedOled.setTextXY(0,0);              //OLE 游標移至 0,0
    SeeedOled.putString("The analog is ");  //顯示字元 The analog is
    SeeedOled.setTextXY(2,0);              //OLE 游標移至 2,0
    SeeedOled.putFloat(sensorValue);        //顯示 感測器的值
    
}




        但上面這程式以一個臨界值做判斷當Light Sensor讀取的數據剛好在250附近變動時燈就會有閃爍現象 這時就要用兩個臨界值來修正

      下面這程式 當Light Sensor讀取的數據低於250時燈會開啟,當燈開啟後一直要到Light Sensor讀取的數據高於 280 時燈才會關閉

      Light Sensor 會顯示於OLED用手慢慢遮住Light Sensor直到Light Sensor讀取的數據低於250燈就會開啟,開啟後再慢慢移開當Light Sensor讀取的數據高於280燈才會關閉

/*********以下為程式**************/

 #include <Wire.h>
 #include <SeeedOLED.h>
 #define LIGHT_SENSOR A0      // Light Sensor 接在 A2

void setup()
{

  pinMode(5, OUTPUT);                 //設定 Pin5 為輸出
  Wire.begin();            
  SeeedOled.init();                    //初始化 OLED
  SeeedOled.setNormalDisplay();      //設定 OLED 正常顯示
  SeeedOled.setPageMode();           //設定 OLED 為頁模式
  SeeedOled.clearDisplay();           //清除OLED

   }
void loop()
{

    int sensorValue = analogRead(LIGHT_SENSOR);  //感測器的值 = 類比輸入腳的值

    if(sensorValue < 250)          // 如果感測器的值小於250
    digitalWrite(5, 1);            //將燈打開

    else if (sensorValue > 280)    //如果不是且感測器的值大於280
    digitalWrite(5, 0);           //將燈關閉
 
    SeeedOled.setTextXY(0,0);              //OLE 游標移至 0,0
    SeeedOled.putString("The analog is ");  //顯示字元 The analog is
    SeeedOled.setTextXY(2,0);              //OLE 游標移至 2,0
    SeeedOled.putFloat(sensorValue);        //顯示 感測器的值
 
}

if-else 函數

if...else       如果 .. 否則....

        例 : 如果"好天氣" 就 "出門玩"否則就 "在家" 

if  (好天氣)     // 條件成立會做下面這件事條件不成立會執行 else
 出門玩
else                //if 條件不成立時會執行下面這件事
 在家

      if 需要條件執行,當然 else 也可以有條件執行 例如 : 如果"好天氣" 就 "出門玩"天氣不好又有500塊就 "吃麥當勞" ,兩個都不成立就當作沒說過

  if  (好天氣)     // 條件成立會做下面這件事,條件不成立會執行 else
 出門去玩
  else if (有500塊)              //else條件成立時會執行下面這件事
  吃麥當勞



參考資料 : 聯發科創意實驗室                    http://home.labs.mediatek.com/?lang=zh-hans
                     Seeed Technology Co., Ltd      http://www.seeedstudio.com/depot/
                    Arduino LLC                              https://www.arduino.cc/

沒有留言:

張貼留言