RED PLANTERNE MED ESP32 & IFTTT!

 

Kan du også formå at slå selv en kaktus ihjel? - så se med her! Dette lille projekt  kan sikre dig, at din plante derhjemme ikke visner fordi du glemmer at vande den. Projektet består af to sensorer, en der både måler temperatur og luftfugtighed og en anden sensor som kan måle jordfugtigheden. Ved at koble en ESP32 på sensorerne og samtidig op koble den til Wifi, kan vi vha. af ESP32'en sende notifikationer til telefonen vha IFTTT,  hvis den nedre grænseværdi på eksempelvis jordfugtigheden er nået.

Der vil være en Quick guide for dig som bare hurtigt vil i gang og har en masse erfaring med Arduino og sensorer. Men for dig som ønsker en mere udførlig guide og lidt hygge læsning så læs med efter indholdsfortegnelsen.

Kode kan hentes på GitHub. Det er skrevet i Platform IO, hvis du ønsker at kompilere i Arduino IDE, skal du blot kopierer det i main.cpp, som findes i src.

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

INDHOLDSFORTEGNELSE

 

For at kunne lave dette projekt skal du bruge nedenstående komponenter. De er alle at finde hos ebits.

Antal

Komponent

Link

1

ESP-WROOM-32

ESP-WROOM-32 Udviklingsboard – ebits.dk

1

Jordfugtighedssensor med komparator

Jord fugtighedssensor med komparator – ebits.dk

1

Temperatur og fugtighedsmåler - DHT11

Temperatur og fugtighedsmåler - DHT11 – ebits.dk

1

Fumlebræt 165mm x 55mm

Fumlebræt 165mm x 55mm – ebits.dk

1

120stk Dupont kabler 10cm

120stk Dupont kabler 10cm eller 20cm længde, 3 typer – ebits.dk

Eller
1 Red planterne Kit Red planterne Kit

TEST OG VALIDERING AF SENSORER

Nedenstående er en gennemgang af opsætning af sensorer og validering af aflæsningerne i seriel monitor.

DHT11

For at kunne aflæse værdier på DHT11 sensoren skal et bibliotek inkluderes i projektet. Det vil efter inkludering være muligt at blot gemme event.temperatur og event.humidity i variable.

#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;
JORDFUGTIGHEDSMÅLER

Opsætning af jordfugtighedsmåleren kræver blot at du kobler den til en GPIO hvor der er en ADC. Vi anvender analogread til at måle fugtigheden i jorden. ADC'en udskriver en værdi fra 0 - 4095. For at få omregnet det til procent kan nedenstående formel med fordel anvendes:

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

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

SAMLET SENSOR-FUNKTION()
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
    {}
}
UDSKRIVNING TIL SERIAL MONITOR

OPSÆTNING AF WIFI PÅ ESP32

Opsætning af wifi på ESP32 er ret enkel og der findes mange guides på youtube. Man bruger et biblitok og kalder nogle funktioner. Nedenstående løsning sørger for at time hvor lang tid du har forsøgt at oprette forbindelse, hvis det ikke er lykkedes inden 20 sekunder vil ESP32'en stoppe. Her er det altid muligt at skrive en reboot kommando ind.

STEP 1 - Biblioteker og definitioner:

Udskift her MITSSID og PASSWORD med dit netværksnavn og kode hertil.

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

STEP 2 - Oprettelse af funktion til oprettelse af forbindelse

Indsæt følgende funktion udenfor void loop og void setup. Når denne funktin kaldes oprettes der forbindelse til det netværk du har angivet i step 1. Når den har oprettet forbindelse vil den sågar udskrive IP-adressen på ESP32 hvis denne skal bruges i andre projekter.

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());
  }
}

STEP 3 - Kald af funktion

Funktionen ovenfor kaldes i void setup(). Samtidig kaldes serial.begin(baudrate), så vi kan aflæse der om der er oprettet fobindelse.

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

 

OPSÆTNING AF IFTTT

STEP 1 - Opsætning af IFTTT (If this)

Gå til My Applets - IFTTT, her opretttes en konto hvis ikke allerede du har en. Herefter trykkes der på Create i højre hjørne. Du vil blive præsenteret med me If this og then that. Her trykker du på add ved If then.

Søg herefter på webhooks og tryk på denne. 

Vælg herefter Receive a web request, og indskriv event_name eks. soil_sensor. Afslut med Create Trigger.

STEP 2 - Opsætning af IFTTT (then that)

Vælg nu Then That og tryk add. Søg nu på notifikationer, nedenstående til højre vil dukke op

Vælg nu Send a notification from the IFTTT app.

 

STEP 3 - Oprettelse af tekst med ønskede værdier

Du har nu mulighed for at skrive en tekst der sendes til din telefon. Det er muligt at udskrive trigger-navn, tre forskellige værdier du kan sende med og hvornår notifikationen er sendt. 

Under ses opsætningen jeg bruger

 

STEP 4 - Nøgle og api

For at kunne lave en HTTP-request skal vi bruge en unik nøgle og et link hvor vi sender trigger og de ønskede værdier. Det finde under dokumentationen for webhooks. nedenstående billede viser den unikke nøgle og api'en. Her er det også muligt at teste det med din telefon ved at trykke Test 

STEP 4 - Biblioteker og definitioner:

Ved String key = "nøgle". Skal du indskrive nøglen som du har fået i step 3. eventnavnet er op til dig.

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

STEP 5 - Oprettelse af funktion til kommunikation til webhooks :

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!");
}

STEP 6 - Kald af funktion

Her laver jeg et tjek på hvad værdien er på jordfugtigheden, hvis den er <= 30, kaldes IFFT_notifikation()-funktionen hvor de nødvendige værdier bliver sendt videre til IFTTT.

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

 Kompiler nu programmet og efterprøv 

TEST

Nedenstående test er udført ved at tage jordfugtigssensoren op af jorden for at sikre at fugtigheden kommer under de 30%, som er området den normalt trigger på. Notifikationen kommer kort efter på telefonen.

 

QUICK GUIDE

Komponenter du skal bruge til projektet:

Antal

Komponent

Link

1

ESP-WROOM-32

ESP-WROOM-32 Udviklingsboard – ebits.dk

1

Jordfugtighedssensor med komparator

Jord fugtighedssensor med komparator – ebits.dk

1

Temperatur og fugtighedsmåler - DHT11

Temperatur og fugtighedsmåler - DHT11 – ebits.dk

1

Fumlebræt 165mm x 55mm

Fumlebræt 165mm x 55mm – ebits.dk

1

120stk Dupont kabler 10cm

120stk Dupont kabler 10cm eller 20cm længde, 3 typer – ebits.dk

Kode

Kode kan hente på GitHub. Det er skrevet i Platform IO, hvis du ønsker at kompilere i Arduino IDE, skal du blot kopierer det i main.cpp, som findes 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;

Sensor funktion

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 indbygget timer der stopper med at forsøge oprettelse hvis der er gået mere end 20 sekunder. I den if-statement er det muligt at inskrive en handling, hvis der ønskes reboot el. lign.

#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 opsætning

På IFTTT.com, skal der anvendes webhooks og notifikationer. sørg for at huske på trigger navn og hvor mange værdier du udprinter. I dokumentationen skal du bruge den unikke nøgle og linket. 

#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

Nedenstående test er udført ved at tage jordfugtigssensoren op af jorden for at sikre at fugtigheden kommer under de 30%, som er området den normalt trigger på. Notifikationen kommer kort efter på telefonen.

 

Skriv kommentar!

Relevante produkter

TS101 digital loddekolbeTS101 digital loddekolbe i hånd
TS101 digital loddekolbe med USB C forsyning
Tilbudspris Fra 699,00 kr
1 på lager
TS80P USB-C Loddekolbe kitTS80P Loddekolbe
TS80P USB-C Loddekolbe kit
Tilbudspris 799,00 kr
11 på lager
bruge Loddekolbe Renser til at rengøre loddekolbespidsenLoddekolbe Renser
Luksus Loddekolbe renser
Tilbudspris 89,00 kr
5 på lager