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:
De huidige onderdelen lijst met de vereiste hardware onderdelen. (Met verwijzingslink)
Nummer |
Beschrijving |
Opmerking |
1 |
|
|
|
Alternatief voor DHT 22 |
|
1 |
|
|
1 |
|
|
6 |
|
|
1 |
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:
• 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:
• Kleur: Wit
• Invoerpen: V8 (virtueel)
• Minimumwaarde: -20
• Maximale waarde: 60
• Leessnelheid: PUSH
Dan moet onze planten app er zo uitzien:
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.
2 Reacties
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.