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

Vyžadovaná aplikace

AplikaceGoogle PlayAppStore
IoT Plant MonitorIoT Plant MonitorZatím nedostupné

Knihovny

KnihovnaVerzeDownload
WebSocket2.16.0GitHub

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ář!

Podobné příspěvky

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *