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:
La liste des pièces en cours avec les pièces matérielles requises. (Avec lien de référence)
Nombre |
Description |
Note |
1 |
|
|
|
Alternative à DHT 22 |
|
1 |
|
|
1 |
|
|
6 |
|
|
1 |
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 :
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 :
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:
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.
2 commentaires
Knut Dorendorff
Hallo Michael.
Das würde mich interessieren
Gruss Knut
Michael
Der Beitrag ist ja mal wieder hervorragend geschrieben! Weiter so. Ich werde versuchen meinen Bosch BME zu implementieren.