Equipo de protección fitosanitaria de la ventanilla parte 5: medición de la iluminación

En esta Parte de la Serie que voy, una vez más, la más importante de las Partes anteriores de resumir. Hemos Retrospectiva, ya que algunos Cambios y Adiciones de nuestro Pflanzenwächters realizado. Por ejemplo, tenemos el Número de sensores de humedad de suelo para 6 avanzado y un combinado de Temperatura y Luftfeuchtesensor añadido. Para las Plantas, son ya una buena Base. Falta, sin embargo, aún para nuestra Flora, otro de los más importantes sí indispensable Ambiental. Esta es la Luz, en especial la Iluminación! Genmessen la Iluminación en la Unidad de Lux.

La mayoría de las Plantas se sienten en el Beleuchtungsstärkenbereich de 300-1500 Lux (dependiendo del Tipo de planta) más cómodo. Esto es lo que deseamos, por supuesto, tener en cuenta y con nuestro Pflanzenwächter la iluminación en Lux en cualquier momento. Para ello, recopilamos la Iluminancia en la Unidad Lux y estas en la misma y la Manera en la pantalla del teléfono móvil como de Información y comunicaciones.

Para esta Tarea es, en nuestro Caso, la Beleuchtungsstärkensensor BH1750, ya que esta última, por una parte, con los 3,3 Voltios Datenpegeln del ESP32 es compatible, como también la Iluminación como un Paquete de datos a través de la Interfaz de I2C directamente en Lux, Unidad de nuestros ESP transmite.

Pedir está el Sensor de luz, por ejemplo, en el AZ de Entrega de la Tienda como Módulo GY-302.

Si ustedes más Detalles sobre el Módulo interesados, podéis encontrar por ejemplo aquí para obtener más Información.

 

La BH1750 tiene un muy amplio Rango de medición y la Resolución puede, en principio, a través de Parámetros de configuración entre 0,5 Lux 1 Lux y 4 Lux ser elegido.

Para nuestro Proyecto, vamos a elegir el medio de Resolución de 1 Lux.

Con la Adición del Sensor de luz, tenemos nuestros Sensores necesarios ahora final para el Proyecto que

 

Aquí se encuentra la anterior Pflanzenwächterteile, su Estudio, yo quisiera recomendar, ya que la Información importante, Por Ejemplo, a través de la Calibración de los sensores de humedad de suelo contiene:


volvamos a la importante lista de Piezas. Puedes encontrar todas las Partes relevantes de este Proyecto, el de su Réplica en la siguiente lista de Piezas:

Número

Descripción

Nota

1

DHT 22

 

 

DHT 11

como Alternativa a la DHT 22

1

KY-016 LED RGB Módulo

 

1

ESP-32 Dev Kit C

 

6

Humedad del Sensor Módulo V1.2

 

1

MB102 Adaptador de fuente de Alimentación

Para Breadboardaufbau

1

Módulo GY-302

Beleuchtungsstärkensensor

12

Resistencias, según la Descripción

 

 

 

Nos veamos actualizado el Diagrama de Cableado del Pflanzenwächters en:

Parte 5: Circuito

 

reconocemos en él el añadido un nuevo Sensor de luz BH1570. Nos unimos a la Periferia de la siguiente manera:

RGB_Led Módulo

RGB Led Ánodo

ESP32 Pin

Rojo

0

Verde

15

Azul

14

 

sensores de humedad de suelo

Sensor de humedad

ESP32 Pin

1

SP

2

SN

3

34

4

35

5

32

6

33

 

Temperatura/Luftfeuchtesensor DHT 22

PIN

ESP32 Pin

DATA /OUT

4

 

Beleuchtungsstärkensensor BH1570

BH1570 PIN

ESP32 Pin

SDA

21

SCL

22

ADDR

GND

 

Después de que nos de el Cableado es correcto, han convencidoa cargar el siguiente Código en nuestro ESP alto:

 

#include <driver/adc.h>     // Build En la Librería. No external Library needed
//#include <esp_wifi.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <ESPmDNS.h>
#include <BlynkSimpleEsp32.h>
#include <EEPROM.h>
#include <Preferences.h>
#include <Wire.h>
#include "DHT.h"    // REQUIRES the following Arduino bibliotecas:
//- DHT Sensor de Biblioteca: https://github.com/adafruit/DHT-sensor-library
//- Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor


// Portedefinierung del RGB LED del Módulo
#define LED_Rot     0     // LED Rojo 
#define LED_Blau    14    // LED Azul
#define LED_Gruen   15    // LED Verde

// I2C, las Definiciones de Puerto
#define SDA1 21
#define SCL1 22

// LED PWM Configuración
#define PWMfreq 5000  // 5 Khz frecuencia fundamental de Pantalla LED
#define PWMledChannelA  0
#define PWMledChannelB  1
#define PWMledChannelC  2
#define PWMresolution  8 // 8 Bits de Resolución para el LED PWM

//Tiempo / Temporización Definiciones para Sensorabfragen
#define ADCAttenuation ADC_ATTEN_DB_11       // ADC_ATTEN_DB_11 = 0-3,6 V Amortiguación ADC (ADC Extensión
#define MoisureSens_Poll_MinInterval 3600       // Mínimo Messwertübertragungsintervall entre dos Bodenfeuchtemessungen en Segundos.
#define DHT_Poll_MinInterval 2700               // Mínimo Messwertübertragungsintervall entre los dos la Temperatura y la Luftfeuchikeitsemessungen en Segundos.
#define BH_Poll_MinInterval  1800             // Mínimo Messwertübertragungsintervall entre dos Lichtstärkeabfragen en Segundos.

#define DEBUG                                // En la definición de una serie de datos y de los valores de Medición de la Serie la Interfaz de salida. Por favor antes de eliminar productivo Uso !
#define MaxSensors 6                         // Número Máximo de conectables FeuchteSensoren
#define MinSensorValue 500                   // Mnidest AD, un Valor que Sensoreingangskanale (1-6) como "Activo" en el Sistema para informar. (Sensor de humedad está conectado durante la fase de booteo)
#define StartInit true
#define RunTime false
#define Sens_Calib true
#define Sens_NOTCalib false
#define EEPROM_SIZE 512                      // Definición de Tamaño de la Interna EEPROM

// Blynk APLICACIÓN Definiciones
#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 Serial 1
#define BLYNK_NO_BUILTIN
#define BLYNK_NO_FLOAT
//#define BLYNK_DEBUG

//DHT Configuración
#define DHTPIN 4                             // Digital pin connected to the DHT sensor
#define DHTTYPE DHT22                        // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // en Caso de que en sus Proyecto DHT 21 (AM2301) se utiliza por favor, laas Ajuste definir

struct SystemRunParameters
{   int Data[MaxSensors * 2] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; // Calibration Data para el sensor de Humedad. Por favor, el Proyecto de Texto de nota y Valores según personalizar   byte StatusBorderPercentValues[MaxSensors * 2][2] = { {10, 50},     // Zweidimensinonales Matriz de Prozentgrenzwerte (Semáforo), de uno en uno por Sensor de humedad (1 -6)     {10, 50},     {10, 50},     {10, 50},     {10, 50},     {10, 50}   };   String SensorName[MaxSensors + 3] = {"Planta 1", "Planta 2", "Planta De 3", "Planta 4", "Planta 5", "Planta De 6",, "Humedad", "Temperatura", Intensidad"}; // Sensorname, en la APP, como el Encabezado se muestra
};

struct MoistureSensorData
{   int Percent[MaxSensors] = {0, 0, 0, 0, 0, 0};  // Feuchtigkeitssensordaten Porcentaje de   bytes Old_Percent[MaxSensors] = {0, 0, 0, 0, 0, 0}; / Anterior/ _ Feuchtigkeitssensordaten en por Ciento (Propósito: Cantidad de dinero.)   bool DataValid [MaxSensors] = {false, false, false, false, false, false};
};

struct DHTSensorData
{   float Humidity = 0 ;      // Luftfeuchtigkeitssensordaten en por Ciento   float Temperatura = 0;   float Old_Humidity = 0 ;      // Luftfeuchtigkeitssensordaten en por Ciento   float Old_Temperature = 0;   bool DataValid  = false;   bool SensorEnabled  = false;
};

struct BHLightSensorData
{   int Lux = 0 ;          // la Intensidad de luz en Lux   int Old_Lux = 0 ;      // La intensidad de luz en Lux   bool DataValid  = false;   bool SensorEnabled  = false;
};

DHT dht(DHTPIN, DHTTYPE); // DHT Sensor Instancia initalisieren

TwoWire I2CWire = TwoWire(0);


//Global Variables

char auth[] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // Aquí lt. Guía Auth Token particular Blynk App inscribirse (E-Mail).
// Tus Datos De Acceso WiFi.
char ssid[] = "Deine_WLAN_SSID";                 // por Favor, a mi WI-fi SSID personalizar
char pass[] = "Tu _WLAN _Passwort!";           // Por favor, a mi WI-fi Contraseña personalizar
char ESPName[] = "PlantSensor1";

SystemRunParameters SysConfig;
MoistureSensorData MMeasure;
DHTSensorData  DHTMeasure;
BHLightSensorData BHMeasure;


byte AttachedMoistureSensors = 0;               // Detected Active Moisture Sensor (Count)
byte BH1750I2CAddress = 0;                      // Detected BH1750 I2C Address
bool Connected2Blynk = false;                   // Bool Variable. Tiendas the Connectionstate to the Blynk Nube
unsigned long Moisure_ServiceCall_Handler = 0;  // Delay Variable for Delay between Moisure Lecturas
unsigned long DHT_ServiceCall_Handler = 0;      // Delay Variable for Delay between DHT Lecturas
unsigned long BH_ServiceCall_Handler = 0;       // Delay Variable for Delay between BH1750 Lecturas
unsigned long chipid;

void setup() {   pinMode(LED_Rot, SALIDA);   pinMode(LED_Blau, SALIDA);   pinMode(LED_Gruen, SALIDA);   Serial.begin(115200);             // inicializar la comunicación serie a 115200 bits por segundo:   I2CWire.comenzar(SDA1, SCL1, 400000); // join bus i2c (dirección opcional para el maestro)   //chipid=ESP.getEfuseMac(); //El ID de chip es esencialmente su dirección MAC(duración: 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);   // adjuntar el canal a la GPIO para ser controlado   ledcAttachPin(LED_Blau, PWMledChannelB);   ledcAttachPin(LED_Gruen, PWMledChannelC);   SetLedConfig(255, 255, 255);
#ifdef DEBUG   Serial.print(F("Verbindung zu WLAN"));
#endif   WiFi.se desconecte();   el WiFi.setHostname(ESPName);   // esp_wifi_set_mode(WIFI_MODE_STA);   WiFi.en modo(WIFI_STA);   WiFi.comenzar(ssid, pass);   WiFi.setSleep(false);   si (WiFi.waitForConnectResult() != WL_CONNECTED)   {     mientras que (WiFi.de estado() != WL_CONNECTED)     {       retraso(1000);       WiFi.comenzar(ssid, pasar);  // probar de nuevo, si se Conectan primero es incorrecta
#ifdef DEBUG       Serial.print(F("."));
#endif     }   }
#ifdef DEBUG   Serial.println(F(" erfolgreich."));   De serie.impresión(F("Dirección IP: "));   de Serie.println(WiFi.localIP());   Serie.de impresión(F("Hostname: "));   de Serie.println(ESPName);
#endif   si (!MDNS.comenzar(ESPName))   {     Serie.println("Error de configuración de MDNS respondedor!");   }   MDNS.addService("planta", "tcp", 400);   Blynk.config(auth);   // en lugar de Blynk.begin(auth, ssid, contraseña);   mientras que (Blynk.conectar() == falso) {     retraso(500);     de Serie.impresión(".");   }

#ifdef DEBUG   Serial.println(F("Systemkonfiguration:"));
#endif   si (EEPROM.comenzar(EEPROM_SIZE))   {
#ifdef DEBUG     Serial.de impresión(EEPROM_SIZE);     Serie.println(F(" Bytes de EEPROM"));
#endif   }   Run_MoistureSensors(StartInit);
#ifdef DEBUG   Serial.de impresión(AttachedMoistureSensors);   Serie.println(F(" Bodenfeuchtigkeitsensor(es)"));
#endif   dht.comenzar();   DHTMeasure.SensorEnabled = Run_DHTSensor (StartInit);   si (DHTMeasure.SensorEnabled)   {
#ifdef DEBUG     Serial.println(F("1 DHT 22 Sensor"));
#endif   }   BHMeasure.SensorEnabled = Run_BH1750Sensor(StartInit);   si (BHMeasure.SensorEnabled)   {
#ifdef DEBUG     Serial.println(F("1 B1750 Sensor de Luz"));
#endif   }
}

vacío CheckConnection() {   Connected2Blynk = Blynk.conectado();   si (!Connected2Blynk) {     Serie.println("No está conectado a Blynk servidor");     Blynk.conectar(3333);  // tiempo de espera de 10 segundos y, a continuación, continuar sin Blynk   }   otra {     Serie.println("Conectado a Blynk servidor");   }
}

bool Run_BH1750Sensor (bool Init)   // Tiempo de ejecución de Funktion für den BH170 Lichtsensor
{   byte ce;   si ((millis() - BH_ServiceCall_Handler >= BH_Poll_MinInterval * 1000) | (Init))   {     BH_ServiceCall_Handler = millis();     si (Init)     {       bool BH1750Detected = falso;       I2CWire.beginTransmission(35);       ce = I2CWire.endTransmission(verdadero);       si (ce == 0)       {         BH1750Detected = verdadero;         BH1750I2CAddress = 35; // BH1750 I2C Adresse ist DIC 35       } más       {         I2CWire.beginTransmission(92);         ce = I2CWire.endTransmission(verdadero);         si (ce == 0)         {           BH1750Detected = verdadero;           BH1750I2CAddress = 92; // BH1750 I2C Adresse ist DIC 92         }       }       si (BH1750Detected)       {         // Inicializar el Sensor de         I2CWire.beginTransmission(BH1750I2CAddress);         I2CWire.escribir(0x01);    // encenderlo antes de que podamos restablecer         I2CWire.endTransmission();         I2CWire.beginTransmission(BH1750I2CAddress);         I2CWire.escribir(0 x 07);    // Reset         I2CWire.endTransmission();         I2CWire.beginTransmission(BH1750I2CAddress);         I2CWire.escribir(0x10);    // Continuamente H-Modo de Resolución ( 1 lux Resolución) Weitere Modis möglich, gemäß Datenblatt         //I2CWire.escribir(0x11); // Continuamente H-Modo de Resolución 2 ( 0.5 lux Resolución)         //I2CWire.escribir(0x20); // Una Vez H-Modo de Resolución ( 1 lux Resolución)         //I2CWire.escribir(0x21); // Una Vez H-Resolución Mode2 ( 0.5 lux Resolución)         I2CWire.endTransmission();         Blynk.setProperty(V9, "color", BLYNK_WHITE);         Blynk.setProperty(V9, "etiqueta", SysConfig.SensorName[8]);       } más       {         Blynk.setProperty(V9, "etiqueta", "Deaktiviert");         Blynk.setProperty(V9, "color", BLYNK_BLACK);         Blynk.virtualWrite(V9, 0);         volver BH1750Detected;       }     }     I2CWire.beginTransmission(BH1750I2CAddress);     ce = I2CWire.endTransmission(verdadero);     si (ce == 0)     {       I2CWire.requestFrom(BH1750I2CAddress, 2);       BHMeasure.Lux = I2CWire.leer();       BHMeasure.Lux <<= 8;                  // Verschieben der unteren de 8 Bits de morir höhreren 8 Bits der 16 Bits breiten Zahl       BHMeasure.Lux |= I2CWire.leer();       BHMeasure.Lux = BHMeasure.Lux / 1.2;       BHMeasure.DataValid = verdadero;       si (BHMeasure.Lux != BHMeasure.Old_Lux)       {         BHMeasure.Old_Lux = BHMeasure.Lux;         Update_Blynk_APP(8, true); // Lichtstärkeanzeige en Lux aktualisieren
#ifdef DEBUG         Serial.de impresión ("Lichtstärke en Lux :");         De serie.println (BHMeasure.Lux);
#endif       }     } else     {       BHMeasure.DataValid = falso;       BHMeasure.SensorEnabled = falso;       Blynk.setProperty(V9, "color", BLYNK_BLUE);     }   }   devolver true;
}

bool Run_DHTSensor (bool Init)   // tiempo de ejecución de Funktion für den DHT Temp und Luftfeuchtesensor
{   si ((millis() - DHT_ServiceCall_Handler >= DHT_Poll_MinInterval * 1000) | (Init))   {     DHT_ServiceCall_Handler = millis();     DHTMeasure.Humedad = dht.readHumidity();     DHTMeasure.Temperatura = dht.readTemperature(false);   // Leer la temperatura Celsius (isFahrenheit = true)     si (Init)     {       si (isnan(DHTMeasure.Humedad) || isnan(DHTMeasure.Temperatura))       {         Blynk.setProperty(V7, "etiqueta", "Deaktiviert");         Blynk.setProperty(V8 de, "etiqueta", "Deaktiviert");         Blynk.virtualWrite(V7, 0);         Blynk.virtualWrite(V8, -20);         Blynk.setProperty(V7, "color", BLYNK_BLACK);         Blynk.setProperty(V8, "de color", BLYNK_BLACK);         DHTMeasure.DataValid  = false;         return false;       } else       {         Blynk.setProperty(V7, "color", BLYNK_WHITE);         Blynk.setProperty(V7, "etiqueta", SysConfig.SensorName[6]);         Blynk.setProperty(V8, "de color", BLYNK_WHITE);         Blynk.setProperty(V8 de, "etiqueta", SysConfig.SensorName[7]);         DHTMeasure.DataValid  = verdadero;         DHTMeasure.Old_Humidity = DHTMeasure.Humedad;         Update_Blynk_APP(6, true); // Luftfeuchteanzeige         DHTMeasure.Old_Temperature = DHTMeasure.Temperatura;         Update_Blynk_APP(7, true); // Temperaturanzeige         devolver true;       }     }     si (isnan(DHTMeasure.Humedad) || isnan(DHTMeasure.Temperatura))     {       Blynk.setProperty(V7, "color", BLYNK_BLUE);       Blynk.setProperty(V8, "de color", BLYNK_BLUE);       DHTMeasure.DataValid  = falso;       DHTMeasure.SensorEnabled = false;       return false;     }     DHTMeasure.DataValid  = verdadero;     si (DHTMeasure.Humedad != DHTMeasure.Old_Humidity)     {       DHTMeasure.Old_Humidity = DHTMeasure.Humedad;       Update_Blynk_APP(6, true); // Luftfeuchteanzeige     }     si (DHTMeasure.Temperatura !=  DHTMeasure.Old_Temperature)     {       DHTMeasure.Old_Temperature = DHTMeasure.Temperatura;       Update_Blynk_APP(7, true); // Temperaturanzeige     }   }   devolver true;
}

bool SetLedConfig(byte Rojo, byte Verde, byte Azul)
{   ledcWrite(PWMledChannelA, Rojo); // Rote LED   ledcWrite(PWMledChannelB, Azul); // Azul LED   ledcWrite(PWMledChannelC, Verde); // Gruene LED   devolver true;
}

int ReadMoistureSensor_Raw_Val(byte Sensor)
{   int ReturnValue, me;   largo de suma = 0;
#define NUM_READS 6   adc1_config_width(ADC_WIDTH_BIT_12);   //Rango de 0-4095   interruptor de (Sensor)   {     caso 0:       {         adc1_config_channel_atten(ADC1_CHANNEL_0, ADCAttenuation);         para (que yo = 0; me < NUM_READS; i++) { // Promedio algoritmo de           suma += adc1_get_raw( ADC1_CHANNEL_0 ); //Lectura analógica         }         ReturnValue = suma / NUM_READS;         romper;       }     caso 1:       {         adc1_config_channel_atten(ADC1_CHANNEL_3, ADCAttenuation);         para (que yo = 0; me < NUM_READS; i++) { // Promedio algoritmo de           suma += adc1_get_raw( ADC1_CHANNEL_3 ); //Lectura analógica         }         ReturnValue = suma / NUM_READS;         romper;       }     caso 2:       {         adc1_config_channel_atten(ADC1_CHANNEL_6, ADCAttenuation);         para (que yo = 0; me < NUM_READS; i++) { // Promedio algoritmo de           suma += adc1_get_raw( ADC1_CHANNEL_6 ); //Lectura analógica         }         ReturnValue = suma / NUM_READS;         romper;       }     caso 3:       {         adc1_config_channel_atten(ADC1_CHANNEL_7, ADCAttenuation);         para (que yo = 0; me < NUM_READS; i++) { // Promedio algoritmo de           suma += adc1_get_raw( ADC1_CHANNEL_7 ); //Leer analógico         }         ReturnValue = suma / NUM_READS;         romper;       }     caso 4:       {         adc1_config_channel_atten(ADC1_CHANNEL_4, ADCAttenuation);         para (que yo = 0; me < NUM_READS; i++) { // Promedio algoritmo de           suma += adc1_get_raw( ADC1_CHANNEL_4 ); //Lectura analógica         }         ReturnValue = suma / NUM_READS;         romper;       }     defecto:       {         adc1_config_channel_atten(ADC1_CHANNEL_5, ADCAttenuation);         para (que yo = 0; me < NUM_READS; i++) { // Promedio algoritmo de           suma += adc1_get_raw( ADC1_CHANNEL_5 ); //Leer analógico         }         ReturnValue = suma / NUM_READS;         romper;       }   }   volver ReturnValue;
}


vacío Update_Local_Display()
{   byte red1 = 0;   byte amarillo1 = 0;   byte green1 = 0;   por (byte yo = 0; me < AttachedMoistureSensors; yo++)   {     si (MMeasure.DataValid[yo])     {       si ( MMeasure.por Ciento[me] > SysConfig.StatusBorderPercentValues[me][1])       {         green1++;       } más si ( MMeasure.por Ciento[me] > SysConfig.StatusBorderPercentValues[me][0])       {         amarillo1++;       } más       {         red1++;       }     }   }   si (red1 > 0)   {     SetLedConfig(255, 0, 0);   }   más si (amarillo1 > 0)   {     SetLedConfig(255, 255, 0);   }   más si (green1 > 0)   {     SetLedConfig(0, 255, 0);   }   más   {     SetLedConfig(0, 0, 255);   }
}

vacío Update_Blynk_APP(byte Sensor, bool Calibrado)
{   interruptor de (Sensor)   {     caso 0:       {         si ((MMeasure.DataValid[0]) & (Calibrado))         {           si ( MMeasure.por Ciento[0] > SysConfig.StatusBorderPercentValues[0][1])           {             Blynk.setProperty(V1, "de color", BLYNK_GREEN);           } más si ( MMeasure.por Ciento[0] > SysConfig.StatusBorderPercentValues[0][0])           {             Blynk.setProperty(V1, "de color", BLYNK_YELLOW);           } más           {             Blynk.setProperty(V1, "de color", BLYNK_RED);           }           retraso(100);           Blynk.virtualWrite(V1, MMeasure.por Ciento[0]);         } más         {           Blynk.setProperty(V1, "de color", BLYNK_BLUE);         }         romper;       }     caso 1:       {         si ((MMeasure.DataValid[1]) & (Calibrado))         {           si ( MMeasure.por Ciento[1] > SysConfig.StatusBorderPercentValues[1][1])           {             Blynk.setProperty(V2, "de color", BLYNK_GREEN);           } más si ( MMeasure.por Ciento[1] > SysConfig.StatusBorderPercentValues[1][0])           {             Blynk.setProperty(V2, "de color", BLYNK_YELLOW);           } más           {             Blynk.setProperty(V2, "de color", BLYNK_RED);           }           retraso(100);           Blynk.virtualWrite(V2, MMeasure.por Ciento[1]);         } más         {           Blynk.setProperty(V3, "color", BLYNK_BLUE);         }         romper;       }     caso 2:       {         si ((MMeasure.DataValid[2]) & (Calibrado))         {           si ( MMeasure.por Ciento[2] > SysConfig.StatusBorderPercentValues[2][1])           {             Blynk.setProperty(V3, "color", BLYNK_GREEN);           } más si ( MMeasure.por Ciento[2] > SysConfig.StatusBorderPercentValues[2][0])           {             Blynk.setProperty(V3, "color", BLYNK_YELLOW);           } más           {             Blynk.setProperty(V3, "de color", BLYNK_RED);           }           retraso(100);           Blynk.virtualWrite(V3, MMeasure.por Ciento[2]);         } más         {           Blynk.setProperty(V3, "color", BLYNK_BLUE);         }         romper;       }     caso 3:       {         si ((MMeasure.DataValid[3]) & (Calibrado))         {           si ( MMeasure.por Ciento[3] > SysConfig.StatusBorderPercentValues[3][1])           {             Blynk.setProperty(V4, "color", BLYNK_GREEN);           } más si ( MMeasure.por Ciento[3] > SysConfig.StatusBorderPercentValues[3][0])           {             Blynk.setProperty(V4, "color", BLYNK_YELLOW);           } más           {             Blynk.setProperty(V4, "de color", BLYNK_RED);           }           retraso(100);           Blynk.virtualWrite(V4, MMeasure.por Ciento[3]);         } más         {           Blynk.setProperty(V4, "color", BLYNK_BLUE);         }         romper;       }     caso 4:       {         si ((MMeasure.DataValid[4]) & (Calibrado))         {           si ( MMeasure.por Ciento[4] > SysConfig.StatusBorderPercentValues[4][1])           {             Blynk.setProperty(V5, "color", BLYNK_GREEN);           } más si ( MMeasure.por Ciento[4] > SysConfig.StatusBorderPercentValues[4][0])           {             Blynk.setProperty(V5, "color", BLYNK_YELLOW);           } más           {             Blynk.setProperty(V5, "color", BLYNK_RED);           }           retraso(100);           Blynk.virtualWrite(V5, MMeasure.por Ciento[4]);         } más         {           Blynk.setProperty(V5, "color", BLYNK_BLUE);         }         romper;       }     caso 5:       {         si ((MMeasure.DataValid[5]) & (Calibrado))         {           si ( MMeasure.por Ciento[5] > SysConfig.StatusBorderPercentValues[5][1])           {             Blynk.setProperty(V6, "de color", BLYNK_GREEN);           } más si ( MMeasure.por Ciento[5] > SysConfig.StatusBorderPercentValues[5][0])           {             Blynk.setProperty(V6, "color", BLYNK_YELLOW);           } más           {             Blynk.setProperty(V6, "color", BLYNK_RED);           }           retraso(100);           Blynk.virtualWrite(V6, MMeasure.por Ciento[5]);         } más         {           Blynk.setProperty(V6, "color", BLYNK_BLUE);         }         romper;       }     caso 6:       {         si (DHTMeasure.DataValid)         {           si (DHTMeasure.Humedad < 40)  //  https://www.pflanzenfreunde.com/luftfeuchtigkeit.htm und https://www.brune.info/magazin/richtige-luftfeuchtigkeit-fuer-pflanzen/           {             Blynk.setProperty(V7, "de color", BLYNK_RED);           } más si (DHTMeasure.Humedad < 60)           {             Blynk.setProperty(V7, "color", BLYNK_YELLOW);           } más  si (DHTMeasure.Humedad < 85)           {             Blynk.setProperty(V7, "color", BLYNK_GREEN);           } más           {             Blynk.setProperty(V7, "color", BLYNK_YELLOW);           }           Blynk.virtualWrite(V7, DHTMeasure.Humedad);         }         romper;       }     caso 7:       {         si (DHTMeasure.DataValid)         {           si (DHTMeasure.Temperatura > 43)   // https://www.spektrum.de/lexikon/biologie-kompakt/hitzeresistenz/5543           {             Blynk.setProperty(V8, "de color", BLYNK_RED);           } más si (DHTMeasure.Temperatura < 11) // https://de.wikipedia.org/wiki/K%C3%A4ltestress_bei_Pflanzen           {             Blynk.setProperty(V8, "de color", BLYNK_RED);           } más           {             Blynk.setProperty(V8, "de color", BLYNK_WHITE);           }           Blynk.virtualWrite(V8, DHTMeasure.Temperatura);         }         romper;       }     caso 8:       {         si (BHMeasure.DataValid)         {           si (BHMeasure.Lux < 500)   // https://www.zimmerpflanzenlexikon.info/artikel/lichtbedarf-von-pflanzen           {             Blynk.setProperty(V9, "color", BLYNK_RED);           } más si (BHMeasure.Lux < 1000)           {             Blynk.setProperty(V9, "de color", BLYNK_GREEN);           } más si (BHMeasure.Lux < 1500)           {             Blynk.setProperty(V9, "color", BLYNK_WHITE);           } más           {             Blynk.setProperty(V9, "color", BLYNK_YELLOW);           }           Blynk.virtualWrite(V9, BHMeasure.Lux);         }         break;       }   } // Interruptor final
}

void Get_Moisture_DatainPercent()
{   byte CalibDataOffset = 0;   por (byte yo = 0; me < AttachedMoistureSensors; me++)   {     CalibDataOffset =  i * 2;     int RawMoistureValue = ReadMoistureSensor_Raw_Val(yo);     si ((SysConfig.Datos[CalibDataOffset] == 0) || (SysConfig.Datos[CalibDataOffset + 1] == 0)) // MinADC Valor maxADC ADC Valor     {       MMeasure.por Ciento[me] = RawMoistureValue;       MMeasure.DataValid[me] = false;     } else     {       RawMoistureValue = SysConfig.Datos[CalibDataOffset + 1] - RawMoistureValue;       RawMoistureValue = SysConfig.Datos[CalibDataOffset] + RawMoistureValue;       MMeasure.por Ciento[yo] = mapa(RawMoistureValue, SysConfig.Datos[CalibDataOffset], SysConfig.Datos[CalibDataOffset + 1], 0, 100);       si ((MMeasure.por Ciento[me] > 100 ) | (MMeasure.por Ciento[me] < 0 ))       {         MMeasure.por Ciento[me] = RawMoistureValue;         MMeasure.DataValid[me] = false;       } else  {         MMeasure.DataValid[yo] = verdadero;       }     }   }   retorno ;
}

void Run_MoistureSensors (bool Init)   // HauptFunktion zum Betrieb der Bodenfeuchtesensoren
{   byte MinSensValue = 100;   si ((millis() - Moisure_ServiceCall_Handler >= MoisureSens_Poll_MinInterval * 1000) | (Init))   {     Moisure_ServiceCall_Handler = millis();     si (Init)     {       para (int i = 0; i < MaxSensors; i++)       {         int MSensorRawValue = ReadMoistureSensor_Raw_Val(yo);         si ( MSensorRawValue > MinSensorValue)         {           AttachedMoistureSensors++;         } más {           romper;         }       }       si (AttachedMoistureSensors < 1)       {
#ifdef DEBUG         Serial.println(F("Keine Bodenfeuchtigkeitssensoren erkannt. Sistema de angehalten."));
#endif         SetLedConfig(255, 0, 255);         digitalWrite(LED_Rot, ALTA); // Sistema de angehalten Led Anzeige: lila         digitalWrite(LED_Blau, ALTA);         digitalWrite(LED_Gruen, de BAJO);         retardo(1200000);         esp_deep_sleep_start();         mientras que (1) {}       }       para (int i = 0; i < AttachedMoistureSensors; yo++)       {         si (me == 0) {           Blynk.setProperty(V1, "etiqueta", SysConfig.SensorName[0]);         }         si (me == 1) {           Blynk.setProperty(V2, "etiqueta", SysConfig.SensorName[1]);         }         si (me == 2) {           Blynk.setProperty(V3, "etiqueta", SysConfig.SensorName[2]);         }         si (me == 3) {           Blynk.setProperty(V4, "etiqueta", SysConfig.SensorName[3]);         }         si (me == 4) {           Blynk.setProperty(V5, "etiqueta", SysConfig.SensorName[4]);         }         si (me == 5) {           Blynk.setProperty(V6, "etiqueta", SysConfig.SensorName[5]);         }       }       para (int i = AttachedMoistureSensors; me < MaxSensors; yo++)       {         si (me == 0) {           Blynk.setProperty(V1, "etiqueta", "Deaktiviert");           Blynk.setProperty(V1, "de color", BLYNK_BLACK);         }         si (me == 1) {           Blynk.setProperty(V2, "etiqueta", "Deaktiviert");           Blynk.setProperty(V2, "de color", BLYNK_BLACK);         }         si (me == 2) {           Blynk.setProperty(V3, "etiqueta", "Deaktiviert");           Blynk.setProperty(V3, "color", BLYNK_BLACK);         }         si (me == 3) {           Blynk.setProperty(V4, "etiqueta", "Deaktiviert");           Blynk.setProperty(V4, "color", BLYNK_BLACK);         }         si (me == 4) {           Blynk.setProperty(V5, "etiqueta", "Deaktiviert");           Blynk.setProperty(V5, "color", BLYNK_BLACK);         }         si (me == 5) {           Blynk.setProperty(V6, "etiqueta", "Deaktiviert");           Blynk.setProperty(V6, "de color", BLYNK_BLACK);         }       }     }     Get_Moisture_DatainPercent();     para (int i = 0; i < AttachedMoistureSensors; yo++)     {       si (MMeasure.DataValid[yo])       {         si (MMeasure.por Ciento[me] != MMeasure.Old_Percent[me])         {           MMeasure.Old_Percent[me] = MMeasure.por Ciento[yo];           si (MMeasure.por Ciento[me] < MinSensValue ) {             MinSensValue = MMeasure.por Ciento[i];           };
#ifdef DEBUG           Serial.print(F("Feuchtigkeitswert Sensor "));           de Serie.impresión(que me);           de Serie.impresión(F(" en Prozent :"));           de Serie.impresión(MMeasure.por Ciento[i]);           Serie.println(F(" %"));
#endif           Update_Blynk_APP(me, Sens_Calib);    // Aktualisiere Handywerte         }       } más       {         Update_Blynk_APP(me, Sens_NOTCalib);    // Aktualisiere Handywerte         Serie.de impresión(F("Sensor "));         de Serie.impresión(que me);         de Serie.impresión(F(" nicht kalibiert. Bitte kalibrieren. Rohdatenwert:"));         de Serie.println(MMeasure.por Ciento[me]);       }     }     Update_Local_Display();           // Aktualisiere lokales Pflanzenwächter Display (Led)   }

}

// Bucle Principal
void loop()
{   Run_MoistureSensors(en tiempo de ejecución);   si (DHTMeasure.SensorEnabled) {     Run_DHTSensor(en tiempo de ejecución);   }   si (BHMeasure.SensorEnabled)  {     Run_BH1750Sensor(tiempo de ejecución);   }   Blynk.ejecutar();
}

 

 

En dem Código müssen vor dem ersten Hochladen müssen jedoch noch folgende Codezeilen una mueren jeweiligen eigenen Necesidades de la angepasst werden:

int Datos[MaxSensors*2] = {0,0,0,0,0,0,0,0,0,0,0,0,};

 

Werte bitte gemäß Description en Teil 1 der Reihe anpassen.

#definir MoisureSens_Poll_MinInterval 3600

 

Intervalo entre zwei Bodenfeuchtemessungen en Sekunden. Der Wert sombrero darauf Einfluss, wie oft morir Handydaten der Bodenfeuchtesensoren aktualisiert werden, und damit auch, que Datenvolumen für die Übertragung pro Zeit anfällt. Je höher, desto größeres Intervalo. Bitte auf einen Wert setzen, der zu dem eigenen Datenvolumen bzw. Presupuesto passt.

[Beispiel: 3600 s =1 Stunde]

#define DHT_Poll_MinInterval 2700

 

Intervalo entre zwei Temperatur/Luftfeuchtemessungen en Sekunden. Der Wert sombrero darauf Einfluss, wie oft morir Handydaten der Temperatur/Luftfeuchtemessungen aktualisiert werden, und damit auch, que Datenvolumen für die Übertragung pro Zeit anfällt. Je höher, desto größeres Intervalo. Bitte auf einen Wert setzen, der zu dem eigenen Datenvolumen bzw. Presupuesto passt.

[Beispiel: 2700 s = 45 Minutos Datenübertragungsintervall]

#define BH_Poll_MinInterval 1800

 

Intervalo entre zwei Beleuchtungsstärkenmessungen en Sekunden. Der Wert sombrero darauf Einfluss, wie oft morir Handydaten der Beleuchtungsstärkenmessungen aktualisiert werden, und damit auch, que Datenvolumen für die Übertragung pro Zeit anfällt. Je höher, desto größeres Intervalo. Bitte auf einen Wert setzen, der zu dem eigenen Datenvolumen bzw. Presupuesto passt. 

[Beispiel: 1800 s = 30 Minuten Datenübertragungsintervall]

char auth[] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

char ssid[] = "Deine_WLAN_SSID";

char pass[] = "Dein _WLAN _Passwort!";

 

Werte bitte gemäß Description en Teil 2 der Reihe anpassen.

Es können los siguientes Parámetros/Líneas de código, a las Necesidades:

String SensorName[MaxSensors] = {"Planta 1","Planta 2","Planta 3","Planta 4","Planta 5","Planta 6"};

 

Sensornamen en la APP, como un Título que se muestra.

byte StatusBorderPercentValues[MaxSensors*2][2]= { {10,50}, .....

 

Matriz bidimensional de Prozentgrenzwerte (Semáforo), de uno en uno por Sensor de humedad (1 -6). Tiene Influencia en el "Semáforo" Visualización y la Visualización de los Valores de la APP. La primera, ¿Quién (10) indica el límite de transición entre el Estado de "rojo" y el Estado "amarillo" en. El segundo Valor indica el límite de transición entre el Estado de "amarillo" y el Estado "verde" en. Ejemplo: a partir de 51 % de Humedad del suelo "verde" a partir de 9% de Humedad del suelo "rojo".

#define DEBUG

 

Si la Definición de "DEPURACIÓN" existe Utilitario en la Interfaz serial de salida. Para el Uso en producción jarra de la Definición de "DEPURACIÓN" de ser eliminados innecesario el uso de Recursos vermeinden..

 

ahora vamos de nuevo, como en otras Partes, a la Adaptación de nuestra APLICACIÓN Móvil. En este, tenemos ahora un nuevo "H-Level" Elemento generar y este como siguiendo descrito Configuración

, Vamos a añadir para ver la Humedad del suelo en el Nivel H" 1 vez en agregar

 Teil5 App1

Y configurar el nuevo Elemento de la siguiente manera:

 Teil5 App2
  • Color: Rojo
  • Input Pin: V9 (virtual)
  • Valor Mínimo: 0
  • Máximo: 1400 (o 1500)

, La más importante de Adaptación es la de Entrada Variable. Esta debe fhier en "V9" se

Nos definimos como Reading Tasa de nuevo "Push"

Teil5 App3

en El Resultado final, en caso de Activación del Proyecto ahora debe ser similar a la siguiente:

Teil5 App4

Felicidades!!! Has tu Pflanzenwächter configurado correctamente.

Por favor, ten en cuenta lo siguiente:

ahora Tenemos en nuestro Panel 9 "H Nivel de Indicadores. Cada "H Nivel de Elemento que nos cuesta 200 de Energía. Esto hace 9*200 = 1800 puntos de Energía. Agregar otros Elementos, el más caro de 200 puntos de Energía es a partir de este Punto, sólo a través de pago de las Compras IN-APP sea posible. El resto de Ejemplos y Capturas de pantalla con los Gráficos son por lo tanto, de pago! General de la Función del Pflanzenwächters son en ningún modo necesario!

, También se puede , no se garantiza que en el futuro la APLICACIÓN o las compras de Energía en futuras Folgereihen siendo utilizado o se. Por favor, decisiones, por lo tanto, bajo su propia responsabilidad, si tienes Dinero en esto de invertir quieras.

Incluso cuando la Aplicación en cada Caso, SIN necesidad de más Inversión totalmente Funcional ya en un verdadero punto de Atracción, quiero que ustedes ya posibles Extensiones de pago, no negamos. Esto no es un Cambio del ESP Códigos. Todas las Capturas de pantalla son solo a través de la Blynk APLICACIÓN, independientemente de que el Firmware lo configurable.

 

Machbarkeitsbeispiel: perfil de Temperatura (juntos en un Chart) :

Teil5 - App5 Ejemplo

 

Teil5-App6

 

Machbarkeitsbeispiel:perfil de Temperatura (separados en dos Charts) 

Teil5 App7: Ejemplo 2

Machbarkeitsbeispiel Beleuchtungsstärkenverlauf

Teil5 App8 Lux

para obtener Más Información sobre las Blynk APLICACIÓN y su Uso en los Controladores, y los puedes encontrar en:

 

 

por Favor, ten en cuenta que este Proyecto de Hydrokulturpflanzen o Luftwurzlerpflanzen no es el adecuado. Las plantas tienen diferentes Necesidades en Su medio Ambiente. Puesto que los Requisitos individuales de las Plantas de nuestro Pflanzenwächter no se puede conocer, está la Interpretación de la Wertedarstellungen del Pflanzenwächters exclusivamente en la Mano del Usuario

 

de La Pflanzenwächter no es un Sustituto del Cuidado responsable de las Plantas!

 

Podéis este Proyecto, así como otros Proyectos de mí, también a mi Git Hub de la Página, encontrar.

 

Diviértete Reproducciones.

 

Esp-32Projekte für fortgeschritteneSensorenSmart home

5 comentarios

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

Deja un comentario

Todos los comentarios son moderados antes de ser publicados