Pflanzenwächter für die Fensterbank Teil 4 – Temperatur und Luftfeuchtigkeitsmessung - AZ-Delivery

Hallo en welkom bij een ander deel van de plant watcher serie.


Vandaag zullen we een 2 in 1 milieusensor doneren aan de plantenmonitor, evenals een aantal optimalisaties van de (LED) hardware en de code implementeren. De sensor die we in dit deel aansluiten is de bekende DHT 22 temperatuur- en vochtigheidssensor. Naast bodemvocht kan onze plantenmonitor nu ook de omgevingsparameters van temperatuur en vochtigheid vastleggen, die belangrijk zijn voor planten in uw omgeving. Uiteraard zullen we onze mobiele app ook op de juiste manier uitbreiden. Allereerst maken we een verandering in het schakelen van de LED's.

We gebruiken de KY-016 LED RGB module en sluiten deze direct aan als volgt:
Rood op pin 0, groen op pin 15 en blauw op pin.

Voordelen van deze module zijn, aan de ene kant, besparen we ruimte wanneer geïnstalleerd in een behuizing ( 1/ 3 van de behuizing ruimte) , maar hebben ook het volledige RGB spectrum van kleuren via PWM controle van de individuele kanalen, zodat meer dan oorspronkelijk slechts 3 staten kunnen worden weergegeven.
(De LED wordt nu bijvoorbeeld in het wit verlicht tijdens de initialisatiefase). Last but not least redden we onszelf de weerstanden, omdat ze al geïntegreerd zijn op de module. De pinnen waarop de RGB LED's zijn aangesloten op de ESP32 zijn geselecteerd volgens het criterium "geschikt voor het timen van niet-kritieke hardware". De achtergrond is dat de pinnen waarop de LED is aangesloten, firmware voorwaardelijk trillen tijdens een systeem herstart (PWM) voordat ze worden geïnitialiseerd, en dus niet geschikt voor het timen van kritieke hardware (zoals de DHT22).


Er is ook een verandering in de manier waarop het LED-display werkt en hoe het wordt weergegeven: omdat we slechts één en niet zes RGB LED's hebben om de statistieken van de voogd weer te geven, moeten we de belangrijkste informatie erover samenvatten.


Hiervoor gebruiken we de volgende overweging: Voor ons is de belangrijkste informatie of een van de maximaal 6 planten moet worden besproeid of niet. Dit betekent dat dit in één oogopslag duidelijk moet zijn. Om dit te doen, herdefiniëren we de kleur groen (voldoende vochtigheid) zodat alle 6 planten genoeg vocht hebben om een "groen" display te krijgen. Dus als een van de zes sensoren minder dan 50% bodemvocht detecteert, springt ons display naar "geel". Op minder dan 10% op "rood". Dus we weten dat we moeten beginnen met onze plant directeur APP om uit te vinden welke van de zes planten moeten worden bewaterd. Aangezien de temperatuur- en vochtigheidssensor DHT 22 3,3 V-pin en logicacompatibel is, sluiten we deze rechtstreeks aan op poort 4 van de ESP's. Hier ziet u de volledige verbinding:

 Deel 4 - Structuur

 

De huidige onderdelen lijst met de vereiste hardware onderdelen. (Met verwijzingslink)

 

Nummer

Beschrijving

Opmerking

1

DHT 22

 

 

DHT 11

Alternatief voor DHT 22

1

KY-016 LED RGB-module

 

1

ESP-32 Dev Kit C

 

6

Bodemvochtsensormodule V1.2

 

1

MB102-voedingsadapter

Voor breadboard setup

12

Opnieuw duurzaam volgens de beschrijving

 

 

In plaats van de eerste genoemde DHT 22 sensor, kan de goedkopere DHT 11 sensor worden gebruikt door simpelweg de lijn "DHTTYPE DHT22" aan te passen. De DHT 11 is echter niet zo nauwkeurig als de DHT 22.

Hier de verschillen tussen de twee sensoren zijn ook weer te lezen.

Als de DHT 11 Senor moet worden gebruikt, moet de lijn

#define DHTTYPE DHT22

Inch

#define DHTTYPE DHT11

worden gewijzigd. Verdere wijzigingen zijn niet nodig.

 

De ESP32 van de pintoewijzing is als volgt

ESP32-pincode

Gebruiken

Opmerking

4

DHT-sensorinvoer

 

0

RGB LED-PINCODE

Rode

15

RGB LED-PINCODE

Groene

14

RGB LED-PINCODE

Blauwe

 

Dit waren al de nodige hardwarewijzigingen. Om de DHT22/DHT 11 sensor met zijn eigen Wire Protocol in onze schets te kunnen gebruiken, moeten we nog twee bibliotheken in onze IDE naast.

Aan de ene kant is dit de meest populaire "Adafruit Unified Sensor Libary" : evenals de werkelijke DHT-sensorbibliotheek. Beide bibliotheken bouwen op elkaar voort en moeten worden toegevoegd aan onze IDE-bibliotheken zoals ze nodig zijn door ons project.

Na het toevoegen van de bibliotheken en het aanpassen van de parameters in de code, zoals in de Deel 3 in deze serie, beschreven uploaden we de volgende code naar ons ESP:

 

#include <Stuurprogramma/Adc.H>
#include <Wifi.H>
#include <WiFiClient.H>
#include <BlynkSimpleEsp32.H>
#include "EEPROM.h"
#include <Voorkeuren.H>
#include "DHT.h"    VEREIST de volgende Arduino-bibliotheken:
- DHT Sensor Bibliotheek: https://github.com/adafruit/DHT-sensor-library
- Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor

Poort edefinition RGP LED-module
#define LED_Rot     0     Rode LED 
#define LED_Blau    14    Blauwe LED
#define LED_Gruen   15    Gruene LED

LED PWM-instellingen
#define PWMfreq PWMfreq 5000  5 Khz basisfrequentie voor LED-display
#define PWMledChannelA  0
#define PWMledChannelB  1
#define PWMledChannelC  2
#define PWM-resolutie  8 8-bits resolutie voor LED PWM

Andere definities
#define ADCAttenuation ADC_ATTEN_DB_11    ADC_ATTEN_DB_11 = 0-3,6V demping ADC (ADC-extensie
#define MoisureSens_Poll_Interval 300000   Interval tussen twee bodemvochtmetingen in milliseconden -> stuur elke 5 minuten een datapakket naar de mobiele telefoon
#define DHT_Poll_Interval 400000           Interval tussen twee temeperature en lucht-fractious metingen in milliseconden -> stuur gegevenspakket naar mobiele telefoon om de 6 minuten
#define MaxSensoren 6                      Maximaal aantal koppelbare vochtigheidssensoren
#define StartInit Waar
#define Runtime Valse
#define Sens_Calib Waar
#define Sens_NOTCalib Valse
#define EEPROM_SIZE 512                  Grootte van de interne EEPROMS

Blynk APP Definities
#define BLYNK_GREEN     "#23C48E"
#define BLYNK_BLUE      "#04C0F8"
#define BLYNK_YELLOW    "#ED9D00"
#define BLYNK_RED       "#D3435C"
#define BLYNK_BLACK     "#000000"
#define BLYNK_PRINT Seriële
#define BLYNK_NO_BUILTIN
#define BLYNK_NO_FLOAT
#define BLYNK_DEBUG

DHT-configuratie
#define DHTPIN DHTPIN 4     Digitale pin aangesloten op de DHT-sensor
#define DHTTYPE DHT22   DHT 22 (AM2302), AM2321
#define DHTTYPE DHT21 * DHT 21 (AM2301)

Struct Gegevens over de kalibratie van vochtsensoren
{   Int Gegevens[MaxSensoren * 2] = {1651, 2840, 1652, 2840, 1653, 2840, 1654, 2840, 1655, 2840, 1656, 2840}; Kalibratiegegevens voor vochtigheidssensor. Houd de projecttekst in de gaten en pas waarden dienovereenkomstig aan   int Data[MaxSensors*2] = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"  Kalibratiegegevens voor vochtigheidssensor. Houd de projecttekst in de gaten en pas waarden dienovereenkomstig aan   Byte Statusborderpercentwaarden[MaxSensoren * 2][2] = { {10, 50},     Twee-dimensinonalarray voor percentagelimieten (verkeerslicht) enkele per vochtigheidssensor (1 -6)     {10, 50},     {10, 50},     {10, 50},     {10, 50},     {10, 50}   };   Tekenreeks SensorNaam[MaxSensoren + 2] = {"Plant 1", "Plant 2", "Plant 3", "Plant 4", "Plant 5", "Plant 6", "Vochtigheid", "Temperatuur"}; Sensornaam die ook wordt weergegeven als een kop in de APP

};

Struct MoistureSensorData
{   Int Procent[MaxSensoren] = {0, 0, 0, 0, 0, 0};  Gegevens van vochtigheidssensor in procenten   Byte Old_Percent[MaxSensoren] = {0, 0, 0, 0, 0, 0}; Vorige _ Vochtigheidssensorgegevens in procenten (doel: Gegevens opslaanHoeveelheid.)   Bool GegevensGeldig [MaxSensoren] = {Valse, Valse, Valse, Valse, Valse, Valse};
};

Struct DHTSensorData
{   Float Vochtigheid = 0 ;      Gegevens van de vochtigheidssensor met een percentage   Float Temperatuur = 0;   Float Old_Humidity = 0 ;      Gegevens van de vochtigheidssensor met een percentage   Float Old_Temperature = 0;   Bool GegevensGeldig  = Valse;   Bool Sensorenabled  = Valse;
};

Dht Dht(DHTPIN DHTPIN, DHTTYPE); DHP Instalz initalisieren


Globale variabelen


Char Auth[] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; Hier lt. Anleitung Auth Token dere Blynk App eintragen (E-Mail).
Deine WiFi Zugangsdaten.
Char Ssid[] = "Deine_WLAN_SSID";                 Bitte een eigene WLAN SSID anpassen
Char Pass[] = "Dein _WLAN _Passwort!";           Bitte een eigene WLAN Passwort anpassen
Gegevens over de kalibratie van vochtsensoren MCalib MCalib;
MoistureSensorData MMeasure;
DHTSensorData  DHTMeasure;

Byte Aangeslotenvochtsensoren; Gedetecteerde actieve vochtsensoren (aantal)
Unsigned Lange Moisure_ServiceCall_Handler = 0;  Vertragingsvariabele voor vertraging tussen moisure-metingen
Unsigned Lange DHT_ServiceCall_Handler = 0;  Vertragingsvariabele voor vertraging tussen DHT-metingen


Void Setup() {   pinMode(LED_Rot, Output);   pinMode(LED_Blau, Output);   pinMode(LED_Gruen, Output);   Seriële.Beginnen(115200);   serial communication initialiseren met 115200 bits per seconde:   ledcSetup(PWMledChannelA, PWMfreq PWMfreq, PWMresolutie);   ledcSetup(PWMledChannelB, PWMfreq PWMfreq, PWMresolutie);   ledcSetup(PWMledChannelC, PWMfreq PWMfreq, PWMresolutie);   ledcAttachPin(LED_Rot, PWMledChannelA);   het kanaal aan de GPIO te bevestigen om te worden gecontroleerd   ledcAttachPin(LED_Blau, PWMledChannelB);   ledcAttachPin(LED_Gruen, PWMledChannelC);   SetLedConfig SetLedConfig(255, 255, 255);   Seriële.println(F("Systemkonfiguratie:"));   Als (!Eeprom.Beginnen(EEPROM_SIZE))   {     Seriële.println(F("niet te initialiseren EEPROM"));   } Anders   { Seriële.println(EEPROM_SIZE);     Seriële.println(F(" Bytes EEPROM"));   }   Aangeslotenvochtsensoren = Detectievan vochtsensoren();   Seriële.Afdrukken(Aangeslotenvochtsensoren);   Seriële.println(F(" Bodenfeuchtigkeitsensor(en)"));   Dht.Beginnen();   DHTMeasure.Sensorenabled  = Run_DHTSensor (StartInit);   Als (DHTMeasure.Sensorenabled)   {     Seriële.println(F("1 DHT 22 Sensor"));   }   Seriële.Afdrukken(F("Verbindung zu WLAN"));   Vertraging(500);   Blynk Blynk (Blynk).Beginnen(Auth, Ssid, Pass);  WiFi-verbinding initalize via blync-bibliotheek   Seriële.println(F(Erfolgreich.));   SetLedConfig SetLedConfig(0, 0, 0);   Init_Blynk_APP();   Run_MoistureSensors(StartInit);   Voor (Int I = Aangeslotenvochtsensoren; I < 6; I++) {     Update_Blynk_APP(I, Sens_Calib);   };
}

Byte Detectievan vochtsensoren ()
{
#define MinSensorValue MinSensorValue 100   Byte Gedetecteerd = 0;   Voor (Int I = 0; I < MaxSensoren; I++)   {     Int MsensorRawValue = ReadMoistureSensor_Raw_Val(I);     Als ( MsensorRawValue > MinSensorValue MinSensorValue) {       Gedetecteerd++;     } Anders {       Breken;     }   }   Als (Gedetecteerd < 1)   {     Seriële.println(F("Keine Bodenfeuchtigkeitssesoren erkannt. Systeem angehalten."));     esp_deep_sleep_start();     Terwijl (1) {}   }   Terug Gedetecteerd;
}

Bool SetLedConfig SetLedConfig(Byte Rode, Byte Groene, Byte Blauwe)
{   ledcWrite(PWMledChannelA, Rode); Rote LED   ledcWrite(PWMledChannelB, Blauwe); Blaue LED   ledcWrite(PWMledChannelC, Groene); Gruene LED   Terug Waar;
}

Int ReadMoistureSensor_Raw_Val(Byte Sensor)
{   Int Returnvalue, I;   Lange Som = 0;
#define NUM_READS 6   adc1_config_width(ADC_WIDTH_BIT_12);   Bereik 0-4095   Schakelen (Sensor)   {     Geval 0:       {         adc1_config_channel_atten(ADC1_CHANNEL_0, ADCAttenuation);         Voor (I = 0; I < NUM_READS; I++) { Gemiddeld algoritme           Som += adc1_get_raw( ADC1_CHANNEL_0 ); Analoog lezen         }         Returnvalue = Som / NUM_READS;         Breken;       }     Geval 1:       {         adc1_config_channel_atten(ADC1_CHANNEL_3, ADCAttenuation);         Voor (I = 0; I < NUM_READS; I++) { Gemiddeld algoritme           Som += adc1_get_raw( ADC1_CHANNEL_3 ); Analoog lezen         }         Returnvalue = Som / NUM_READS;         Breken;       }     Geval 2:       {         adc1_config_channel_atten(ADC1_CHANNEL_6, ADCAttenuation);         Voor (I = 0; I < NUM_READS; I++) { Gemiddeld algoritme           Som += adc1_get_raw( ADC1_CHANNEL_6 ); Analoog lezen         }         Returnvalue = Som / NUM_READS;         Breken;       }     Geval 3:       {         adc1_config_channel_atten(ADC1_CHANNEL_7, ADCAttenuation);         Voor (I = 0; I < NUM_READS; I++) { Gemiddeld algoritme           Som += adc1_get_raw( ADC1_CHANNEL_7 ); Analoog lezen         }         Returnvalue = Som / NUM_READS;         Breken;       }     Geval 4:       {         adc1_config_channel_atten(ADC1_CHANNEL_4, ADCAttenuation);         Voor (I = 0; I < NUM_READS; I++) { Gemiddeld algoritme           Som += adc1_get_raw( ADC1_CHANNEL_4 ); Analoog lezen         }         Returnvalue = Som / NUM_READS;         Breken;       }     Standaard:       {         adc1_config_channel_atten(ADC1_CHANNEL_5, ADCAttenuation);         Voor (I = 0; I < NUM_READS; I++) { Gemiddeld algoritme           Som += adc1_get_raw( ADC1_CHANNEL_5 ); Analoog lezen         }         Returnvalue = Som / NUM_READS;         Breken;       }   }   Terug Returnvalue;
}

Void Init_Blynk_APP()
{   Blynk Blynk (Blynk).Eigenschapinstellen(V1, "label", MCalib MCalib.SensorNaam[0]);   Blynk Blynk (Blynk).Eigenschapinstellen(V2, "label", MCalib MCalib.SensorNaam[1]);   Blynk Blynk (Blynk).Eigenschapinstellen(V3, "label", MCalib MCalib.SensorNaam[2]);   Blynk Blynk (Blynk).Eigenschapinstellen(V4, "label", MCalib MCalib.SensorNaam[3]);   Blynk Blynk (Blynk).Eigenschapinstellen(V5, "label", MCalib MCalib.SensorNaam[4]);   Blynk Blynk (Blynk).Eigenschapinstellen(V6, "label", MCalib MCalib.SensorNaam[5]);   Blynk Blynk (Blynk).Eigenschapinstellen(V7, "label", MCalib MCalib.SensorNaam[6]);   Blynk Blynk (Blynk).Eigenschapinstellen(V8, "label", MCalib MCalib.SensorNaam[7]);
}

Void Update_Local_Display()
{   Byte rood1 = 0;   Byte geel1 = 0;   Byte groen1 = 0;   Voor (Byte I = 0; I < Aangeslotenvochtsensoren; I++)   {     Als (MMeasure.GegevensGeldig[I])     {       Als ( MMeasure.Procent[I] > MCalib MCalib.Statusborderpercentwaarden[I][1])       {         groen1++;       } Anders Als ( MMeasure.Procent[I] > MCalib MCalib.Statusborderpercentwaarden[I][0])       {         geel1++;       } Anders       {         rood1++;       }     }   }   Als (rood1 > 0)   {     SetLedConfig SetLedConfig(255, 0, 0);   }   Anders Als (geel1 > 0)   {     SetLedConfig SetLedConfig(255, 255, 0);   }   Anders Als (groen1 > 0)   {     SetLedConfig SetLedConfig(0, 255, 0);   }   Anders   {     SetLedConfig SetLedConfig(0, 0, 255);   }
}

Void Update_Blynk_APP(Byte Sensor, Bool Gekalibreerd)
{   Schakelen (Sensor)   {     Geval 0:       {         Als ((MMeasure.GegevensGeldig[0]) & (Gekalibreerd))         {           Als ( MMeasure.Procent[0] > MCalib MCalib.Statusborderpercentwaarden[0][1])           {             Blynk Blynk (Blynk).Eigenschapinstellen(V1, "kleur", BLYNK_GREEN);           } Anders Als ( MMeasure.Procent[0] > MCalib MCalib.Statusborderpercentwaarden[0][0])           {             Blynk Blynk (Blynk).Eigenschapinstellen(V1, "kleur", BLYNK_YELLOW);           } Anders           {             Blynk Blynk (Blynk).Eigenschapinstellen(V1, "kleur", BLYNK_RED);           }           Vertraging(100);           Blynk Blynk (Blynk).virtualWrite(V1, MMeasure.Procent[0]);         } Anders         {           Als (Gekalibreerd)           {             Blynk Blynk (Blynk).Eigenschapinstellen(V1, "label", "Deaktiviert");             Vertraging(100);             Blynk Blynk (Blynk).virtualWrite(V1, 0);             Vertraging(100);             Blynk Blynk (Blynk).Eigenschapinstellen(V1, "kleur", BLYNK_BLACK);           }           Anders           {             Blynk Blynk (Blynk).virtualWrite(V1, 0);             Vertraging(100);             Blynk Blynk (Blynk).Eigenschapinstellen(V1, "kleur", BLYNK_BLUE);           }         }         Breken;       }     Geval 1:       {         Als ((MMeasure.GegevensGeldig[1]) & (Gekalibreerd))         {           Als ( MMeasure.Procent[1] > MCalib MCalib.Statusborderpercentwaarden[1][1])           {             Blynk Blynk (Blynk).Eigenschapinstellen(V2, "kleur", BLYNK_GREEN);           } Anders Als ( MMeasure.Procent[1] > MCalib MCalib.Statusborderpercentwaarden[1][0])           {             Blynk Blynk (Blynk).Eigenschapinstellen(V2, "kleur", BLYNK_YELLOW);           } Anders           {             Blynk Blynk (Blynk).Eigenschapinstellen(V2, "kleur", BLYNK_RED);           }           Vertraging(100);           Blynk Blynk (Blynk).virtualWrite(V2, MMeasure.Procent[1]);         } Anders         {           Als (Gekalibreerd)           {             Blynk Blynk (Blynk).Eigenschapinstellen(V2, "label", "Deaktiviert");             Vertraging(100);             Blynk Blynk (Blynk).virtualWrite(V2, 0);             Vertraging(100);             Blynk Blynk (Blynk).Eigenschapinstellen(V2, "kleur", BLYNK_BLACK);           }           Anders           {             Blynk Blynk (Blynk).virtualWrite(V2, 0);             Vertraging(100);             Blynk Blynk (Blynk).Eigenschapinstellen(V3, "kleur", BLYNK_BLUE);           }         }         Breken;       }     Geval 2:       {         Als ((MMeasure.GegevensGeldig[2]) & (Gekalibreerd))         {           Als ( MMeasure.Procent[2] > MCalib MCalib.Statusborderpercentwaarden[2][1])           {             Blynk Blynk (Blynk).Eigenschapinstellen(V3, "kleur", BLYNK_GREEN);           } Anders Als ( MMeasure.Procent[2] > MCalib MCalib.Statusborderpercentwaarden[2][0])           {             Blynk Blynk (Blynk).Eigenschapinstellen(V3, "kleur", BLYNK_YELLOW);           } Anders           {             Blynk Blynk (Blynk).Eigenschapinstellen(V3, "kleur", BLYNK_RED);           }           Vertraging(100);           Blynk Blynk (Blynk).virtualWrite(V3, MMeasure.Procent[2]);         } Anders         {           Als (Gekalibreerd)           {             Blynk Blynk (Blynk).Eigenschapinstellen(V3, "label", "Deaktiviert");             Vertraging(100);             Blynk Blynk (Blynk).virtualWrite(V3, 0);             Vertraging(100);             Blynk Blynk (Blynk).Eigenschapinstellen(V3, "kleur", BLYNK_BLACK);           }           Anders           {             Blynk Blynk (Blynk).virtualWrite(V3, 0);             Vertraging(100);             Blynk Blynk (Blynk).Eigenschapinstellen(V3, "kleur", BLYNK_BLUE);           }         }         Breken;       }     Geval 3:       {         Als ((MMeasure.GegevensGeldig[3]) & (Gekalibreerd))         {           Als ( MMeasure.Procent[3] > MCalib MCalib.Statusborderpercentwaarden[3][1])           {             Blynk Blynk (Blynk).Eigenschapinstellen(V4, "kleur", BLYNK_GREEN);           } Anders Als ( MMeasure.Procent[3] > MCalib MCalib.Statusborderpercentwaarden[3][0])           {             Blynk Blynk (Blynk).Eigenschapinstellen(V4, "kleur", BLYNK_YELLOW);           } Anders           {             Blynk Blynk (Blynk).Eigenschapinstellen(V4, "kleur", BLYNK_RED);           }           Vertraging(100);           Blynk Blynk (Blynk).virtualWrite(V4, MMeasure.Procent[3]);         } Anders         {           Als (Gekalibreerd)           {             Blynk Blynk (Blynk).Eigenschapinstellen(V4, "label", "Deaktiviert");             Vertraging(100);             Blynk Blynk (Blynk).virtualWrite(V4, 0);             Vertraging(100);             Blynk Blynk (Blynk).Eigenschapinstellen(V4, "kleur", BLYNK_BLACK);           }           Anders           {             Blynk Blynk (Blynk).virtualWrite(V4, 0);             Vertraging(100);             Blynk Blynk (Blynk).Eigenschapinstellen(V4, "kleur", BLYNK_BLUE);           }         }         Breken;       }     Geval 4:       {         Als ((MMeasure.GegevensGeldig[4]) & (Gekalibreerd))         {           Als ( MMeasure.Procent[4] > MCalib MCalib.Statusborderpercentwaarden[4][1])           {             Blynk Blynk (Blynk).Eigenschapinstellen(V5, "kleur", BLYNK_GREEN);           } Anders Als ( MMeasure.Procent[4] > MCalib MCalib.Statusborderpercentwaarden[4][0])           {             Blynk Blynk (Blynk).Eigenschapinstellen(V5, "kleur", BLYNK_YELLOW);           } Anders           {             Blynk Blynk (Blynk).Eigenschapinstellen(V5, "kleur", BLYNK_RED);           }           Vertraging(100);           Blynk Blynk (Blynk).virtualWrite(V5, MMeasure.Procent[4]);         } Anders         {           Als (Gekalibreerd)           {             Blynk Blynk (Blynk).Eigenschapinstellen(V5, "label", "Deaktiviert");             Vertraging(100);             Blynk Blynk (Blynk).virtualWrite(V5, 0);             Vertraging(100);             Blynk Blynk (Blynk).Eigenschapinstellen(V5, "kleur", BLYNK_BLACK);           }           Anders           {             Blynk Blynk (Blynk).virtualWrite(V5, 0);             Vertraging(100);             Blynk Blynk (Blynk).Eigenschapinstellen(V5, "kleur", BLYNK_BLUE);           }         }         Breken;       }     Geval 5:       {         Als ((MMeasure.GegevensGeldig[5]) & (Gekalibreerd))         {           Als ( MMeasure.Procent[5] > MCalib MCalib.Statusborderpercentwaarden[5][1])           {             Blynk Blynk (Blynk).Eigenschapinstellen(V6, "kleur", BLYNK_GREEN);           } Anders Als ( MMeasure.Procent[5] > MCalib MCalib.Statusborderpercentwaarden[5][0])           {             Blynk Blynk (Blynk).Eigenschapinstellen(V6, "kleur", BLYNK_YELLOW);           } Anders           {             Blynk Blynk (Blynk).Eigenschapinstellen(V6, "kleur", BLYNK_RED);           }           Vertraging(100);           Blynk Blynk (Blynk).virtualWrite(V6, MMeasure.Procent[5]);         } Anders         {           Als (Gekalibreerd)           {             Blynk Blynk (Blynk).Eigenschapinstellen(V6, "label", "Deaktiviert");             Vertraging(100);             Blynk Blynk (Blynk).virtualWrite(V6, 0);             Vertraging(100);             Blynk Blynk (Blynk).Eigenschapinstellen(V6, "kleur", BLYNK_BLACK);           }           Anders           {             Blynk Blynk (Blynk).virtualWrite(V6, 0);             Vertraging(100);             Blynk Blynk (Blynk).Eigenschapinstellen(V6, "kleur", BLYNK_BLUE);           }         }         Breken;       }     Geval 6:       {         Als (DHTMeasure.GegevensGeldig)         {           Blynk Blynk (Blynk).virtualWrite(V7, DHTMeasure.Vochtigheid);         } Anders         {           Blynk Blynk (Blynk).Eigenschapinstellen(V7, "label", "Deaktiviert");           Vertraging(100);           Blynk Blynk (Blynk).virtualWrite(V7, 0);           Vertraging(100);           Blynk Blynk (Blynk).Eigenschapinstellen(V7, "kleur", BLYNK_BLACK);         }         Breken;       }     Geval 7:       {         Als (DHTMeasure.GegevensGeldig)         {           Blynk Blynk (Blynk).virtualWrite(V8, DHTMeasure.Temperatuur);         } Anders         {           Blynk Blynk (Blynk).Eigenschapinstellen(V8, "label", "Deaktiviert");           Vertraging(100);           Blynk Blynk (Blynk).virtualWrite(V8, 0);           Vertraging(100);           Blynk Blynk (Blynk).Eigenschapinstellen(V8, "kleur", BLYNK_BLACK);         }         Breken;       }   } Switch beëindigen
}

Void Get_Moisture_DatainPercent()
{   Byte CalibDataOffset CalibDataOffset = 0;   Voor (Byte I = 0; I < Aangeslotenvochtsensoren; I++)   {     CalibDataOffset CalibDataOffset =  I * 2;     Int Ruwe vochtwaarde = ReadMoistureSensor_Raw_Val(I);     Als ((MCalib MCalib.Gegevens[CalibDataOffset CalibDataOffset] == 0) || (MCalib MCalib.Gegevens[CalibDataOffset CalibDataOffset + 1] == 0)) MinADC-waarde maxADC ADC-waarde     {       MMeasure.Procent[I] = Ruwe vochtwaarde;       MMeasure.GegevensGeldig[I] = Valse;     } Anders     {       Ruwe vochtwaarde = MCalib MCalib.Gegevens[CalibDataOffset CalibDataOffset + 1] - Ruwe vochtwaarde;       Ruwe vochtwaarde = MCalib MCalib.Gegevens[CalibDataOffset CalibDataOffset] + Ruwe vochtwaarde;       MMeasure.Procent[I] = Kaart(Ruwe vochtwaarde, MCalib MCalib.Gegevens[CalibDataOffset CalibDataOffset], MCalib MCalib.Gegevens[CalibDataOffset CalibDataOffset + 1], 0, 100);       Als ((MMeasure.Procent[I] > 100 ) | (MMeasure.Procent[I] < 0 ))       {         MMeasure.Procent[I] = Ruwe vochtwaarde;         MMeasure.GegevensGeldig[I] = Valse;       } Anders  {         MMeasure.GegevensGeldig[I] = Waar;       }     }   }   Terug ;
}



Void Run_MoistureSensors (Bool Init)   HauptFunktion zum Betrieb der Bodenfeuchtesensoren
{   Byte MinSensValue MinSensValue = 100;   Als ((millis() - Moisure_ServiceCall_Handler >= MoisureSens_Poll_Interval) | (Init))   {     Moisure_ServiceCall_Handler = millis();     Get_Moisture_DatainPercent();     Voor (Int I = 0; I < Aangeslotenvochtsensoren; I.++)     {       Als (MMeasure.GegevensGeldig[I.])       {         Als (MMeasure.Procent[I.] != MMeasure.Old_Percent[I.])         {           MMeasure.Old_Percent[I.] = MMeasure.Procent[I.];           Als (MMeasure.Procent[I.] < MinSensValue MinSensValue ) {             MinSensValue MinSensValue = MMeasure.Procent[I.];           };           Seriële.Afdrukken(V("Vochtwaarde sensor"));           Seriële.Afdrukken(I.);           Seriële.Afdrukken(V(" in procenten :"));           Seriële.Afdrukken(MMeasure.Procent[I.]);           Seriële.println(V(" %"));           Update_Blynk_APP(I., Sens_Calib);    Waarden voor mobiele telefoons bijwerken         }       } Anders       {         Update_Blynk_APP(I., Sens_NOTCalib);    Waarden voor mobiele telefoons bijwerken         Seriële.Afdrukken(V("Sensor"));         Seriële.Afdrukken(I.);         Seriële.Afdrukken(V(" niet gekalibreerd. Gelieve te kalibreren. Ruwe gegevenswaarde:"));         Seriële.println(MMeasure.Procent[I.]);       }     }     Update_Local_Display();           Update Local Plant Guardian Display (Led)   }
}

Bool Run_DHTSensor (Bool Init)   //
{   Als ((millis() - DHT_ServiceCall_Handler >= DHT_Poll_Interval) | (Init))   {     DHT_ServiceCall_Handler = millis();     DHTMeasure.Vochtigheid = Dht.readVochtigheid();     DHTMeasure.Temperatuur = Dht.leesTemperatuur(Valse);   Lees temperatuur als Celsius (isFahrenheit = waar)     Als (Isnan (Isnan)(DHTMeasure.Vochtigheid) || Isnan (Isnan)(DHTMeasure.Temperatuur) )     {       Seriële.println(V("Niet te lezen van DHT sensor!"));       DHTMeasure.GegevensGeldig  = Valse;       Terug Valse;     }     DHTMeasure.GegevensGeldig  = Waar;     Als (DHTMeasure.Vochtigheid != DHTMeasure.Old_Humidity)     {       DHTMeasure.Old_Humidity = DHTMeasure.Vochtigheid;       Update_Blynk_APP(6, Waar); Vochtigheidsindicator     }     Als (DHTMeasure.Temperatuur !=  DHTMeasure.Old_Temperature)     {       DHTMeasure.Old_Temperature = DHTMeasure.Temperatuur;       Update_Blynk_APP(7, Waar); Temperatuurweergave     }   }   Terug Waar;
}


Hoofdlus
Void Lus()
{   Run_MoistureSensors(Runtime);   Als (DHTMeasure.Sensorenabled) {     Run_DHTSensor(Runtime);   }   Blynk Blynk (Blynk).Uitvoeren();   Blync Basic-functies uitvoeren
}

 

Andere parameters die moeten worden aangepast zijn niet toegevoegd, omdat de DHT 22 en ook de DHT 11 sensor een interne kalibratiewaarden hebben, die niet langer verder hoeven af te stellen.

Nu we de code hebben aangepast en geüpload naar onze ESP en met succes ingelogd op de WLAN (witte LED gaat af), moeten we onze APP opnieuw uit te breiden in dit deel.

Om dit te doen, voegen we nog twee "LEVEL H" elementen toe aan onze APP en configureren we het eerste vochtigheidselement als volgt:

Configuratie van de Part4-app


• Kleur: Wit
• Invoerpen: V7 (virtueel)
• Minimumwaarde:0
• Maximale waarde: 100
• Leessnelheid: PUSH

 

Het tweede element "Niveau H" voor het configureren van de temperatuur als volgt:

Deel 4 App-instellingen 2


• Kleur: Wit
• Invoerpen: V8 (virtueel)
• Minimumwaarde: -20
• Maximale waarde: 60
• Leessnelheid: PUSH

 

Dan moet onze planten app er zo uitzien:

Deel 4 - App-weergave

Na het indrukken van de "Start" knop, krijgen we nu de huidige temperatuur en vochtigheid weergegeven in de APP in aanvulling op de huidige bodem vochtsensor waarden dankzij onze DHT sensor.

Ik wens u veel plezier recreëren, en tot de volgende keer.

 

Esp-32Projekte für fortgeschritteneSensorenSmart home

2 Reacties

Knut Dorendorff

Knut Dorendorff

Hallo Michael.
Das würde mich interessieren
Gruss Knut

Michael

Michael

Der Beitrag ist ja mal wieder hervorragend geschrieben! Weiter so. Ich werde versuchen meinen Bosch BME zu implementieren.

Laat een reactie achter

Alle opmerkingen worden voor publicatie gecontroleerd door een moderator

Aanbevolen blogberichten

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery