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 |
|
|
|
como Alternativa a la DHT 22 |
|
1 |
|
|
1 |
|
|
6 |
|
|
1 |
Para Breadboardaufbau |
|
1 |
Beleuchtungsstärkensensor |
|
12 |
|
Nos veamos actualizado el Diagrama de Cableado del Pflanzenwächters en:
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 |
|
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
Y configurar el nuevo Elemento de la siguiente manera:
- 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"
en El Resultado final, en caso de Activación del Proyecto ahora debe ser similar a la siguiente:
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) :
Machbarkeitsbeispiel:perfil de Temperatura (separados en dos Charts)
Machbarkeitsbeispiel Beleuchtungsstärkenverlauf
para obtener Más Información sobre las Blynk APLICACIÓN y su Uso en los Controladores, y los puedes encontrar en:
- Blynk Introducción -> https://www.blynk.cc/getting-started
- Documentación -> http://docs.blynk.cc/
- Sketch Generador -> https://examples.blynk.cc/
- Última Blynk Biblioteca -> https://github.com/blynkkk/blynk-library/releases/download/v0.6.1/Blynk_Release_v0.6.1.zip
- lo más reciente Blynk server -> https://github.com/blynkkk/blynk-server/releases/download/v0.41.5/server-0.41.5.jar
- Blynk Inicio -> https://www.blynk.cc
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.
5 comentarios
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