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

Bonjour et bienvenue dans une autre partie de la série d’observateurs de plantes.


Aujourd’hui, nous allons faire don d’un capteur environnemental 2 en 1 au moniteur de l’usine, ainsi que mettre en œuvre quelques optimisations du matériel (LED) ainsi que le code. Le capteur que nous connectons dans cette partie est le célèbre capteur de température et d’humidité DHT 22. En plus de l’humidité du sol, notre moniteur végétal sera maintenant en mesure d’enregistrer les paramètres environnementaux de la température et de l’humidité, qui sont importants pour les plantes dans votre environnement. Bien sûr, nous allons également étendre notre application mobile de manière appropriée. Tout d’abord, nous faisons un changement dans la commutation de la LED.

Nous utilisons le module LED RGB KY-016 et le connectons directement comme suit :
Rouge sur la broche 0, vert sur la broche 15, et bleu sur broche.

Les avantages de ce module sont, d’une part, nous économisons de l’espace lorsqu’il est installé dans un boîtier (1/3 de l’espace de logement) , mais ont également le spectre RGB complet de couleurs via le contrôle PWM des canaux individuels, de sorte que plus de seulement 3 états à l’origine peuvent être affichés.
(Par exemple, la LED est maintenant allumée en blanc pendant la phase d’initialisation). Enfin, nous nous sauvons les résistances, car elles sont déjà intégrées sur le module. Les broches auxquelles les LED RGB sont connectées à l’ESP32 ont été sélectionnées selon le critère "adapté au matériel non critique". L’arrière-plan est que les broches auxquelles la LED est connectée, le firmware vibrent conditionnellement lors d’un redémarrage du système (PWM) avant qu’ils ne soient paraséminés, et donc ne convient pas pour le matériel critique de synchronisation (comme le DHT22).


Il ya aussi eu un changement dans la façon dont l’écran LED fonctionne et comment il est affiché: puisque nous n’avons qu’une et non six LED RGB pour afficher les statistiques du gardien, nous devons résumer les informations les plus importantes sur elle.


À cette fin, nous utilisons la considération suivante : pour nous, l’information la plus importante est de savoir si l’une des 6 plantes maximales doit être arrosée ou non. Cela signifie que cela devrait être évident en un coup d’œil. Pour ce faire, nous redéfinissons la couleur verte (humidité suffisante) de sorte que TOUTES les 6 plantes ont assez d’humidité pour obtenir un écran "vert". Donc, si l’un des six capteurs détecte moins de 50% d’humidité du sol, notre écran saute à "jaune". A moins de 10% sur "rouge". Nous savons donc que nous devrions commencer notre APP, gardien de l’usine, pour savoir laquelle des six usines doit être arrosée. Étant donné que le capteur de température et d’humidité DHT 22 est compatible avec la goupille de 3,3 V et la logique, nous la connectons directement au port 4 de l’ESP. Ici, vous pouvez voir la connexion complète:

 Partie 4 - Structure

 

La liste des pièces en cours avec les pièces matérielles requises. (Avec lien de référence)

 

Nombre

Description

Note

1

DHT 22

 

 

DHT 11

Alternative à DHT 22

1

KY-016 LED RGB Module

 

1

ESP-32 Dev Kit C

 

6

Module de capteur d’humidité du sol V1.2

 

1

Adaptateur d’alimentation MB102

Pour la configuration de la planche à pain

12

Ré-enduringaccording à la description

 

 

Au lieu du premier capteur DHT 22 répertorié, le capteur DHT 11 moins cher peut être utilisé en ajustant simplement la ligne "DHTTYPE DHT22". Cependant, le DHT 11 n’est pas aussi précis que le DHT 22.

Ici les différences entre les deux capteurs peuvent également être lues à nouveau.

Si le DHT 11 Senor doit être utilisé, la ligne doit être

#define DHTTYPE DHT22

Dans

#define DHTTYPE DHT11

être changés. Aucun autre changement n’est nécessaire.

 

L’ESP32 de l’affectation de broches est le suivant

BROCHE ESP32

Utiliser

Note

4

Entrée de capteur DHT

 

0

RGB BROCHE LED

Rouge

15

RGB BROCHE LED

Vert

14

RGB BROCHE LED

Bleu

 

Il s’agissait déjà des changements matériels nécessaires. Afin d’utiliser le capteur DHT22/DHT 11 avec son protocole de fil exclusif dans notre croquis, nous devons inclure deux autres bibliothèques dans notre IDE prochaine.

D’une part, c’est le plus populaire "Adafruit Unified Sensor Libary" : ainsi que les Bibliothèque de capteurs DHT. Les deux bibliothèques s’appuient les unes sur les autres et doivent être ajoutées à nos bibliothèques IDE comme elles sont nécessaires par notre projet.

Après l’ajout des bibliothèques et l’ajustement des paramètres du code, comme dans le Partie 3 dans cette série, décrit nous téléchargeons le code suivant à notre ESP:

 

#include <Pilote/Adc.H (en)>
#include <Wifi.H (en)>
#include <WiFiClient (WiFiClient).H (en)>
#include <BlynkSimpleEsp32.H (en)>
#include "EEPROM.h"
#include <Préférences.H (en)>
#include "DHT.h"    REQUIRES les bibliothèques Arduino suivantes:
- Bibliothèque de capteurs DHT: https://github.com/adafruit/DHT-sensor-library
- Capteur unifié Adafruit Lib: https://github.com/adafruit/Adafruit_Sensor

Module LED Port edefinition RGP
#define LED_Rot     0     LED rouge 
#define LED_Blau    14    LED bleue
#define LED_Gruen   15    Gruene LED

Paramètres LED PWM
#define PWMfreq 5000  5 Fréquence de base Khz pour l’affichage LED
#define PWMledChannelA  0
#define PWMledChannelB (en anglais)  1
#define PWMledChannelC (en anglais)  2
#define Résolution PWM  8 Résolution 8 Bit pour LED PWM

Autres définitions
#define ADCAttenuation ADC_ATTEN_DB_11    ADC_ATTEN_DB_11 '0-3.6V atténuation ADC (extension ADC
#define MoisureSens_Poll_Interval 300000   Intervalle entre deux mesures de l’humidité du sol en millisecondes - envoyer paquet de données au téléphone mobile toutes les 5 minutes
#define DHT_Poll_Interval 400000           Intervalle entre deux mesures de teméperature et d’air-fractious en millisecondes - -gt; envoyer le paquet de données au téléphone mobile toutes les 6 minutes
#define MaxSensors (en) 6                      Nombre maximal d’humidités connectables
#define StartInit StartInit Vrai
#define Duree Faux
#define Sens_Calib Vrai
#define Sens_NOTCalib Faux
#define EEPROM_SIZE 512                  Taille de l’EEPROMS interne

Définitions de l’APP Blynk
#define BLYNK_GREEN     "#23C48E"
#define BLYNK_BLUE      "#04C0F8"
#define BLYNK_YELLOW    "#ED9D00"
#define BLYNK_RED       "#D3435C"
#define BLYNK_BLACK     "#000000"
#define BLYNK_PRINT Série
#define BLYNK_NO_BUILTIN
#define BLYNK_NO_FLOAT
BLYNK_DEBUG #define

DHT Configuration
#define DHTPIN DHTPIN 4     Pin numérique connecté au capteur DHT
#define DHTTYPE DHT22 DHT22   DHT 22 (AM2302), AM2321
#define DHTTYPE DHT21 - DHT 21 (AM2301)

Struct MoistureSensorCalibrationData
{   Int Données[MaxSensors (en) * 2] = {1651, 2840, 1652, 2840, 1653, 2840, 1654, 2840, 1655, 2840, 1656, 2840}; Données d’étalonnage pour capteur d’humidité. Veuillez observer le texte du projet et ajuster les valeurs en conséquence   données int[MaxSensorsMD2] - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"  Données d’étalonnage pour capteur d’humidité. Veuillez observer le texte du projet et ajuster les valeurs en conséquence   Octet StatusBorderPercentValues[MaxSensors (en) * 2][2] = { {10, 50},     Tableau bi-dimensinonal pour les limites de pourcentage (feux de circulation) simple par capteur d’humidité (1 -6)     {10, 50},     {10, 50},     {10, 50},     {10, 50},     {10, 50}   };   String SensorName (SensorName)[MaxSensors (en) + 2] = {"Plante 1", "Plante 2", "Plante 3", "Plante 4", "Plante 5", "Plante 6", "Humidité", "Température"}; Nom du capteur qui apparaît également comme un titre dans l’APP

};

Struct MoistureSensorData (en)
{   Int Pourcentage d’entre nous[MaxSensors (en)] = {0, 0, 0, 0, 0, 0};  Données du capteur d’humidité en pourcentage   Octet Old_Percent[MaxSensors (en)] = {0, 0, 0, 0, 0, 0}; Données précédentes du capteur d’humidité en pourcentage (but : Enregistrer les donnéesQuantity.)   Bool DataValid (en) [MaxSensors (en)] = {Faux, Faux, Faux, Faux, Faux, Faux};
};

Struct DHTSensorData DHTSensorData
{   Flotteur Humidité = 0 ;      Données du capteur d’humidité en pourcentage   Flotteur Température = 0;   Flotteur Old_Humidity = 0 ;      Données du capteur d’humidité en pourcentage   Flotteur Old_Temperature = 0;   Bool DataValid (en)  = Faux;   Bool SensorEnabled  = Faux;
};

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


Variables globales


char Auth[] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; Hier lt. Anleitung Auth Token dere Blynk App eintragen (E-Mail).
Deine WiFi Zugangsdaten.
char Ssid[] = "Deine_WLAN_SSID";                 an eigene WLAN SSID anpassen
char Passer[] = "Dein _WLAN _Passwort !";           an eigene WLAN Passwort anpassen
MoistureSensorCalibrationData MCalib MCalib;
MoistureSensorData (en) MMeasure (MMeasure);
DHTSensorData DHTSensorData  DHTMeasure;

Octet AttachedMoistureSensors; Capteurs d’humidité active détectés (Compte)
Unsigned Long Moisure_ServiceCall_Handler = 0;  Limite de retard pour le retard entre les lectures de moisure
Unsigned Long DHT_ServiceCall_Handler = 0;  Limite de retard pour le retard entre les lectures DHT


Vide Configuration() {   pinMode(LED_Rot, Sortie);   pinMode(LED_Blau, Sortie);   pinMode(LED_Gruen, Sortie);   Série.Commencer(115200);   initialiser la communication en série à 115200 bits par seconde :   ledcSetup(PWMledChannelA, PWMfreq, PWMresolution);   ledcSetup(PWMledChannelB (en anglais), PWMfreq, PWMresolution);   ledcSetup(PWMledChannelC (en anglais), PWMfreq, PWMresolution);   ledcAttachPin(LED_Rot, PWMledChannelA);   attacher le canal au GPIO à contrôler   ledcAttachPin(LED_Blau, PWMledChannelB (en anglais));   ledcAttachPin(LED_Gruen, PWMledChannelC (en anglais));   SetLedConfig SetLedConfig SetLedConfig SetLed(255, 255, 255);   Série.println(F("Systemkonfiguration:"));   Si (!Eeprom.Commencer(EEPROM_SIZE))   {     Série.println(F("n’a pas réussi à initialiser EEPROM"));   } Autre   { Série.println(EEPROM_SIZE);     Série.println(F(" Octets EEPROM "));   }   AttachedMoistureSensors = DétecterMoistureSenseurs();   Série.Imprimer(AttachedMoistureSensors);   Série.println(F(" Bodenfeuchtigkeitsensor (fr)"));   Dht.Commencer();   DHTMeasure.SensorEnabled  = Run_DHTSensor (StartInit StartInit);   Si (DHTMeasure.SensorEnabled)   {     Série.println(F("1 DHT 22 Capteur"));   }   Série.Imprimer(F("Verbindung zu WLAN"));   Retard(500);   Blynk Blynk.Commencer(Auth, Ssid, Passer);  Initaliser WiFi-Connection sur Blync Library   Série.println(F("erfolgreich."));   SetLedConfig SetLedConfig SetLedConfig SetLed(0, 0, 0);   Init_Blynk_APP();   Run_MoistureSensors(StartInit StartInit);   Pour (Int  = AttachedMoistureSensors;  < 6; ++) {     Update_Blynk_APP(, Sens_Calib);   };
}

Octet DétecterMoistureSenseurs ()
{
#define MinSensorValue 100   Octet Détecté = 0;   Pour (Int  = 0;  < MaxSensors (en); ++)   {     Int MSensorRawValue (en anglais seulement) = ReadMoistureSensor_Raw_Val();     Si ( MSensorRawValue (en anglais seulement) > MinSensorValue) {       Détecté++;     } Autre {       Pause;     }   }   Si (Détecté < 1)   {     Série.println(F("Keine Bodenfeuchtigkeitssesoren erkannt. Système angehalten.));     esp_deep_sleep_start();     Tandis que (1) {}   }   Retour Détecté;
}

Bool SetLedConfig SetLedConfig SetLedConfig SetLed(Octet Rouge, Octet Vert, Octet Bleu)
{   ledcWrite(PWMledChannelA, Rouge); Céd DER   ledcWrite(PWMledChannelB (en anglais), Bleu); Blaue LED   ledcWrite(PWMledChannelC (en anglais), Vert); Gruene LED   Retour Vrai;
}

Int ReadMoistureSensor_Raw_Val(Octet Capteur)
{   Int Returnvalue, ;   Long Somme = 0;
#define NUM_READS 6   adc1_config_width(ADC_WIDTH_BIT_12);   Gamme 0-4095   Interrupteur (Capteur)   {     Cas 0:       {         adc1_config_channel_atten(ADC1_CHANNEL_0, ADCAttenuation);         Pour ( = 0;  < NUM_READS; ++) { Algorithme de moyenne           Somme += adc1_get_raw( ADC1_CHANNEL_0 ); Lire analogique         }         Returnvalue = Somme / NUM_READS;         Pause;       }     Cas 1:       {         adc1_config_channel_atten(ADC1_CHANNEL_3, ADCAttenuation);         Pour ( = 0;  < NUM_READS; ++) { Algorithme de moyenne           Somme += adc1_get_raw( ADC1_CHANNEL_3 ); Lire analogique         }         Returnvalue = Somme / NUM_READS;         Pause;       }     Cas 2:       {         adc1_config_channel_atten(ADC1_CHANNEL_6, ADCAttenuation);         Pour ( = 0;  < NUM_READS; ++) { Algorithme de moyenne           Somme += adc1_get_raw( ADC1_CHANNEL_6 ); Lire analogique         }         Returnvalue = Somme / NUM_READS;         Pause;       }     Cas 3:       {         adc1_config_channel_atten(ADC1_CHANNEL_7, ADCAttenuation);         Pour ( = 0;  < NUM_READS; ++) { Algorithme de moyenne           Somme += adc1_get_raw( ADC1_CHANNEL_7 ); Lire analogique         }         Returnvalue = Somme / NUM_READS;         Pause;       }     Cas 4:       {         adc1_config_channel_atten(ADC1_CHANNEL_4, ADCAttenuation);         Pour ( = 0;  < NUM_READS; ++) { Algorithme de moyenne           Somme += adc1_get_raw( ADC1_CHANNEL_4 ); Lire analogique         }         Returnvalue = Somme / NUM_READS;         Pause;       }     Par défaut:       {         adc1_config_channel_atten(ADC1_CHANNEL_5, ADCAttenuation);         Pour ( = 0;  < NUM_READS; ++) { Algorithme de moyenne           Somme += adc1_get_raw( ADC1_CHANNEL_5 ); Lire analogique         }         Returnvalue = Somme / NUM_READS;         Pause;       }   }   Retour Returnvalue;
}

Vide Init_Blynk_APP()
{   Blynk Blynk.Setproperty(V1 (V1), "étiquette", MCalib MCalib.SensorName (SensorName)[0]);   Blynk Blynk.Setproperty(V2 (V2), "étiquette", MCalib MCalib.SensorName (SensorName)[1]);   Blynk Blynk.Setproperty(V3 (V3), "étiquette", MCalib MCalib.SensorName (SensorName)[2]);   Blynk Blynk.Setproperty(V4 (V4), "étiquette", MCalib MCalib.SensorName (SensorName)[3]);   Blynk Blynk.Setproperty(V5 (V5), "étiquette", MCalib MCalib.SensorName (SensorName)[4]);   Blynk Blynk.Setproperty(V6 (V6), "étiquette", MCalib MCalib.SensorName (SensorName)[5]);   Blynk Blynk.Setproperty(V7 (V7), "étiquette", MCalib MCalib.SensorName (SensorName)[6]);   Blynk Blynk.Setproperty(V8 (V8), "étiquette", MCalib MCalib.SensorName (SensorName)[7]);
}

Vide Update_Local_Display()
{   Octet rouge1 = 0;   Octet jaune1 = 0;   Octet vert1 = 0;   Pour (Octet  = 0;  < AttachedMoistureSensors; ++)   {     Si (MMeasure (MMeasure).DataValid (en)[])     {       Si ( MMeasure (MMeasure).Pourcentage d’entre nous[] > MCalib MCalib.StatusBorderPercentValues[][1])       {         vert1++;       } Autre Si ( MMeasure (MMeasure).Pourcentage d’entre nous[] > MCalib MCalib.StatusBorderPercentValues[][0])       {         jaune1++;       } Autre       {         rouge1++;       }     }   }   Si (rouge1 > 0)   {     SetLedConfig SetLedConfig SetLedConfig SetLed(255, 0, 0);   }   Autre Si (jaune1 > 0)   {     SetLedConfig SetLedConfig SetLedConfig SetLed(255, 255, 0);   }   Autre Si (vert1 > 0)   {     SetLedConfig SetLedConfig SetLedConfig SetLed(0, 255, 0);   }   Autre   {     SetLedConfig SetLedConfig SetLedConfig SetLed(0, 0, 255);   }
}

Vide Update_Blynk_APP(Octet Capteur, Bool Calibré)
{   Interrupteur (Capteur)   {     Cas 0:       {         Si ((MMeasure (MMeasure).DataValid (en)[0]) & (Calibré))         {           Si ( MMeasure (MMeasure).Pourcentage d’entre nous[0] > MCalib MCalib.StatusBorderPercentValues[0][1])           {             Blynk Blynk.Setproperty(V1 (V1), "couleur", BLYNK_GREEN);           } Autre Si ( MMeasure (MMeasure).Pourcentage d’entre nous[0] > MCalib MCalib.StatusBorderPercentValues[0][0])           {             Blynk Blynk.Setproperty(V1 (V1), "couleur", BLYNK_YELLOW);           } Autre           {             Blynk Blynk.Setproperty(V1 (V1), "couleur", BLYNK_RED);           }           Retard(100);           Blynk Blynk.virtualWrite (en)(V1 (V1), MMeasure (MMeasure).Pourcentage d’entre nous[0]);         } Autre         {           Si (Calibré)           {             Blynk Blynk.Setproperty(V1 (V1), "étiquette", "Deaktiviert");             Retard(100);             Blynk Blynk.virtualWrite (en)(V1 (V1), 0);             Retard(100);             Blynk Blynk.Setproperty(V1 (V1), "couleur", BLYNK_BLACK);           }           Autre           {             Blynk Blynk.virtualWrite (en)(V1 (V1), 0);             Retard(100);             Blynk Blynk.Setproperty(V1 (V1), "couleur", BLYNK_BLUE);           }         }         Pause;       }     Cas 1:       {         Si ((MMeasure (MMeasure).DataValid (en)[1]) & (Calibré))         {           Si ( MMeasure (MMeasure).Pourcentage d’entre nous[1] > MCalib MCalib.StatusBorderPercentValues[1][1])           {             Blynk Blynk.Setproperty(V2 (V2), "couleur", BLYNK_GREEN);           } Autre Si ( MMeasure (MMeasure).Pourcentage d’entre nous[1] > MCalib MCalib.StatusBorderPercentValues[1][0])           {             Blynk Blynk.Setproperty(V2 (V2), "couleur", BLYNK_YELLOW);           } Autre           {             Blynk Blynk.Setproperty(V2 (V2), "couleur", BLYNK_RED);           }           Retard(100);           Blynk Blynk.virtualWrite (en)(V2 (V2), MMeasure (MMeasure).Pourcentage d’entre nous[1]);         } Autre         {           Si (Calibré)           {             Blynk Blynk.Setproperty(V2 (V2), "étiquette", "Deaktiviert");             Retard(100);             Blynk Blynk.virtualWrite (en)(V2 (V2), 0);             Retard(100);             Blynk Blynk.Setproperty(V2 (V2), "couleur", BLYNK_BLACK);           }           Autre           {             Blynk Blynk.virtualWrite (en)(V2 (V2), 0);             Retard(100);             Blynk Blynk.Setproperty(V3 (V3), "couleur", BLYNK_BLUE);           }         }         Pause;       }     Cas 2:       {         Si ((MMeasure (MMeasure).DataValid (en)[2]) & (Calibré))         {           Si ( MMeasure (MMeasure).Pourcentage d’entre nous[2] > MCalib MCalib.StatusBorderPercentValues[2][1])           {             Blynk Blynk.Setproperty(V3 (V3), "couleur", BLYNK_GREEN);           } Autre Si ( MMeasure (MMeasure).Pourcentage d’entre nous[2] > MCalib MCalib.StatusBorderPercentValues[2][0])           {             Blynk Blynk.Setproperty(V3 (V3), "couleur", BLYNK_YELLOW);           } Autre           {             Blynk Blynk.Setproperty(V3 (V3), "couleur", BLYNK_RED);           }           Retard(100);           Blynk Blynk.virtualWrite (en)(V3 (V3), MMeasure (MMeasure).Pourcentage d’entre nous[2]);         } Autre         {           Si (Calibré)           {             Blynk Blynk.Setproperty(V3 (V3), "étiquette", "Deaktiviert");             Retard(100);             Blynk Blynk.virtualWrite (en)(V3 (V3), 0);             Retard(100);             Blynk Blynk.Setproperty(V3 (V3), "couleur", BLYNK_BLACK);           }           Autre           {             Blynk Blynk.virtualWrite (en)(V3 (V3), 0);             Retard(100);             Blynk Blynk.Setproperty(V3 (V3), "couleur", BLYNK_BLUE);           }         }         Pause;       }     Cas 3:       {         Si ((MMeasure (MMeasure).DataValid (en)[3]) & (Calibré))         {           Si ( MMeasure (MMeasure).Pourcentage d’entre nous[3] > MCalib MCalib.StatusBorderPercentValues[3][1])           {             Blynk Blynk.Setproperty(V4 (V4), "couleur", BLYNK_GREEN);           } Autre Si ( MMeasure (MMeasure).Pourcentage d’entre nous[3] > MCalib MCalib.StatusBorderPercentValues[3][0])           {             Blynk Blynk.Setproperty(V4 (V4), "couleur", BLYNK_YELLOW);           } Autre           {             Blynk Blynk.Setproperty(V4 (V4), "couleur", BLYNK_RED);           }           Retard(100);           Blynk Blynk.virtualWrite (en)(V4 (V4), MMeasure (MMeasure).Pourcentage d’entre nous[3]);         } Autre         {           Si (Calibré)           {             Blynk Blynk.Setproperty(V4 (V4), "étiquette", "Deaktiviert");             Retard(100);             Blynk Blynk.virtualWrite (en)(V4 (V4), 0);             Retard(100);             Blynk Blynk.Setproperty(V4 (V4), "couleur", BLYNK_BLACK);           }           Autre           {             Blynk Blynk.virtualWrite (en)(V4 (V4), 0);             Retard(100);             Blynk Blynk.Setproperty(V4 (V4), "couleur", BLYNK_BLUE);           }         }         Pause;       }     Cas 4:       {         Si ((MMeasure (MMeasure).DataValid (en)[4]) & (Calibré))         {           Si ( MMeasure (MMeasure).Pourcentage d’entre nous[4] > MCalib MCalib.StatusBorderPercentValues[4][1])           {             Blynk Blynk.Setproperty(V5 (V5), "couleur", BLYNK_GREEN);           } Autre Si ( MMeasure (MMeasure).Pourcentage d’entre nous[4] > MCalib MCalib.StatusBorderPercentValues[4][0])           {             Blynk Blynk.Setproperty(V5 (V5), "couleur", BLYNK_YELLOW);           } Autre           {             Blynk Blynk.Setproperty(V5 (V5), "couleur", BLYNK_RED);           }           Retard(100);           Blynk Blynk.virtualWrite (en)(V5 (V5), MMeasure (MMeasure).Pourcentage d’entre nous[4]);         } Autre         {           Si (Calibré)           {             Blynk Blynk.Setproperty(V5 (V5), "étiquette", "Deaktiviert");             Retard(100);             Blynk Blynk.virtualWrite (en)(V5 (V5), 0);             Retard(100);             Blynk Blynk.Setproperty(V5 (V5), "couleur", BLYNK_BLACK);           }           Autre           {             Blynk Blynk.virtualWrite (en)(V5 (V5), 0);             Retard(100);             Blynk Blynk.Setproperty(V5 (V5), "couleur", BLYNK_BLUE);           }         }         Pause;       }     Cas 5:       {         Si ((MMeasure (MMeasure).DataValid (en)[5]) & (Calibré))         {           Si ( MMeasure (MMeasure).Pourcentage d’entre nous[5] > MCalib MCalib.StatusBorderPercentValues[5][1])           {             Blynk Blynk.Setproperty(V6 (V6), "couleur", BLYNK_GREEN);           } Autre Si ( MMeasure (MMeasure).Pourcentage d’entre nous[5] > MCalib MCalib.StatusBorderPercentValues[5][0])           {             Blynk Blynk.Setproperty(V6 (V6), "couleur", BLYNK_YELLOW);           } Autre           {             Blynk Blynk.Setproperty(V6 (V6), "couleur", BLYNK_RED);           }           Retard(100);           Blynk Blynk.virtualWrite (en)(V6 (V6), MMeasure (MMeasure).Pourcentage d’entre nous[5]);         } Autre         {           Si (Calibré)           {             Blynk Blynk.Setproperty(V6 (V6), "étiquette", "Deaktiviert");             Retard(100);             Blynk Blynk.virtualWrite (en)(V6 (V6), 0);             Retard(100);             Blynk Blynk.Setproperty(V6 (V6), "couleur", BLYNK_BLACK);           }           Autre           {             Blynk Blynk.virtualWrite (en)(V6 (V6), 0);             Retard(100);             Blynk Blynk.Setproperty(V6 (V6), "couleur", BLYNK_BLUE);           }         }         Pause;       }     Cas 6:       {         Si (DHTMeasure.DataValid (en))         {           Blynk Blynk.virtualWrite (en)(V7 (V7), DHTMeasure.Humidité);         } Autre         {           Blynk Blynk.Setproperty(V7 (V7), "étiquette", "Deaktiviert");           Retard(100);           Blynk Blynk.virtualWrite (en)(V7 (V7), 0);           Retard(100);           Blynk Blynk.Setproperty(V7 (V7), "couleur", BLYNK_BLACK);         }         Pause;       }     Cas 7:       {         Si (DHTMeasure.DataValid (en))         {           Blynk Blynk.virtualWrite (en)(V8 (V8), DHTMeasure.Température);         } Autre         {           Blynk Blynk.Setproperty(V8 (V8), "étiquette", "Deaktiviert");           Retard(100);           Blynk Blynk.virtualWrite (en)(V8 (V8), 0);           Retard(100);           Blynk Blynk.Setproperty(V8 (V8), "couleur", BLYNK_BLACK);         }         Pause;       }   } Commutateur de fin
}

Vide Get_Moisture_DatainPercent()
{   Octet CalibDataOffset = 0;   Pour (Octet  = 0;  < AttachedMoistureSensors; ++)   {     CalibDataOffset =   * 2;     Int RawMoistureValue = ReadMoistureSensor_Raw_Val();     Si ((MCalib MCalib.Données[CalibDataOffset] == 0) || (MCalib MCalib.Données[CalibDataOffset + 1] == 0)) Valeur De minADC maxADC Valeur ADC     {       MMeasure (MMeasure).Pourcentage d’entre nous[] = RawMoistureValue;       MMeasure (MMeasure).DataValid (en)[] = Faux;     } Autre     {       RawMoistureValue = MCalib MCalib.Données[CalibDataOffset + 1] - RawMoistureValue;       RawMoistureValue = MCalib MCalib.Données[CalibDataOffset] + RawMoistureValue;       MMeasure (MMeasure).Pourcentage d’entre nous[] = Carte(RawMoistureValue, MCalib MCalib.Données[CalibDataOffset], MCalib MCalib.Données[CalibDataOffset + 1], 0, 100);       Si ((MMeasure (MMeasure).Pourcentage d’entre nous[] > 100 ) | (MMeasure (MMeasure).Pourcentage d’entre nous[] < 0 ))       {         MMeasure (MMeasure).Pourcentage d’entre nous[] = RawMoistureValue;         MMeasure (MMeasure).DataValid (en)[] = Faux;       } Autre  {         MMeasure (MMeasure).DataValid (en)[] = Vrai;       }     }   }   Retour ;
}



Vide Run_MoistureSensors (Bool Init)   HauptFunktion zum Betrieb der Bodenfeuchtesensoren
{   Octet MinSensValue = 100;   Si ((Millis() - Moisure_ServiceCall_Handler >= MoisureSens_Poll_Interval) | (Init))   {     Moisure_ServiceCall_Handler = Millis();     Get_Moisture_DatainPercent();     Pour (Int  = 0;  < AttachedMoistureSensors; Ⅰ.++)     {       Si (MMeasure (MMeasure).DataValid (en)[Ⅰ.])       {         Si (MMeasure (MMeasure).Pourcentage d’entre nous[Ⅰ.] != MMeasure (MMeasure).Old_Percent[Ⅰ.])         {           MMeasure (MMeasure).Old_Percent[Ⅰ.] = MMeasure (MMeasure).Pourcentage d’entre nous[Ⅰ.];           Si (MMeasure (MMeasure).Pourcentage d’entre nous[Ⅰ.] < MinSensValue ) {             MinSensValue = MMeasure (MMeasure).Pourcentage d’entre nous[Ⅰ.];           };           Série.Imprimer(Q("Capteur de valeur hydratation"));           Série.Imprimer(Ⅰ.);           Série.Imprimer(Q(" en pourcentage :"));           Série.Imprimer(MMeasure (MMeasure).Pourcentage d’entre nous[Ⅰ.]);           Série.println(Q(" %"));           Update_Blynk_APP(Ⅰ., Sens_Calib);    Mettre à jour les valeurs des téléphones mobiles         }       } Autre       {         Update_Blynk_APP(Ⅰ., Sens_NOTCalib);    Mettre à jour les valeurs des téléphones mobiles         Série.Imprimer(Q("Capteur"));         Série.Imprimer(Ⅰ.);         Série.Imprimer(Q(" pas calibré. S’ll vous plaît, étalonner. Valeur des données brutes:"));         Série.println(MMeasure (MMeasure).Pourcentage d’entre nous[Ⅰ.]);       }     }     Update_Local_Display();           Mise à jour Local Plant Guardian Display (Led)   }
}

Bool Run_DHTSensor (Bool Init)   //
{   Si ((Millis() - DHT_ServiceCall_Handler >= DHT_Poll_Interval) | (Init))   {     DHT_ServiceCall_Handler = Millis();     DHTMeasure.Humidité = Dht.lireHumidity();     DHTMeasure.Température = Dht.lireTemperature(Faux);   Lire la température comme Celsius (estFahrenheit - vrai)     Si (Isnan (Isnan)(DHTMeasure.Humidité) || Isnan (Isnan)(DHTMeasure.Température) )     {       Série.println(Q("N’a pas lu à partir du capteur DHT!"));       DHTMeasure.DataValid (en)  = Faux;       Retour Faux;     }     DHTMeasure.DataValid (en)  = Vrai;     Si (DHTMeasure.Humidité != DHTMeasure.Old_Humidity)     {       DHTMeasure.Old_Humidity = DHTMeasure.Humidité;       Update_Blynk_APP(6, Vrai); Indicateur d’humidité     }     Si (DHTMeasure.Température !=  DHTMeasure.Old_Temperature)     {       DHTMeasure.Old_Temperature = DHTMeasure.Température;       Update_Blynk_APP(7, Vrai); Affichage de température     }   }   Retour Vrai;
}


Boucle principale
Vide Boucle()
{   Run_MoistureSensors(Duree);   Si (DHTMeasure.SensorEnabled) {     Run_DHTSensor(Duree);   }   Blynk Blynk.Courir();   Exécuter Blync Basic- Fonctions
}

 

D’autres paramètres qui doivent être ajustés n’ont pas été ajoutés, puisque le DHT 22 et aussi le capteur DHT 11 ont une valeur d’étalonnage interne, qui n’a plus besoin d’ajustement supplémentaire.

Maintenant que nous avons adapté le code et l’avons téléchargé sur notre ESP et que nous nous sommes connectés avec succès au WLAN (LED blanche s’éteint), nous devons étendre notre APP à nouveau dans cette partie.

Pour ce faire, nous ajoutons deux autres éléments « LEVEL H » à notre APP et configurons le premier élément d’humidité de l’air comme suit :

Configuration de l’application Part4


Couleur: Blanc
Pin d’entrée : V7 (virtuel)
Valeur minimale : 0
Valeur maximale : 100
Taux de lecture: PUSH

 

Le deuxième élément « niveau H » pour configurer la température comme suit :

Partie 4 Paramètres d’application 2


Couleur: Blanc
Pin d’entrée : V8 (virtuel)
Valeur minimale : -20
Valeur maximale : 60
Taux de lecture: PUSH

 

Ensuite, notre application de plantes devrait ressembler à ceci:

Partie 4 - App View

Après avoir appuyé sur le bouton "Démarrer", nous obtenons maintenant la température et l’humidité actuelles affichées dans l’APP en plus des valeurs actuelles du capteur d’humidité du sol grâce à notre capteur DHT.

Je vous souhaite beaucoup de plaisir à recréer, et jusqu’à la prochaine fois.

 

Esp-32Projekte für fortgeschritteneSensorenSmart home

2 commentaires

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.

Laisser un commentaire

Tous les commentaires sont modérés avant d'être publiés

Articles de blog recommandés

  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