Hoy quiero compartir con vosotros un nuevo interesante mehrteiliges Proyecto con el versátil y potente ESP 32 imaginar. Vamos a construir nosotros un Pflanzenwächter para nuestras Plantas autóctonas. El objetivo es que mientras nos enfocamos en nuestros emocionantes Elektronikprojekten dedicar, el contenido de Humedad de la Pflanzenerde supervisar y nos informa de si la Humedad del suelo disminuye. Para ello, nuestro Pflanzenwächter una Semáforos LED en la Tierra húmeda se ilumina en verde y en seco de la Tierra a través de amarillo a rojo. Sin embargo, antes de comenzar con el Proyecto, pero nosotros debemos aún, antes del Inicio del Proyecto, algunos de los que preocuparse. Esto afecta, en particular, el Uso del Pflanzenwächters. Debido a que nuestro Pflanzenwächter la Humedad de la Tierra a través de una capacitiva Nahfeldmessung determinado, es necesario que la Humedad en las Inmediaciones del Sensor se almacena. Mientras que el i. d. R. normal (Flores)Pflanzenerde en una Ferretería o en una tienda de esta Condición se cumple, esto es, con, entre otros, Hydrokultursubstraten o Orchideensubstrat no es el Caso! Por lo tanto,
Este Proyecto es para Hydrokulturpflanzen o Luftwurzlerpflanzen (como, por ejemplo, las Orquídeas) no adecuado!
Además, la planta tiene diferentes Requisitos para Su Riego. Mientras hago las Plantas una permanente humedad permanente (normalmente no se Inundan) prefiere son los hago por el contrario, más bien trockenliebend y desea rara vez se vierte. Puesto que los Requisitos individuales de la Planta de nuestro Pflanzenwächter no se puede conocer, está la Interpretación de la acción adecuada (verter o no de la fundición) en la (Semáforo) Indicación del Pflanzenwächters exclusivamente en la Mano del botánico anuncio de Usuario 😊.
de La Pflanzenwächter tanto, no es un Sustituto para una buena y pflanzengerechte el Cuidado de tus Plantas!
En el Transcurso del Proyecto y con mayor en la Medida que los Sensores de ataduras y, por supuesto, Confort agregar. Que no se dejen sorprender!
Pero vamos a empezar con la Base. Echemos un vistazo a los Componentes que necesitamos para nuestro Pflanzenwächter necesario para comenzar:
- 1 x LED de Color Verde (560nm); 5 mm
- 1x LED de Color Amarillo (605nm); 5 mm
- 1x LED de Color Rojo (633nm); 5 mm
- 6x130kΩ Resistencia de Tolerancia de ±1%;
- 6x 47kΩ Resistencia de Tolerancia de ±1
- 3x 150 Ω Resistencia de Tolerancia de ±1%;
- 1x Sensor de humedad Capacitivo
- 1x ESP32-38Pin Variante Generic; Tipo NodeMCU-32S; Pierna 38;
- 1x YwRobot Protoboard Alimentación
Nos cableado de los Componentes de la siguiente manera:
150 Ohm Resistencias como resistencias en serie para los LEDs utilizados. De los 130 Ohms, constituye, junto con la de 47 Ohm la Resistencia de un divisor de tensión para la salida Analógica del sensor de humedad.
Invitamos siguiente Código en nuestros ESP 32 alto:
#include <driver/adc.h> // Portedefinierung Led's #define LED_Rot 5 // LED Rojo #define LED_Gelb 14 // el LED Amarillo #define LED_Gruen 15 // LED Verde // LED PWM Configuración #define PWMfreq 5000 // 5 Khz frecuencia base #define PWMledChannelA 0 #define PWMledChannelB 1 #define PWMledChannelC 2 #define PWMresolution 8 // 8 Bits de Resolución #define ADCAttenuation ADC_ATTEN_DB_11 //ADC_ATTEN_DB_11 = 0-3,6 V Dämpung ADC Einstzellung #define MaxSensors 1 struct MoistureSensorCalibrationData { int Data[MaxSensors * 2] = {0, 0}; // Calibration Data para el sensor de Humedad. Por favor, el Proyecto de Texto de nota y Valores según personalizar }; struct MoistureSensorData { byte Percent[MaxSensors] = {0}; // Feuchtigkeitssensordaten en Porcentaje }; //Variable Global MoistureSensorCalibrationData MCalib; MoistureSensorData MMeasure; byte AttachedMoistureSensors; // Detected Active Moisture Sensor (Count) void setup() { // initialize serial communication at 9600 bits por segundo: pinMode(LED_Rot, SALIDA); pinMode(LED_Gelb, SALIDA); pinMode(LED_Gruen, SALIDA); Serial.begin(115200); ledcSetup(PWMledChannelA, PWMfreq, PWMresolution); ledcSetup(PWMledChannelB, PWMfreq, PWMresolution); ledcSetup(PWMledChannelC, PWMfreq, PWMresolution); 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(F("Systemkonfiguration:")); de Serie.impresión(AttachedMoistureSensors); Serie.println(F(" Bodenfeuchtigkeitsensor(en)")); } byte DetectMoistureSensors () { #define MinSensorValue 100 byte Detectado = 0; por (int i = 0; i < MaxSensors; i++) { int MSensorRawValue = ReadMoistureSensorVal(yo); si ( MSensorRawValue > MinSensorValue) { Detectado++; } más { de romper; } } si (se Detecta < 1) { Serie.println(F("Keine Bodenfeuchtigkeitssesoren erkannt. Sistema de angehalten.")); esp_deep_sleep_start(); mientras que (1) {} } el retorno Detectado; } bool SetLedConfig(byte Rojo, byte amarillo, byte verde) { ledcWrite(PWMledChannelA, Rojo); // Rote LED ledcWrite(PWMledChannelB, amarillo); // Gelbe LED ledcWrite(PWMledChannelC, verde); // Gruene LED devolver true; } int ReadMoistureSensorVal(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; } } volver ReturnValue; } bool GetMoistureData() { bool ReadisValid = verdadero; para (int i = 0; i < AttachedMoistureSensors; yo++) { si ((MCalib.de Datos[i] == 0) || (MCalib.de Datos[i + 1] == 0)) // MinADC Valor maxADC ADC Valor { ReadisValid = falso; retorno ReadisValid; } int RawMoistureValue = ReadMoistureSensorVal(me); RawMoistureValue = MCalib.de Datos[i + 1] - RawMoistureValue; RawMoistureValue = MCalib.de Datos[i] + RawMoistureValue; MMeasure.por Ciento[yo] = mapa(RawMoistureValue, MCalib.de Datos[i], MCalib.de Datos[i + 1], 0, 100); si (MMeasure.por Ciento[me] > 100 ) { ReadisValid = falso; } } retorno ReadisValid; } // Bucle Principal void loop() { si (GetMoistureData()) { Serie.de impresión(F("Feuchtigkeitswert Sensor 1 en Prozent :")); de Serie.impresión(MMeasure.por Ciento[0]); de Serie.println(F(" %")); si (MMeasure.por Ciento[0] > 50) { SetLedConfig(0, 0, 20); } más si (MMeasure.por Ciento[0] > 10) { SetLedConfig(0, 255, 0); } más { SetLedConfig(255, 0, 0); } } otra { Serie.de impresión(F("Bodenfeuchtigkeitssensor nicht kalibriert.Bitte kalibrieren. RohDaten des Sensores 1:")); de Serie.println(ReadMoistureSensorVal(0)); SetLedConfig(20, 20, 20); } retraso(1000); // retardo entre las lecturas para la estabilidad }
de la Ela letzten Schritt wir müssen monja morir Kalibrierung unseres Feuchtigkeitssensors durchführen. Morir Kalibrierung des Sensores legt fest, fue ela trockene Erde (Wassergehalt 0%) und fue nasse Erde (Wassergehalt 100%) erkannt wird. Dazu strecken wir den Feuchtigkeitssensor ela ersten en absolut trockene Erde und lassen uns die Sensor-Rohdaten auf der seriellen Schnittselle ausgeben:
Wert 1: (Trocken)
Wir notieren uns den Wert (2276) und bewässern monja die Erde solange, bis sie komplett! durchnässt ist und kein Wasser mehr ausnehmen kann. Wir notieren unsden Wert 2: (Nasse Erde) (1648)
Wir addieren zu dem ersten Wert 2276, 10 dazu und ziehen von 1648, 10 ab. Es ergeben sich daraus morir Werte 2286 und 1638
Wir tragen morir Werte en unseren Código ein:
struct MoistureSensorCalibrationData
Und laden den el Código de erneut hoch.
Wir erhalten folgende Ausgabe:
Gleichzeitig zeigt unsere Led "Ampel" grün una. Dabei bedeuten die Farben:
Gelb: Feuchtigkeit mittelmäßig.
Rot: Trocken.
Viel Spaß beim Nachbauen und bis zum nächsten Teil der Serie.
19 comentarios
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
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
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
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
Hallo,
wie lang darf die Leitung vom Sensor bis zum Board sein?
Jörg
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
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
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
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
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
Halli Hallo,
eine tolle Sache. Wie komme ich an Library Driver/adc.h ?
Gruss Knut.
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
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
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
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
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
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
Hallo,
ihr Fritzing Bild ist mangelhaft, 5 Widerstände hängen in der Luft, nix Spannungsteiler.
H. Winkler
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.