Gardien de plantes pour le rebord de la fenêtre la partie 3 – l'élargissement des détecteurs d'humidité de sol sur au maximum six pièces.

Dans la troisième partie de la série "Plant Guards" nous revenons à, dans les parties précédentes déjà mis en œuvre détail technique circuit et d’élargir le nombre de capteurs d’humidité qui peuvent être connectés à notre moniteur d’usine à un maximum de six. Certaines personnes ont peut-être remarqué les six diviseurs de tension existants, mais jusqu’à présent, un seul d’entre eux a été allumé. Les 5 délirés de tension restants ont été principalement utilisés pour tirer 5 des 6 entrées analogiques-numériques de l’ESP32 définies à 0 afin de les empêcher de se balancer peut-être incontrôlée, mais aussi pour le rendre détectable pour notre ESP à laquelle les 6 entrées est maintenant connectée à un capteur d’humidité et à laquelle pas. C’est parce qu’il devrait être possible de connecter des capteurs supplémentaires à volonté et sans changer le code en connectant simplement un autre capteur (jusqu’à un maximum de 6) et ensuite la réinitialisation du système. Ainsi, nous pouvons charger n’importe quel nombre d’au moins 1 à un maximum de 6 capteurs, à commencer par le port gauche (GPIO36) jusqu’à un maximum du port droit (GPIO 33). Toutefois, les ports entre capteurs ne doivent pas être omis, sinon ils ne seront pas détectés. L’assemblage maximal avec capteurs d’humidité est indiqué ci-dessous :

Circuit avec 6 capteurs

 

Notre liste de pièces est ainsi étendue à :1 x vert de couleur LED (560nm); 5 mm

  • 1x jaune de couleur LED (605nm); 5 mm
  • 1x couleur LED rouge (633nm); 5 mm
  • 6x130k" Tolérance de résistance -1%
  • 6x 47k" Tolérance à la résistance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  • 3x 150" Tolérance de résistance -1%
  • 6x (en) Capteur d’humidité capacitif
  • 1x ESP32-38Pin variante générique; Type NodeMCU-32S; Jambe 38;
  • 1x YwRobot Breadboard Alimentation

Maintenant que nous avons apporté les modifications matérielles nécessaires, nous devons encore ajuster un peu notre code sur l’ESP et étendre notre application mobile APP. Tout d’abord, nous téléchargeons le code suivant sur notre ESP:

 

#include <Pilote/Adc.H (en)>
#include <Wifi.H (en)>
#include <WiFiClient (WiFiClient).H (en)>
#include <BlynkSimpleEsp32.H (en)>


Portedefination Led
#define LED_Rot     18    LED rouge 
#define LED_Gelb    14    LED jaune
#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 MaxSensors (en) 6                      Nombre maximal d’humidités connectables
#define StartInit StartInit Vrai
#define Sens_Calib Vrai
#define Sens_NOTCalib Faux

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

Struct MoistureSensorCalibrationData
{   Int Données[MaxSensors (en) * 2] = {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   String SensorName (SensorName)[MaxSensors (en)] = {"Plante 1", "Plante 2", "Plante 3", "Plante 4", "Plante 5", "Plante 6"}; Nom du capteur qui apparaît également comme un titre dans l’APP   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}   };
};

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};
};


Variables globales

Char Char Auth[] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; Entrez votre application Blynk ici (email) selon les instructions Auth Token.
Vos informations d’identification WiFi.
Char Char Ssid[] = "Deine_WLAN_SSID";                 S’il vous plaît s’adapter à votre propre WLAN SSID
Char Char Passer[] = "Votre _WLAN _Passwort !";           S’il vous plaît s’adapter à votre propre mot de passe Wi-Fi

MoistureSensorCalibrationData MCalib MCalib;
MoistureSensorData (en) MMeasure (MMeasure);
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

Vide Configuration() {   pinMode(LED_Rot, Sortie);   pinMode(LED_Gelb, Sortie);   pinMode(LED_Gruen, Sortie);   Série.Commencer(115200);   initialiser la communication en série à 115200 bits par seconde :   ledcSetup(PWMledChannelA, PWMfreq, Résolution PWM);   ledcSetup(PWMledChannelB (en anglais), PWMfreq, Résolution PWM);   ledcSetup(PWMledChannelC (en anglais), PWMfreq, Résolution PWM);   ledcAttachPin(LED_Rot, PWMledChannelA);   attacher le canal au GPIO à contrôler   ledcAttachPin(LED_Gelb, PWMledChannelB (en anglais));   ledcAttachPin(LED_Gruen, PWMledChannelC (en anglais));   SetLedConfig SetLedConfig SetLedConfig SetLed(255, 255, 255);   Série.println(Q("Configuration du système:"));   AttachedMoistureSensors = DétecterMoistureSenseurs();   Série.Imprimer(AttachedMoistureSensors);   Série.println(Q(« Capteur d’humidité du sol(s) »));   Série.Imprimer(Q("Connexion au Wi-Fi"));   Retard(500);   Blynk Blynk.Commencer(Auth, Ssid, Passer);  Initaliser WiFi Connection sur Blync Library   Série.println(Q("Succès."));   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(Q(« Aucun sonors d’humidité du sol n’a été détecté. système s’arrêta.));     esp_deep_sleep_start();     Tandis que (1) {}   }   Retour Détecté;
}

Bool SetLedConfig SetLedConfig SetLedConfig SetLed(Octet Rouge, Octet Jaune, Octet Vert)
{   ledcWrite(PWMledChannelA, Rouge); LED rouge   ledcWrite(PWMledChannelB (en anglais), Jaune); LED jaune   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]);
}

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(0, 255, 0);   }   Autre Si (vert1 > 0)   {     SetLedConfig SetLedConfig SetLedConfig SetLed(0, 0, 100);   }   Autre   {     SetLedConfig SetLedConfig SetLedConfig SetLed(100, 100, 100);   }
}

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;       }     Par défaut:       {         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;       }   } 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(F("Capteur Feuchtigkeitswert"));           Série.Imprimer();           Série.Imprimer(F(" à Prozent :"));           Série.Imprimer(MMeasure (MMeasure).Pourcentage d’entre nous[]);           Série.println(F(" %"));           Update_Blynk_APP(, Sens_Calib);    Aktualisiere Handywerte         }       } Autre       {         Update_Blynk_APP(, Sens_NOTCalib);    Aktualisiere Handywerte         Série.Imprimer(F("Sensor"));         Série.Imprimer();         Série.Imprimer(F(" nicht kalibiert. kalibrieren. Rohdatenwert:"));         Série.println(MMeasure (MMeasure).Pourcentage d’entre nous[Ⅰ.]);       }     }     Update_Local_Display();           Mise à jour Local Plant Guardian Display (Led)   }
}

Boucle principale
Vide Boucle()
{   Run_MoistureSensors(Faux);   Blynk Blynk.Courir();   Exécuter Blync Basic- Fonctions
} 

 

Avant de le télécharger sur notre ESP, il est important de noter que les paramètres/lignes de code suivants sont adaptés aux besoins respectifs Doit:

données int[MaxSensorsMD2] - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"

Veuillez ajuster les valeurs en fonction de la description de la partie 1 de la série.

 

#define MoisureSens_Poll_Interval 300000

Intervalle entre deux mesures de l’humidité du sol en millisecondes. La valeur influence la fréquence à laquelle les données de téléphonie mobile sont mises à jour, et donc aussi sur la quantité de données générées pour la transmission par fois. Plus l’intervalle est élevé, plus l’intervalle est grand. Veuillez définir une valeur qui correspond à votre propre volume de données ou votre budget. [Exemple : 300000 ms et intervalle de transfert de données de 5 minutes

 

char auth[] - "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
char ssid[] - "Deine_WLAN_SSID";
char pass[] - "Votre _WLAN _Passwort!";

S’il vous plaît ajuster les valeurs en fonction de la description dans la partie 2 de la série.

 

Il Anc les paramètres/lignes de code suivants à adapter aux besoins respectifs :

 

nom de capteur de chaîne[maxsensors] - "plante 1", "plante 2", "plante 3", "plante 4", "plante 5", "plante 6";

Nom du capteur d’humidité qui apparaît comme un titre dans l’APP.

 

byte StatusBorderPercentValues[MaxSensorsMD2][2] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

 Tableau bidimensionnel pour les limites de pourcentage (feux de circulation) par capteur d’humidité (1 -6). Affecte l’affichage du « feu de circulation » et l’affichage des valeurs dans l’APP. D’abord qui (10) précise la limite de transition entre le statut "rouge" et le statut "jaune". La deuxième valeur indique la limite de transition entre le statut jaune et le statut vert. Exemple : de 51 % d’humidité du sol « verte » à partir de 9 % d’humidité du sol « rouge ».

 

Si tous ces paramètres ont été correctement définis, la sortie sur le moniteur de série devrait maintenant ressembler à ceci :

Sortie en série

Note: Dans cet exemple, au lieu de max6. seulement 5 capteurs connectés

Ensuite, nous devons adapter notre HandyApp au matériel et au firmware modifiés.

Puisque nous n’obtenons que 2000 points d’énergie disponibles gratuitement dans notre Blynk HandyAPP, nous devons budgétiser quelque chose avec 6 capteurs connectés. Dans la première étape, nous supprimons donc l’élément "Gauge" créé dans la deuxième partie.

Blynk Handyapp Photo 1

 

Nous remplaçons l’élément "Gauge" par l’élément "Niveau H"

Application Blynk - Ajouter l’article

Maintenant, nous ajoutons l’élément plus respectueux de l’énergie "Niveau H" un total de 6 fois pour afficher l’humidité actuelle du sol.

Blynk - Widget

Maintenant, notre surface devrait ressembler à ceci:

Blynk App - nouvelle annonce

Maintenant, nous devons ajuster trois valeurs à chaque fois dans les propriétés des 6 éléments. Je montre les paramètres du premier capteur ici comme un exemple

Paramètres Blynk

L’ajustement le plus important est la variable d’entrée. Cela doit être défini en permanence pour chaque élément « niveau H », de l’entrée « V1 » pour l’usine 1 à « V6 » pour l’usine 6. "V" signifie "Virtual Pins" et permet une association entre les éléments de l’APP et les instructions du code. Nous sélectionnons également 0 comme valeur minimale et 100 comme valeur maximale. Le troisième est de définir la « poussée » comme le taux de lecture. Dans la conception, n’importe quelle couleur, taille de police et nom peuvent être choisis, car ces paramètres sont plus tard définis ou définis par notre programme sur l’ESP.

Le résultat final, lorsque le projet est activé, devrait maintenant ressembler à ceci :

Affichage des capteurs Blynk

(le dernier capteur est montré comme désactivé parce que je n’ai connecté que 5 capteurs dans l’exemple. Lors de l’utilisation de 6 capteurs, le champ est automatiquement activé)

Pour plus d’informations sur l’APP Blynk et son utilisation dans les contrôleurs, voir


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

 

 

 

 

 

Esp-32Projets pour avancéCapteursMaison intelligente

9 commentaires

Tobias

Tobias

Hallo Peter,
Da dis ein komplett anderen Anwendungsfall darstellt, würde ich empfehlen hier die Blynk Dokumenation als Basis für den Neuaufbau eines eigenen Sketches zu nutzen.

Gruß
Tobias

Tobias Kuch

Tobias Kuch

Hallo Max,
Grundsätzlich schon, jedoch ist dann auch eine komplette Umprogrammierung der Software erforderlich. Die Software als solches ist nur auf dem ESP32 so ausführbar.
Gruß
Tobias

Max

Max

Hallo und danke für das SUPER Projekt. Ich suche schon lange etwas ähnliches, bei dem ich die Bodenfeuchtigkeit messen kann und damit dann eine automatische Bewässerung steuern kann.
Natürlich kann ich nur Teile aus diesem Projekt verwenden, aber besonders die Handy-App-Anzeige und die Anzahl der Sensoren ist super.
Für meinen Anwendungsfall benötige ich allerdings 8-10 Feuchtigkeitssensoren und zusätzlich noch 4 Eingänge für Füllstandsschalter (Reedkontakt).

Kann man das Projekt mit einer anderen Hardware auf die genannten Sensoren und Eingänge bringen?
Bis Bald
Max

Peter

Peter

Habe den Pflanzenwächter gebaut und es funktioniert alles perfekt. Jetzt habe ich eine ganz andere Sache vor. Wie kann ich den Sketch umändern, damit von zwei Spannungs-und zwei Stromsensoren die Werte in der Blynk-App angezeigt werden?

Tobias Kuch

Tobias Kuch

Hallo Knut,

Die Sensoren werden mit 5 Volt betrieben, der Rest mit 3,3 Volt. Sorry für die verspätete Antwort. Du kannst alle Projekte mit Plänen im Fritzing Format (Inkl. Werteangaben) unter meiner GitHub Seite https://github.com/kuchto herunterladen.
Viele Grüße

Knut Dorendorff

Knut Dorendorff

OK dann hierzu keine Antwort.
Mit wieviel Volt wird was auf dem Board was betrieben? 3,3 oder 5 Volt?

Mit freundlichen Grüßen
Knut Dorendorff

Knut Dorendorff

Knut Dorendorff

Hallo Tobias,
welche Widerständen kommen zwischen Minus und dem ESP32. Da wir sechsmal 47 kΩ und 130 kΩ haben. Oder ist da egal?

Mit freundlichen Grüssen
Knut
Danke schon mal.

Tobias

Tobias

Hallo Martin,

Leider funktioniert das Projekt nicht nativ mit dem ESP8266, da dieser nur einen Analog-Port besitzt, wir aber sechs Ports brauchen, aber auch, weil der Analog Port des ESP8266 eine fixen Eingangsbereich von 0 – 1 Volt hat. Diesen sehe ich i.m.h.o als zu gering für unsere Zwecke an. Du könntest theoretisch jedoch einen externen I2C AD Wandler an des ESP8266 hängen. Jedoch muss der Großteils danach angepasst werden. Insgesamt ist es aber mit sehr viel Aufwand möglich es zu portieren. Auch bringt der externe AD Wandler Extrakosten mit sich.

Martin

Martin

Hallo Tobias,

würde dein Projekt auch mit einem NodeMCU Lua Lolin V3 Modul mit ESP8266 12E funktionieren?

Laisser un commentaire

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

Messages de blogs recommandés

  1. Installez maintenant ESP32 via l'administrateur de la carte
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA-Over the Air-ESP Programmation par WiFi