Pflanzenwächter für die Fensterbank Teil 5 – Beleuchtungsstärkenmessung - AZ-Delivery

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

DHT 22

 

 

DHT 11

als een Alternatief voor DHT 22

1

KY-016 RGB LED-module

 

1

ESP-32 Dev Kit C

 

6

soil moisture Sensor module V1.2

 

1

MB102 voeding Adapter

Voor brood Raad design

1

module GY-302

verlichting sensor

12

Weerstanden volgens de beschrijving

 

 

 

, laten We eens kijken naar de bijgewerkte schema/elektrisch schema van de Plant controller:

deel 5: circuit

 

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 -

22

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

 onderdeel5 1

En configureren van het nieuwe item is als volgt:

 onderdeel5 App2
  • - 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"

onderdeel5 App3

van Het eindresultaat, in het geval van activering van het project ziet er nu iets als het volgende:

onderdeel5 App4

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) :

onderdeel5 - App5 - voorbeeld

 

onderdeel5-App6

 

haalbaarheid voorbeeld:temperatuur cursus (gescheiden in twee Grafieken) 

onderdeel5 App7 - voorbeeld 2

haalbaarheid bijvoorbeeld de verlichtingssterkte geschiedenis

onderdeel5 App8 Lux

voor Meer informatie over de Blynk APP en het gebruik ervan in controllers kan gevonden worden op:

 

 

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.

 

Esp-32Projekte für fortgeschritteneSensorenSmart home

5 Reacties

Siegfried

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

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

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

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

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

Laat een reactie achter

Alle opmerkingen worden voor publicatie gecontroleerd door een moderator

Aanbevolen blogberichten

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery