Det kommer en Snabbguide för dig som bara vill komma igång snabbt och har mycket erfarenhet av Arduino och sensorer. Men för er som vill ha en mer detaljerad guide och lite njutbar läsning, läs med efter innehållsförteckningen.
Koden är tillgänglig på GitHub. Det är skrivet i Platform IO, om du vill kompilera i Arduino IDE är det bara att kopiera det i main.cpp som finns i src.
GitHub: GitHub - Mowgli/1.-ESP32-IFTTT
INNEHÅLLSFÖRTECKNING
För att göra detta projekt behöver du komponenterna nedan. De kan alla hittas på ebits.
siffra |
Komponent |
Länk |
1 |
ESP-WROOM-32 |
|
1 |
Jordfuktighetssensor med komparator |
|
1 |
Temperatur- och luftfuktighetsmätare - DHT11 |
|
1 |
Fumble board 165mm x 55mm |
|
1 |
120 st Dupont kablar 10cm |
120 st Dupont-kablar 10cm eller 20cm längd, 3 typer – ebits.se |
TESTNING OCH VALIDERING AV SENSORER
Nedan finns en genomgång av hur man ställer in sensorerna och validerar avläsningarna i den seriella monitorn.
DHT11
För att kunna läsa värden på DHT11 -sensorn måste ett bibliotek ingå i projektet. Efter inkludering kommer det att vara möjligt att helt enkelt lagra händelse.temperatur och händelse.fuktighet i variabler.
# include <Adafruit_Sensor.h>
# inkluderar <DHT.h>
# inkluderar <DHT_U.h>
//DHT11 sensor
# define DHTPIN 23 // Digital pin ansluten till DHT11-sensor
# define DHTTYPE DHT11 // I biblioteket DHT måste vi definiera typ
DHT_Unified dht(DHTPIN, DHTTYPE);
uint32_t delayMS;
JORDFUKTSMÄTARE
Att ställa in jordfuktighetsmätaren kräver helt enkelt att du ansluter den till en GPIO där det finns en ADC. Vi använder analog avläsning för att mäta fukten i jorden. ADC:n skriver ut ett värde från 0 - 4095. För att omvandla det till en procentsats kan följande formel med fördel användas:
//Jordsensor
# definiera sensorPin 36
int soil_sensor, output_value;
float output_value_pct;
$${Output\_value\_pct=100-((\frac{jord\_sensor}{4095.00})*100)}$$
TOTAL SENSORFUNKTION()
void sensors(){
flytande temp;
int hum;
sensors_event_t händelse;
//skriv ut ADC-utgång:
Seriell . print (F( "ADC-läsning(0 - 4095)" ) );
Seriell . println ( analogRead (sensorPin));
//Beräkna till procent 0% är torr, 100% är våt
soil_sensor = analogRead (sensorPin);
//output_value = (jordsensor / 4095.00);
output_value_pct = ( 100 - ((jordsensor/ 4095.00 ) * 100 ));
Seriell . print (F( "Markfuktighet: " ));
Seriell . print (output_value_pct);
Seriell . println (F( "%" ));
dht.temperature().getEvent(&event);
if (isnan(händelse.temperatur)) {
Seriell . println (F( "Fel vid läsning av temperatur!" )) ;
}
annat {
Seriell . print (F( "Temperatur: " ));
Seriell . print (händelse.temperatur);
Seriell . println (F( "°C" ));
}
temp = händelse.temperatur;
dht.humidity().getEvent(&event);
if (isnan(event.relative_humidity)) {
Seriell . println (F( "Fel vid läsning av fuktighet!" )) ;
}
annat {
Seriell . print (F( "Fuktighet: " ));
Seriell . print (event.relative_humidity);
Seriell . println (F( "%" ));
}
hum = händelse.relativ_fuktighet;
Seriell . println ( "" );
if (output_value_pct <= 30 ) // om under 30 procent skickas meddelandet till telefonen
{
IFFT_notification(output_value_pct, hum, temp);
}
annat
{}
}
UTSKRIFT TILL SERIEÖVERVAKNING
INSTÄLLNING AV WIFI PÅ ESP32
Att sätta upp wifi på ESP32 är ganska enkelt och det finns många guider på youtube. Du använder ett bibliotek och anropar vissa funktioner. Lösningen nedan ser till att tajma hur länge du har försökt upprätta en anslutning, om det inte har lyckats inom 20 sekunder stannar ESP32 . Här är det alltid möjligt att ange ett omstartskommando.
STEG 1 - Bibliotek och definitioner:
Ersätt här MITSID och LÖSENORD med ditt nätverksnamn och kod.
# include <WiFi.h>
//Wifi-information
# definiera WIFI_NETWORK "SSID"
# definiera WIFI_PASSWORD "LÖSENORD"
# definiera WIFI_TIMEOUT_MS 20000 //20 ms
STEG 2 - Skapande av anslutningsskapande funktion
Infoga följande funktion utanför void loop och void setup. När denna funktion anropas upprättas en anslutning till nätverket du angav i steg 1. När den har upprättat en anslutning kommer den till och med att skriva ut IP-adressen för ESP32 om den ska användas i andra projekt.
void connectToWiFi(){
Seriell . print ( "Ansluter till Wifi.." ) ;
WiFi .mode(WIFI_STA);
Wi-Fi . börja (WIFI_NETWORK, WIFI_PASSWORD);
unsigned long startAttempTime = millis ();
while ( WiFi .status() !=WL_CONNECTED && millis ()- startAttempTime < WIFI_TIMEOUT_MS){
Seriell . print ( "." );
fördröjning ( 100 );
}
if ( WiFi .status() !=WL_CONNECTED){
Seriell . println ( "Mislyckades!" );
//En omstart kan ställas in här
}
annat {
Seriell . println ( " " );
Seriell . print ( "Ansluten till Wifi med IP: " );
Seriell . println ( WiFi . localIP ());
}
}
STEG 3 - Anrop av funktion
Funktionen ovan anropas in void setup(). Samtidigt anropas serial.begin(baudrate), så att vi där kan läsa om en fo-anslutning har upprättats.
void setup () {
//Initiera seriell monitor
Seriell . börja ( 9600 );
//Initiera Wifi
connectToWiFi();
}
INSTÄLLNING AV IFTTT
STEG 1 - Konfigurera IFTTT (om detta)
Gå till Mina applets - IFTTT , skapa ett konto här om du inte redan har ett. Tryck sedan på Skapa i det högra hörnet. Du kommer att presenteras för mig om detta och då. Här trycker du på lägg till bredvid Om då.
Sök sedan efter webhooks och tryck på denna.
STEG 2 - Konfigurera IFTTT (då det)
Välj sedan Then That och tryck på lägg till. Sök nu efter aviseringar, nere till höger visas
STEG 3 - Skapande av text med önskade värden
Du har nu möjlighet att skriva en text som skickas till din telefon. Det är möjligt att skriva ut triggernamnet, tre olika värden du kan skicka med och när 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 vi skickar triggern och de önskade värdena. Du hittar den under dokumentationen för webhooks. bilden nedan visar den unika nyckeln och api. Här är det även möjligt att testa den med din telefon genom att trycka på Testa
STEG 4 - Bibliotek och definitioner:
At String key = "key". Måste du ange nyckeln som du fick i steg 3. Eventets namn är upp till dig.
# include <HTTPClient.h>
//IFFT-inställning
String nyckel = "nyckel" ; //nyckel
String event_name= "jordfuktighetspost" ;
STEG 5 - Skapande av funktion för kommunikation till webhooks:
void IFFT_notification( flytvärde1 , int värde2, flytvärde3 ){
HTTPClient http;
http. börja ( "https://maker.ifttt.com/trigger/" +event_name+ "/with/key/" +key+ "?value1=" +value1+ "&value2=" +value2+ "&value3=" +value3+ "" );
http.GET();
http. än ();
Seriell . print ( "Meddelande skickat!" );
}
STEG 6 - Anrop av funktion
Här kollar jag vad värdet är på markfuktigheten, om den är <= 30 anropas funktionen IFFT_notification() där de nödvändiga värdena skickas till IFTTT.
if (output_value_pct <= 30 ) //om under eller lika med 30 meddelande skickas
{
IFFT_notification(output_value_pct, hum, temp);
}
annat
{}
Kompilera nu programmet och testa
TESTA
Testet nedan utförs genom att ta markfuktighetssensorn från marken för att säkerställa att luftfuktigheten sjunker under 30 %, vilket är det intervall som den normalt utlöser. Aviseringen kommer kort därefter på telefonen.
SNABB GUIDE
Komponenter du behöver för projektet:
siffra |
Komponent |
Länk |
1 |
ESP-WROOM-32 |
|
1 |
Jordfuktighetssensor med komparator |
|
1 |
Temperatur- och luftfuktighetsmätare - DHT11 |
|
1 |
Fumble board 165mm x 55mm |
|
1 |
120 st Dupont kablar 10cm |
120 st Dupont-kablar 10cm eller 20cm längd, 3 typer – ebits.se |
Koda
Koden kan laddas ner från GitHub. Det är skrivet i Platform IO, om du vill kompilera i Arduino IDE är det bara att kopiera det i main.cpp som finns i src.
GitHub: GitHub - Mowgli/1.-ESP32-IFTTT
# include <Adafruit_Sensor.h>
# inkluderar <DHT.h>
# inkluderar <DHT_U.h>
//DHT11 sensor
# define DHTPIN 23 // Digital pin ansluten till DHT11-sensor
# define DHTTYPE DHT11 // I biblioteket DHT måste vi definiera typ
DHT_Unified dht (DHTPIN, DHTTYPE) ;
uint32_t delayMS;
//Jordsensor
# definiera sensorPin 36
int soil_sensor, output_value;
float output_value_pct;
Sensorfunktion
void sensors(){
flytande temp;
int hum;
sensors_event_t händelse;
//skriv ut ADC-utgång:
Seriell . print (F( "ADC-läsning(0 - 4095)" ) );
Seriell . println ( analogRead (sensorPin));
//Beräkna till procent 0% är torr, 100% är våt
soil_sensor = analogRead (sensorPin);
//output_value = (jordsensor / 4095.00);
output_value_pct = ( 100 - ((jordsensor/ 4095.00 ) * 100 ));
Seriell . print (F( "Markfuktighet: " ));
Seriell . print (output_value_pct);
Seriell . println (F( "%" ));
dht.temperature().getEvent(&event);
if (isnan(händelse.temperatur)) {
Seriell . println (F( "Fel vid läsning av temperatur!" )) ;
}
annat {
Seriell . print (F( "Temperatur: " ));
Seriell . print (händelse.temperatur);
Seriell . println (F( "°C" ));
}
temp = händelse.temperatur;
dht.humidity().getEvent(&event);
if (isnan(event.relative_humidity)) {
Seriell . println (F( "Fel vid läsning av fuktighet!" )) ;
}
annat {
Seriell . print (F( "Fuktighet: " ));
Seriell . print (event.relative_humidity);
Seriell . println (F( "%" ));
}
hum = händelse.relativ_fuktighet;
Seriell . println ( "" );
if (output_value_pct <= 30 ) // om under 30 procent skickas meddelandet till telefonen
{
IFFT_notification(output_value_pct, hum, temp);
}
annat
{}
}
Wifi funktion
Funktionen har en inbyggd timer som slutar försöka skapa om det har gått mer än 20 sekunder. I if-satsen är det möjligt att ange en åtgärd om en omstart etc. önskas. Ekv.
# include <WiFi.h>
//Wifi-information
# definiera WIFI_NETWORK "SSID"
# definiera WIFI_PASSWORD "LÖSENORD"
# definiera WIFI_TIMEOUT_MS 20000 //20 ms
void connectToWiFi(){
Seriell . print ( "Ansluter till Wifi.." ) ;
WiFi .mode(WIFI_STA);
Wi-Fi . börja (WIFI_NETWORK, WIFI_PASSWORD);
unsigned long startAttempTime = millis ();
while ( WiFi .status() !=WL_CONNECTED && millis ()- startAttempTime < WIFI_TIMEOUT_MS){
Seriell . print ( "." );
fördröjning ( 100 );
}
if ( WiFi .status() !=WL_CONNECTED){
Seriell . println ( "Mislyckades!" );
//En omstart kan ställas in här
}
annat {
Seriell . println ( " " );
Seriell . print ( "Ansluten till Wifi med IP: " );
Seriell . println ( WiFi . localIP ());
}
}
IFTTT-inställning
På IFTTT.com måste webhooks och aviseringar användas. se till att du kommer ihåg utlösarens namn och hur många värden du skriver ut. I dokumentationen måste du använda den unika nyckeln och länken.
# include <HTTPClient.h>
//IFFT-inställning
String nyckel = "nyckel" ; //nyckel
String event_name= "jordfuktighetspost" ;
void IFFT_notification (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 ( "Meddelande skickat!" );
}
TESTA
Testet nedan utförs genom att ta markfuktighetssensorn från marken för att säkerställa att luftfuktigheten sjunker under 30 %, vilket är det intervall som den normalt utlöser. Aviseringen kommer kort därefter på telefonen.