Plant guard for the windowsill part 3 - Extension of the soil moisture sensors to a maximum of six.

In the third part of the series "Plant Guards" we come back to, in the previous parts already implemented circuit technical detail and expand the number of humidity sensors that can be connected to our plant monitor to a maximum of six. Some people may have noticed the existing six voltage dividers, but so far only one of them has been switched on. The remaining 5 voltage dividers were mainly used to pull 5 of 6 analog-digital inputs of the ESP32 defined to 0 in order to prevent them from swinging possibly uncontrolled, but also to make it detectable for our ESP to which the 6 inputs is now connected to a humidity sensor and to which not. This is because it should be possible to connect additional sensors at will and without changing the code by simply connecting another sensor (up to a maximum of 6) and then resetting the system. So we can load any number of at least 1 to a maximum of 6 sensors, starting with the left port (GPIO36) up to a maximum of the right port (GPIO 33). However, ports between sensors must not be omitted, otherwise they will not be detected. The maximum assembly with humidity sensors is shown below:

Circuit with 6 sensors

 

Our parts list is thus extended to:1 x LED color green (560nm); 5 mm

  • 1x LED color yellow (605nm); 5 mm
  • 1x LED color red (633nm); 5 mm
  • 6x130k" Resistance Tolerance -1%
  • 6x 47k" Resistance Tolerance . . . . . . . . . . . . . . . .
  • 3x 150" Resistance Tolerance -1%
  • 6x Capacitive humidity sensor
  • 1x ESP32-38Pin variant Generic; Type NodeMCU-32S; Leg 38;
  • 1x YwRobot Breadboard Power Supply

Now that we have made the necessary hardware changes, we still need to adjust our code on the ESP a little bit and expand our mobile app APP. First, we upload the following code to our ESP:

 

#include <Driver/Adc.H>
#include <Wifi.H>
#include <WiFiClient.H>
#include <BlynkSimpleEsp32.H>


Portedefination Led's
#define LED_Rot     18    Red LED 
#define LED_Gelb    14    Yellow LED
#define LED_Gruen   15    Gruene LED

LED PWM Settings
#define PWMfreq 5000  5 Khz base frequency for LED display
#define PWMledChannelA  0
#define PWMledChannelB  1
#define PWMledChannelC  2
#define PWM resolution  8 8 Bit Resolution for LED PWM

Other definitions
#define ADCAttenuation ADC_ATTEN_DB_11    ADC_ATTEN_DB_11 = 0-3.6V attenuation ADC (ADC extension
#define MoisureSens_Poll_Interval 300000   Interval between two soil moisture measurements in milliseconds -> send data packet to mobile phone every 5 minutes
#define MaxSensors 6                      Maximum number of connectable humiditysensors
#define StartInit True
#define Sens_Calib True
#define Sens_NOTCalib False

Blynk APP Definitions
#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

Struct MoistureSensorCalibrationData
{   Int Data[MaxSensors * 2] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; Calibration Data for humidity sensor. Please observe project text and adjust values accordingly   String SensorName[MaxSensors] = {"Plant 1", "Plant 2", "Plant 3", "Plant 4", "Plant 5", "Plant 6"}; Sensor name that also appears as a heading in the APP   Byte StatusBorderPercentValues[MaxSensors * 2][2] = { {10, 50},     Two-dimensinonal array for percentage limits (traffic light) single per humidity sensor (1 -6)     {10, 50},     {10, 50},     {10, 50},     {10, 50},     {10, 50}   };
};

Struct MoistureSensorData
{   Int Percent[MaxSensors] = {0, 0, 0, 0, 0, 0};  Humidity sensor data in percent   Byte Old_Percent[MaxSensors] = {0, 0, 0, 0, 0, 0}; Previous _ Humidity sensor data in percent (purpose: Save dataQuantity.)   Bool DataValid [MaxSensors] = {False, False, False, False, False, False};
};


Global Variables

Char Auth[] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; Enter your Blynk app here (email) according to instructions Auth Token.
Your WiFi credentials.
Char Ssid[] = "Deine_WLAN_SSID";                 Please adapt to your own WLAN SSID
Char Pass[] = "Your _WLAN _Passwort!";           Please adjust to your own Wi-Fi password

MoistureSensorCalibrationData MCalib;
MoistureSensorData MMeasure;
Byte AttachedMoistureSensors; Detected Active Moisture Sensors (Count)
Unsigned Long Moisure_ServiceCall_Handler = 0;  Delay Variable for Delay between Moisure Readings

Void Setup() {   pinMode(LED_Rot, Output);   pinMode(LED_Gelb, Output);   pinMode(LED_Gruen, Output);   Serial.Begin(115200);   initialize serial communication at 115200 bits per second:   ledcSetup(PWMledChannelA, PWMfreq, PWM resolution);   ledcSetup(PWMledChannelB, PWMfreq, PWM resolution);   ledcSetup(PWMledChannelC, PWMfreq, PWM resolution);   ledcAttachPin(LED_Rot, PWMledChannelA);   attach the channel to the GPIO to be controlled   ledcAttachPin(LED_Gelb, PWMledChannelB);   ledcAttachPin(LED_Gruen, PWMledChannelC);   SetLedConfig(255, 255, 255);   Serial.println(Q("System Configuration:"));   AttachedMoistureSensors = DetectMoistureSensors();   Serial.Print(AttachedMoistureSensors);   Serial.println(Q(" Soil moisture sensor(s)"));   Serial.Print(Q("Connection to Wi-Fi"));   Delay(500);   Blynk.Begin(Auth, Ssid, Pass);  Initalize WiFi Connection over Blync Library   Serial.println(Q("Successful."));   SetLedConfig(0, 0, 0);   Init_Blynk_APP();   Run_MoistureSensors(StartInit);   for (Int  = AttachedMoistureSensors;  < 6; ++) {     Update_Blynk_APP(, Sens_Calib);   };
}

Byte DetectMoistureSensors ()
{
#define MinSensorValue 100   Byte Detected = 0;   for (Int  = 0;  < MaxSensors; ++)   {     Int MSensorRawValue = ReadMoistureSensor_Raw_Val();     If ( MSensorRawValue > MinSensorValue) {       Detected++;     } else {       Break;     }   }   If (Detected < 1)   {     Serial.println(Q("No soil moisture sesors detected. system paused."));     esp_deep_sleep_start();     while (1) {}   }   Return Detected;
}

Bool SetLedConfig(Byte Red, Byte yellow, Byte Green)
{   ledcWrite(PWMledChannelA, Red); Red LED   ledcWrite(PWMledChannelB, yellow); Yellow LED   ledcWrite(PWMledChannelC, Green); Gruene LED   Return True;
}

Int ReadMoistureSensor_Raw_Val(Byte Sensor)
{   Int Returnvalue, ;   Long Sum = 0;
#define NUM_READS 6   adc1_config_width(ADC_WIDTH_BIT_12);   Range 0-4095   Switch (Sensor)   {     Case 0:       {         adc1_config_channel_atten(ADC1_CHANNEL_0, ADCAttenuation);         for ( = 0;  < NUM_READS; ++) { Averaging algorithm           Sum += adc1_get_raw( ADC1_CHANNEL_0 ); Read analog         }         Returnvalue = Sum / NUM_READS;         Break;       }     Case 1:       {         adc1_config_channel_atten(ADC1_CHANNEL_3, ADCAttenuation);         for ( = 0;  < NUM_READS; ++) { Averaging algorithm           Sum += adc1_get_raw( ADC1_CHANNEL_3 ); Read analog         }         Returnvalue = Sum / NUM_READS;         Break;       }     Case 2:       {         adc1_config_channel_atten(ADC1_CHANNEL_6, ADCAttenuation);         for ( = 0;  < NUM_READS; ++) { Averaging algorithm           Sum += adc1_get_raw( ADC1_CHANNEL_6 ); Read analog         }         Returnvalue = Sum / NUM_READS;         Break;       }     Case 3:       {         adc1_config_channel_atten(ADC1_CHANNEL_7, ADCAttenuation);         for ( = 0;  < NUM_READS; ++) { Averaging algorithm           Sum += adc1_get_raw( ADC1_CHANNEL_7 ); //Read analog         }         ReturnValue = sum / NUM_READS;         break;       }     case 4:       {         adc1_config_channel_atten(ADC1_CHANNEL_4, ADCAttenuation);         for (i = 0; i < NUM_READS; i++) { // Averaging algorithm           sum += adc1_get_raw( ADC1_CHANNEL_4 ); //Read analog         }         ReturnValue = sum / NUM_READS;         break;       }     default:       {         adc1_config_channel_atten(ADC1_CHANNEL_5, ADCAttenuation);         for (i = 0; i < NUM_READS; i++) { // Averaging algorithm           sum += adc1_get_raw( ADC1_CHANNEL_5 ); //Read analog         }         ReturnValue = sum / NUM_READS;         break;       }   }   return ReturnValue;
}

void Init_Blynk_APP()
{   Blynk.setProperty(V1, "label", MCalib.SensorName[0]);   Blynk.setProperty(V2, "label", MCalib.SensorName[1]);   Blynk.setProperty(V3, "label", MCalib.SensorName[2]);   Blynk.setProperty(V4, "label", MCalib.SensorName[3]);   Blynk.setProperty(V5, "label", MCalib.SensorName[4]);   Blynk.setProperty(V6, "label", MCalib.SensorName[5]);
}

void Update_Local_Display()
{   byte red1 = 0;   byte yellow1 = 0;   byte green1 = 0;   for (byte i = 0; i < AttachedMoistureSensors; i++)   {     if (MMeasure.DataValid[i])     {       if ( MMeasure.Percent[i] > MCalib.StatusBorderPercentValues[i][1])       {         green1++;       } else if ( MMeasure.Percent[i] > MCalib.StatusBorderPercentValues[i][0])       {         yellow1++;       } else       {         red1++;       }     }   }   if (red1 > 0)   {     SetLedConfig(255, 0, 0);   }   else if (yellow1 > 0)   {     SetLedConfig(0, 255, 0);   }   else if (green1 > 0)   {     SetLedConfig(0, 0, 100);   }   else   {     SetLedConfig(100, 100, 100);   }
}

void Update_Blynk_APP(byte Sensor, bool Calibrated)
{   switch (Sensor)   {     case 0:       {         if ((MMeasure.DataValid[0]) & (Calibrated))         {           if ( MMeasure.Percent[0] > MCalib.StatusBorderPercentValues[0][1])           {             Blynk.setProperty(V1, "color", BLYNK_GREEN);           } else if ( MMeasure.Percent[0] > MCalib.StatusBorderPercentValues[0][0])           {             Blynk.setProperty(V1, "color", BLYNK_YELLOW);           } else           {             Blynk.setProperty(V1, "color", BLYNK_RED);           }           delay(100);           Blynk.virtualWrite(V1, MMeasure.Percent[0]);         } else         {           if (Calibrated)           {             Blynk.setProperty(V1, "label", "Deaktiviert");             delay(100);             Blynk.virtualWrite(V1, 0);             delay(100);             Blynk.setProperty(V1, "color", BLYNK_BLACK);           }           else           {             Blynk.virtualWrite(V1, 0);             delay(100);             Blynk.setProperty(V1, "color", BLYNK_BLUE);           }         }         break;       }     case 1:       {         if ((MMeasure.DataValid[1]) & (Calibrated))         {           if ( MMeasure.Percent[1] > MCalib.StatusBorderPercentValues[1][1])           {             Blynk.setProperty(V2, "color", BLYNK_GREEN);           } else if ( MMeasure.Percent[1] > MCalib.StatusBorderPercentValues[1][0])           {             Blynk.setProperty(V2, "color", BLYNK_YELLOW);           } else           {             Blynk.setProperty(V2, "color", BLYNK_RED);           }           delay(100);           Blynk.virtualWrite(V2, MMeasure.Percent[1]);         } else         {           if (Calibrated)           {             Blynk.setProperty(V2, "label", "Deaktiviert");             delay(100);             Blynk.virtualWrite(V2, 0);             delay(100);             Blynk.setProperty(V2, "color", BLYNK_BLACK);           }           else           {             Blynk.virtualWrite(V2, 0);             delay(100);             Blynk.setProperty(V3, "color", BLYNK_BLUE);           }         }         break;       }     case 2:       {         if ((MMeasure.DataValid[2]) & (Calibrated))         {           if ( MMeasure.Percent[2] > MCalib.StatusBorderPercentValues[2][1])           {             Blynk.setProperty(V3, "color", BLYNK_GREEN);           } else if ( MMeasure.Percent[2] > MCalib.StatusBorderPercentValues[2][0])           {             Blynk.setProperty(V3, "color", BLYNK_YELLOW);           } else           {             Blynk.setProperty(V3, "color", BLYNK_RED);           }           delay(100);           Blynk.virtualWrite(V3, MMeasure.Percent[2]);         } else         {           if (Calibrated)           {             Blynk.setProperty(V3, "label", "Deaktiviert");             delay(100);             Blynk.virtualWrite(V3, 0);             delay(100);             Blynk.setProperty(V3, "color", BLYNK_BLACK);           }           else           {             Blynk.virtualWrite(V3, 0);             delay(100);             Blynk.setProperty(V3, "color", BLYNK_BLUE);           }         }         break;       }     case 3:       {         if ((MMeasure.DataValid[3]) & (Calibrated))         {           if ( MMeasure.Percent[3] > MCalib.StatusBorderPercentValues[3][1])           {             Blynk.setProperty(V4, "color", BLYNK_GREEN);           } else if ( MMeasure.Percent[3] > MCalib.StatusBorderPercentValues[3][0])           {             Blynk.setProperty(V4, "color", BLYNK_YELLOW);           } else           {             Blynk.setProperty(V4, "color", BLYNK_RED);           }           delay(100);           Blynk.virtualWrite(V4, MMeasure.Percent[3]);         } else         {           if (Calibrated)           {             Blynk.setProperty(V4, "label", "Deaktiviert");             delay(100);             Blynk.virtualWrite(V4, 0);             delay(100);             Blynk.setProperty(V4, "color", BLYNK_BLACK);           }           else           {             Blynk.virtualWrite(V4, 0);             delay(100);             Blynk.setProperty(V4, "color", BLYNK_BLUE);           }         }         break;       }     case 4:       {         if ((MMeasure.DataValid[4]) & (Calibrated))         {           if ( MMeasure.Percent[4] > MCalib.StatusBorderPercentValues[4][1])           {             Blynk.setProperty(V5, "color", BLYNK_GREEN);           } else if ( MMeasure.Percent[4] > MCalib.StatusBorderPercentValues[4][0])           {             Blynk.setProperty(V5, "color", BLYNK_YELLOW);           } else           {             Blynk.setProperty(V5, "color", BLYNK_RED);           }           delay(100);           Blynk.virtualWrite(V5, MMeasure.Percent[4]);         } else         {           if (Calibrated)           {             Blynk.setProperty(V5, "label", "Deaktiviert");             delay(100);             Blynk.virtualWrite(V5, 0);             delay(100);             Blynk.setProperty(V5, "color", BLYNK_BLACK);           }           else           {             Blynk.virtualWrite(V5, 0);             delay(100);             Blynk.setProperty(V5, "color", BLYNK_BLUE);           }         }         break;       }     default:       {         if ((MMeasure.DataValid[5]) & (Calibrated))         {           if ( MMeasure.Percent[5] > MCalib.StatusBorderPercentValues[5][1])           {             Blynk.setProperty(V6, "color", BLYNK_GREEN);           } else if ( MMeasure.Percent[5] > MCalib.StatusBorderPercentValues[5][0])           {             Blynk.setProperty(V6, "color", BLYNK_YELLOW);           } else           {             Blynk.setProperty(V6, "color", BLYNK_RED);           }           delay(100);           Blynk.virtualWrite(V6, MMeasure.Percent[5]);         } else         {           if (Calibrated)           {             Blynk.setProperty(V6, "label", "Deaktiviert");             delay(100);             Blynk.virtualWrite(V6, 0);             delay(100);             Blynk.setProperty(V6, "color", BLYNK_BLACK);           }           else           {             Blynk.virtualWrite(V6, 0);             delay(100);             Blynk.setProperty(V6, "color", BLYNK_BLUE);           }         }         break;       }   } // End Switch
}

void Get_Moisture_DatainPercent()
{   byte CalibDataOffset = 0;   for (byte i = 0; i < AttachedMoistureSensors; i++)   {     CalibDataOffset =  i * 2;     int RawMoistureValue = ReadMoistureSensor_Raw_Val(i);     if ((MCalib.Data[CalibDataOffset] == 0) || (MCalib.Data[CalibDataOffset + 1] == 0)) // MinADC Value maxADC ADC Value     {       MMeasure.Percent[i] = RawMoistureValue;       MMeasure.DataValid[i] = false;     } else     {       RawMoistureValue = MCalib.Data[CalibDataOffset + 1] - RawMoistureValue;       RawMoistureValue = MCalib.Data[CalibDataOffset] + RawMoistureValue;       MMeasure.Percent[i] = map(RawMoistureValue, MCalib.Data[CalibDataOffset], MCalib.Data[CalibDataOffset + 1], 0, 100);       if ((MMeasure.Percent[i] > 100 ) | (MMeasure.Percent[i] < 0 ))       {         MMeasure.Percent[i] = RawMoistureValue;         MMeasure.DataValid[i] = false;       } else  {         MMeasure.DataValid[i] = true;       }     }   }   return ;
}

void Run_MoistureSensors (bool Init)   // HauptFunktion zum Betrieb der Bodenfeuchtesensoren
{   byte MinSensValue = 100;   if ((millis() - Moisure_ServiceCall_Handler >= MoisureSens_Poll_Interval) | (Init))   {     Moisure_ServiceCall_Handler = millis();     Get_Moisture_DatainPercent();     for (int i = 0; i < AttachedMoistureSensors; i++)     {       if (MMeasure.DataValid[i])       {         if (MMeasure.Percent[i] != MMeasure.Old_Percent[i])         {           MMeasure.Old_Percent[i] = MMeasure.Percent[i];           if (MMeasure.Percent[i] < MinSensValue ) {             MinSensValue = MMeasure.Percent[i];           };           Serial.print(F("Feuchtigkeitswert Sensor "));           Serial.print(i);           Serial.print(F(" in Prozent :"));           Serial.print(MMeasure.Percent[i]);           Serial.println(F(" %"));           Update_Blynk_APP(i, Sens_Calib);    // Aktualisiere Handywerte         }       } else       {         Update_Blynk_APP(i, Sens_NOTCalib);    // Aktualisiere Handywerte         Serial.print(F("Sensor "));         Serial.print(i);         Serial.print(F(" nicht kalibiert. Bitte kalibrieren. Rohdatenwert:"));         Serial.println(MMeasure.Percent[]);       }     }     Update_Local_Display();           Update Local Plant Guardian Display (Led)   }
}

Main Loop
Void Loop()
{   Run_MoistureSensors(False);   Blynk.Run();   Execute Blync Basic- Functions
} 

 

Before uploading to our ESP, it is important to note that the following parameters/code lines are adapted to the respective needs Must:

int Data[MaxSensors*2] = .0,0,0,0,0,0,0,0,0,0,0,0,0,0,"

Please adjust values according to the description in Part 1 of the series.

 

#define MoisureSens_Poll_Interval 300000

Interval between two soil moisture measurements in milliseconds. The value influences how often the mobile phone data is updated, and thus also on the amount of data generated for transmission per time. The higher, the greater the interval. Please set to a value that matches your own data volume or budget. [Example: 300000 ms = 5 minutes data transfer interval

 

char auth[] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
char ssid[] = "Deine_WLAN_SSID";
char pass[] = "Your _WLAN _Passwort!";

Please adjust values according to the description in Part 2 of the series.

 

It Can the following parameters/code lines to be adapted to the respective needs:

 

string sensorname[maxsensors] = "plant 1", "plant 2", "plant 3", "plant 4", "plant 5", "plant 6";

Humidity sensor name that appears as a heading in the APP.

 

byte StatusBorderPercentValues[MaxSensors*2][2]= . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

 Two-dimensional array for percentage limits (traffic lights) per humidity sensor (1 -6). Affects the "traffic light" display and the display of values in the APP. First who (10) specifies the transition limit between status "red" and status "yellow". Second value indicates the transition boundary between status yellow and status green. Example: from 51% soil moisture "green" from 9% soil moisture "red".

 

If all of these parameters have been correctly defined, the output on the serial monitor should now look like this:

Serial output

Note: In this example, instead of max6. only 5 sensors connected

Next, we need to adapt our HandyApp to the changed hardware and firmware.

Since we only get 2000 energy points available free of charge in our Blynk HandyAPP, we have to budget something with 6 connected sensors. In the first step, we therefore delete the "Gauge" element created in the second part.

Blynk Handyapp Picture 1

 

We replace the "Gauge" element with the "Level H" element

Blynk App - Add Item

Now we add the more energy-friendly element "Level H" a total of 6 times to display the current soil moisture.

Blynk - Widget

Now our surface should look something like this:

Blynk App - new ad

Now we have to adjust three values each time in the properties of the 6 elements. I show the settings for the first sensor here as an example

Blynk Settings

The most important adjustment is the input variable. This must be defined continuously for each "Level H" element, from input "V1" for plant 1 to "V6" for plant 6. "V" stands for "Virtual Pins" and allows an association between the elements of the APP and the instructions in the code. We also select 0 as the minimum value and 100 as the maximum value. The third is to define "push" as the Reading Rate. In the design, any color, font size and name can be chosen, as these parameters are later set or defined by our program on the ESP.

The end result, when the project is activated, should now look something like this:

Blynk Sensors Display

(the last sensor is shown as disabled because I connected only 5 sensors in the example. When using 6 sensors, the field is automatically activated)

For more information about the Blynk APP and its use in controllers, see


I wish you a lot of fun recreating, and until next time.

 

 

 

 

 

Esp-32Projekte für fortgeschritteneSensorsSmart home

9 comments

Tobias

Tobias

Hallo Peter,
Da dis ein komplett anderen Anwendungsfall darstellt, würde ich empfehlen hier die Blynk Dokumenation als Basis für den Neuaufbau eines eigenen Sketches zu nutzen.

Gruß
Tobias

Tobias Kuch

Tobias Kuch

Hallo Max,
Grundsätzlich schon, jedoch ist dann auch eine komplette Umprogrammierung der Software erforderlich. Die Software als solches ist nur auf dem ESP32 so ausführbar.
Gruß
Tobias

Max

Max

Hallo und danke für das SUPER Projekt. Ich suche schon lange etwas ähnliches, bei dem ich die Bodenfeuchtigkeit messen kann und damit dann eine automatische Bewässerung steuern kann.
Natürlich kann ich nur Teile aus diesem Projekt verwenden, aber besonders die Handy-App-Anzeige und die Anzahl der Sensoren ist super.
Für meinen Anwendungsfall benötige ich allerdings 8-10 Feuchtigkeitssensoren und zusätzlich noch 4 Eingänge für Füllstandsschalter (Reedkontakt).

Kann man das Projekt mit einer anderen Hardware auf die genannten Sensoren und Eingänge bringen?
Bis Bald
Max

Peter

Peter

Habe den Pflanzenwächter gebaut und es funktioniert alles perfekt. Jetzt habe ich eine ganz andere Sache vor. Wie kann ich den Sketch umändern, damit von zwei Spannungs-und zwei Stromsensoren die Werte in der Blynk-App angezeigt werden?

Tobias Kuch

Tobias Kuch

Hallo Knut,

Die Sensoren werden mit 5 Volt betrieben, der Rest mit 3,3 Volt. Sorry für die verspätete Antwort. Du kannst alle Projekte mit Plänen im Fritzing Format (Inkl. Werteangaben) unter meiner GitHub Seite https://github.com/kuchto herunterladen.
Viele Grüße

Knut Dorendorff

Knut Dorendorff

OK dann hierzu keine Antwort.
Mit wieviel Volt wird was auf dem Board was betrieben? 3,3 oder 5 Volt?

Mit freundlichen Grüßen
Knut Dorendorff

Knut Dorendorff

Knut Dorendorff

Hallo Tobias,
welche Widerständen kommen zwischen Minus und dem ESP32. Da wir sechsmal 47 kΩ und 130 kΩ haben. Oder ist da egal?

Mit freundlichen Grüssen
Knut
Danke schon mal.

Tobias

Tobias

Hallo Martin,

Leider funktioniert das Projekt nicht nativ mit dem ESP8266, da dieser nur einen Analog-Port besitzt, wir aber sechs Ports brauchen, aber auch, weil der Analog Port des ESP8266 eine fixen Eingangsbereich von 0 – 1 Volt hat. Diesen sehe ich i.m.h.o als zu gering für unsere Zwecke an. Du könntest theoretisch jedoch einen externen I2C AD Wandler an des ESP8266 hängen. Jedoch muss der Großteils danach angepasst werden. Insgesamt ist es aber mit sehr viel Aufwand möglich es zu portieren. Auch bringt der externe AD Wandler Extrakosten mit sich.

Martin

Martin

Hallo Tobias,

würde dein Projekt auch mit einem NodeMCU Lua Lolin V3 Modul mit ESP8266 12E funktionieren?

Leave a comment

All comments are moderated before being published

Recommended blog posts

  1. Install ESP32 now from the board manager
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA - Over the Air - ESP programming via WLAN