Image of eBits Academy airquality illustration

Rädda växterna med ESP32 & IFTTT!

  • September 07, 2021
  • |
  • Jesper Nielsen

 

Lyckas du till och med ta död på en kaktus? Ta en titt! Detta lilla projekt kan hjälpa dig att undvika att växten vissnar för att du glömmer vattna den. Det använder två sensorer: en som mäter både temperatur och luftfuktighet och en annan som mäter jordfuktighet. Genom att ansluta en ESP32 till sensorerna och WiFi kan ESP32 skicka aviseringar till telefonen med IFTTT, exempelvis när jordfuktigheten når en nedre gräns.

Det finns en snabbguide för erfarna Arduino- och sensoranvändare som vill komma igång direkt. För en utförligare guide och lite trevlig läsning fortsätter du efter innehållsförteckningen.

Ladda ned koden från GitHub. Den är skriven i Platform IO. För att kompilera i Arduino IDE kopierar du innehållet i main.cpp som finns i src.

GitHub:  GitHub - Mowglli/1.-ESP32-IFTTT

INNEHÅLL

 

För att bygga projektet behöver du komponenterna nedan. Alla finns hos eBits.

Antal

Komponent

Länk

1

ESP-WROOM-32

ESP-WROOM-32 utvecklingskort – ebits.dk

1

Jordfuktighetssensor med komparator

Jordfuktighetssensor med komparator – ebits.dk

1

Temperatur- och luftfuktighetssensor - DHT11

Temperatur- och luftfuktighetssensor - DHT11 – ebits.dk

1

Kopplingsdäck 165mm x 55mm

Kopplingsdäck 165mm x 55mm – ebits.dk

1

120 st. Dupont-kablar, 10cm

120 st. Dupont-kablar, 10cm eller 20cm långa, 3 typer – ebits.dk

Eller
1 Rädda växterna-kit Rädda växterna-kit

TESTA OCH KONTROLLERA SENSORERNA

Nedan går vi igenom sensorinställning och kontroll av avläsningarna i Serial Monitor.

DHT11

För att läsa värden från DHT11-sensorn inkluderar du ett bibliotek i projektet. Därefter kan event.temperatur och event.humidity sparas i variabler.

#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>

//DHT11 sensor
#define DHTPIN 23                 // Digital pin forbundet til  DHT11 sensor 
#define DHTTYPE    DHT11          // I biblioteket DHT skal vi definere type
DHT_Unified dht(DHTPIN, DHTTYPE);
uint32_t delayMS;
JORDFUKTIGHETSSENSOR

Denna jordfuktighetssensor ansluts till en lämplig ADC-ingång. Sensorutgången måste ligga inom ESP32-ingångens tillåtna spänning; anslut aldrig en 5V-utgång direkt. På klassisk ESP32 bör ADC1 användas med WiFi. I detta 12-bitarsexempel ger analogRead ett råvärde från 0–4095. Formeln nedan ger bara en omvänd skala på 0–100, inte kalibrerad jordfuktighet i procent. Kalibrera torr/våt-referenser i den aktuella jorden och anpassa tröskeln:

//Soil sensor
#define sensorPin 36
int soil_sensor, output_value;
float output_value_pct;

$${Output\_value\_pct=100-((\frac{soil\_sensor}{4095.00})*100)}$$

GEMENSAM SENSORFUNKTION()
void sensors(){
  float temp;
  int hum;

   sensors_event_t event;
  //print adc udlæsning:
   Serial.print(F("ADC-aflæsning(0 - 4095)"));
   Serial.println(analogRead(sensorPin));

    //Udregn til procent 0% er tør, 100% er vådt
    soil_sensor = analogRead(sensorPin);
    //output_value  =  (soil_sensor / 4095.00);
    output_value_pct =  (100 - ( (soil_sensor/4095.00) * 100 ) );
    Serial.print(F("Jorfugtighed: "));
    Serial.print(output_value_pct);
    Serial.println(F("%"));

  dht.temperature().getEvent(&event);
  if (isnan(event.temperature)) {
    Serial.println(F("Fejl ved aflæsning af temperatur!"));
  }
  else {
    Serial.print(F("Temperatur: "));
    Serial.print(event.temperature);
    Serial.println(F("°C"));
  }
  temp = event.temperature;
 
  dht.humidity().getEvent(&event);
  if (isnan(event.relative_humidity)) {
    Serial.println(F("Fejl ved aflæsning af Fugtighed!"));
  }
  else {
    Serial.print(F("Fugtighed: "));
    Serial.print(event.relative_humidity);
    Serial.println(F("%"));
  }
    hum = event.relative_humidity;
  Serial.println("");

    if(output_value_pct <= 30 ) // hvis under 30 pct, sendes der besked til telefon
    {
      IFFT_notifikation(output_value_pct, hum, temp);
    }
    else
    {}
}
SKRIV UT TILL SERIAL MONITOR

WIFI-INSTÄLLNING PÅ ESP32

Att ställa in WiFi på ESP32 är enkelt och det finns många guider på YouTube. Du använder ett bibliotek och anropar några funktioner. Lösningen nedan mäter hur länge anslutningsförsöket pågått; om det inte lyckats inom 20 sekunder stoppar ESP32 försöket. Du kan lägga till ett omstartskommando här.

STEG 1 - Bibliotek och definitioner:

Ersätt MITSSID och PASSWORD med ditt nätverksnamn och lösenord.

#include <WiFi.h>
//Wifi info
#define WIFI_NETWORK "SSID"
#define WIFI_PASSWORD "PASSWORD"
#define WIFI_TIMEOUT_MS 20000 //20 ms

STEG 2 - Skapa anslutningsfunktionen

Lägg denna funktion utanför void loop och void setup. När den anropas ansluter den till nätverket som anges i steg 1. Efter anslutning skriver den även ut IP-adressen för ESP32 om du behöver den i andra projekt.

void connectToWiFi(){
  Serial.print("Connecting to Wifi..");
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_NETWORK, WIFI_PASSWORD);

  unsigned long startAttempTime = millis();

  while(WiFi.status() !=WL_CONNECTED && millis()- startAttempTime < WIFI_TIMEOUT_MS){
    Serial.print(".");
    delay(100);
  }
  if(WiFi.status() !=WL_CONNECTED){
    Serial.println("Failed!");
    //En genstart kan sættes her
  }
  else{
    Serial.println(" ");
    Serial.print("Connected to Wifi with IP: ");
    Serial.println(WiFi.localIP());
  }
}

STEG 3 - Anropa funktionen

Anropa funktionen ovan i void setup(). Anropa även serial.begin(baudrate) så att du kan se om anslutningen lyckades.

void setup() {
  //Initialiser serial monitor
  Serial.begin(9600);
  //Initialiser Wifi
  connectToWiFi();
}

 

IFTTT-INSTÄLLNING

STEG 1 - Ställ in IFTTT (If This)

Gå till My Applets - IFTTT, och skapa ett konto om du inte redan har ett. Klicka sedan på Create i högra hörnet. Du ser If This och Then That. Klicka på add vid If This.

Sök efter webhooks och välj det. 

Välj sedan Receive a web request, och  ange ett event_name, exempelvis soil_sensor. Avsluta med Create Trigger.

STEG 2 - Ställ in IFTTT (Then That)

Välj nu Then That och klicka på add. Sök nu efter aviseringar, så visas alternativet längst ned till höger

Välj nu Send a notification from the IFTTT app.

 

STEG 3 - Skapa text med önskade värden

Nu kan du skriva texten som skickas till telefonen. Den kan innehålla triggernamnet, tre olika värden som du skickar och tidpunkten då aviseringen skickades. 

Nedan visas inställningen jag använder

 

STEG 4 - Nyckel och API

För att göra en HTTP-förfrågan behöver vi en unik nyckel och en länk dit triggern och önskade värden skickas. De finns i dokumentationen för Webhooks. Bilden nedan visar den unika nyckeln och API:et. Du kan också testa med telefonen genom att klicka på Test 

STEG 4 - Bibliotek och definitioner:

Vid String key = "nøgle" anger du nyckeln från steg 3. Välj själv händelsenamnet.

#include <HTTPClient.h>
//IFFT setup
String key = "key"; //nøgle
String event_name= "soil_moisture_email";

STEG 5 - Skapa funktionen för Webhooks-kommunikation:

void IFFT_notifikation(float value1,int value2,float value3){
HTTPClient http;
http.begin("https://maker.ifttt.com/trigger/"+event_name+"/with/key/"+key+"?value1="+value1+"&value2="+value2+"&value3="+value3+"");
http.GET();
http.end();
Serial.print("Notifikation sendt!");
}

STEG 6 - Anropa funktionen

Här kontrollerar jag jordfuktighetsvärdet. Om det är <= 30 anropas IFFT_notifikation(), som skickar de nödvändiga värdena till IFTTT.

    if(output_value_pct <= 30) //hvis under eller lig med 30 sendes notifikation
    {
      IFFT_notifikation(output_value_pct, hum, temp);
    }
    else
    {}

 Kompilera nu programmet och testa det 

TEST

Testet nedan gjordes genom att lyfta jordfuktighetssensorn ur jorden så att avläsningen hamnar under triggergränsen på 30%. Aviseringen kommer till telefonen strax efteråt.

 

SNABBGUIDE

Komponenter som behövs för projektet:

Antal

Komponent

Länk

1

ESP-WROOM-32

ESP-WROOM-32 utvecklingskort – ebits.dk

1

Jordfuktighetssensor med komparator

Jordfuktighetssensor med komparator – ebits.dk

1

Temperatur- och luftfuktighetssensor - DHT11

Temperatur- och luftfuktighetssensor - DHT11 – ebits.dk

1

Kopplingsdäck 165mm x 55mm

Kopplingsdäck 165mm x 55mm – ebits.dk

1

120 st. Dupont-kablar, 10cm

120 st. Dupont-kablar, 10cm eller 20cm långa, 3 typer – ebits.dk

Kod

Ladda ned koden från GitHub. Den är skriven i Platform IO. För att kompilera i Arduino IDE kopierar du innehållet i main.cpp som finns i  src.

GitHub:  GitHub - Mowglli/1.-ESP32-IFTTT

#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>

//DHT11 sensor
#define DHTPIN 23                 // Digital pin forbundet til  DHT11 sensor 
#define DHTTYPE    DHT11          // I biblioteket DHT skal vi definere type
DHT_Unified dht(DHTPIN, DHTTYPE);
uint32_t delayMS;

//Soil sensor
#define sensorPin 36
int soil_sensor, output_value;
float output_value_pct;

Sensorfunktion

void sensors(){
  float temp;
  int hum;

   sensors_event_t event;
  //print adc udlæsning:
   Serial.print(F("ADC-aflæsning(0 - 4095)"));
   Serial.println(analogRead(sensorPin));

    //Udregn til procent 0% er tør, 100% er vådt
    soil_sensor = analogRead(sensorPin);
    //output_value  =  (soil_sensor / 4095.00);
    output_value_pct =  (100 - ( (soil_sensor/4095.00) * 100 ) );
    Serial.print(F("Jorfugtighed: "));
    Serial.print(output_value_pct);
    Serial.println(F("%"));

  dht.temperature().getEvent(&event);
  if (isnan(event.temperature)) {
    Serial.println(F("Fejl ved aflæsning af temperatur!"));
  }
  else {
    Serial.print(F("Temperatur: "));
    Serial.print(event.temperature);
    Serial.println(F("°C"));
  }
  temp = event.temperature;
 
  dht.humidity().getEvent(&event);
  if (isnan(event.relative_humidity)) {
    Serial.println(F("Fejl ved aflæsning af Fugtighed!"));
  }
  else {
    Serial.print(F("Fugtighed: "));
    Serial.print(event.relative_humidity);
    Serial.println(F("%"));
  }
    hum = event.relative_humidity;
  Serial.println("");

    if(output_value_pct <= 30 ) // hvis under 30 pct, sendes der besked til telefon
    {
      IFFT_notifikation(output_value_pct, hum, temp);
    }
    else
    {}

}

 WiFi-funktion

Funktionen har en timer som stoppar anslutningsförsök efter 20 sekunder. Du kan lägga till en åtgärd i den if-satsen, exempelvis omstart.

#include <WiFi.h>
//Wifi info
#define WIFI_NETWORK "SSID"
#define WIFI_PASSWORD "PASSWORD"
#define WIFI_TIMEOUT_MS 20000 //20 ms
void connectToWiFi(){
  Serial.print("Connecting to Wifi..");
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_NETWORK, WIFI_PASSWORD);

  unsigned long startAttempTime = millis();

  while(WiFi.status() !=WL_CONNECTED && millis()- startAttempTime < WIFI_TIMEOUT_MS){
    Serial.print(".");
    delay(100);
  }
  if(WiFi.status() !=WL_CONNECTED){
    Serial.println("Failed!");
    //En genstart kan sættes her
  }
  else{
    Serial.println(" ");
    Serial.print("Connected to Wifi with IP: ");
    Serial.println(WiFi.localIP());
  }
}

IFTTT-inställning

På IFTTT.com använder du Webhooks och aviseringar. Kom ihåg triggernamnet och hur många värden du skickar. Du behöver den unika nyckeln och länken från dokumentationen. 

#include <HTTPClient.h>
//IFFT setup
String key = "key"; //nøgle
String event_name= "soil_moisture_email";
void IFFT_notifikation(float value1,int value2,float value3){
HTTPClient http;
http.begin("https://maker.ifttt.com/trigger/"+event_name+"/with/key/"+key+"?value1="+value1+"&value2="+value2+"&value3="+value3+"");
http.GET();
http.end();
Serial.print("Notifikation sendt!");
}

TEST

Testet nedan gjordes genom att lyfta jordfuktighetssensorn ur jorden så att avläsningen hamnar under triggergränsen på 30%. Aviseringen kommer till telefonen strax efteråt.

 

Lämna en kommentar

Observera att kommentarer måste godkännas innan de publiceras.