Forum: Mikrocontroller und Digitale Elektronik Leseprobleme mit dem DHT21 an einem D1 Mini V3


von Mathias H. (mathias_h549)


Lesenswert?

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

von Monk (roehrmond)


Lesenswert?

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.

von Helmut -. (dc3yc)


Lesenswert?

Und poste bitte dein Programm als .txt-Datei!

Hast du auch den Pullup-Widerstand vorgesehen?

: Bearbeitet durch User
von Monk (roehrmond)


Lesenswert?

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.

: Bearbeitet durch User
von Mathias H. (mathias_h549)


Angehängte Dateien:

Lesenswert?

Ich hoffe, das passt so.

von Mathias H. (mathias_h549)


Lesenswert?

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.

von Monk (roehrmond)


Lesenswert?

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.

: Bearbeitet durch User
von Mathias H. (mathias_h549)


Angehängte Dateien:

Lesenswert?

Recht langes Programm, Verbesserungsvorschläge gerne wilkommen.

Und wenn man den Fehler beheben kann, wäre das natürlich toll!

von Monk (roehrmond)


Lesenswert?

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!

: Bearbeitet durch User
von Mathias H. (mathias_h549)


Angehängte Dateien:

Lesenswert?

Also so ändern?

von Monk (roehrmond)


Lesenswert?

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(...)

von Joachim B. (jar)


Lesenswert?

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.

von Mathias H. (mathias_h549)


Lesenswert?

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?

von Mathias H. (mathias_h549)


Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

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.

von Mathias H. (mathias_h549)


Lesenswert?

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.

von Helmut -. (dc3yc)


Lesenswert?

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!

von Joachim B. (jar)


Lesenswert?

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.

von Mathias H. (mathias_h549)


Lesenswert?

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

von Monk (roehrmond)


Lesenswert?

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.

von Mathias H. (mathias_h549)


Lesenswert?

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.

von Mathias H. (mathias_h549)


Lesenswert?

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 vom Autor gelöscht.
von Mathias H. (mathias_h549)


Lesenswert?

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. :-(

von Monk (roehrmond)


Lesenswert?

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.

von Mathias H. (mathias_h549)


Lesenswert?

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???

von Joachim B. (jar)


Lesenswert?

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/

von Paul (deadeyeflint)


Lesenswert?

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.

von Monk (roehrmond)


Lesenswert?

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

: Bearbeitet durch User
von Paul (deadeyeflint)


Lesenswert?

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.

von Mathias H. (mathias_h549)


Lesenswert?

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.

von Mathias H. (mathias_h549)


Lesenswert?

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.

von Mathias H. (mathias_h549)


Lesenswert?

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.

von Paul (deadeyeflint)


Lesenswert?

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.

von Paul (deadeyeflint)


Lesenswert?

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.

von Mathias H. (mathias_h549)


Lesenswert?

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.

von Paul (deadeyeflint)


Lesenswert?

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?!

von Monk (roehrmond)


Lesenswert?

Ohne Oszilloskopbild der Störung möchte ich nicht über Entstörmaßnahmen 
munkeln.

Ist das Kabel zum Sensor wenigstens abgeschirmt?

von Joachim B. (jar)


Lesenswert?

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
von Mathias H. (mathias_h549)


Lesenswert?

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.

von Paul (deadeyeflint)


Lesenswert?

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.

von Monk (roehrmond)


Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

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
von Obelix X. (obelix)


Lesenswert?

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?

von Mathias H. (mathias_h549)


Angehängte Dateien:

Lesenswert?

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?

von Mathias H. (mathias_h549)


Lesenswert?

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!

von Obelix X. (obelix)


Lesenswert?

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
von Joachim B. (jar)


Lesenswert?

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.

von Mathias H. (mathias_h549)


Lesenswert?

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.

von Monk (roehrmond)


Lesenswert?

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

: Bearbeitet durch User
von Mathias H. (mathias_h549)


Lesenswert?

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.

von Mathias H. (mathias_h549)


Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

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
von Mathias H. (mathias_h549)


Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

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
Noch kein Account? Hier anmelden.