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 |
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.
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
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.
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 |
|
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
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.