Ein Pflanzenwächter für die Fensterbank - AZ-Delivery

Oggi vorrei presentarvi un nuovo, interessante progetto multiparte con il versatile e potente ESP 32. Stiamo costruendo un custode per le nostre piante domestiche. Mentre stiamo dedicando la nostra attenzione ai nostri entusiasmanti progetti elettronici, questo dovrebbe monitorare il contenuto d'acqua del suolo della pianta e informarci quando l'umidità del suolo cala. Il nostro guardiano delle piante ha un semaforo a LED che si illumina di verde quando il terreno è umido e diventa rosso quando il terreno è asciutto. Prima di iniziare il progetto, tuttavia, dobbiamo pensare ad alcune cose prima di iniziare effettivamente il progetto. Ciò vale in particolare per l'uso del guardiano delle piante. Poiché il nostro custode dell'impianto determina l'umidità della terra attraverso una misurazione capacitiva del campo vicino, è necessario che l'umidità sia immagazzinata nelle immediate vicinanze del sensore. Di regola, il terreno normale (invasatura) delle piante dal negozio di ferramenta o dal supermercato soddisfa questa condizione, come nel caso degli Stati Uniti. I substrati idroponici o i substrati di orchidea non sono il caso! quindi:

Questo progetto è per piante idroponiche o Piante Airroot  (come le orchidee) non adatto!

Le piante hanno anche requisiti molto diversi per la loro irrigazione. Mentre alcune piante preferiscono un livello di umidità di base permanente (per lo più nessun ristagno), alcune piante sono piuttosto amanti dell'asciutto e raramente vogliono essere annaffiate. Poiché il nostro custode dell'impianto non è in grado di conoscere i requisiti individuali dell'impianto, l'interpretazione delle azioni necessarie (irrigazione o non irrigazione) sul display (semaforo) del custode dell'impianto è esclusivamente nelle mani dell'utente botanicamente competente 😊. 

Il guardiano delle piante non sostituisce quindi la cura responsabile e adeguata delle piante per le tue piante!

Nell'ulteriore corso del progetto e man mano che il campo di applicazione cresce, collegheremo ulteriori sensori e, naturalmente, aggiungeremo funzioni di comfort. Lasciati sorprendere!
Ma cominciamo con la base. Diamo un'occhiata ai componenti di cui abbiamo bisogno per il nostro tutore dell'impianto per iniziare:

  • 1 x LED di colore verde (560nm); 5 mm
  • 1x LED di colore giallo (605nm); 5 mm
  • 1x LED di colore rosso (633nm); 5 mm
  • 6x130kΩ tolleranza di resistenza ± 1%;
  • 6x tolleranza di resistenza 47kΩ ± 1
  • 3x 150Ω tolleranza di resistenza ± 1%;
  • 1x sensore di umidità capacitivo
  • 1x ESP32-38Pin variante generico; Tipo NodeMCU-32S; Gambe 38;
  • 1x alimentatore per breadboard YwRobot

Colleghiamo i componenti come segue:

circuito

 

I resistori da 150 ohm sono utilizzati come resistori in serie per i LED. 130 KOhm insieme alla resistenza da 47 KOhm formano un divisore di tensione per l'uscita analogica del sensore di umidità.

Carichiamo il seguente codice sul nostro ESP 32:

 

#include <autista/adc.B>

// Definizione della porta principale
#define LED_Rot     5     // LED rosso 
#define LED_Gelb    14    // LED giallo
#define LED_Gruen   15    // LED verde

// Impostazioni LED PWM
#define pwmfreq 5000  // frequenza di base 5 kHz
#define PWMledChannelA  0
#define PWMledChannelB  1
#define PWMledChannelC  2
#define Risoluzione PWM  8 // Risoluzione a 8 bit
#define ADCAttenuation ADC_ATTEN_DB_11  // ADC_ATTEN_DB_11 = impostazione ADC smorzamento 0-3.6V
#define MaxSensors 1


struct MoistureSensorCalibrationData
{   int dati[MaxSensors * 2] = {0, 0}; // Dati di calibrazione per sensore di umidità. Nota il testo del progetto e regola i valori di conseguenza
};

struct MoistureSensorData
{   byte per cento[MaxSensors] = {0};  // Dati del sensore di umidità in percentuale
};

// Variabili globali
MoistureSensorCalibrationData MCalib;
MoistureSensorData MMeasure;
byte AttachedMoistureSensors; // Sensori di umidità attiva rilevati (conteggio)

vuoto configurazione() {   // inizializza la comunicazione seriale a 9600 bit al secondo:   pinMode(LED_Rot, PRODUZIONE);   pinMode(LED_Gelb, PRODUZIONE);   pinMode(LED_Gruen, PRODUZIONE);   Seriale.inizio(115200);   ledcSetup(PWMledChannelA, PWMfreq, PWMresolution);   ledcSetup(PWMledChannelB, PWMfreq, PWMresolution);   ledcSetup(PWMledChannelC, PWMfreq, PWMresolution);   ledcAttachPin(LED_Rot, PWMledChannelA);   // collega il canale al GPIO da controllare   ledcAttachPin(LED_Gelb, PWMledChannelB);   ledcAttachPin(LED_Gruen, PWMledChannelC);   SetLedConfig(20, 20, 20);   AttachedMoistureSensors = DetectMoistureSensors();   Seriale.println(F("Systemkonfiguration:"));   Seriale.Stampa(AttachedMoistureSensors);   Seriale.println(F("Bodenfeuchtigkeitsensor (en)"));
}

byte DetectMoistureSensors ()
{
#definire MinSensorValue 100   byte rilevato = 0;   per (int io = 0; io < MaxSensors; io++)   {     int MSensorRawValue = ReadMoistureSensorVal(io);     Se ( MSensorRawValue > MinSensorValue) {       rilevato++;     } altro {       rompere;     }   }   Se (rilevato < 1)   {     Seriale.println(F("Keine Bodenfeuchtigkeitssesoren erkannt. System angehalten."));     esp_deep_sleep_start();     mentre (1) {}   }   ritorno rilevato;
}

bool SetLedConfig(byte Rosso, byte giallo, byte verde)
{   ledcWrite(PWMledChannelA, Rosso); // LED Rote   ledcWrite(PWMledChannelB, giallo); // LED Gelbe   ledcWrite(PWMledChannelC, verde); // LED Gruene   ritorno vero;
}

int ReadMoistureSensorVal(byte Sensore)
{   int Valore di ritorno, io;   lungo somma = 0;
#definire NUM_READS 6   adc1_config_width(ADC_WIDTH_BIT_12);   // Intervallo 0-4095   interruttore (Sensore)   {     Astuccio 0:       {         adc1_config_channel_atten(ADC1_CHANNEL_0, ADCAttenuation);         per (io = 0; io < NUM_READS; io++) { // Algoritmo di media           somma += adc1_get_raw( ADC1_CHANNEL_0 ); // Leggi analogico         }         Valore di ritorno = somma / NUM_READS;         rompere;       }   }   ritorno Valore di ritorno;
}

bool GetMoistureData()
{   bool ReadisValid = vero;   per (int io = 0; io < AttachedMoistureSensors; io++)   {     Se ((MCalib.Dati[io] == 0) || (MCalib.Dati[io + 1] == 0)) // Valore MinADC Valore ADC maxADC     {       ReadisValid = falso;       ritorno ReadisValid;     }     int RawMoistureValue = ReadMoistureSensorVal(io);     RawMoistureValue = MCalib.Dati[io + 1] - RawMoistureValue;     RawMoistureValue = MCalib.Dati[io] + RawMoistureValue;     MMeasure.Per cento[io] = carta geografica(RawMoistureValue, MCalib.Dati[io], MCalib.Dati[io + 1], 0, 100);     Se (MMeasure.Per cento[io] > 100 ) {       ReadisValid = falso;     }   }   ritorno ReadisValid;
}

// Main Loop
vuoto ciclo continuo()
{   Se (GetMoistureData())   {     Seriale.Stampa(F("Feuchtigkeitswert Sensor 1 in Prozent:"));     Seriale.Stampa(MMeasure.Per cento[0]);     Seriale.println(F(" %"));     Se (MMeasure.Per cento[0] > 50)     {       SetLedConfig(0, 0, 20);     }     altro Se (MMeasure.Per cento[0] > 10)     {       SetLedConfig(0, 255, 0);     }     altro     {       SetLedConfig(255, 0, 0);     }   }   altro   {     Seriale.Stampa(F("Bodenfeuchtigkeitssensor nicht kalibriert.Bitte kalibrieren. RohDaten des Sensors 1:"));     Seriale.println(ReadMoistureSensorVal(0));     SetLedConfig(20, 20, 20);   }   ritardo(1000);        // ritardo tra le letture per stabilità
}

 

 

Come detto, Schritt müssen wir nun die Kalibrierung unseres Feuchtigkeitssensors durchführen. Die Kalibrierung des Sensors Legt Fest, era anche Trockene Erde (Wassergehalt 0%) ed era Nasse Erde (Wassergehalt 100%) erkannt wird. Dazu strecken wir den Feuchtigkeitssensor als erstes in assolut trockene Erde und lassen uns die Sensor-Rohdaten auf der seriellen Schnittselle ausgeben:

Wert 1: (Trocken)

Sensore di umidità del suolo non calibrato

Wir notieren uns den Wert (2276) und bewässern nun die Erde solange, bis sie komplett! durchnässt ist und kein Wasser mehr ausnehmen kann. Wir notieren unsden Wert 2: (Nasse Erde) (1648)

Valore quando bagnato

 

Wir addieren zu dem ersten Wert 2276, 10 dazu und ziehen von 1648, 10 ab. Es ergeben sich daraus die Werte 2286 und 1638

Wir tragen die Werte in unseren Codice ein:

struct MoistureSensorCalibrationData

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

Codice non carico di codice erneut hoch.

Wir erhalten folgende Ausgabe:

Emissione di umidità del suolo

 

Allo stesso tempo, il nostro led mostra "semaforo" in verde. ci media  i colori:

verde: Umidità elevata.

giallo: Umidità moderata.

rosso: Secco

Divertiti a ricostruire e fino alla prossima parte della serie.

Esp-32Projekte für fortgeschritteneSensorenSmart home

19 commenti

Andreas Wolter

Andreas Wolter

@Rolf: Danke für die Info. Ich habe das eben in anderen Blogs getestet und es scheint ein globales Problem zu sein.
Ich habe hier in diesen Beitrag einen Download Link hinzugefügt. Ich gebe das an die technische Abteilung weiter und hoffe, dass das Problem behoben wird.

Grüße,
Andreas Wolter
AZ-Delivery Blog

Rolf

Rolf

Hallo,
ich weiss nicht, ob es bekannt ist: wenn man den Sketch über den Button Ziwschenablage kopiert, werden jeweils ab dem 2. Leerzciehn infolge nicht Hex 20 sondern Hex A0 eingefügt. Das stört den Adrduino Überseteer mit der Bemerkung “extended character is not vaid in an identifier”
Kann einen zur Verzweiflung bringen!
Wenn man es mit Markieren mit der Masu via Zwischenablage erledigt, ist alles ok.
mfg

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.

Lascia un commento

Tutti i commenti vengono moderati prima della pubblicazione