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 |
|
|
1 |
Jordfuktighetssensor med komparator |
|
|
1 |
Temperatur- och luftfuktighetssensor - DHT11 |
|
|
1 |
Kopplingsdäck 165mm x 55mm |
|
|
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.



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


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.


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 |
|
|
1 |
Jordfuktighetssensor med komparator |
|
|
1 |
Temperatur- och luftfuktighetssensor - DHT11 |
|
|
1 |
Kopplingsdäck 165mm x 55mm |
|
|
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.