iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 12
2
Modern Web

Webduino 不只是物聯網,智慧插座也可以很 Modern~系列 第 12

實戰智慧插座 12 - 碰到水就開燈 ( 土壤濕度偵測 )

在前兩篇「開關」的介紹,都是使用「兩個裝置以上」進行連動,這其實是相當便利的,因為在傳統的 Arduino 世界裡,要做到同時多個裝置連動十分困難,但如果我們把這些裝置以及上頭的零件,透過 Webduino 的協助,變成都以「網頁變數」的型態來操作,相對就簡單許多

這邊會繼續用「兩個裝置」來進行連動,以下將會透過「土壤濕度偵測計」來偵測土壤濕度,當濕度到達一定程度的時候就亮燈,其實因為原理是控制繼電器,所以其實我們可以把燈泡換成水泵,就變成濕度不夠的時候就自動澆水。( 參考:https://webduino.io/tutorials/tutorial-36-pump.html )



土壤濕度偵測計

一開始看到土壤濕度偵測計,溼度的偵測原理其實是透過「導電度」,也就是兩支金屬探針之間的導電度,因此一般如果中間的介質只有空氣,導電度應該就是 0 ( 有時候空氣濕度太高,可能就會是 0.X 之類的 )。
Webduino 土壤濕度偵測

因為土壤濕度真偵測計回傳的是類比訊號,所以接線的方法要把 S 的腳位接在類比腳 ( A 開頭 ),+ 接 VCC,- 接 GND。
Webduino 土壤濕度偵測

這裏先打開 Webduino Blockly 編輯工具測試 ( https://blockly.webduino.io ),放入開發板,輸入手邊裝置的 ID,放入土壤濕度偵測的積木,設定開始偵測並顯示偵測數值。
Webduino 土壤濕度偵測

執行之後,如果用手去按壓 ( 一根手指同時觸碰兩隻探針 ) ,就會發現數值往上升高。
Webduino 土壤濕度偵測

這時候就可以拿一個水杯,把土壤濕度偵測計插到水裡,就可以測出相對應的數值。( 數值基本上不可能到 100,因為 100 表示導電度百分之百,除非你拿一條電線把兩隻探針接起來就可以 )



Webduino 程式用法

接著我們來看一下土壤濕度偵測計在 JavaScript 有哪些可以用的方法,土壤濕度的宣告使用 getSoil,注意這邊接的 pin 腳數字是「類比腳」,也就是在開發板上面有「A」( Analog ) 開頭的腳位,例如接在 A3 後面數字就填 3。

soil = getSoil(board, 3);

開始偵測的用法如下,使用 .on 以及 callback 實作,callback 帶一個參數,這個參數就是土壤濕度所偵測到的數值。

soil.on(function(val){
});

如果要停止偵測,使用 .off() 即可。

soil.off();


網頁控制

開始控制之前要先接線,一塊裝置開發板接土壤濕度偵測計 ( 腳位 A3 ),另一塊裝置接智慧插座 ( 腳位 10 ),其實不一定要這樣做,用同一塊開發板也可以完成,只是用兩塊更能凸顯「Wi-Fi」操控的能力,對於土壤偵測來說也比較合理,畢竟花盆擺在陽台上,燈泡在室內是比較正常的狀況。
Webduino 土壤濕度偵測

HTML 的部分先在自己的網頁內引入「 webduino-min.js 」還有「 webduino-blockly.js 」這兩個 JavaScript,這樣我們才有操控開發板以及土壤偵測的 API 可以使用,在 body 的區域放入一個 h2 來顯示一些文字訊息,然後放入兩張燈泡一明一暗的圖片,讓偵測到訊號的時候,網頁上的燈泡也會發生反應。

<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
  <title>Webduino</title>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
  <script src="https://webduino.io/components/webduino-js/dist/webduino-all.min.js"></script>
  <script src="https://blockly.webduino.io/webduino-blockly.js"></script>
</head>

<body>
  <h2 id="show"></h2>
  <img src="http://example.oxxostudio.tw/it2016/it2016-day05-on.jpg" id="on">
  <img src="http://example.oxxostudio.tw/it2016/it2016-day05-off.jpg" class="show" id="off">
</body>
</html>

CSS 的部分就只是寫個簡單的控制燈泡圖片有沒有出現而已。

img{
  display:none;
}
.show{
  display:block;
}

JavaScript 的說明就直接寫在程式碼裡頭,一開始的 a 變數做為確認兩塊開發板同時上線,其他大概就是宣告土壤濕度、LED、圖片之類的變數。

$(function(){

  var soil,
      led,
      $show=$('#show'),
      $on = $('#on'), 
      $off = $('#off'),
      a = 0;

  //設定第一塊裝置接智慧插座燈泡
  boardReady('裝置 1 的 ID', function (board) {
    board.systemReset();
    board.samplingInterval = 250;
    led = getLed(board, 10); //設定 LED 為 10 號腳
    a = a+1;
    if(a===2){
      allReady(); //確認兩塊板子都上線了就執行
    }
  });

  //設定第二塊裝置接按鈕開關
  boardReady('裝置 2 的 ID', function (board) {
    board.systemReset();
    board.samplingInterval = 250;
    soil = getSoil(board, 3); //設定 土壤偵測 為 A3 號腳
    a = a+1;
    if(a===2){
      allReady(); //確認兩塊板子都上線了就執行
    }
  });

  ////確認兩塊板子都上線了要執行的動作
  function allReady(){
    $show.text('偵測中...');
    soil.on(function(val){
      $show.text(val);
      if(val>10){
        led.on();
        $on.addClass('show');
        $off.removeClass('show');
      }else{
        led.off();
        $on.removeClass('show');
        $off.addClass('show');
      }
    });
  }

});

打開網頁之後,我們把偵測器放到水裡,就會看到燈泡亮起,離開水的時候燈泡就會熄滅,反之,如果是要做一個自動澆花器,就把邏輯相反就可以了 ( 類似說小於 30 就啟動水泵 )
Webduino 土壤濕度偵測

( 範例程式:http://bin.webduino.io/jaro/1/edit?html,js,output )



小結

目前土壤濕度偵測遇到最大的問題,或許就是「鏽蝕」與「非人為破壞」,畢竟雖然感測器都有鍍膜避免鏽蝕,但實際在田野栽種總是會遇到自然環境的侵蝕,而非人為破壞就更無解,例如來個颱風,或是野狗野貓的破壞都是在所難免,但如果是自己的植栽,或是溫室的栽種,應該就能把這些變數降低到最小。

參考資料


上一篇
實戰智慧插座 11 - 打造電流急急棒,碰三次就開燈!( 開關應用 )
下一篇
實戰智慧插座 13 - 用悠遊卡嗶一下就開燈 ( RFID )
系列文
Webduino 不只是物聯網,智慧插座也可以很 Modern~30

尚未有邦友留言

立即登入留言