A plant keeper for the windowsill

Today I would like to introduce you to a new interesting multi-part project with the versatile and powerful ESP 32. We build a plant guard for our native plants. While we devote our attention to our exciting electronics projects, we should monitor the water content of the plant soil and inform us when soil moisture is decreasing. For this purpose, our plant monitor has an LED traffic light, which glows green when the ground is damp and turns red over yellow in dry soil. However, before we start the project, we have to think about it before the actual start of the project. This applies in particular to the use of the plant monitor. Since our plant monitor determines the moisture of the earth via a capacitive near-field measurement, it is necessary that the moisture is stored in the immediate vicinity of the sensor. While normal (flower) plant soil from the DIY store or supermarket usually fulfils this condition, this is not the case with hydroculture substrates or orchid substrates, among others! Therefore:

This project is designed for hydroculture plants or Air-worm plants (such as orchids) not suitable!

In addition, plants have very different requirements for your irrigation. While plants prefer a permanent basic moisture (usually no waterlogging), make, however, make rather dry-loving and rarely want to be watered. Since the individual requirements of the plant our plant guardian cannot know, the interpretation of the necessary actions (watering or not watering) on the (traffic light) display of the plant monitor is exclusively in the hands of the botanically knowledgeable user. 😊. 

The plant monitor is therefore no substitute for responsible and plant-appropriate care of your plants!

In the further course of the project and with larger scope we will connect more sensors and of course also add comfort functions. Let yourself be surprised!
But let's start with the grassroots. Let's take a look at the components we need for our plant warden to start with:

  • 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%;
  • 1x Capacitive humidity sensor
  • 1x ESP32-38Pin variant Generic; Type NodeMCU-32S; Leg 38;
  • 1x YwRobot Breadboard Power Supply

We wire the components as follows:

Circuit

 

The 150 Ohm resistors are used as resistors for the LEDs. Together with the 47 KOhm resistor, the 130 KOhm forms a voltage divider for the analog output of the humidity sensor.

We upload the following code to our ESP 32:

 

#include <Driver/Adc.H>

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

LED PWM Settings
#define PWMfreq 5000  5 Khz base frequency
#define PWMledChannelA  0
#define PWMledChannelB  1
#define PWMledChannelC  2
#define PWM resolution  8 8 Bit Resolution
#define ADCAttenuation ADC_ATTEN_DB_11  ADC_ATTEN_DB_11 = 0-3.6V damping ADC compression
#define MaxSensors 1


Struct MoistureSensorCalibrationData
{   Int Data[MaxSensors * 2] = {0, 0}; Calibration Data for humidity sensor. Please observe project text and adjust values accordingly
};

Struct MoistureSensorData
{   Byte Percent[MaxSensors] = {0};  Humidity sensor data in percent
};

Global Variables
MoistureSensorCalibrationData MCalib;
MoistureSensorData MMeasure;
Byte AttachedMoistureSensors; Detected Active Moisture Sensors (Count)

Void Setup() {   initialize serial communication at 9600 bits per second:   pinMode(LED_Rot, Output);   pinMode(LED_Gelb, Output);   pinMode(LED_Gruen, Output);   Serial.Begin(115200);   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(20, 20, 20);   AttachedMoistureSensors = DetectMoistureSensors();   Serial.println(Q("System Configuration:"));   Serial.Print(AttachedMoistureSensors);   Serial.println(Q(" Soil moisture sensor(s)"));
}

Byte DetectMoistureSensors ()
{
#define MinSensorValue 100   Byte Detected = 0;   for (Int  = 0;  < MaxSensors; ++)   {     Int MSensorRawValue = ReadMoistureSensorVal();     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 ReadMoistureSensorVal(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;       }   }   Return Returnvalue;
}

Bool GetMoistureData()
{   Bool ReadisValid = True;   for (Int  = 0;  < AttachedMoistureSensors; ++)   {     If ((MCalib.Data[] == 0) || (MCalib.Data[ + 1] == 0)) MinADC Value maxADC ADC Value     {       ReadisValid = False;       Return ReadisValid;     }     Int RawMoistureValue = ReadMoistureSensorVal();     RawMoistureValue = MCalib.Data[ + 1] - RawMoistureValue;     RawMoistureValue = MCalib.Data[] + RawMoistureValue;     MMeasure.Percent[] = map(RawMoistureValue, MCalib.Data[], MCalib.Data[ + 1], 0, 100);     If (MMeasure.Percent[] > 100 ) {       ReadisValid = False;     }   }   Return ReadisValid;
}

Main Loop
Void Loop()
{   If (GetMoistureData())   {     Serial.Print(Q("Humidity value sensor 1 in percent :"));     Serial.Print(MMeasure.Percent[0]);     Serial.println(Q(" %"));     If (MMeasure.Percent[0] > 50)     {       SetLedConfig(0, 0, 20);     }     else If (MMeasure.Percent[0] > 10)     {       SetLedConfig(0, 255, 0);     }     else     {       SetLedConfig(255, 0, 0);     }   }   else   {     Serial.Print(Q("Soil moisture sensor not calibrated. Please calibrate. Raw data of the sensor 1:"));     Serial.println(ReadMoistureSensorVal(0));     SetLedConfig(20, 20, 20);   }   Delay(1000);        delay between reads for stability
}

 

 

As a final step, we now have to perform the calibration of our humidity sensor. Calibration of the sensor determines what is considered to be dry soil (water content 0%) and what wet soil (water content 100%) detected. For this purpose, we first stretch the moisture sensor into absolutely dry soil and let us output the raw sensor data on the serial cut line:

Value 1: (Dry)

Soil moisture sensor not calibrated

We note the value (2276) and now irrigate the earth until it is complete! is soaked and can no longer take out water. We take note of value 2: (Wet Earth) (1648)

Value in wet conditions

 

We add to the first value 2276, 10 and deduct from 1648, 10. The values are 2286 and 1638.

We enter the values in our code:

struct MoistureSensorCalibrationData

{
int Data[MaxSensors*2] =1638,2286};
};

And upload the code again.

We get the following output:

Output soil moisture

 

At the same time, our Led "Traffic Light" shows green. In doing so, Mean the colors:

Green: Moisture high.

Yellow: Moisture mediocre. 

Red: Dry.

Have fun recreating and going all the way to the next part of the series.

Esp-32Projekte für fortgeschritteneSensorenSmart home

17 comments

Patrick

Patrick

Super, dass du mit uns dein Projekt teilst. Vielen Dank dafür!

Ich habe eine Frage bezüglich der Spannungsversorgung: Würde die Spannungsversorgung vom ESP32 auch alleine ausreichen? Wie hoch darf der maximale Laststrom sein? Ich finde dazu leider keine Angaben.

Viele Grüße
Patrick

Tobias Kuch

Tobias Kuch

Hallo Clajo,
Die Antwort auf die Frage wie lange die Zuleitungen zu dem Sensor sein dürfen ist nicht trivial und hängt von einigen Faktoren ab. Diese ergeben sich aus dem Grundsatz bzw. der Formel des Spannungsabfalls auf elektrischen Leitungen. Die Antwort auf deine Frage ergibt sich aus den Formeln R (Leitung)=2L/κ (Kupfer κ = 56,0)* A und ΔU=R⋅I Davon ausgehend, das die Betriebsspannung Ub Nom. 5 Volt des NE555 Timers nicht mehr als 0,5 Volte abfallen sollte bei 0,2 A angenommenen Strombezug ergibt sich durch einsetzen ein max. R von 2,5 Ohm. Umgestellt nach Leitungslänge bei ang. materialabhängige Leitfähigkeit von Kupfer und angenommenen 1mm Querschnitt des Kabels ergibt sich durch Umstellung eine Maximallänge von L = 70 Meter. Die parasitäre Kapazität der Leitung ist irrelevant, da diese erst bei hohen Freuenzen von belang ist.. Ich hoffe, dein Frage zufriedenstellend beantwortet zu haben

Clajo

Clajo

Hallo,

wie lang darf die Leitung vom Sensor bis zum Board sein?
Jörg

Tobias

Tobias

Hallo Jörg,

Die Idee mit der Ansteuerung für eine automatische Bewässerung währe zwar eine konsequente Erweiterung , würde jedoch den Rahmen des Projektes hier sprengen. Falls du weitergehende Tipps dazu bekommen möchtest, schreibe bitte an AZ-Delivery mit bitte um Weiterleitung an mich. Dann gehe ich gerne zu diesem Thema noch auf Details ein.

Jörg

Jörg

Hi Tobias,
dein Hinweis auf ein gewisses Grundwissen der Programmierung ist schon nicht falsch.
Zumindest weiß ich in der Zwischenzeit auch wie das mit der Belegung der Pins in der Programmierung zu erkennen ist. Wenigstens ein kleiner Lichtblick für mich…..
Denn in meinem Alter will ich nicht mehr großartig anfangen irgend welche Programmiersprachen zu lernen, das Grundlegende des Code verstehe ich soweit ich weiß um was es sich dabei handeln soll….
Jetzt aber gleich noch eine ganz einfache Frage:
Ich habe ein ähnliches Projekt aber das läuft auf einer separaten Hardware und nennt sich: Gies-O-Mat mit AVR
Vom Prinzip her das gleiche Grundprinzip, kapazitive Feuchtigkeitssensoren zur Ermittlung der Erdfeuchte. Nur kann dieses Projekt nun auch noch Relais ansteuern und somit die Pflanzen selbständig gießen…….
Denkst du dass du das vielleicht auch noch implementieren könntest, dann wäre das ganze Projekt ja absolut unschlagbar ?!?!?

Tobias

Tobias

Hallo Jörg,

Erst einmal vielen Dank für die Beantwortung der Fragen bzgl. des Treibers. Du liegst natürlich direkt richtig. Der Treiber wird automatisch eingebunden. Bezüglich des Schaltbildes würde ich dich bitten, etwas Geduld zu haben. Ich werde dieses bei Gelegenheit dann auf meiner GIT-Hub Seite auf https://github.com/kuchto auf der ich die Projekte ebenfalls einstelle, veröffentlichen. Dieses Projekt setzt aber Erfahrung in der Technik an sich als auch in der Programmierung voraus.

Knut Dorendorff

Knut Dorendorff

Hallo Jörg. Vielen Dank für die Hinweise. Ich habe zwar noch nicht die einzelnen Teile zusammen gesteckt, aber zunächst hatte ich auch mit der Ansicht Probleme. Allerdings muss du berücksichtigen, dass auf dieser Seite nur ein Sensor angeschlossen ist, aber die Vorbereitung für weitere 5 Sensoren schon verbaut sind, aber noch nicht genutzt werden. Siehe am unteren Bild die Widerstände. Wenn Du in den dritten Teil gehst sollte es sich erklären.
Schauen wir mal .
Gruß Knut

Jörg

Jörg

Hallo Knut,
das Problem mit dem Treiber hat sich, denk ich mal von selbst erledigt.
Sobald man nämlich das Board ESP32xxxxx verwendet, wird auch automatisch der richtige Treiber bereit gestellt.
Zumindest habe ich das bisher bei der Überprüfung beim Kompilieren festgestellt.
Falls das nicht stimmen sollte:
Bitte nicht gleich alle mit dem Vorschlaghammer auf mich einschlagen ;-))))
Und in einem anderem Thread habe ich lesen können dass dieser Sketch nicht mit dem Lolin V3 kompatibel ist, somit hat sich diese Frage auch schon von selbst aufgelöst.
Das Einzige:
Ich kann die Schaltung nach wie vor nicht richtig erkennen….
Gibt es hierfür einen schöneren Steckplan oder gar Schaltplan?

Jörg

Knut Dorendorff

Knut Dorendorff

Halli Hallo,
eine tolle Sache. Wie komme ich an Library Driver/adc.h ?

Gruss Knut.

Knut Dorendorff

Knut Dorendorff

Große Klasse. Allerdings habe ich auch das Problem wie Jörg, dass die Library Driver/adc.h nicht gefunden wird. Wo bekomme ich die als Zip?

Gruß Knut

Jörg

Jörg

Hallo, eine sehr schöne Schaltung welche ich gerne auch nachbauen möchte.
Leider bin ich nicht gerade der Programmierprofi und habe auch mit der Beschaltung an sich ein kleines Problem. Ein paar Fragen hierzu:
1.: Gibt es eine Art Schaltplan für diese Schaltung, ich kann das Bild sehr schlecht erkennen ?
2.: Kann man diese Schaltung auch mit einem Lolin NodeMcu V3 nachbauen ?
3.: Wo finde ich den Treiber <driver/adc.h> ?

Jörg

Tobias Kuch

Tobias Kuch

Hallo Thorsten,

In dem von dir genannten Datasheet wird eine Minimalbertriebsspannung von 3,0 volt genannt. Bei einer Betriebsspannung des Sensors von 3,0 Volt ist die Ausgangsspannung tatsächlich Betriebsbedingt 3 volt. Der Sensor funktionierte bei mir in Tests jedoch erst zuverlässig mit 5 Volt. Im Schaltbild siehst du auch das er auf der 5 Volt Schiene liegt. GEMESSENE Ausgangsspannung war bei trockenem Sensor bei mir dann 4 Volt. Also zu hoch für den ESP. Daher ist und bleibt der Spannungsteiler notwendig ;)

Thorsten

Thorsten

Das mit dem Spannungsteiler ist mir nicht ganz logisch. Der Sensor hat einen Ausgangsspannungsbereich von 0V bis 3.0V (https://media.digikey.com/pdf/Data%20Sheets/DFRobot%20PDFs/SEN0193_Web.pdf) und damit innerhalb der Spec vom ESP.

Wäre nett, wenn du das noch mal klarstellen würdest.

Thorsten

Tobias

Tobias

Hallo Joe,

Es werden keine kapazitiven Werte durch den ESP gemessen, sondern, bedingt durch die interne Funktionsbeschaltung des Feuchtesensors, analoge Gleichspannungswerte. Da der Messbereich des ESP jedoch unterhalb der max. . analogen Spannungswerte des Feuchtesensors sind , ist der Spannungsteiler notwendig.

Tobias

Tobias

Hallo Paulaner,

Die Beschaltung der Wiederstände ist nicht mangelhaft, sondern im Gegenteil Absicht sind, da diese , und auch der Code bereits Vorbereitungen für die Anbindungen weiterer 5 Sensoren des Typs Feuchtesensoren enthalten bzw. sind.

paulaner

paulaner

Hallo,
ihr Fritzing Bild ist mangelhaft, 5 Widerstände hängen in der Luft, nix Spannungsteiler.
H. Winkler

joe

joe

Ganz logisch erscheint mit die Beschaltung des Spannungsteiler und Feuchtesensor nicht.
Das ich bei Messung kapazitiver Werte ein Wechselspannung mit einer, entsprechen dem kapazitiven Wert des Sensor, Frequenz betreiben muß. Das sehe ich dort nicht.

Leave a comment

All comments are moderated before being published