Návod: IoT monitoring rostlin pomocí XIAO ESP32C3 & aplikace Flutter
Zdroj: DIY Usthad
Dnes si představíme projekt IoT Plant Monitoring , který využívá novou vývojovou desku XIAO ESP32C od společnosti Seeed Studios. Úkolem desky je čtení dat senzoru vlhkosti a jejich následné odeslání do aplikace prostřednictvím WebSocket.
Cíl projektu
Cílem je dosáhnout toho, aby WebSocket server v XIAO ESP32C četl a kalibroval data získaná ze senzorů vlhkosti půdy, pH senzoru a teplotního senzoru, a aby tato data odesílal ve formátu JSON připojeným klientům, kdykoliv bude potřeba.
V tomto případě je klientem mobilní aplikace zabudovaná do Flutteru, která zvládne vícenásobné připojení přes WebSocket, a všechny informace zobrazí na řídicím panelu v grafickém rozhraní.
POZNÁMKA: V níže uvedeném příkladu je použitý pouze senzor vlhkosti půdy, protože ostatní senzory zatím nejsou dostupné.
Co to je WebSocket?
Jedná se o obousměrný, plně duplexní protokol, používaný pro komunikaci klient-server. Na rozdíl od HTTP WebSocket začíná ws:/ nebo wss:/. Protože se jedná o stavový protokol, spojení klienta a serveru zůstane aktivní, dokud se jeden z nich neodpojí. Po odpojení klienta nebo serveru je připojení obousměrně přerušeno.
Ukázkové video
Vyžadovaný hardware
- Seeed Studio XIAO ESP32C3
- Grove Shield pro Seeeduino XIAO
- Grove – Senzor vlhkosti
- Grove – Univerzální 20cm propojka (5 ks)
Vyžadovaná aplikace
Aplikace | Google Play | AppStore |
IoT Plant Monitor | IoT Plant Monitor | Zatím nedostupné |
Knihovny
Knihovna | Verze | Download |
WebSocket | 2.16.0 | GitHub |
Obvod
Protože používáme Grove Shield, stačí senzor jen připojit 😉
- Připájejte ke XIAO ESP32C3 pinheadery a vložte jej do Grove Shield.
- K první svorce připojte senzor vlhkosti půdy.
Programování Arduino
V níže uvedeném programu Arduino čteme analogovou hodnotu ze senzoru vlhkosti půdy a poté ji převádíme na řetězec JSON spolu s některými fiktivními hodnotami pro ostatní senzory a posíláme je všem připojeným klientům kdykoli, kdy požadují data.
Před nahráním programu na XIAO vývojovou desku změňte následující parametry:
- Na příslušném místě změňte Wi-Fi, SSID a heslo.
- Nainstalujte knihovnu WebSocket.
// IoT Plant Monitor
// by diyusthad.com
#include <WiFi.h>
#include <WebSocketsServer.h>
int sensorPin = A0;
int moistureSensorValue = 0;
const char* ssid = "YOUR WiFi SSID";
const char* password = "WiFi PASSWORD";
WebSocketsServer webSocket = WebSocketsServer(80);
// Called when receiving message from WebSocket client
void onWebSocketEvent(uint8_t num,
WStype_t type,
uint8_t * payload,
size_t length) {
switch (type) {
// Client has disconnected
case WStype_DISCONNECTED:
Serial.printf("[%u] Disconnected!\n", num);
break;
// New client has connected
case WStype_CONNECTED:
{
IPAddress ip = webSocket.remoteIP(num);
Serial.printf("[%u] Connection from ", num);
Serial.println(ip.toString());
}
// Send data back to client
case WStype_TEXT:
Serial.printf("[%u] Text: %s\n", num, payload);
readSensor(num);
break;
// For everything else: do nothing
case WStype_BIN:
case WStype_ERROR:
case WStype_FRAGMENT_TEXT_START:
case WStype_FRAGMENT_BIN_START:
case WStype_FRAGMENT:
case WStype_FRAGMENT_FIN:
default:
break;
}
}
void setup() {
// Start Serial port
Serial.begin(115200);
// Connect to access point
Serial.println("Connecting");
WiFi.begin(ssid, password);
while ( WiFi.status() != WL_CONNECTED ) {
delay(500);
Serial.print(".");
}
// Print IP address
Serial.println("Connected!");
Serial.print("My IP address: ");
Serial.println(WiFi.localIP());
// Start WebSocket server and assign callback
webSocket.begin();
webSocket.onEvent(onWebSocketEvent);
}
void readSensor(int num) {
moistureSensorValue = analogRead(sensorPin); //Read analog data from the sensor
int mapvalue = map(moistureSensorValue, 1100, 2700, 0, 100); // map the value
String mapMoistureSensorValue = String(mapvalue); // convert the value to string
// convert the string to JSON formate
// I have used dummy values for temperature, humidity and pH
String json = "{\"water_level\":";
json += mapMoistureSensorValue;
json += ",\"temperature\":0.5,\"humidity\":0.7,\"ph\":0.2}";
webSocket.sendTXT(num, json); //send data to client
}
void loop()
{
webSocket.loop();
}
Přidání rostliny
Krok 1: Nainstalujte aplikaci IoT Plant Monitor
Krok 2: Přidejte rostlinu
Po úspěšné instalaci se aplikace automaticky otevře. Pro přidání nové rostliny klikněte na tlačítko „Add plant“ ve spodní části domovské obrazovky.
Zadejte název rostliny a IP adresu vývojové desky XIAO, kterou získáte ze sériového monitoru Arduino. Poté zadejte port (v našem případě je to 80) a stiskněte tlačítko „Add“.
Po přidání rostliny se rostlina zobrazí na hlavní obrazovce. Rostlin je možné přidat neomezené množství. Pokud chcete změnit časový interval obnovy dat z kontroléru, tuto možnost najdete v nastavení. Vstoupí v platnost od příštího restartu.
Odebrání rostliny
Pokud chcete rostlinu odstranit, klikněte na 3 tečky v pravém horním rohu karty dané rostliny a vyberte možnost „Delete“.
Zajímavý tip
Desky od společnosti Seeed jsou jedním z nejpovedenějších klonů Arduina. V jiném článku na našem blogu jsme se zaměřili na desku Seeeduino Lotus, kterou jsme využili v projektu zabývajícím se měřením hladiny vody. Podívejte se zde!
Závěr
Jednoduché, že? Napadá vás, jak celý systém vylepšit a přidat nové funkce? Neváhejte nám dát zpětnou vazbu a zanechat zde svůj komentář!