In dit deel van de serie ga ik, nogmaals, het belangrijkste van de vorige Delen samen. We hebben Achteraf gezien, een aantal Wijzigingen en toevoegingen aan onze plant monitor. Bijvoorbeeld, we hebben uitgebreid het nummer van het vocht in de bodem sensoren 6 en een gecombineerde temperatuur-en vochtigheidssensor toegevoegd. Voor planten die al een goede basis. Het is een andere belangrijke, Ja, onmisbaar milieu-factor ontbreekt het nog aan voor onze plant wereld. Dit is het licht, in het bijzonder de verlichting van kracht. Is Genmessen de verlichtingssterkte in de eenheid Lux.
De meeste van de planten voelen in de verlichtingssterkte variëren van 300-1500 Lux (afhankelijk van het gewas) het meest comfortabel. Dit is wat we willen rekening houden met, natuurlijk, en met onze plant security guard, de lichtsterkte in Lux op elk moment in de gaten te houden. Te dien einde, we nemen de verlichtingssterkte in de eenheid Lux, en vertegenwoordigen deze op de gebruikelijke manier op de mobiele telefoon weergegeven als een informatieve waarde.
Dit is een taak die, in ons geval, de licht sensor BH1750 sterke punten, want dit is degene met de 3.3 Volt gegevens niveaus van de ESP32 compatibel, evenals de verlichting van kracht als packet-gegevens via de I2C interface rechtstreeks in Lux eenheid naar onze ESP te geven.
Beschikbaar is de licht sensor, bijvoorbeeld in het geval van AZ-Levering Winkel als een module GY-302.
Als u meer Details over de module van belang, kan worden gevonden in de bijv. hier voor meer informatie.
De BH1750 heeft een zeer groot meetbereik en de resolutie kan in principe worden geconfigureerd via de configuratie parameter tussen 0,5 Lux 1 Lux en 4 Lux gekozen.
Voor ons project kiezen we de medium resolutie van 1 Lux.
Met het Toevoegen van de licht sensor, we hebben onze Sensoren nodig nu definitief voor het project
Hier vindt u de vorige plant guard delen, de studie die ik wil aanbevelen, omdat belangrijke informatie, bijvoorbeeld over de kalibratie van de bodem vocht sensoren inbegrepen zijn:
om terug te gaan naar het belangrijkste deel van de lijst. U vindt alle van de relevante onderdelen van dit project, het haar op de replica in de volgende lijst:
nummer |
beschrijving |
opmerking |
1 |
|
|
|
als een Alternatief voor DHT 22 |
|
1 |
|
|
1 |
|
|
6 |
|
|
1 |
Voor brood Raad design |
|
1 |
verlichting sensor |
|
12 |
|
, laten We eens kijken naar de bijgewerkte schema/elektrisch schema van de Plant controller:
Wij erkennen de toegevoegde lichtsensor BH1570. We verbinden de randapparatuur als volgt:
RGB_Led module
RGB -Led Anode |
ESP32 Pin |
Rood |
0 |
Groen |
15 |
Blauw |
14 |
vocht in de bodem sensoren
vochtigheid sensor |
ESP32 Pin |
1 |
SP, |
2 |
SN |
3 |
34 |
4 |
35 |
5 |
32 |
6 |
33 |
temperatuur/luchtvochtigheid sensor DHT 22
PIN |
ESP32 Pin |
DATA /OUT |
4 |
verlichting sensor BH1570
BH1570 PIN |
ESP32 Pin |
SDA |
21 |
SCL - |
|
ADDR |
GND |
Na ons van de juiste bedrading ervan overtuigd zijn dat dedownload onderstaande Code om onze ESP hoog:
#include <driver/adc.h> // Bouwen In de Bibliotheek. Geen externe Bibliotheek nodig //#include <esp_wifi.h> #include <WiFi.h> #include <wifi-client.h> #include <ESPmDNS.h> #include <BlynkSimpleEsp32.h> #include <EEPROM.h> #include <Voorkeuren.h> #include <Draad.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 // De haven definiëren RGB LED-module #define LED_Rot 0 // Rode LED #define LED_Blau 14 // blue LED #define LED_Gruen 15 // Groene LED // I2C-poortdefinities #define SDA1 21 #define SCL1 22 // LED PWM-instellingen #define PWMfreq 5000 // 5 kHz basisfrequentie voor LED-weergave #define PWMledChannelA 0 #define PWMledChannelB 1 #define PWMledChannelC 2 #define PWM-resolutie 8 // 8 bit resolutie voor LED PWM // Tijd- / timingdefinities voor sensorquery's #define ADCAttenuation ADC_ATTEN_DB_11 // ADC_ATTEN_DB_11 = 0-3.6V demping ADC (ADC extensie #define MoisureSens_Poll_MinInterval 3600 // Minimaal meetwaardeoverdrachtsinterval tussen twee bodemvochtmetingen in seconden. #define DHT_Poll_MinInterval 2700 // Minimale meetwaarde transmissie-interval tussen twee temperatuur- en vochtigheidsmetingen in seconden. #define BH_Poll_MinInterval 1800 // Minimaal meetwaarde-transmissie-interval tussen twee lichtintensiteitsvragen in seconden. #define DEBUG // Wanneer gedefinieerd, worden verschillende informatie en meetwaarden uitgevoerd op de seriële interface. Verwijder vóór productief gebruik! #define MaxSensoren 6 // Maximaal aantal aansluitbare vochtigheidssensoren #define MinSensorValue 500 // Minste AD-waarde om een sensoringangskanaal (1-6) als "actief" aan het systeem te melden. (Vochtigheidssensor is aangesloten tijdens de opstartfase) #define StartInit waar #define RunTime fout #define Sens_Calib waar #define Sens_NOTCalib fout #define EEPROM_SIZE 512 // Definitiegrootte van de interne EEPROM // 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_WHITE "#FFFFFF" #define BLYNK_PRINT Serie 1 #define BLYNK_NO_BUILTIN #define BLYNK_NO_FLOAT // # definieer BLYNK_DEBUG // DHT-configuratie #define DHTPIN 4 // Digitale pin aangesloten op de DHT-sensor #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 // # definieer DHTTYPE DHT21 // Als een DHT 21 (AM2301) in uw project wordt gebruikt, definieer deze instelling struct SystemRunParameters { int Gegevens[MaxSensoren * 2] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; // Kalibratiegegevens voor vochtsensor. Let op de projecttekst en pas de waarden dienovereenkomstig aan byte StatusBorderPercentValues[MaxSensoren * 2][2] = { {10, 50}, // Tweedimensionale reeks voor procentuele grenswaarden (verkeerslicht) afzonderlijk voor elke vochtigheidssensor (1-6) {10, 50}, {10, 50}, {10, 50}, {10, 50}, {10, 50} }; String Sensornaam[MaxSensoren + 3] = {"Plant 1", "Plant 2", "Plant 3", "Plant 4", "Plant 5", "Plant 6", "Vochtigheid", "Temperatuur", "Lichtsterkte"}; // Sensornaam, die ook als kop in de APP wordt weergegeven }; struct MoistureSensorData { int Procent[MaxSensoren] = {0, 0, 0, 0, 0, 0}; // Vochtsensorgegevens in procent byte Old_Percent[MaxSensoren] = {0, 0, 0, 0, 0, 0}; // Vorige _ Vochtsensorgegevens in procent (doel: hoeveelheid gegevens opslaan.) dwaas DataValid [MaxSensoren] = {fout, fout, fout, fout, fout, fout}; }; struct DHTSensorData { zweven Luchtvochtigheid = 0 ; // Gegevens vochtigheidssensor in procent zweven Temperatuur = 0; zweven Oude luchtvochtigheid = 0 ; // Gegevens vochtigheidssensor in procent zweven Oude temperatuur = 0; dwaas DataValid = fout; dwaas Sensor ingeschakeld = fout; }; struct BHLightSensorData { int Lux = 0 ; // Lichtsterkte in lux int Old_Lux = 0 ; // Lichtsterkte in lux dwaas DataValid = fout; dwaas Sensor ingeschakeld = fout; }; DHT dht(DHTPIN, DHTTYPE); // Initialiseer de DHT-sensorinstantie TwoWire I2CWire = TwoWire(0); // Globale variabelen char auth[] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // Voer de Blynk-app in volgens de instructies voor het Auth Token (e-mail). // Uw wifi-toegangsgegevens. char ssid[] = "Your_WLAN_SSID"; // Pas uw eigen WLAN SSID aan char doorgeven[] = "Uw _WLAN _Passwort!"; // Pas uw eigen WiFi-wachtwoord aan char ESPName[] = "PlantSensor1"; SystemRunParameters SysConfig; MoistureSensorData MMeasure; DHTSensorData DHTMeasure; BHLightSensorData BHMeasure; byte AttachedMoistureSensors = 0; // Gedetecteerde actieve vochtsensoren (aantal) byte BH1750I2CAdres = 0; // Detecteerde BH1750 I2C-adres dwaas Connected2Blynk = fout; // Bool-variabele. Slaat de verbindingsstatus op de Blynk Cloud op niet ondertekend lang Moisure_ServiceCall_Handler = 0; // Vertragingsvariabele voor vertraging tussen metingen van de vrije tijd niet ondertekend lang DHT_ServiceCall_Handler = 0; // Vertragingsvariabele voor vertraging tussen DHT-metingen niet ondertekend lang BH_ServiceCall_Handler = 0; // Vertragingsvariabele voor vertraging tussen BH1750-metingen niet ondertekend lang chipid; nietig opstelling() { pinMode(LED_Rot, UITGANG); pinMode(LED_Blau, UITGANG); pinMode(LED_Gruen, UITGANG); Serie.beginnen(115200); // initialiseer seriële communicatie met 115200 bits per seconde: I2CWire.beginnen(SDA1, SCL1, 400000); // kom bij i2c bus (adres optioneel voor master) //chipid=ESP.getEfuseMac (); // De chip-ID is in wezen het MAC-adres (lengte: 6 bytes). // sprintf (ESPName, "% d% d% d% d% d% d% d% d% d% d% d% d% d% d% d% d% d", chipid); ledcSetup(PWMledChannelA, PWMfreq, PWMresolution); ledcSetup(PWMledChannelB, PWMfreq, PWMresolution); ledcSetup(PWMledChannelC, PWMfreq, PWMresolution); ledcAttachPin(LED_Rot, PWMledChannelA); // voeg het kanaal toe aan de te besturen GPIO ledcAttachPin(LED_Blau, PWMledChannelB); ledcAttachPin(LED_Gruen, PWMledChannelC); SetLedConfig(255, 255, 255); #ifdef DEBUG Serie.afdrukken(F("Verbindung zu WLAN")); #stop als Wifi.verbinding verbreken(); Wifi.setHostname(ESPName); // esp_wifi_set_mode (WIFI_MODE_STA); Wifi.modus(WIFI_STA); Wifi.beginnen(ssid, voorbij gaan aan); Wifi.setSlapen(fout); als (Wifi.waitForConnectResult() != WL_CONNECTED) { terwijl (Wifi.toestand() != WL_CONNECTED) { vertraging(1000); Wifi.beginnen(ssid, voorbij gaan aan); // probeer het opnieuw, als eerst Connect mislukt #ifdef DEBUG Serie.afdrukken(F(".")); #stop als } } #ifdef DEBUG Serie.println(F("erfolgreich.")); Serie.afdrukken(F("IP adres: ")); Serie.println(Wifi.localIP()); Serie.afdrukken(F("Hostnaam:")); Serie.println(ESPName); #stop als als (!MDNS.beginnen(ESPName)) { Serie.println("Fout bij instellen van MDNS-responder!"); } MDNS.addService("fabriek", "tcp", 400); Blynk.config(auth); // in plaats van Blynk.begin (auth, ssid, pass); terwijl (Blynk.aansluiten() == fout) { vertraging(500); Serie.afdrukken("."); } #ifdef DEBUG Serie.println(F("Systeemconfiguratie:")); #stop als als (EEPROM.beginnen(EEPROM_SIZE)) { #ifdef DEBUG Serie.afdrukken(EEPROM_SIZE); Serie.println(F("Bytes EEPROM")); #stop als } Run_MoistureSensors(StartInit); #ifdef DEBUG Serie.afdrukken(AttachedMoistureSensors); Serie.println(F("Bodenfeuchtigkeitsensor (en)")); #stop als dht.beginnen(); DHTMeasure.Sensor ingeschakeld = Run_DHTSensor (StartInit); als (DHTMeasure.Sensor ingeschakeld) { #ifdef DEBUG Serie.println(F("1 DHT 22-sensor")); #stop als } BHMeasure.Sensor ingeschakeld = Run_BH1750Sensor(StartInit); als (BHMeasure.Sensor ingeschakeld) { #ifdef DEBUG Serie.println(F("1 B1750 lichtsensor")); #stop als } } nietig CheckConnection() { Connected2Blynk = Blynk.verbonden(); als (!Connected2Blynk) { Serie.println("Niet verbonden met Blynk-server"); Blynk.aansluiten(3333); // time-out ingesteld op 10 seconden en ga dan verder zonder Blynk } anders { Serie.println("Verbonden met Blynk-server"); } } dwaas Run_BH1750Sensor (dwaas In het) // Runtime Funktion für den BH170 Lichtsensor { byte ec; als ((millis() - BH_ServiceCall_Handler >= BH_Poll_MinInterval * 1000) | (In het)) { BH_ServiceCall_Handler = millis(); als (In het) { dwaas BH1750 Gedetecteerd = fout; I2CWire.beginVerzending(35); ec = I2CWire.endTransmission(waar); als (ec == 0) { BH1750 Gedetecteerd = waar; BH1750I2CAdres = 35; // BH1750 I2C Adresse ist DEC 35 } anders { I2CWire.beginVerzending(92); ec = I2CWire.endTransmission(waar); als (ec == 0) { BH1750 Gedetecteerd = waar; BH1750I2CAdres = 92; // BH1750 I2C Adresse ist DEC 92 } } als (BH1750 Gedetecteerd) { // Intialize sensor I2CWire.beginVerzending(BH1750I2CAdres); I2CWire.schrijven(0x01); // Schakel het in voordat we het kunnen resetten I2CWire.endTransmission(); I2CWire.beginVerzending(BH1750I2CAdres); I2CWire.schrijven(0x07); // Reset I2CWire.endTransmission(); I2CWire.beginVerzending(BH1750I2CAdres); I2CWire.schrijven(0x10); // Continu H-resolutiemodus (1 lux resolutie) Weitere Modis möglich, gemäß Datenblatt //I2CWire.write(0x11); // Continu H-resolutiemodus 2 (resolutie van 0,5 lux) //I2CWire.write(0x20); // Eenmalige H-resolutiemodus (1 lux resolutie) //I2CWire.write(0x21); // Eenmalige H-resolutiemodus2 (resolutie van 0,5 lux) I2CWire.endTransmission(); Blynk.setProperty(V9, "kleur", BLYNK_WHITE); Blynk.setProperty(V9, "etiket", SysConfig.Sensornaam[8]); } anders { Blynk.setProperty(V9, "etiket", "Deaktiviert"); Blynk.setProperty(V9, "kleur", BLYNK_BLACK); Blynk.virtualWrite(V9, 0); terug BH1750 Gedetecteerd; } } I2CWire.beginVerzending(BH1750I2CAdres); ec = I2CWire.endTransmission(waar); als (ec == 0) { I2CWire.aanvraag van(BH1750I2CAdres, 2); BHMeasure.Lux = I2CWire.lezen(); BHMeasure.Lux <<= 8; // Verschieben der unteren 8 Bits in die höhreren 8 Bits der 16 Bit breiten Zahl BHMeasure.Lux |= I2CWire.lezen(); BHMeasure.Lux = BHMeasure.Lux / 1.2; BHMeasure.DataValid = waar; als (BHMeasure.Lux != BHMeasure.Old_Lux) { BHMeasure.Old_Lux = BHMeasure.Lux; Update_Blynk_APP(8, waar); // Lichtstärkeanzeige in Lux aktualisieren #ifdef DEBUG Serie.afdrukken ("Lichtstärke in Lux:"); Serie.println (BHMeasure.Lux); #stop als } } anders { BHMeasure.DataValid = fout; BHMeasure.Sensor ingeschakeld = fout; Blynk.setProperty(V9, "kleur", BLYNK_BLUE); } } terug waar; } dwaas Run_DHTSensor (dwaas In het) // Runtime-functie voor den DHT Temp und Luftfeuchtesensor { als ((millis() - DHT_ServiceCall_Handler >= DHT_Poll_MinInterval * 1000) | (In het)) { DHT_ServiceCall_Handler = millis(); DHTMeasure.Vochtigheid = dht.leesvochtigheid(); DHTMeasure.Temperatuur = dht.leestemperatuur(fout); // Temperatuur lezen als Celsius (isFahrenheit = true) als (In het) { als (isnan(DHTMeasure.Vochtigheid) || isnan(DHTMeasure.Temperatuur)) { Blynk.setProperty(V7, "etiket", "Deaktiviert"); Blynk.setProperty(V8, "etiket", "Deaktiviert"); Blynk.virtualWrite(V7, 0); Blynk.virtualWrite(V8, -20); Blynk.setProperty(V7, "kleur", BLYNK_BLACK); Blynk.setProperty(V8, "kleur", BLYNK_BLACK); DHTMeasure.DataValid = fout; terug fout; } anders { Blynk.setProperty(V7, "kleur", BLYNK_WHITE); Blynk.setProperty(V7, "etiket", SysConfig.Sensornaam[6]); Blynk.setProperty(V8, "kleur", BLYNK_WHITE); Blynk.setProperty(V8, "etiket", SysConfig.Sensornaam[7]); DHTMeasure.DataValid = waar; DHTMeasure.Oude luchtvochtigheid = DHTMeasure.Vochtigheid; Update_Blynk_APP(6, waar); // Luftfeuchteanzeige DHTMeasure.Oude temperatuur = DHTMeasure.Temperatuur; Update_Blynk_APP(7, waar); // Temperaturanzeige terug waar; } } als (isnan(DHTMeasure.Vochtigheid) || isnan(DHTMeasure.Temperatuur)) { Blynk.setProperty(V7, "kleur", BLYNK_BLUE); Blynk.setProperty(V8, "kleur", BLYNK_BLUE); DHTMeasure.DataValid = fout; DHTMeasure.Sensor ingeschakeld = fout; terug fout; } DHTMeasure.DataValid = waar; als (DHTMeasure.Vochtigheid != DHTMeasure.Oude luchtvochtigheid) { DHTMeasure.Oude luchtvochtigheid = DHTMeasure.Vochtigheid; Update_Blynk_APP(6, waar); // Luftfeuchteanzeige } als (DHTMeasure.Temperatuur != DHTMeasure.Oude temperatuur) { DHTMeasure.Oude temperatuur = DHTMeasure.Temperatuur; Update_Blynk_APP(7, waar); // Temperaturanzeige } } terug waar; } dwaas SetLedConfig(byte Rood, byte Groen, byte Blauw) { ledcWrite(PWMledChannelA, Rood); // Rote LED ledcWrite(PWMledChannelB, Blauw); // Blaue LED ledcWrite(PWMledChannelC, Groen); // Gruene LED terug waar; } int ReadMoistureSensor_Raw_Val(byte Sensor) { int Winstwaarde, ik; lang som = 0; #bepalen NUM_READS 6 adc1_config_width(ADC_WIDTH_BIT_12); // Bereik 0-4095 schakelaar (Sensor) { geval 0: { adc1_config_channel_atten(ADC1_CHANNEL_0, ADCAttenuation); voor (ik = 0; ik < NUM_READS; ik++) { // Gemiddelde algoritme som += adc1_get_raw( ADC1_CHANNEL_0 ); // Analoog lezen } Winstwaarde = som / NUM_READS; breken; } geval 1: { adc1_config_channel_atten(ADC1_CHANNEL_3, ADCAttenuation); voor (ik = 0; ik < NUM_READS; ik++) { // Gemiddelde algoritme som += adc1_get_raw( ADC1_CHANNEL_3 ); // Analoog lezen } Winstwaarde = som / NUM_READS; breken; } geval 2: { adc1_config_channel_atten(ADC1_CHANNEL_6, ADCAttenuation); voor (ik = 0; ik < NUM_READS; ik++) { // Gemiddelde algoritme som += adc1_get_raw( ADC1_CHANNEL_6 ); // Analoog lezen } Winstwaarde = som / NUM_READS; breken; } geval 3: { adc1_config_channel_atten(ADC1_CHANNEL_7, ADCAttenuation); voor (ik = 0; ik < NUM_READS; ik++) { // Gemiddelde algoritme som += adc1_get_raw( ADC1_CHANNEL_7 ); // Analoog lezen } Winstwaarde = som / NUM_READS; breken; } geval 4: { adc1_config_channel_atten(ADC1_CHANNEL_4, ADCAttenuation); voor (ik = 0; ik < NUM_READS; ik++) { // Gemiddelde algoritme som += adc1_get_raw( ADC1_CHANNEL_4 ); // Analoog lezen } Winstwaarde = som / NUM_READS; breken; } standaard: { adc1_config_channel_atten(ADC1_CHANNEL_5, ADCAttenuation); voor (ik = 0; ik < NUM_READS; ik++) { // Gemiddelde algoritme som += adc1_get_raw( ADC1_CHANNEL_5 ); // Analoog lezen } Winstwaarde = som / NUM_READS; breken; } } terug Winstwaarde; } nietig Update_Local_Display() { byte rood1 = 0; byte geel1 = 0; byte groen1 = 0; voor (byte ik = 0; ik < AttachedMoistureSensors; ik++) { als (MMeasure.DataValid[ik]) { als ( MMeasure.Procent[ik] > SysConfig.StatusBorderPercentValues[ik][1]) { groen1++; } anders als ( MMeasure.Procent[ik] > SysConfig.StatusBorderPercentValues[ik][0]) { geel1++; } anders { rood1++; } } } als (rood1 > 0) { SetLedConfig(255, 0, 0); } anders als (geel1 > 0) { SetLedConfig(255, 255, 0); } anders als (groen1 > 0) { SetLedConfig(0, 255, 0); } anders { SetLedConfig(0, 0, 255); } } nietig Update_Blynk_APP(byte Sensor, dwaas Gekalibreerd) { schakelaar (Sensor) { geval 0: { als ((MMeasure.DataValid[0]) & (Gekalibreerd)) { als ( MMeasure.Procent[0] > SysConfig.StatusBorderPercentValues[0][1]) { Blynk.setProperty(V1, "kleur", BLYNK_GREEN); } anders als ( MMeasure.Procent[0] > SysConfig.StatusBorderPercentValues[0][0]) { Blynk.setProperty(V1, "kleur", BLYNK_YELLOW); } anders { Blynk.setProperty(V1, "kleur", BLYNK_RED); } vertraging(100); Blynk.virtualWrite(V1, MMeasure.Procent[0]); } anders { Blynk.setProperty(V1, "kleur", BLYNK_BLUE); } breken; } geval 1: { als ((MMeasure.DataValid[1]) & (Gekalibreerd)) { als ( MMeasure.Procent[1] > SysConfig.StatusBorderPercentValues[1][1]) { Blynk.setProperty(V2, "kleur", BLYNK_GREEN); } anders als ( MMeasure.Procent[1] > SysConfig.StatusBorderPercentValues[1][0]) { Blynk.setProperty(V2, "kleur", BLYNK_YELLOW); } anders { Blynk.setProperty(V2, "kleur", BLYNK_RED); } vertraging(100); Blynk.virtualWrite(V2, MMeasure.Procent[1]); } anders { Blynk.setProperty(V3, "kleur", BLYNK_BLUE); } breken; } geval 2: { als ((MMeasure.DataValid[2]) & (Gekalibreerd)) { als ( MMeasure.Procent[2] > SysConfig.StatusBorderPercentValues[2][1]) { Blynk.setProperty(V3, "kleur", BLYNK_GREEN); } anders als ( MMeasure.Procent[2] > SysConfig.status Board rpercent waarden[2][0]) { Blynk.setProperty(V3, "kleur", BLYNK_YELLOW); } anders { Blynk.setProperty(V3, "kleur", BLYNK_RED); } vertraging(100); Blynk.virtuele schrijven(V3, MMeasure.Procent[2]); } anders { Blynk.setProperty(V3, "kleur", BLYNK_BLUE); } breken; } geval 3: { als ((MMeasure.gegevens geldig[3]) & (Gekalibreerd)) { als ( MMeasure.Procent[3] > SysConfig.status Board rpercent waarden[3][1]) { Blynk.setProperty(V4, ", kleur", BLYNK_GREEN); } anders als ( MMeasure.Procent[3] > SysConfig.StatusBorderPercentValues[3][0]) { Blynk.setProperty(V4, "kleur", BLYNK_YELLOW); } anders { Blynk.setProperty(V4, "kleur", BLYNK_RED); } vertraging(100); Blynk.virtualWrite(V4, MMeasure.Procent[3]); } anders { Blynk.setProperty(V4, "kleur", BLYNK_BLUE); } breken; } geval 4: { als ((MMeasure.DataValid[4]) & (Gekalibreerd)) { als ( MMeasure.Procent[4] > SysConfig.StatusBorderPercentValues[4][1]) { Blynk.setProperty(V5, "kleur", BLYNK_GREEN); } anders als ( MMeasure.Procent[4] > SysConfig.StatusBorderPercentValues[4][0]) { Blynk.setProperty(V5, "kleur", BLYNK_YELLOW); } anders { Blynk.setProperty(V5, "kleur", BLYNK_RED); } vertraging(100); Blynk.virtualWrite(V5, MMeasure.Procent[4]); } anders { Blynk.setProperty(V5, "kleur", BLYNK_BLUE); } breken; } geval 5: { als ((MMeasure.DataValid[5]) & (Gekalibreerd)) { als ( MMeasure.Procent[5] > SysConfig.StatusBorderPercentValues[5][1]) { Blynk.setProperty(V6, "kleur", BLYNK_GREEN); } anders als ( MMeasure.Procent[5] > SysConfig.StatusBorderPercentValues[5][0]) { Blynk.setProperty(V6, "kleur", BLYNK_YELLOW); } anders { Blynk.setProperty(V6, "kleur", BLYNK_RED); } vertraging(100); Blynk.virtualWrite(V6, MMeasure.Procent[5]); } anders { Blynk.setProperty(V6, "kleur", BLYNK_BLUE); } breken; } geval 6: { als (DHTMeasure.DataValid) { als (DHTMeasure.Vochtigheid < 40) // https://www.pflanzenfreunde.com/luftfeuchtigkeit.htm und https://www.brune.info/magazin/richtige-luftfeuchtigkeit-fuer-pflanzen/ { Blynk.setProperty(V7, "kleur", BLYNK_RED); } anders als (DHTMeasure.Vochtigheid < 60) { Blynk.setProperty(V7, "kleur", BLYNK_YELLOW); } anders als (DHTMeasure.Vochtigheid < 85) { Blynk.setProperty(V7, "kleur", BLYNK_GREEN); } anders { Blynk.setProperty(V7, "kleur", BLYNK_YELLOW); } Blynk.virtualWrite(V7, DHTMeasure.Vochtigheid); } breken; } geval 7: { als (DHTMeasure.DataValid) { als (DHTMeasure.Temperatuur > 43) // https://www.spektrum.de/lexikon/biologie-kompakt/hitzeresistenz/5543 { Blynk.setProperty(V8, "kleur", BLYNK_RED); } anders als (DHTMeasure.Temperatuur < 11) // https://de.wikipedia.org/wiki/K%C3%A4ltestress_bei_Pflanzen { Blynk.setProperty(V8, "kleur", BLYNK_RED); } anders { Blynk.setProperty(V8, "kleur", BLYNK_WHITE); } Blynk.virtualWrite(V8, DHTMeasure.Temperatuur); } breken; } geval 8: { als (BHMeasure.DataValid) { als (BHMeasure.Lux < 500) // https://www.zimmerpflanzenlexikon.info/artikel/lichtbedarf-von-pflanzen { Blynk.setProperty(V9, "kleur", BLYNK_RED); } anders als (BHMeasure.Lux < 1000) { Blynk.setProperty(V9, "kleur", BLYNK_GREEN); } anders als (BHMeasure.Lux < 1500) { Blynk.setProperty(V9, "kleur", BLYNK_WHITE); } anders { Blynk.setProperty(V9, "kleur", BLYNK_YELLOW); } Blynk.virtualWrite(V9, BHMeasure.Lux); } pauze; } } // Einde Schakelaar } void Get_Moisture_DatainPercent() { byte CalibDataOffset = 0; voor (byte ik = 0; ik < AttachedMoistureSensors; ik++) { CalibDataOffset = ik * 2; int RawMoistureValue = ReadMoistureSensor_Raw_Val(ik); als ((SysConfig.Gegevens[CalibDataOffset] == 0) || (SysConfig.Gegevens[CalibDataOffset + 1] == 0)) // MinADC Waarde maxADC ADC-Waarde { MMeasure.Procent[ik] = RawMoistureValue; MMeasure.DataValid[ik] = vals; } anders { RawMoistureValue = SysConfig.Gegevens[CalibDataOffset + 1] - RawMoistureValue; RawMoistureValue = SysConfig.Gegevens[CalibDataOffset] + RawMoistureValue; MMeasure.Procent[ik] = kaart(RawMoistureValue, SysConfig.Gegevens[CalibDataOffset], SysConfig.Gegevens[CalibDataOffset + 1], 0, 100); als ((MMeasure.Procent[ik] > 100 ) | (MMeasure.Procent[ik] < 0 )) { MMeasure.Procent[ik] = RawMoistureValue; MMeasure.DataValid[ik] = vals; } anders { MMeasure.DataValid[ik] = true; } } } return ; } void Run_MoistureSensors (bool Init) // HauptFunktion zum Betrieb der Bodenfeuchtesensoren { byte MinSensValue = 100; als ((millis() - Moisure_ServiceCall_Handler >= MoisureSens_Poll_MinInterval * 1000) | (Init)) { Moisure_ServiceCall_Handler = millis(); als (Init) { voor (int i = 0; i < MaxSensors; ik++) { int MSensorRawValue = ReadMoistureSensor_Raw_Val(ik); als ( MSensorRawValue > MinSensorValue) { AttachedMoistureSensors++; } anders { breken; } } als (AttachedMoistureSensors < 1) { #ifdef DEBUG Seriële.println(F("Keine Bodenfeuchtigkeitssensoren erkannt. Systeem angehalten.")); #endif SetLedConfig(255, 0, 255); digitalWrite(LED_Rot, HIGH); // Systeem angehalten Led-Anzeige: lila digitalWrite(LED_Blau, HOGE); digitalWrite(LED_Gruen, LAGE); vertraging(1200000); esp_deep_sleep_start(); terwijl (1) {} } voor (int i = 0; i < AttachedMoistureSensors; ik++) { als (ik == 0) { Blynk.setProperty(V1, "label", SysConfig.SensorName[0]); } als (ik == 1) { Blynk.setProperty(V2, "label", SysConfig.SensorName[1]); } als (ik == 2) { Blynk.setProperty(V3, "label", SysConfig.SensorName[2]); } als (ik == 3) { Blynk.setProperty(V4, "label", SysConfig.SensorName[3]); } als (ik == 4) { Blynk.setProperty(V5, "label", SysConfig.SensorName[4]); } als (ik == 5) { Blynk.setProperty(V6, "label", SysConfig.SensorName[5]); } } voor (int i = AttachedMoistureSensors; ik < MaxSensors; ik++) { als (ik == 0) { Blynk.setProperty(V1, "label", "Deaktiviert"); Blynk.setProperty(V1, "kleur", BLYNK_BLACK); } als (ik == 1) { Blynk.setProperty(V2, "label", "Deaktiviert"); Blynk.setProperty(V2, "kleur", BLYNK_BLACK); } als (ik == 2) { Blynk.setProperty(V3, "label", "Deaktiviert"); Blynk.setProperty(V3, "kleur", BLYNK_BLACK); } als (ik == 3) { Blynk.setProperty(V4, "label", "Deaktiviert"); Blynk.setProperty(V4, "kleur", BLYNK_BLACK); } als (ik == 4) { Blynk.setProperty(V5, "label", "Deaktiviert"); Blynk.setProperty(V5, "kleur", BLYNK_BLACK); } als (ik == 5) { Blynk.setProperty(V6, "label", "Deaktiviert"); Blynk.setProperty(V6, "kleur", BLYNK_BLACK); } } } Get_Moisture_DatainPercent(); voor (int i = 0; i < AttachedMoistureSensors; ik++) { als (MMeasure.DataValid[ik]) { als (MMeasure.Procent[ik] != MMeasure.Old_Percent[ik]) { MMeasure.Old_Percent[ik] = MMeasure.Procent[ik]; als (MMeasure.Procent[ik] < MinSensValue ) { MinSensValue = MMeasure.Procent[i]; }; #ifdef DEBUG Seriële.print(F("Feuchtigkeitswert Sensor ")); Serieel.afdrukken(ik); Seriële.print(F(" in Prozent :")); Serieel.afdrukken(MMeasure.Procent[ik]); Seriële.println(F(" %")); #endif Update_Blynk_APP(ik, Sens_Calib); // Aktualisiere Handywerte } } anders { Update_Blynk_APP(ik, Sens_NOTCalib); // Aktualisiere Handywerte Seriële.print(F("Sensor ")); Serieel.afdrukken(ik); Seriële.print(F(" nicht kalibiert. Please kalibrieren. Rohdatenwert:")); Seriële.println(MMeasure.Procent[ik]); } } Update_Local_Display(); // Aktualisiere lokales Pflanzenwächter Display (Led) } } // Main Loop void loop() { Run_MoistureSensors(RunTime); als (DHTMeasure.SensorEnabled) { Run_DHTSensor(RunTime); } als (BHMeasure.SensorEnabled) { Run_BH1750Sensor(RunTime); } Blynk.uitgevoerd(); }
In dem Code müssen vor dem ersten Hochladen müssen jedoch noch folgende Codezeilen een sterven jeweiligen eigenen Bedürfnisse angepasst werden:
int Data[MaxSensors*2] = {0,0,0,0,0,0,0,0,0,0,0,0,};
|
Werte bitte gemäß Beschreibung in de Teil 1 der Reihe anpassen.
#definiëren MoisureSens_Poll_MinInterval 3600
|
Interval zwischen zwei Bodenfeuchtemessungen in Sekunden. Der Wert hoed darauf Einfluss, wie oft sterven Handydaten der Bodenfeuchtesensoren aktualisiert werden, und damit auch, welches Datenvolumen für die Übertragung pro Zeit anfällt. Je höher, desto größeres Interval. Bitte auf einen Wert setzen, der zu dem eigenen Datenvolumen bzw. Budget passt.
[Beispiel: 3600 s =1 Stunde]
#define DHT_Poll_MinInterval 2700
|
Interval zwischen zwei Temperatur/Luftfeuchtemessungen in Sekunden. Der Wert hoed darauf Einfluss, wie oft sterven Handydaten der Temperatur/Luftfeuchtemessungen aktualisiert werden, und damit auch, welches Datenvolumen für die Übertragung pro Zeit anfällt. Je höher, desto größeres Interval. Bitte auf einen Wert setzen, der zu dem eigenen Datenvolumen bzw. Budget passt.
[Beispiel: 2700 s = 45 Minuten Datenübertragungsintervall]
#define BH_Poll_MinInterval 1800
|
Interval zwischen zwei Verlichtingsterktemetingen in seconden. De waarde heeft een invloed, zoals vaak de mobiele telefoon de gegevens van de verlichtingssterkte metingen worden bijgewerkt, en dus het volume van de te verzenden data per keer is verkregen. Hoe hoger, hoe groter interval. Gelieve een waarde ingesteld, om de eigen gegevens van het volume en Budget.
[Voorbeeld: 1800 n = 30 minuten data transmissie-interval]
char auth[] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; char ssid[] = "Deine_WLAN_SSID"; char pass[] = "Uw _WLAN _Passwort!"; |
Voeg deze waarden in overeenstemming met de beschrijving in deel 2 van de serie aan te passen.
Het kan de volgende parameters/regels code, aangepast aan de individuele behoeften worden:
String sensor naam[MaxSensors] = {"Plant 1""2 Plant","Plant 3","Plant 4","Plant 5","Plant 6"}; |
sensor naam in de APP als de titel wordt weergegeven.
byte status Board rpercent waarden[MaxSensors*2][2]= { {10,50}, .....
|
Twee-dimensionale Array voor het percentage grenzen (stoplicht) in elk geval afzonderlijk per vochtigheid sensor (1 -6). Effect op het "stoplicht" display en de weergave van de waarden in de APP. De eerste Die (10), de overgang grens tussen de statussen "rood" en Status "geel". De tweede waarde is de overgang grens tussen de Status "geel" en Status "groen". Voorbeeld: een 51% vocht in de bodem "groen" te beginnen bij 9% vocht in de bodem "rood".
#define DEBUG
|
Als de Definitie van "DEBUG" zijn de runtime-berichten op de seriële interface. Voor de productieve ingebruikname van de pot van de Definitie van "DEBUG" worden verwijderd om te voorkomen dat onnodig gebruik van middelen om te voorkomen dat..
we Komen weer, zoals in de andere Delen, de aanpassing van onze APP voor mobiele telefoons. In deze moeten we nu een nieuwe "A-Level" - Element, te genereren, en dit als volgt beschreven Setup
, kunnen We toevoegen aan de weergave van de huidige bodemvocht, de "Niveau-H" op " 1-de tijd voor het toevoegen
En configureren van het nieuwe item is als volgt:
- - kleur: Rood
- - Ingang Pin: V9 (bijna)
- Minimale waarde: 0
- Maximale waarde: 1400 (of 1500)
De meest belangrijke aanpassing is de Input Variabele. Dit moet fhier op "V9" kan worden ingesteld
, We definiëren we als het Lezen van Tarief weer "Druk"
van Het eindresultaat, in het geval van activering van het project ziet er nu iets als het volgende:
gefeliciteerd! U hebt geconfigureerd uw planten guard met succes.
Let op het volgende:
We hebben nu op ons DashBoard 9 "H-Niveau" scherm elementen. Elke "H-Niveau" kost 200 energie. Dit maakt 9*200 = 1800 punten van energie. Voor het Toevoegen van extra elementen, die is duurder dan energie 200 punten, vanaf dit punt, alleen de betaalde IN-APP aankopen. De andere voorbeelden en Screenshots met grafieken zijn daarom onderworpen aan een heffing! Voor de Algemene functie van de plant detector dit is niet nodig,!
kan Ook niet worden gegarandeerd dat in de toekomst, met de APP of de gekochte energie punten voor toekomstige follow-up serie wordt nog steeds gebruikt, of zal worden. Gelieve te beslissen, daarom verantwoordelijk voor of je het geld hierin willen investeren.
Zelfs als de App-Functie is, in ieder geval, zelfs ZONDER verdere investering, is volledig operationeel en wordt al een echte eye-catcher, ik heb u niet willen onthouden van de reeds mogelijk betaalde uitbreidingen. Geen Wijzigingen aan het ESP-code is nodig. Alle Screenshots zijn niet alleen op de Blynk APP, ongeacht de Firmware zo worden geconfigureerd.
Haalbaarheid voorbeeld: temperatuur gradiënt (in een Tabel) :
haalbaarheid voorbeeld:temperatuur cursus (gescheiden in twee Grafieken)
haalbaarheid bijvoorbeeld de verlichtingssterkte geschiedenis
voor Meer informatie over de Blynk APP en het gebruik ervan in controllers kan gevonden worden op:
- Blynk inleiding -> https://www.blynk.cc/getting-started
- documentatie -> http://docs.blynk.cc/
- Schets-Generator -> https://examples.blynk.cc/
- meest Recente Blynk bibliotheek -> https://github.com/blynkkk/blynk-library/releases/download/v0.6.1/Blynk_Release_v0.6.1.zip
- de Nieuwste Blynk server -> https://github.com/blynkkk/blynk-server/releases/download/v0.41.5/server-0.41.5.jar
- Blynk startpagina -> https://www.blynk.cc
let op: dit is een project voor hydro-cultuur planten of lucht-wortel planten zijn niet geschikt. Planten hebben verschillende eisen aan hun omgeving. Aangezien de individuele eisen van de planten, onze fabriek bewakers misschien niet weet, is de Interpretatie van de waarde verklaringen van de plant guard uitsluitend in de handen van de gebruiker
van De plant guard is niet een vervanging voor een verantwoorde verzorging van de planten!
U kunt dit project en andere projecten van mij op mijn Git-Hub pagina, te vinden.
Veel plezier.
5 Reacties
Siegfried
Hallo Tobias,
ich habe selten so gute Beiträge gelesen wie deine “Pflanzenwächter 1-5”. Da ist wirklich alles dabei und für richtige Experten “volles Programm”!
Meine vorsichtige Frage: Hast Du auch eine vereinfachte Version, z. B. ohne Handy App und WLAN. Dafür mit Display für die Anzeige vor Ort (2,8" TFT LCD Shield wie RM68090 oder ähnlich)? Das könnte eine interessante Ergänzung zu dem perfekten Erfassungsmodul sein!?
Freundliche Grüße aus München,
Siegfried
Helmut Lieven
Hallo und danke für das SUPER Projekt. Ich suche schon lange etwas um die Bodenfeuchtigkeit zu messen.
Das Projekt funktioniert mit allen Anzeigen auf dem Handy. Nur ein Problem bereit mir die Feuchtigkeitsanzeige, habe 2 Sensoren angeschlossen. Wenn ich die Werte mit Code Teil 1 auswerte und in Code Teil 5 übertrage kommt die Anzeige BITTE Kalibrieren. Bei geänderten Werten funktioniert es aber die Anzeige % weicht von der ersten Messung ab. Wie kann man am besten Daten ändern?
Gruß Helmut
Dieter
Hallo, ich bin noch Anfänger, und finde die Anleitungen sehr gut. Frage könnte man noch ein Tutorial machen in den man eine Pumpe, bzw Lüfter bei bestimmten Werten schalten kann?
Wäre echt toll.
Danke.
Tobias
Hallo Knut,
versuche mal einen Sensor in trockene Erde und den anderen in feuchte Erde zu stecken. Das sollte in jedem Fall unterschiedliche Ergebnisse liefern. Des weiteren ist eine Kalibrierung der Sensoren wichtig. Ist dies durchgeführt worden ?
Knut Dorendorff
Hallo,
ich habe für 6 Bodenfeuchtsensoren alles eingerichtet und auch dazu den Code installiert. Ich habe im Moment nur 2 Sensoren angeschlossen. Diese arbeiten auch, zeigen aber für beide Sensoren den gleichen Wert an. Habe mehrmals überprüft, ob irgendwo überbrücken sind, aber nein. Ist das ein typischen verhalten bei nur angeschlossenen 2 Sensoren oder muss ich dann im Code etwas verändern?
Danke
Knut