Pflanzenwächter für die Fensterbank Teil 4 – Temperatur und Luftfeuchtigkeitsmessung - AZ-Delivery

Hola y bienvenidos a otra parte de la serie de observadores de plantas.


Hoy vamos a donar un sensor ambiental 2 en 1 al monitor de la planta, así como implementar algunas optimizaciones del hardware (LED), así como el código. El sensor que conectamos en esta parte es el conocido sensor de temperatura y humedad DHT 22. Además de la humedad del suelo, nuestro monitor de planta ahora será capaz de registrar los parámetros ambientales de temperatura y humedad, que son importantes para las plantas en su entorno. Por supuesto, también ampliaremos nuestra aplicación móvil adecuadamente. En primer lugar, realizamos un cambio en el cambio de los LED.

Utilizamos el módulo KY-016 LED RGB y lo conectamos directamente de la siguiente manera:
Rojo en el pin 0, verde en el pin 15, y azul en el pin.

Las ventajas de este módulo son, por un lado, ahorramos espacio cuando se instala en una carcasa (1/3 del espacio de la vivienda), pero también tenemos el espectro completo RGB de colores a través del control PWM de los canales individuales, por lo que más de originalmente sólo se pueden mostrar 3 estados.
(Por ejemplo, el LED ahora se ilumina en blanco durante la fase de inicialización). Por último, pero no menos importante, nos ahorramos las resistencias, ya que ya están integradas en el módulo. Los pines a los que están conectados los LED RGB al ESP32 se han seleccionado según el criterio "adecuado para cronometrar hardware no crítico". El fondo es que los pines a los que está conectado el LED, el firmware vibran condicionalmente durante un reinicio del sistema (PWM) antes de que se inicialicen y, por lo tanto, no son adecuados para cronometrar hardware crítico (como el DHT22).


También ha habido un cambio en la forma en que funciona la pantalla LED y cómo se muestra: ya que sólo tenemos uno y no seis LED RGB para mostrar las estadísticas del guardián, tenemos que resumir la información más importante sobre ella.


Para ello, utilizamos la siguiente consideración: Para nosotros, la información más importante es si una de las 6 plantas como máximo debe ser regada o no. Esto significa que esto debería ser evidente de un vistazo. Para ello, redefinimos el color verde (humedad suficiente) para que TODAS las 6 plantas tengan suficiente humedad para obtener una pantalla "verde". Así que si uno de los seis sensores detecta menos del 50% de humedad del suelo, nuestra pantalla salta a "amarillo". A menos del 10% en "rojo". Así que sabemos que debemos comenzar nuestra APP de alcaide de plantas para averiguar cuál de las seis plantas debe ser regada. Dado que el sensor de temperatura y humedad DHT 22 es compatible con 3,3 V pin y lógica, lo conectamos directamente al puerto 4 de los ESP. Aquí puede ver la conexión completa:

 Parte 4 - Estructura

 

La lista de piezas actual con las piezas de hardware necesarias. (Con enlace de referencia)

 

Número

Descripción

Nota

1

DHT 22

 

 

DHT 11

Alternativa a DHT 22

1

Módulo RGB LED KY-016

 

1

ESP-32 Kit de desarrollo C

 

6

Módulo de sensor de humedad del suelo V1.2

 

1

Mb102 Adaptador de fuente de alimentación

Para la configuración de la placa de pan

12

Volver a soportar según la descripción

 

 

En lugar del primer sensor DHT 22 listado, el sensor DHT 11 más barato se puede utilizar simplemente ajustando la línea "DHTTYPE DHT22". Sin embargo, el DHT 11 no es tan preciso como el DHT 22.

Aquí las diferencias entre los dos sensores también se pueden leer de nuevo.

Si se va a utilizar el DHT 11 Senor, la línea debe

#define DHTTYPE DHT22

En

#define DHTTYPE DHT11

ser cambiado. No se pueden realizar más cambios.

 

LA asignación de pines ESP32 es la siguiente

ESP32 PIN

Uso

Nota

4

Entrada del sensor DHT

 

0

RGB LED PIN

Rojo

15

RGB LED PIN

Verde

14

RGB LED PIN

Azul

 

Estos ya eran los cambios de hardware necesarios. Para utilizar el sensor DHT22/DHT 11 con su protocolo de alambre patentado en nuestro boceto, necesitamos incluir dos bibliotecas más en nuestro IDE a continuación.

Por un lado, este es el más popular "Adafruit Unified Sensor Libary" : así como el Biblioteca de sensores DHT. Ambas bibliotecas se basan entre sí y deben agregarse a nuestras bibliotecas IDE según las necesite según nuestro proyecto.

Después de agregar las bibliotecas y ajustar los parámetros en el código, como en el Parte 3 en esta serie, descrita cargamos el siguiente código a nuestro ESP:

 

#include <Conductor/Adc.H>
#include <Wifi.H>
#include <WiFiClient.H>
#include <BlynkSimpleEsp32.H>
#include "EEPROM.h"
#include <Preferencias.H>
#include "DHT.h"    REQUIERE las siguientes bibliotecas Arduino:
- Biblioteca de sensores DHT: https://github.com/adafruit/DHT-sensor-library
- Adafruit Sensor Unificado Lib: https://github.com/adafruit/Adafruit_Sensor

Módulo LED RGP edefinición de puerto
#define LED_Rot     0     LED rojo 
#define LED_Blau    14    LED azul
#define LED_Gruen   15    Gruene LED

Ajustes de LED PWM
#define PWMfreq 5000  Frecuencia base de 5 Khz para la pantalla LED
#define PWMledChannelA  0
#define PWMledChannelB  1
#define PWMledChannelC  2
#define Resolución PWM  8 Resolución de 8 bits para LED PWM

Otras definiciones
#define ADCAttenuation ADC_ATTEN_DB_11    ADC_ATTEN_DB_11 ADC de atenuación de 0-3.6V (extensión ADC
#define MoisureSens_Poll_Interval 300000   Intervalo entre dos mediciones de humedad del suelo en milisegundos -> enviar paquete de datos al teléfono móvil cada 5 minutos
#define DHT_Poll_Interval 400000           Intervalo entre dos mediciones temeperature y de aire-fractario en milisegundos -> enviar paquete de datos al teléfono móvil cada 6 minutos
#define MaxSensors 6                      Número máximo de sensores de humedad conectables
#define StartInit Verdad
#define Ejecución Falso
#define Sens_Calib Verdad
#define Sens_NOTCalib Falso
#define EEPROM_SIZE 512                  Tamaño del EEPROMS Interno

Definiciones de Blynk APP
#define BLYNK_GREEN     "#23C48E"
#define BLYNK_BLUE      "#04C0F8"
#define BLYNK_YELLOW    "#ED9D00"
#define BLYNK_RED       "#D3435C"
#define BLYNK_BLACK     "#000000"
#define BLYNK_PRINT Serial
#define BLYNK_NO_BUILTIN
#define BLYNK_NO_FLOAT
#define BLYNK_DEBUG

Configuración de DHT
#define DHTPIN 4     Pin digital conectado al sensor DHT
#define DHTTYPE DHT22   DHT 22 (AM2302), AM2321
#define DHTTYPE DHT21 * DHT 21 (AM2301)

Estructura MoistureSensorCalibrationData
{   Int Datos[MaxSensors * 2] = {1651, 2840, 1652, 2840, 1653, 2840, 1654, 2840, 1655, 2840, 1656, 2840}; Datos de calibración para sensor de humedad. Observe el texto del proyecto y ajuste los valores en consecuencia   int Data[MaxSensors*2] á .0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"  Datos de calibración para sensor de humedad. Observe el texto del proyecto y ajuste los valores en consecuencia   Byte StatusBorderPercentValues[MaxSensors * 2][2] = { {10, 50},     Matriz de dos dimensiones para límites porcentuales (luz de tráfico) individual por sensor de humedad (1 -6)     {10, 50},     {10, 50},     {10, 50},     {10, 50},     {10, 50}   };   Cadena SensorName[MaxSensors + 2] = {"Planta 1", "Planta 2", "Planta 3", "Planta 4", "Planta 5", "Planta 6", "Humedad", "Temperatura"}; Nombre del sensor que también aparece como un encabezado en la APP

};

Estructura MoistureSensorData
{   Int Por ciento[MaxSensors] = {0, 0, 0, 0, 0, 0};  Datos del sensor de humedad en porcentaje   Byte Old_Percent[MaxSensors] = {0, 0, 0, 0, 0, 0}; Anterior _ Datos del sensor de humedad en porcentaje (propósito: Guardar dataCantidad.)   Bool DataValid [MaxSensors] = {Falso, Falso, Falso, Falso, Falso, Falso};
};

Estructura DHTSensorData
{   Flotador Humedad = 0 ;      Porcentaje de datos del sensor de humedad   Flotador Temperatura = 0;   Flotador Old_Humidity = 0 ;      Porcentaje de datos del sensor de humedad   Flotador Old_Temperature = 0;   Bool DataValid  = Falso;   Bool SensorEnabled  = Falso;
};

Dht Dht(DHTPIN, DHTTYPE); DHP Instalz initalisieren


Variables globales


Char Auth[] = "xxxxxxxxxxxxxxxxxxxxxxxxxx"; Anleitung Auth Token dere Blynk App eintragen (Correo electrónico).
Deine WiFi Zugangsdaten.
Char Ssid[] = "Deine_WLAN_SSID";                 Bitte anigene WLAN SSID anpassen
Char Pasar[] = "Dedein _WLAN _Passwort!";           Bitte anigene WLAN Passwort anpassen
MoistureSensorCalibrationData MCalib;
MoistureSensorData MMeasure;
DHTSensorData  DHTMeasure;

Byte AttachedMoistureSensors; Sensores de humedad activos detectados (recuento)
Unsigned Largo Moisure_ServiceCall_Handler = 0;  Variable de retardo para retardo entre lecturas de moisure
Unsigned Largo DHT_ServiceCall_Handler = 0;  Variable de retardo para retardo entre lecturas DHT


Vacío Configuración() {   pinMode(LED_Rot, Salida);   pinMode(LED_Blau, Salida);   pinMode(LED_Gruen, Salida);   Serial.Comenzar(115200);   inicializar la comunicación en serie a 115200 bits por segundo:   ledcSetup(PWMledChannelA, PWMfreq, PWMresolution);   ledcSetup(PWMledChannelB, PWMfreq, PWMresolution);   ledcSetup(PWMledChannelC, PWMfreq, PWMresolution);   ledcAttachPin(LED_Rot, PWMledChannelA);   conectar el canal al GPIO para ser controlado   ledcAttachPin(LED_Blau, PWMledChannelB);   ledcAttachPin(LED_Gruen, PWMledChannelC);   SetLedConfig(255, 255, 255);   Serial.println(F("Systemkonfiguration:"));   Si (!Eeprom.Comenzar(EEPROM_SIZE))   {     Serial.println(F("no se ha podido inicializar EEPROM"));   } Más   { Serial.println(EEPROM_SIZE);     Serial.println(F(" Bytes EEPROM"));   }   AttachedMoistureSensors = DetectMoistureSensors();   Serial.Impresión(AttachedMoistureSensors);   Serial.println(F(" Bodenfeuchtigkeitsensor(es)"));   Dht.Comenzar();   DHTMeasure.SensorEnabled  = Run_DHTSensor (StartInit);   Si (DHTMeasure.SensorEnabled)   {     Serial.println(F("1 Sensor DHT 22"));   }   Serial.Impresión(F("Verbindung zu WLAN"));   Retraso(500);   Blynk.Comenzar(Auth, Ssid, Pasar);  Initalize WiFi-Connection over Blync Library   Serial.println(F(" erfolgreich."));   SetLedConfig(0, 0, 0);   Init_Blynk_APP();   Run_MoistureSensors(StartInit);   Para (Int  = AttachedMoistureSensors;  < 6; ++) {     Update_Blynk_APP(, Sens_Calib);   };
}

Byte DetectMoistureSensors ()
{
#define MinSensorValue 100   Byte Detectado = 0;   Para (Int  = 0;  < MaxSensors; ++)   {     Int MSensorRawValue = ReadMoistureSensor_Raw_Val();     Si ( MSensorRawValue > MinSensorValue) {       Detectado++;     } Más {       Romper;     }   }   Si (Detectado < 1)   {     Serial.println(F("Keine Bodenfeuchtigkeitssesoren erkannt. Sistema angehalten."));     esp_deep_sleep_start();     Mientras (1) {}   }   devolución Detectado;
}

Bool SetLedConfig(Byte Rojo, Byte Verde, Byte Azul)
{   ledcWrite(PWMledChannelA, Rojo); Rote LED   ledcWrite(PWMledChannelB, Azul); Blaue LED   ledcWrite(PWMledChannelC, Verde); Gruene LED   devolución Verdad;
}

Int ReadMoistureSensor_Raw_Val(Byte Sensor)
{   Int ReturnValue, ;   Largo Suma = 0;
#define NUM_READS 6   adc1_config_width(ADC_WIDTH_BIT_12);   Rango 0-4095   Interruptor (Sensor)   {     Caso 0:       {         adc1_config_channel_atten(ADC1_CHANNEL_0, ADCAttenuation);         Para ( = 0;  < NUM_READS; ++) { Algoritmo de promediación           Suma += adc1_get_raw( ADC1_CHANNEL_0 ); Leer analógico         }         ReturnValue = Suma / NUM_READS;         Romper;       }     Caso 1:       {         adc1_config_channel_atten(ADC1_CHANNEL_3, ADCAttenuation);         Para ( = 0;  < NUM_READS; ++) { Algoritmo de promediación           Suma += adc1_get_raw( ADC1_CHANNEL_3 ); Leer analógico         }         ReturnValue = Suma / NUM_READS;         Romper;       }     Caso 2:       {         adc1_config_channel_atten(ADC1_CHANNEL_6, ADCAttenuation);         Para ( = 0;  < NUM_READS; ++) { Algoritmo de promediación           Suma += adc1_get_raw( ADC1_CHANNEL_6 ); Leer analógico         }         ReturnValue = Suma / NUM_READS;         Romper;       }     Caso 3:       {         adc1_config_channel_atten(ADC1_CHANNEL_7, ADCAttenuation);         Para ( = 0;  < NUM_READS; ++) { // Algoritmo promedio           suma += adc1_get_raw( ADC1_CHANNEL_7 ); // Leer análogo         }         Valor de retorno = suma / NUM_READS;         descanso;       }     caso 4:       {         adc1_config_channel_atten(ADC1_CHANNEL_4, Atenuación ADCA);         para (yo = 0; yo < NUM_READS; yo++) { // Algoritmo promedio           suma += adc1_get_raw( ADC1_CHANNEL_4 ); // Leer análogo         }         Valor de retorno = suma / NUM_READS;         descanso;       }     defecto:       {         adc1_config_channel_atten(ADC1_CHANNEL_5, Atenuación ADCA);         para (yo = 0; yo < NUM_READS; yo++) { // Algoritmo promedio           suma += adc1_get_raw( ADC1_CHANNEL_5 ); // Leer análogo         }         Valor de retorno = suma / NUM_READS;         descanso;       }   }   regreso Valor de retorno;
}

vacío Init_Blynk_APP()
{   Blynk.setProperty(V1, "etiqueta", MCalib.Nombre del sensor[0]);   Blynk.setProperty(V2, "etiqueta", MCalib.Nombre del sensor[1]);   Blynk.setProperty(V3, "etiqueta", MCalib.Nombre del sensor[2]);   Blynk.setProperty(V4, "etiqueta", MCalib.Nombre del sensor[3]);   Blynk.setProperty(V5, "etiqueta", MCalib.Nombre del sensor[4]);   Blynk.setProperty(V6, "etiqueta", MCalib.Nombre del sensor[5]);   Blynk.setProperty(V7, "etiqueta", MCalib.Nombre del sensor[6]);   Blynk.setProperty(V8, "etiqueta", MCalib.Nombre del sensor[7]);
}

vacío Update_Local_Display()
{   byte rojo1 = 0;   byte amarillo1 = 0;   byte verde1 = 0;   para (byte yo = 0; yo < Sensores de humedad adjuntos; yo++)   {     Si (MMeasure.DataValid[yo])     {       Si ( MMeasure.Por ciento[yo] > MCalib.StatusBorderPercentValues[yo][1])       {         verde1++;       } más Si ( MMeasure.Por ciento[yo] > MCalib.StatusBorderPercentValues[yo][0])       {         amarillo1++;       } más       {         rojo1++;       }     }   }   Si (rojo1 > 0)   {     SetLedConfig(255, 0, 0);   }   más Si (amarillo1 > 0)   {     SetLedConfig(255, 255, 0);   }   más Si (verde1 > 0)   {     SetLedConfig(0, 255, 0);   }   más   {     SetLedConfig(0, 0, 255);   }
}

vacío Update_Blynk_APP(byte Sensor, bool Calibrado)
{   cambiar (Sensor)   {     caso 0:       {         Si ((MMeasure.DataValid[0]) & (Calibrado))         {           Si ( MMeasure.Por ciento[0] > MCalib.StatusBorderPercentValues[0][1])           {             Blynk.setProperty(V1, "color", BLYNK_GREEN);           } más Si ( MMeasure.Por ciento[0] > MCalib.StatusBorderPercentValues[0][0])           {             Blynk.setProperty(V1, "color", BLYNK_YELLOW);           } más           {             Blynk.setProperty(V1, "color", BLYNK_RED);           }           retrasar(100);           Blynk.virtualWrite(V1, MMeasure.Por ciento[0]);         } más         {           Si (Calibrado)           {             Blynk.setProperty(V1, "etiqueta", "Deaktiviert");             retrasar(100);             Blynk.virtualWrite(V1, 0);             retrasar(100);             Blynk.setProperty(V1, "color", BLYNK_BLACK);           }           más           {             Blynk.virtualWrite(V1, 0);             retrasar(100);             Blynk.setProperty(V1, "color", BLYNK_BLUE);           }         }         descanso;       }     caso 1:       {         Si ((MMeasure.DataValid[1]) & (Calibrado))         {           Si ( MMeasure.Por ciento[1] > MCalib.StatusBorderPercentValues[1][1])           {             Blynk.setProperty(V2, "color", BLYNK_GREEN);           } más Si ( MMeasure.Por ciento[1] > MCalib.StatusBorderPercentValues[1][0])           {             Blynk.setProperty(V2, "color", BLYNK_YELLOW);           } más           {             Blynk.setProperty(V2, "color", BLYNK_RED);           }           retrasar(100);           Blynk.virtualWrite(V2, MMeasure.Por ciento[1]);         } más         {           Si (Calibrado)           {             Blynk.setProperty(V2, "etiqueta", "Deaktiviert");             retrasar(100);             Blynk.virtualWrite(V2, 0);             retrasar(100);             Blynk.setProperty(V2, "color", BLYNK_BLACK);           }           más           {             Blynk.virtualWrite(V2, 0);             retrasar(100);             Blynk.setProperty(V3, "color", BLYNK_BLUE);           }         }         descanso;       }     caso 2:       {         Si ((MMeasure.DataValid[2]) & (Calibrado))         {           Si ( MMeasure.Por ciento[2] > MCalib.StatusBorderPercentValues[2][1])           {             Blynk.setProperty(V3, "color", BLYNK_GREEN);           } más Si ( MMeasure.Por ciento[2] > MCalib.StatusBorderPercentValues[2][0])           {             Blynk.setProperty(V3, "color", BLYNK_YELLOW);           } más           {             Blynk.setProperty(V3, "color", BLYNK_RED);           }           retrasar(100);           Blynk.virtualWrite(V3, MMeasure.Por ciento[2]);         } más         {           Si (Calibrado)           {             Blynk.setProperty(V3, "etiqueta", "Deaktiviert");             retrasar(100);             Blynk.virtualWrite(V3, 0);             retrasar(100);             Blynk.setProperty(V3, "color", BLYNK_BLACK);           }           más           {             Blynk.virtualWrite(V3, 0);             retrasar(100);             Blynk.setProperty(V3, "color", BLYNK_BLUE);           }         }         descanso;       }     caso 3:       {         Si ((MMeasure.DataValid[3]) & (Calibrado))         {           Si ( MMeasure.Por ciento[3] > MCalib.StatusBorderPercentValues[3][1])           {             Blynk.Setproperty(V4, "color", BLYNK_GREEN);           } Más Si ( MMeasure.Por ciento[3] > MCalib.StatusBorderPercentValues[3][0])           {             Blynk.Setproperty(V4, "color", BLYNK_YELLOW);           } Más           {             Blynk.Setproperty(V4, "color", BLYNK_RED);           }           Retraso(100);           Blynk.virtualWrite(V4, MMeasure.Por ciento[3]);         } Más         {           Si (Calibrado)           {             Blynk.Setproperty(V4, "etiqueta", "Deaktiviert");             Retraso(100);             Blynk.virtualWrite(V4, 0);             Retraso(100);             Blynk.Setproperty(V4, "color", BLYNK_BLACK);           }           Más           {             Blynk.virtualWrite(V4, 0);             Retraso(100);             Blynk.Setproperty(V4, "color", BLYNK_BLUE);           }         }         Romper;       }     Caso 4:       {         Si ((MMeasure.DataValid[4]) & (Calibrado))         {           Si ( MMeasure.Por ciento[4] > MCalib.StatusBorderPercentValues[4][1])           {             Blynk.Setproperty(V5, "color", BLYNK_GREEN);           } Más Si ( MMeasure.Por ciento[4] > MCalib.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         {           Si (Calibrado)           {             Blynk.Setproperty(V5, "etiqueta", "Deaktiviert");             Retraso(100);             Blynk.virtualWrite(V5, 0);             Retraso(100);             Blynk.Setproperty(V5, "color", BLYNK_BLACK);           }           Más           {             Blynk.virtualWrite(V5, 0);             Retraso(100);             Blynk.Setproperty(V5, "color", BLYNK_BLUE);           }         }         Romper;       }     Caso 5:       {         Si ((MMeasure.DataValid[5]) & (Calibrado))         {           Si ( MMeasure.Por ciento[5] > MCalib.StatusBorderPercentValues[5][1])           {             Blynk.Setproperty(V6, "color", BLYNK_GREEN);           } Más Si ( MMeasure.Por ciento[5] > MCalib.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         {           Si (Calibrado)           {             Blynk.Setproperty(V6, "etiqueta", "Deaktiviert");             Retraso(100);             Blynk.virtualWrite(V6, 0);             Retraso(100);             Blynk.Setproperty(V6, "color", BLYNK_BLACK);           }           Más           {             Blynk.virtualWrite(V6, 0);             Retraso(100);             Blynk.Setproperty(V6, "color", BLYNK_BLUE);           }         }         Romper;       }     Caso 6:       {         Si (DHTMeasure.DataValid)         {           Blynk.virtualWrite(V7, DHTMeasure.Humedad);         } Más         {           Blynk.Setproperty(V7, "etiqueta", "Deaktiviert");           Retraso(100);           Blynk.virtualWrite(V7, 0);           Retraso(100);           Blynk.Setproperty(V7, "color", BLYNK_BLACK);         }         Romper;       }     Caso 7:       {         Si (DHTMeasure.DataValid)         {           Blynk.virtualWrite(V8, DHTMeasure.Temperatura);         } Más         {           Blynk.Setproperty(V8, "etiqueta", "Deaktiviert");           Retraso(100);           Blynk.virtualWrite(V8, 0);           Retraso(100);           Blynk.Setproperty(V8, "color", BLYNK_BLACK);         }         Romper;       }   } Interruptor de extremo
}

Vacío Get_Moisture_DatainPercent()
{   Byte CalibDataOffset = 0;   Para (Byte  = 0;  < AttachedMoistureSensors; ++)   {     CalibDataOffset =   * 2;     Int RawMoistureValue = ReadMoistureSensor_Raw_Val();     Si ((MCalib.Datos[CalibDataOffset] == 0) || (MCalib.Datos[CalibDataOffset + 1] == 0)) Valor MinADC maxADC Valor ADC     {       MMeasure.Por ciento[] = RawMoistureValue;       MMeasure.DataValid[] = Falso;     } Más     {       RawMoistureValue = MCalib.Datos[CalibDataOffset + 1] - RawMoistureValue;       RawMoistureValue = MCalib.Datos[CalibDataOffset] + RawMoistureValue;       MMeasure.Por ciento[] = Mapa(RawMoistureValue, MCalib.Datos[CalibDataOffset], MCalib.Datos[CalibDataOffset + 1], 0, 100);       Si ((MMeasure.Por ciento[] > 100 ) | (MMeasure.Por ciento[] < 0 ))       {         MMeasure.Por ciento[] = RawMoistureValue;         MMeasure.DataValid[] = Falso;       } Más  {         MMeasure.DataValid[] = Verdad;       }     }   }   devolución ;
}



Vacío Run_MoistureSensors (Bool Init)   HauptFunktion zum Betrieb der Bodenfeuchtesensoren
{   Byte MinSensValue = 100;   Si ((Millis() - Moisure_ServiceCall_Handler >= MoisureSens_Poll_Interval) | (Init))   {     Moisure_ServiceCall_Handler = Millis();     Get_Moisture_DatainPercent();     Para (Int  = 0;  < Sensores de humedad adjuntos; yo++)     {       Si (MMeasure.DataValid[yo])       {         Si (MMeasure.Por ciento[yo] != MMeasure.Porcentaje antiguo[yo])         {           MMeasure.Porcentaje antiguo[yo] = MMeasure.Por ciento[yo];           Si (MMeasure.Por ciento[yo] < MinSensValue ) {             MinSensValue = MMeasure.Por ciento[yo];           };           De serie.impresión(F("Sensor Feuchtigkeitswert"));           De serie.impresión(yo);           De serie.impresión(F("en Prozent:"));           De serie.impresión(MMeasure.Por ciento[yo]);           De serie.println(F(" %"));           Update_Blynk_APP(yo, Sens_Calib);    // Aktualisiere Handywerte         }       } más       {         Update_Blynk_APP(yo, Sens_NOTCalib);    // Aktualisiere Handywerte         De serie.impresión(F("Sensor"));         De serie.impresión(yo);         De serie.impresión(F("nicht kalibiert. Bitte kalibrieren. Rohdatenwert:"));         De serie.println(MMeasure.Por ciento[yo]);       }     }     Update_Local_Display();           // Aktualisiere lokales Pflanzenwächter Display (Led)   }
}

bool Run_DHTSensor (bool En eso)   //
{   Si ((millis() - DHT_ServiceCall_Handler >= DHT_Poll_Interval) | (En eso))   {     DHT_ServiceCall_Handler = millis();     DHTMeasure.Humedad = dht.leer Humedad();     DHTMeasure.Temperatura = dht.temperatura de lectura(falso);   // Leer la temperatura en grados Celsius (isFahrenheit = true)     Si (isnan(DHTMeasure.Humedad) || isnan(DHTMeasure.Temperatura) )     {       De serie.println(F("¡Error al leer desde el sensor DHT!"));       DHTMeasure.DataValid  = falso;       regreso falso;     }     DHTMeasure.DataValid  = cierto;     Si (DHTMeasure.Humedad != DHTMeasure.Humedad Antigua)     {       DHTMeasure.Humedad Antigua = DHTMeasure.Humedad;       Update_Blynk_APP(6, cierto); // Luftfeuchteanzeige     }     Si (DHTMeasure.Temperatura !=  DHTMeasure.Old_Temperature)     {       DHTMeasure.Old_Temperature = DHTMeasure.Temperatura;       Update_Blynk_APP(7, cierto); // Temperaturanzeige     }   }   regreso cierto;
}


// Bucle principal
vacío lazo()
{   Run_MoistureSensors(RunTime);   Si (DHTMeasure.Sensor habilitado) {     Run_DHTSensor(RunTime);   }   Blynk.correr();   // Ejecutar Blync Basic- Funciones
}

 

Weitere unbedingt anzupassende Parámetro sind nicht hinzugekommen, da der DHT 22 und auch der DHT 11 Sensor eine interne Werte Kalibrierung hat, die keiner weiteren Anpassung mehr Bedarf.

Nachdem wir den Code nun angepasst und auf unseren ESP hochgeladen haben und sich unser ESP erfolgreich in das WLAN eingeloggt hat (Weiße LED geht aus) müssen wir auch in diesem Teil wieder unsere APP erweitern.

Dazu fügen wir insere APP zwei weitere „LEVEL H“ Elemente hinzu und konfigurieren das erste Element für die Luftfeuchte wie folgt:

Configuración de la aplicación Part4


 • Color: blanco
 • Pin de entrada: V7 (virtuell)
 • Wert mínimo: 0
 • Peso máximo: 100
 • Velocidad de lectura: PUSH

 

Das zweite „Nivel H“ Elemento para la temperatura configurada en el siguiente:

Parte 4 Configuración de la aplicación 2


 • Color: blanco
 • Pin de entrada: V8 (virtuell)
 • Wert mínimo: -20
 • Peso máximo: 60
 • Velocidad de lectura: PUSH

 

Anschließend sollte unsere Pflanzen App wie folgt aussehen:

Parte 4 - Vista de la aplicación

Nach drücken des „Start“ Buttons bekommen wir nun in der APP neben den aktuellen Bodenfeuchtesensorwerten auch die aktuelle Temperatur und Luftfeuchtigkeit dank unserem DHT Sensor angezeigt.

Ich wünsche viel Spaß beim Nachbauen, und bis zum nächsten Mal.

 

Esp-32Projekte für fortgeschritteneSensorenSmart home

2 comentarios

Knut Dorendorff

Knut Dorendorff

Hallo Michael.
Das würde mich interessieren
Gruss Knut

Michael

Michael

Der Beitrag ist ja mal wieder hervorragend geschrieben! Weiter so. Ich werde versuchen meinen Bosch BME zu implementieren.

Deja un comentario

Todos los comentarios son moderados antes de ser publicados