Ich verwende einen DHT21 (https://www.amazon.de/dp/B0D82X8H3R?ref=ppx_yo2ov_dt_b_fed_asin_title) auf einem D1 Mini V3 NodeMCU ESP8266EX um alle 30 Sekunden die Temperatur und Feuchtigkeit auszulesen. Verbunden ist der DHT sowohl mit 3,3 als auch mit 5 V, Ground und dem GPIO2 (D4) Pin. Daten und VCC sind mit 10kOhm verbunden. Das Programm funktioniert fast ohne Probleme. Meine beiden Probleme sind: Direkt nach dem Falschen muss ich die Spannungsversorgung vom D1 abziehen oder ich bekomme keine Messergebnisse. Was nicht besonders schlimm ist. Aber das große Problem ist, dass ich keine Messergebnisse mehr erhalte, sobald ein andere Verbraucher (z.B. der Lötkolben) in der Nähe vom Datenkabel ausgeschaltet wird. Beim Einschalten passiert nichts, aber sobald abgeschaltet wird, kommen keine Messergebnisse mehr an. Das Problem wird erst durch Abstecken und einstecken vom Sensor oder mit abstecken und einstecken vom D1 behoben. Nur ein Reset über den Reset-Knopf behebt das Problem nicht. Ich habe schon mehrere DHTs und verschiedene D1 und auch einen ESP266-01 getestet. Immer das gleiche Problem. Woran liegt das und wie kann ich das beheben? (Anderer oder weiterer Widerstand, anderer Pin, Kondensator,.... ) Vielen Dank für eure Hilfe. Gruß Mathias
Mathias H. schrieb: > Verbunden ist der DHT sowohl mit 3,3 als auch mit 5 V Wie hast du dieses Kunststück vollbracht? Zeichne einen Schaltplan.
Und poste bitte dein Programm als .txt-Datei! Hast du auch den Pullup-Widerstand vorgesehen?
:
Bearbeitet durch User
Möglicherweise hat dein Programm ein Problem damit, wenn der Sensor durch einen elektromagnetischen Störimpuls unerwartet zum Senden seiner Messwerte angeregt wird. Man könnte jetzt versuchen, die Störimpulse fern zu halten. Ich würde aber erst versuchen, das Programm stabiler zu machen. Oder hängt sich der ESP komplett auf, so dass er nicht mal mehr per WLAN anpingbar ist? GPIO2 ist ungünstig, denn dieser Pin ist beim Booten ein serieller Ausgang, der dabei nicht auf LOW gezogen werden darf. Sonst bootet der ESP nicht zuverlässig.
Der ESP hängt sich nicht auf. Er sendet per MQT und Seriell weiterhin Nachrichten, jetzt aber dass keine Messerwerte mehr zurückkommen. Wenn NUR der Sensor abgesteckt wird und wieder eingesteckt wird im laufenden Betrieb funktioniert auch wieder alles.
So machst du dir den ESP8266 kaputt, weil du damit 5V Pegel auf GPIO2 legst. Es sind maximal 3,6 Volt erlaubt. Betreibe den Pull-Up Widerstand mit 3,3V.
Recht langes Programm, Verbesserungsvorschläge gerne wilkommen. Und wenn man den Fehler beheben kann, wäre das natürlich toll!
Mathias H. schrieb: > Program.txt (8,3 KB) Schau mal, was da in deinem eigenen Programm als Kommentar steht: > If using a board with 3.3V logic like an Arduino Due > connect pin 1 to 3.3V instead of 5V!
Ja. Und wenn du kannst, nimm einen Widerstand, der weniger empfindlich auf Störungen reagiert. Ich tendiere zu 2,2 kΩ. Gibt dein Programm die Meldung "Failed to read from DHT sensor!" aus? Wenn ja, kann man an der Stelle vielleicht eine Neu-Initialisierung der DHT Klasse einbauen: dht.begin(...)
Mathias H. schrieb: > Ich hoffe, das passt so. ich sehe mehrere Problemchen (oder die halt auftreten können) 1. versorgt wird der DHT mit 5V und als Pegel wird 3,3V erwartet, besser wäre den DHT mit 3,3V zu versorgen, 2 Spannungsversorgungen zu nutzen ist selten gut und da das Datenblatt als Versorgung 3,3V erlaubt..... 2. Wenn der DHT abstürzt weil Störungen den außer Tritt bringen könnte er genauso gut aus einem ESP Port versorgt werden,winwin, es sind keine 2 gemischten Versorgungsspannungen im Spiel, er kann durch den ESP neu gestartet werden. 3. Der R kann sollte für bessere Störunempfindlichkeit reduziert werden, ich nehme öfter min. 1mA bei low, das wären bei 3.3V eben 3,3kOhm. 4. Ein DHT22 ist genauer. 5. Schaltbilder gehen anders, auch Fritzing kann Schaltbilder.
Ich ändere den Widerstand. Vorrätig hätte ich noch 5,1K oder 1K. Was empfiehlst du mir? Das Program gibt keine Fehlermeldung aus. Es läuft lediglich in diese Schleife rein: // Check if any reads failed and exit early (to try again). total_counter = total_counter + 1; if (isnan(h) || isnan(t)) { Aber da kann ich gerne wie im Setup "dht.begin();" reinsetzten. Noch andere Vorschläge?
Joachim B. schrieb: > Mathias H. schrieb: >> Ich hoffe, das passt so. > > ich sehe mehrere Problemchen (oder die halt auftreten können) > > 1. versorgt wird der DHT mit 5V und als Pegel wird 3,3V erwartet, besser > wäre den DHT mit 3,3V zu versorgen, 2 Spannungsversorgungen zu nutzen > ist selten gut und da das Datenblatt als Versorgung 3,3V erlaubt..... Wird geändert, Spannungsversorgung auf die andere Seite legen und mit 3,3V versorgen. Kein Problem. > 2. Wenn der DHT abstürzt weil Störungen den außer Tritt bringen könnte > er genauso gut aus einem ESP Port versorgt werden,winwin, es sind keine > 2 gemischten Versorgungsspannungen im Spiel, er kann durch den ESP neu > gestartet werden. Verstehe ich nicht. Ich habe keine 2. Spannungsversorgung. Der ESP hat sowohl einen 5V als auch einen 3,3V Ausgang. Mir kam es so vor dass der 5V etwas stabiler war, aber da kann ich mich auch täuschen weil richtig stabil ist es leider gar nicht. > > 3. Der R kann sollte für bessere Störunempfindlichkeit reduziert werden, > ich nehme öfter min. 1mA bei low, das wären bei 3.3V eben 3,3kOhm. Ich habe einen 1k und einen 5,1K zur Hand. Passen die oder muss ich 3,3k organisieren? > 4. Ein DHT22 ist genauer. Der DHT22 sollte meiner Meinung nach von der Messung identisch sein, nur halt nicht mit Kabel und Schutzgehäuse. Oder irre ich mich da?? > 5. Schaltbilder gehen anders, auch Fritzing kann Schaltbilder. Das war am einfachsten und schnellsten mit Word gemacht. Ist ja auch keine große Schaltung. Ich hoffe, man erkennt wie es angeschlossen ist. Vielen Dank.
Mathias H. schrieb: > Verstehe ich nicht. Ich habe keine 2. Spannungsversorgung. doch, aus USB 5V und aus dem Spannungsregler auf dem Board 3,3V. Sowas kann ins Auge gehen! wenn die beiden auch mal zusammenstoßen. Ein DHT brauch so wenig Strom das er auch aus einem ESP Port gespeist werden kann. Mathias H. schrieb: > Ich habe einen 1k und einen 5,1K zur Hand. Passen die oder muss ich 3,3k > organisieren? war eine Empfehlung wenn Störungen reinspucken. 2x 5,1k parallel oder auch 1k wären OK, so hoch wie möglich, so niedrig wie nötig.
Joachim B. schrieb: > Mathias H. schrieb: >> Verstehe ich nicht. Ich habe keine 2. Spannungsversorgung. > > doch, aus USB 5V und aus dem Spannungsregler auf dem Board 3,3V. Die USB 5V Spannungsversorgung speist den D1 Mini per USB-Anschluss. Am D1 Mini hängt dann der DHT. > Sowas kann ins Auge gehen! wenn die beiden auch mal zusammenstoßen. > > Ein DHT brauch so wenig Strom das er auch aus einem ESP Port gespeist > werden kann. > > Mathias H. schrieb: >> Ich habe einen 1k und einen 5,1K zur Hand. Passen die oder muss ich 3,3k >> organisieren? > > war eine Empfehlung wenn Störungen reinspucken. > 2x 5,1k parallel oder auch 1k wären OK, so hoch wie möglich, so niedrig > wie nötig. Dann also den 1K. Wird so angeschlossen. Danke. Kann ich noch etwas an der SW machen? Ich glaube leider, dass das Problem wird mit dieser Änderung noch nicht behoben sein wird.
Mathias H. schrieb: > Ich hoffe, das passt so. Nein, das ist ein Wimmelbild, aber kein Schaltplan! Schaltpläne sind bei Fritzing einen Tab weiter rechts! Aber kan kann schon erkennen, was du meinst. Es wäre nur schön, wenn die GPIO-Namen auch dabei stehen würden!
Mathias H. schrieb: > Ich glaube leider ich nicht, bin aus der Kirche mit 12 und 16 ausgetreten. Mathias H. schrieb: > Die USB 5V Spannungsversorgung speist den D1 Mini per USB-Anschluss. > Am D1 Mini hängt dann der DHT. was soll der Widerspruch, dein Plan zeigt daß beide Spannungsversorgungen genutzt werden, 5V aus USB und 3.3V von der Boardversorgung vom dortigen Spannungsregler und das kann mal schief gehen, durch Lötspritzer, defekten Bauteilen o.ä. warum also ohne Not 2 Spannungsregler nutzen wenn es mit einer Spannung auch geht. Für längere Leitungen gibt es Pegelwandler in beide Richtungen.
Helmut -. schrieb: > Mathias H. schrieb: >> Ich hoffe, das passt so. > > Nein, das ist ein Wimmelbild, aber kein Schaltplan! Schaltpläne sind bei > Fritzing einen Tab weiter rechts! Aber kan kann schon erkennen, was du > meinst. Es wäre nur schön, wenn die GPIO-Namen auch dabei stehen würden! Wo finde ich dieses Fritzing? Ich sehe es leider nicht. Habe wohl Tomaten auf den Augen, Sorry. Jemand mit nen Hinweis, wo ich schauen muss? Danke, Gruß Mathias
Mathias H. schrieb: > Kann ich noch etwas an der SW machen? Die wichtigste Frage ist: Hängt es und wenn ja, dann wo? Wenn das Programm nicht hängt, finde heraus, woran es den Fehler erkennen kann. Dann kannst du versuchen, nach der Erkennung des Fehlers eine großzügige Pause delay(1s) gefolgt von begin() einzubauen.
Damit der Arduino läuft, benötigt er ja Strom. Dieser bekommt er bei mir aus einem USB Netzteil mit USB-C Stecker der direkt im D1 Mini eingesteckt ist. Der D1 Mini hat dann einen interne Spannungswandler und bietet 3,3V und 5V über seine Pins zur Verfügung. An dieser (3,3V) Spannungsversorgung habe ich den DHT angeschlossen. So gut erklärt? Es gibt also nur eine Spannungsversorgung.
Monk schrieb: > Mathias H. schrieb: >> Kann ich noch etwas an der SW machen? > > Die wichtigste Frage ist: Hängt es und wenn ja, dann wo? Das Programm läuft ganz normal weiter, erhält aber, selbst nach vielen Stunden, keine Messwerte mehr. > Wenn das Programm nicht hängt, finde heraus, woran es den Fehler > erkennen kann. Dann kannst du versuchen, nach der Erkennung des Fehlers > eine großzügige Pause delay(1s) gefolgt von begin() einzubauen. Das versuche ich jetzt einfach mal. Pause und dann Begin und nochmals Pause und dann schauen, ob es sich fängt.
Beitrag #7728284 wurde von einem Moderator gelöscht.
3,3V Anschluss und 1kOhm Widerstand haben das Problem nicht gelöst. Jetzt füge ich im Fehlerfall folgendes mit ein:
1 | delay(1000); |
2 | dht.begin(); |
3 | delay(1000); |
Vielleicht hilft das ja. :-(
Ansonsten kannst du noch versuchen, einen Kondensator mit ca. 100µF an die 3,3V und GND Anschlüsse des ES Moduls zu löten. Manchmal hilft das zur Stabilisierung der Stromversorgung.
Monk schrieb: > Ansonsten kannst du noch versuchen, einen Kondensator mit ca. 100µF an > die 3,3V und GND Anschlüsse des ES Moduls zu löten. Manchmal hilft das > zur Stabilisierung der Stromversorgung. Kondensator habe ich bestellt. Sollten morgen kommen. Mal schauen, ob das etwas bringt. Danke. Gibt es sonst noch Ideen?? Warum passiert das beim Ausschalten von anderen Geräten in der Nähe???
Mathias H. schrieb: > Es gibt also nur eine Spannungsversorgung. ich habe mich vom Wimmelbild verwirren lassen, dagegen helfen nur Schaltpläne. https://starthardware.org/fritzing-anleitung-teil-3-die-schaltplan-ansicht/
Ich hab das Ganze jetzt einmal kurz überflogen. Bist Du Dir sicher, dass der DHT auch noch funktioniert? Ich hatte vor kurzem einen ähnlichen Sachverhalt und habe gesucht wie blöd, bis mir aufgefallen, dass mein SHT30 kaputt war. Probiere doch Mal, mit dem simpelsten Sketch, nur den DHT auszulesen, sollte das mit den aktuellen Anschlüssen möglich sein, kann der Fehler wahrscheinlich nur im Code liegen oder dein Sensor läuft einfach nicht mit 3.3 V. Beim SHT-30 beispielsweise, gibt es Boards die für 3.3V und 5V ausgelegt sind.
Mathias H. schrieb: > Warum passiert das beim Ausschalten von anderen Geräten in der Nähe??? Weil im Schaltkontakt ein Funke entsteht, der eine Radiowelle erzeugt. Jede Leitung ist eine Antenne. Mit der Entdeckung begannt die Entwicklung von drahtlosen Funkstrecken. https://de.wikipedia.org/wiki/Knallfunkensender
Ach und eine Sach fällt mir auch noch ein: Bei Betrieb von externen Modulen auf 5V sind Level-Shifter (5V auf 3,3V und umgekehrt) notwendig, um die GPIOs des ESP nicht zu grillen. Das könnte hier unter Umständen durchaus passiert sein, da die PINs des ESP wohl doch recht empfindlich sind. Probiere als Datenbusleitung, doch auch nochmal einen anderen PIN des ESP.
Paul schrieb: > Ich hab das Ganze jetzt einmal kurz überflogen. Bist Du Dir sicher, dass > der DHT auch noch funktioniert? > Ich hatte vor kurzem einen ähnlichen Sachverhalt und habe gesucht wie > blöd, bis mir aufgefallen, dass mein SHT30 kaputt war. > > Probiere doch Mal, mit dem simpelsten Sketch, nur den DHT auszulesen, > sollte das mit den aktuellen Anschlüssen möglich sein, kann der Fehler > wahrscheinlich nur im Code liegen oder dein Sensor läuft einfach nicht > mit 3.3 V. Also der DHT funktioniert für Stunden ohne Probleme, solange kein 230V Verbraucher in der Nähe geschaltet wird. Da ich aber mit dieser Messung etwas steuern möchte und es aktuell noch per Zeitschaltuhr geschaltet wird, funktioniert es in der echten Umgebung nur ein paar Minuten, bis der Verbraucher geschaltet wird und dann nichts mehr funktioniert. :-( > Beim SHT-30 beispielsweise, gibt es Boards die für 3.3V und 5V ausgelegt > sind. Ich habe den DHT an 3,3V angeschlossen.
Paul schrieb: > Ach und eine Sach fällt mir auch noch ein: > > Bei Betrieb von externen Modulen auf 5V sind Level-Shifter (5V auf 3,3V > und umgekehrt) notwendig, um die GPIOs des ESP nicht zu grillen. Das > könnte hier unter Umständen durchaus passiert sein, da die PINs des ESP > wohl doch recht empfindlich sind. > > Probiere als Datenbusleitung, doch auch nochmal einen anderen PIN des > ESP. Ich habe es mit verschiedenen ESPs versucht und hatte immer das gleiche Problem. Außerdem läuft ja alles ohne Probleme, bis ein Verbraucher abgeschaltet wird.
Monk schrieb: > Mathias H. schrieb: >> Kann ich noch etwas an der SW machen? > > Die wichtigste Frage ist: Hängt es und wenn ja, dann wo? > > Wenn das Programm nicht hängt, finde heraus, woran es den Fehler > erkennen kann. Dann kannst du versuchen, nach der Erkennung des Fehlers > eine großzügige Pause delay(1s) gefolgt von begin() einzubauen. Hat das Problem leider nicht gelöst. Der Fehler wird nicht behoben durch die erneute Initialisierung. Schade.
Mathias H. schrieb: > Ich habe den DHT an 3,3V angeschlossen. Ich habe auch gerade nochmal im Datenblatt zum DHT21 geguckt. Der sollte mit 3.3V klarkommen, da es in den Spezifikationen auch so angegeben ist. Aber wie der gute "Monk" aka "roehrmond" bereits ein zwei Beiträge weiter oben bereits schrieb, ist wahrscheinlich der Kontaktfunke der Zeitschaltuhr schuld. Also nach Möglichkeit die olle Zeitschaltuhr verbannen.
Mathias H. schrieb: > Ich habe es mit verschiedenen ESPs versucht und hatte immer das gleiche > Problem. Außerdem läuft ja alles ohne Probleme, bis ein Verbraucher > abgeschaltet wird. Spaßenshalber könntest Du mal probieren, ein elektrischen Feuerzeug in der Nähe zu zünden. Verursacht es das selbe Problembild, hast du mit großer Wahrscheinlichkeit den/die Störer gefunden.
Paul schrieb: > Mathias H. schrieb: >> Ich habe den DHT an 3,3V angeschlossen. > > Ich habe auch gerade nochmal im Datenblatt zum DHT21 geguckt. Der sollte > mit 3.3V klarkommen, da es in den Spezifikationen auch so angegeben ist. > Aber wie der gute "Monk" aka "roehrmond" bereits ein zwei Beiträge > weiter oben bereits schrieb, ist wahrscheinlich der Kontaktfunke der > Zeitschaltuhr schuld. > > Also nach Möglichkeit die olle Zeitschaltuhr verbannen. Leider ist es fast jedes Gerät in der Nähe. Der Ventilator, der Lötkolben, die Lampe,... Und die Zeitschaltuhr sind zwei recht neue Shellys.
Mathias H. schrieb: > Leider ist es fast jedes Gerät in der Nähe. > > Der Ventilator, der Lötkolben, die Lampe,... Und die Zeitschaltuhr sind > zwei recht neue Shellys. Das ist natürlich bitter :( . Ggf. hilft hier eine Entstörung mit Filtern? Da ich davon aber nicht so viel Ahnung habe, möchte ich keine Falschaussagen geben und keine Filtermöglichkeit empfehlen. Ggf. kann hier Jemand versiertes, einmal kurz einen Spruch zu machen?!
Ohne Oszilloskopbild der Störung möchte ich nicht über Entstörmaßnahmen munkeln. Ist das Kabel zum Sensor wenigstens abgeschirmt?
Mathias H. schrieb: > Der Fehler wird nicht behoben durch die erneute Initialisierung. > > Schade. dann eben power off/on aus einem GPIO Port wenn der DHT zickt Wie weit ist der DHT vom ESP weg?
:
Bearbeitet durch User
Joachim B. schrieb: > Mathias H. schrieb: >> Der Fehler wird nicht behoben durch die erneute Initialisierung. >> >> Schade. > > dann eben power off/on aus einem GPIO Port wenn der DHT zickt Das hört sich gut an. Also den GPIO verwenden als 3,3V Ausgang? Wie wäre dafür das Programm? Oder wie müsste ich das beschalten? > > Wie weit ist der DHT vom ESP weg? Ca. 2 Meter. Aber ich habe das gleiche Problem mit dem 10cm Sensor Kabel, das direkt verbaut ist, und das auch leider nicht geschirmt ist.
Mathias H. schrieb: > > Das hört sich gut an. Also den GPIO verwenden als 3,3V Ausgang? Wie wäre > dafür das Programm? Oder wie müsste ich das beschalten? Wenn ich mich nicht komplett irre, kann der Sketch gleich bleiben und such mal nach "ds18b20 parasite power". Der DS18b20 ist nur ein anderer Tempsensor, der aber mit der gleichen Signalübertragung arbeitet. Ersetze den DS18B20 in den Schaltbildern durch deinen DHT, und dann sollte die parasitäre Speisung funktionieren. Dadurch braucht der Sensor aber etwas zum "Anlaufen" und bietet dir nicht gleich unbedingt plausible Werte an oder kann direkt angesprochen werden. Ich meine mich zu erinnern, dass er so um die 2s benötigt. Ggf. müsstest Du diesbezüglich den Code noch anpassen, ansonsten dürfte der Code aber gleich bleiben können.
Mathias H. schrieb: > Also den GPIO verwenden als 3,3V Ausgang? Ja > Wie wäre dafür das Programm? Schau mal in die Arduino Doku wie man einen GPIO als Ausgang programmiert. Das erste Beispielprogramm (Led Blinker) macht das. > Oder wie müsste ich das beschalten? Na du benutzt einen zweiten GPIO anstelle vom 3,3V Ausgang, um damit den Sensor zu versorgen.
Mathias H. schrieb: > Das hört sich gut an. Also den GPIO verwenden als 3,3V Ausgang? Wie wäre > dafür das Programm? Oder wie müsste ich das beschalten? einfach nur einen GPIO an VCC vom DHT natürlich der pullup vom Data auch.
1 | #define GPIO_NR 13 // dein genutzer Port natürlich wenn nicht 13
|
2 | |
3 | void setup() |
4 | {
|
5 | pinMode(GPIO_NR, OUTPUT); // sets the digital pin GPIO_NR as output |
6 | digitalWrite(GPIO_NR, HIGH); // sets the digital pin GPIO_NR on |
7 | }
|
8 | |
9 | void switch_power_off_on |
10 | {
|
11 | digitalWrite(GPIO_NR, LOW); // sets the digital pin GPIO_NR off |
12 | delay(500); // waits for a halfsecond |
13 | digitalWrite(GPIO_NR, HIGH); // sets the digital pin GPIO_NR on |
14 | delay(500); // waits for a halfsecond |
15 | }
|
:
Bearbeitet durch User
Mathias H. schrieb: > Das Program gibt keine Fehlermeldung aus. Es läuft lediglich in diese > Schleife rein: > > // Check if any reads failed and exit early (to try again). > total_counter = total_counter + 1; > if (isnan(h) || isnan(t)) { "if" ist keine Schleife! Wenn die Bedingung erfüllt ist sollte er auch eine Meldung ausgeben. Mathias H. schrieb: > Leider ist es fast jedes Gerät in der Nähe. > > Der Ventilator, der Lötkolben, die Lampe,... Und die Zeitschaltuhr sind > zwei recht neue Shellys. Was gibt der Serial Monitor aus?
Joachim B. schrieb: > Mathias H. schrieb: >> Das hört sich gut an. Also den GPIO verwenden als 3,3V Ausgang? Wie wäre >> dafür das Programm? Oder wie müsste ich das beschalten? > > einfach nur einen GPIO an VCC vom DHT natürlich der pullup vom Data > auch. > >
1 | > #define GPIO_NR 13 // dein genutzer Port natürlich wenn nicht 13 |
2 | >
|
3 | > void setup() |
4 | > { |
5 | > pinMode(GPIO_NR, OUTPUT); // sets the digital pin GPIO_NR as output |
6 | > digitalWrite(GPIO_NR, HIGH); // sets the digital pin GPIO_NR on |
7 | > } |
8 | >
|
9 | > void switch_power_off_on |
10 | > { |
11 | > digitalWrite(GPIO_NR, LOW); // sets the digital pin GPIO_NR off |
12 | > delay(500); // waits for a halfsecond |
13 | > digitalWrite(GPIO_NR, HIGH); // sets the digital pin GPIO_NR on |
14 | > delay(500); // waits for a halfsecond |
15 | > } |
16 | >
|
Vielen Dank! Kann ich den GPIO 2, den ich für meine Daten verwende, auch "aus und ein" schalten?
Obelix X. schrieb: > Mathias H. schrieb: >> Das Program gibt keine Fehlermeldung aus. Es läuft lediglich in diese >> Schleife rein: >> >> // Check if any reads failed and exit early (to try again). >> total_counter = total_counter + 1; >> if (isnan(h) || isnan(t)) { > > "if" ist keine Schleife! Ist mir klar, dachte so versteht es jeder. Sorry. > Wenn die Bedingung erfüllt ist sollte er auch eine Meldung ausgeben. Natürlich, es passiert genau das, was in der Bedingung angegeben ist: Serial.print(F("Failed to read from DHT sensor!")); > Mathias H. schrieb: >> Leider ist es fast jedes Gerät in der Nähe. >> >> Der Ventilator, der Lötkolben, die Lampe,... Und die Zeitschaltuhr sind >> zwei recht neue Shellys. > > Was gibt der Serial Monitor aus? Failed to read from DHT sensor!
Ich weiß nicht ob das ein Fehler ist, das sieht aber für mich komisch aus :
1 | time_t now = time(nullptr); |
2 | now = now + 3600 + 3600; |
3 | String time = String(ctime(&now)); |
Es wird die Variable "now" deklariert aber in "time.h" gibt es die Funktion "now(); // Returns the current time as seconds". Das gleiche mit "time". Erste ein Funktionsaufruf, dann eine Variablendeklaration. Auch wenn es funktioniert finde ich das kein schönen Programmierstiel.
:
Bearbeitet durch User
Mathias H. schrieb: > Kann ich den GPIO 2, den ich für meine Daten verwende, auch "aus und > ein" schalten? im Prinzip ja, nur warum willst du das tun? Was verstehst du unter aus und ein? In der Computerprogrammierei gibt es kein AUS und kein EIN, es gibt Logikpegel, die können high und low sein, welches davon EIN und AUS bedeutet liegt im Auge des Betrachters und der Hardware, ist wie der Wippschalter der Licht ein- und aus-schaltet, je nach dem wierum er eingebaut ist.
Joachim B. schrieb: > Mathias H. schrieb: >> Das hört sich gut an. Also den GPIO verwenden als 3,3V Ausgang? Wie wäre >> dafür das Programm? Oder wie müsste ich das beschalten? > > einfach nur einen GPIO an VCC vom DHT natürlich der pullup vom Data > auch. > >
1 | > #define GPIO_NR 13 // dein genutzer Port natürlich wenn nicht 13 |
2 | >
|
3 | > void setup() |
4 | > { |
5 | > pinMode(GPIO_NR, OUTPUT); // sets the digital pin GPIO_NR as output |
6 | > digitalWrite(GPIO_NR, HIGH); // sets the digital pin GPIO_NR on |
7 | > } |
8 | >
|
9 | > void switch_power_off_on |
10 | > { |
11 | > digitalWrite(GPIO_NR, LOW); // sets the digital pin GPIO_NR off |
12 | > delay(500); // waits for a halfsecond |
13 | > digitalWrite(GPIO_NR, HIGH); // sets the digital pin GPIO_NR on |
14 | > delay(500); // waits for a halfsecond |
15 | > } |
16 | >
|
Vielen Dank!!! Damit funktioniert es perfekt. Eine Messung fällt aus, und danach geht es wieder weiter. Perfekt!! Immer im Fehlerfall wird jetzt dieses Skript ausgeführt:
1 | delay(100); |
2 | switch_power_off_on(); |
3 | delay(1000); |
4 | dht.begin(); |
5 | delay(500); |
Und alles läuft perfekt.
Obelix X. schrieb: > "if" ist keine Schleife! Aber der Block dahinter steht doch in geschleiften Klammern! :-) Mathias H. schrieb: > Kann ich den GPIO 2, den ich für meine Daten verwende, auch "aus und > ein" schalten? Der Pin ist im Ruhezustand "aus", da als Eingang konfiguriert. Obelix X. schrieb: > Auch wenn es funktioniert finde ich das kein schönen Programmierstiel. Stimmt. Wenn man zu now() etwas addiert, ist es nicht mehr now. Also ein irreführender Name. Man sollte die Variable nach dem benennen, was sie darstellt soll.
1 | in2hours = time(nullptr) + 3600 + 3600 |
Mathias H. schrieb: > Vielen Dank!!! Damit funktioniert es perfekt. > Eine Messung fällt aus, und danach geht es wieder weiter. Dann ist nicht der Mikrocontroller oder sein Software schlecht, sondern der Sensor hängt sich auf. Stichwort: EMV https://de.wikipedia.org/wiki/Elektromagnetische_Vertr%C3%A4glichkeit
Monk schrieb: > Obelix X. schrieb: >> "if" ist keine Schleife! > > Aber der Block dahinter steht doch in geschleiften Klammern! :-) Natürlich, also der Block hinter der IF ist in einer geschweiften Klammer und wird zusammen ausgeführt.
1 | if (isnan(h) || isnan(t)) { |
2 | fail_counter = fail_counter + 1; |
3 | Serial.print(F("Failed to read from DHT sensor! (")); |
4 | Serial.print(String(total_counter)); |
5 | Serial.print("/"); |
6 | Serial.print(String(fail_counter)); |
7 | Serial.println(")"); |
8 | delay(100); |
9 | switch_power_off_on(); |
10 | delay(1000); |
11 | dht.begin(); |
12 | delay(500); |
13 | // Publish an MQTT error message on topic MQTT_PUB_Error
|
14 | uint16_t packetIdPub4 = mqttClient.publish(MQTT_PUB_Error, 1, true, String((fail_counter)).c_str()); delay(100); |
15 | uint16_t packetIdPub5 = mqttClient.publish(MQTT_PUB_Messages, 1, true, String((total_counter)).c_str()); delay(100); |
16 | return; |
17 | }
|
> > Mathias H. schrieb: >> Kann ich den GPIO 2, den ich für meine Daten verwende, auch "aus und >> ein" schalten? > > Der Pin ist im Ruhezustand "aus", da als Eingang konfiguriert. > > Obelix X. schrieb: >> Auch wenn es funktioniert finde ich das kein schönen Programmierstiel. > > Stimmt. Wenn man zu now() etwas addiert, ist es nicht mehr now. Also ein > irreführender Name. Man sollte die Variable nach dem benennen, was sie > darstellt soll. >
1 | > in2hours = time(nullptr) + 3600 + 3600 |
2 | >
|
Das Problem ist die Zeitzone. Wenn ich ohne +3600+3600 verwende dann ist Jetzt leider nicht bei uns jetzt. Aus diesem Grund ist Now schon richtig. Aber es ist mir auch klar dass ich kein Profi bin. Keine Coding-Guidelines einhalte, und durch das zusammenwerfen vom Code vieles nicht so schön ist. Das mit der Time und so kommt aber auch nicht von mir sondern kommt aus nem Beispiel für "Sleepmode" den ich aber nicht umgesetzt habe. > Mathias H. schrieb: >> Vielen Dank!!! Damit funktioniert es perfekt. >> Eine Messung fällt aus, und danach geht es wieder weiter. > > Dann ist nicht der Mikrocontroller oder sein Software schlecht, sondern > der Sensor hängt sich auf. Stichwort: EMV > https://de.wikipedia.org/wiki/Elektromagnetische_Vertr%C3%A4glichkeit Ja, ich habe ja immer gesagt dass die SW normal weiter läuft aber keine Werte mehr vom Sensor bekommt. Ich habe gehofft dass man das mit der HW oder mehr Spannung,... weg bekommt. Ist schon schade dass dieser Sensor so empfindlich ist. Disen Sensor lieber nicht bestellen. Ich hoffe da gibt es bessere.
Obelix X. schrieb: > Ich weiß nicht ob das ein Fehler ist, das sieht aber für mich komisch > aus : > >
1 | > time_t now = time(nullptr); |
2 | > now = now + 3600 + 3600; |
3 | > String time = String(ctime(&now)); |
4 | >
|
> > Es wird die Variable "now" deklariert aber in "time.h" gibt es die > Funktion "now(); // Returns the current time as seconds". > > Das gleiche mit "time". Erste ein Funktionsaufruf, dann eine > Variablendeklaration. > > Auch wenn es funktioniert finde ich das kein schönen Programmierstiel. Da hast du recht. Ist so direkt aus einem "Example" oder so entnommen für Zeit oder Sleep-Mode. Da mir dann die "falsche" Zeit übertragen wurde, habe ich die +3600 + 3600 hinzugefügt. Das kommt aus der Zeitzone. Sonst ist alles direkt übernommen. Muss ehrlich sagen, dass ich den Variablen Type "time_t" nicht verstehe und auch nicht, was da mit "time(nullptr)" gemacht wird. Deshalb einfach so genommen. Aber vielen Dank für das Feedback.
Mathias H. schrieb: > Disen Sensor lieber nicht bestellen. Ich hoffe da gibt es bessere. Joachim B. schrieb: > 4. Ein DHT22 ist genauer. lesen hilft, zwar nicht bei diesem Problem, das bleibt auch beim DHT22, aber man kann die on/off Zeit optimieren und sofort unmögliche Werte rauswerfen.
:
Bearbeitet durch User
Joachim B. schrieb: > Mathias H. schrieb: >> Disen Sensor lieber nicht bestellen. Ich hoffe da gibt es bessere. > > Joachim B. schrieb: >> 4. Ein DHT22 ist genauer. > > lesen hilft, zwar nicht bei diesem Problem, das bleibt auch beim DHT22, > aber man kann die on/off Zeit optimieren und sofort unmögliche Werte > rauswerfen. Ich dachte, das ist der gleiche Sensor nur mit einer anderen Bauform. Die Messwerte sollten dann identisch sein. Der eine ist ohne Gehäuse und mit Pins, der andere mit Gehäuse und Kabel. Die Auflösung und der Messbereich sollte meiner Meinung nach der gleiche sein. Der schlechtere ist der DHT11. >> Disen Sensor lieber nicht bestellen. Ich hoffe da gibt es bessere. Es geht mir auch weniger um das Model, sondern der Hersteller. Ich glaube da ist einfach an der Qualität gespart worden im Inneren.
Mathias H. schrieb: > Es geht mir auch weniger um das Model, sondern der Hersteller. es gibt bessere Feuchtesensoren aber natürlich viel teurer, das Problem mit längeren Leitungen ist aber immer vorhanden es sei denn du wertest mit kurzer Leitung aus, externer Controller und überträgst auf längere Leitungen mit geringerer Datenrate & Fehlerprotokoll und bei Störungen, warum auch immer, verwirfst du die Fehlmessung.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.