打造 IoT 應用程式 (三) | 動手做,隨時監控植物幫他澆水🌱

Morris Lu
SoftChef Blog_CN
Published in
7 min readNov 3, 2019

是否忙碌到忘記澆花?人在國外植物怎麼辦?

我是澆水控看到植物就想澆才不管濕度呢!

上一篇文章,提到了 MESH 智慧積木,而在他們 Projects 頁面中看到一個有興趣的小專案。

盆栽自動澆水裝置

看到這個自動澆水裝置,我在想是否也能實作出一樣的功能,並結合 sensor.live 讓專案能更完整。一開始,我想串連開發板及濕度感測器,並連結抽水馬達讓使用者可以隨時澆水。

第一階段預計完成的情境:

  • 利用土壤濕度感測器偵測數值
  • 隨時檢視濕度
  • 使用者控制澆水開關

在這之前,我準備了這些

  • Wemos D1 mini 開發板
  • 土壤濕度感測器
  • 繼電器
  • 麵包板
  • 抽水馬達(含水管)

同事 Jared 的文章中提及 Blynk App 簡化串連開發板的流程,只需將範例程式燒入後開啟 Blynk App,即可控制開關或取得感測器數值。

第一階段我使用 Blynk App 確認板子是否正常運作,確認能收到感測器的數值及控制抽水馬達開關。

串接設備 Wemos D1 mini、土壤濕度感測器

板子接上 micro USB 電源(來自電腦),感測器對應 5v, G, A0 接腳

Wemos D1 mini 是基於 ESP-8266 的開發板,能透過 Arduino 的 IDE 來開發程式燒入至板子,以及有 Wi-Fi 模組可使用。濕度感測器能將數值回傳至板子上。

人家 Anna 介紹的這麼詳細,我們也來使用看看吧✌️

依照 Blynk 的流程,開啟 Arduino IDE,選擇 Blynk 的範例程式碼後燒入至板子上。以下是範例中的程式碼,只需要將 Wi-Fi 的名稱、密碼以及註冊後會收到的 Blynk Auth Token 填入。

#define BLYNK_PRINT Serial#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "YourAuthToken";
// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "YourNetworkName";
char pass[] = "YourPassword";
void setup()
{
Serial.begin(9600);Blynk.begin(auth, ssid, pass);
}
void loop()
{
Blynk.run();
}
這時點選 ➡ 上傳,將程式燒入至板子上。

那麼來到手機 Blynk App 上,我們需要一個 Value Display Widget 用來顯示感測器的數值。

輸入的接腳選取 A0,其餘使用預設。
順利的話,剛剛加入的 Value Display 已經能顯示數值了

咦!我剛剛有寫程式嗎?

對硬體不太了解的我,很驚訝 Blynk 將硬體與 App 的串連如此易懂,從以上的流程我們都尚未開始寫程式的邏輯就能取得數值,如果你接上一個 LED 燈,也能加入開關 Widget 來控制亮滅。

好像蠻好玩的!再來串連抽水馬達吧!

確認能讀取感測器的數值後,我們需要連接繼電器作為抽水馬達的開關,同樣的在 Blynk App 中加入 Button Widget,這邊繼電器我選擇 D1 接腳當作控制的開關,馬達需要 3.5–9v 的輸入,所以接上板子的 5v 作為電源。

當然可以加入一些判斷邏輯,依照濕度直接開關抽水。

#include <time.h>
#define relayPin D1
int sensorValue;
BlynkTimer timer;
void sendSensor() {
sensorValue = analogRead(A0);
Serial.println(digitalRead(D1));
if (sensorValue > 500) {
digitalWrite(relayPin, HIGH);
Serial.println("Relay is turned on.");
} else {
digitalWrite(relayPin, LOW);
Serial.println("Relay is turned off.");
}
}
void loop() {
Blynk.run();
timer.run();
}
void setup() {Serial.begin(9600);
setClock();
timer.setInterval(1000L, sendSensor);
Blynk.begin(auth, ssid, pass);

}
void setClock() {
configTime(3 * 3600, 0, "pool.ntp.org", "time.nist.gov");
Serial.print("Waiting for NTP time sync: ");
time_t now = time(nullptr);
while (now < 8 * 3600 * 2) {
delay(500);
Serial.print(".");
now = time(nullptr);
}
Serial.println("");
struct tm timeinfo;
gmtime_r(&now, &timeinfo);
Serial.print("Current time: ");
Serial.print(asctime(&timeinfo));
}

作為自己想要監控植物,Blynk 已經實現了:

  • 遠端監控植物土壤濕度
  • 控制抽水馬達開關即時為植物澆水

但作為一個產品,不同植物可能需要各自濕度標準,澆水設備是否能主動提醒我濕度不足了?

結合 sensor.live,這些都可以做到

  • 當設備連網後自動化建立設備在雲端
  • 當濕度低於標準,發送推播提醒使用者是否澆水
  • 針對不同植物,有不同的濕度設定
  • 儲存濕度及澆水的歷史數據
  • 取得歷史數據列表,並用圖表方式呈現
  • 使用者認列設備,管理人員才能幫植物澆水

第一次嘗試串接硬體,如有錯誤或資訊不足的地方請一定要告訴我。

下一篇我們繼續使用這些設備並結合 sensor.live 來完成以上需求,實現更完整的管理植物應用程式,我們下次見哦!

--

--