Vælg land og sprog
Sprog
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 |
|
|
1 |
Jordfugtighedssensor med komparator |
|
|
1 |
Temperatur og fugtighedsmåler - DHT11 |
|
|
1 |
Fumlebræt 165mm x 55mm |
|
|
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 |
Nedenstående er en gennemgang af opsætning af sensorer og validering af aflæsningerne i seriel monitor.

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;
Opsætning af jordfugtighedsmåleren tilsluttes en egnet ADC-indgang. Sensorudgangen skal holde sig inden for ESP32-indgangens tilladte spænding; tilslut aldrig en 5V-udgang direkte. På klassisk ESP32 bør ADC1 bruges sammen med WiFi. analogRead giver i dette 12-bit-eksempel en rå værdi fra 0–4095. Formlen nedenfor giver kun en omvendt skala på 0–100, ikke kalibreret jordfugtighed i procent. Kalibrér tør/våd-reference i den aktuelle jord, og tilpas tærsklen:
//Soil sensor
#define sensorPin 36
int soil_sensor, output_value;
float output_value_pct;
$${Output\_value\_pct=100-((\frac{soil\_sensor}{4095.00})*100)}$$
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
{}
}

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.
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
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());
}
}
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();
}
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 nu Then That og tryk add. Søg nu på notifikationer, nedenstående til højre vil dukke op


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.


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

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";
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!");
}
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
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.
Komponenter du skal bruge til projektet:
|
Antal |
Komponent |
Link |
|
1 |
ESP-WROOM-32 |
|
|
1 |
Jordfugtighedssensor med komparator |
|
|
1 |
Temperatur og fugtighedsmåler - DHT11 |
|
|
1 |
Fumlebræt 165mm x 55mm |
|
|
1 |
120stk Dupont kabler 10cm |
120stk Dupont kabler 10cm eller 20cm længde, 3 typer – ebits.dk |
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;
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
{}
}
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());
}
}
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!");
}
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.
Sprog