ich versuche, einen Feuchtigkeitssensor (DHT11) für das Badezimmer zu entwickeln. Wenn der Feuchtigkeitssensor einen bestimmten Wert erreicht, sollte eine LED aufleuchten, um dies anzuzeigen.
Ich hatte geplant, dafür einen PIC16F1826 zu verwenden, aber da ich ein PIC-Anfänger bin, habe ich zuerst ein Arduino Uno benutzt. Dort hat das Programm mit einer Bibliothek gut funktioniert. Aber mit dem PIC musste ich den Wert mit einer selbst konstruierten Methode messen, was ich auch getan habe. Zuerst habe ich ein Programmierset mit dem PIC18F45K22 verwendet, was ebenfalls gut funktionierte.
Aber jetzt, mit meiner eigenen Schaltung und der Verwendung des PIC16F1826 (ohne Peripheriegeräte des Programmiersets), habe ich ein Problem, den Sensorwert zu lesen. Das Merkwürdige ist, dass ich denselben Code zum Lesen der Daten verwendet habe wie beim Programmierset.
Zuerst habe ich den internen Oszillator verwendet, aber ich habe keine Daten erhalten. Dann habe ich versucht, einen Oszillator von 10 MHz anzuschließen, weil ich dachte, der interne wäre für diesen Zweck zu ungenau. Aber auch diesmal habe ich keine Daten erhalten.
Ich habe sogar versucht, den Oszillator zu testen, indem ich die LED regelmäßig blinken ließ, und das Blinken sah gut aus, soweit ich das von Auge aus beurteilen konnte.
Also bitte ich euch jetzt um Hilfe.
Ich habe einige Vermutungen, die euch vielleicht weiterhelfen:
Vielleicht habe ich die Konfigurationsbits durcheinandergebracht, da es das erste Mal war, dass ich dies getan habe.
Vielleicht gibt es auch ein Problem mit der Oszillatorschaltung.
Unten sind der Code und das Schema der Schaltung aufgeführt.
Zum besseren Verständnis des Fehlers: Ich erhalte aus meinem Code die Daten 0 für die Variable "int_RH".
Hast du ein Oszilloskop zur Hand, mit dem du einfach mal messen kannst, ob auf dem Interface das Protokoll sowohl pegelmäßig als auch vom Timing her so läuft, wie der Sensor es laut Datenblatt braucht?
Das Debuggen serieller Schnittstellen ohne Oszilloskop (oder wenigstens so einem 10€-Saleae-Logikanalyzer-Nachbau) ist wie "Autofahren nach Gehör": wenn es scheppert hats irgendein Problem gegeben.
BTW: diesen Schaltplan hättest du besser als PNG-Screenshot hier angehängt.
Allerdings sind die chinesischen Datenblätter oft völliger Schrott. Und so offenbar auch bei diesem Bauteil, wo das Timing nicht vernünftig mit min/typ/max Werten und Schaltpegeln spezifiziert ist. Und das, was irgendwie "spezifiziert" ist, steht verstreut in irgendwelchen Bildchen. Grauenhaft.
Letztlich hilft dann nur, möglichst nah am "Soll"-Bildchen zu bleiben.
Darauf folgt ein Signal, welches zuerst auf 5V/High geht. Nach kurzer
Zeit jedoch fällt dieses auf ca. 1V herab (siehe Bild)
Lt. DB des Sensors sollen da 5,1k als PullUp gegen Ub gehen, Du hast aber 1k. Vielleicht ist der Strom einfach etwas zu hoch für den OC-Ausgang, so daß er da ein sattes Volt hat ...
Sollte aber trotzdem noch kein Problem sein, da der PIC das immer noch als L zählen dürfte.
Ansonste ist es immer Mist, nur einen kleinen Ausschnitt des Oszillograms zu zeigen. Zeig doch mal die ganze Sequence beginnend mit dem Startsignal (zumindest noch einige relevante Pulse nach dem Start, solange das sinnvoll auf den Oszischirm paßt)
Ich möchte etwas grundsätzliches zu den DHTxx-Sensoren sagen: das sind nur Schätzeisen, wenn die länger höhere Rh sehen, dann bleiben die auf 100%. Man kann die zwar mit dem Fön regenerieren, das hält aber nicht lange.
Ich habe daher alle DHTxx rausgeworfen und durch SHT31 bzw. jetzt SHT41 ersetzt, die wollen allerdings I2C aber das ist ja auch kein Problem.
dumme Zwischenfrage, warum DHT11 wo doch der DHT22 genauer ist und man
am den genauso lernen kann.
Hab ihn nur genommen, weil ich ihn schon hatte, aber Danke für die Info
Zurück aber zum wesentlichen:
Ich habe erneut Messungen durchgeführt in "Bild 1" ist der gesamte Ablauf des "Korrekten Signals" zu sehen.
In "Bild 2" sind zeitlichen Abläufe, welche vom PIC an den DHT11 gehen noch einmal klar dargestellt.
Das zweite Signal vom PIC (das High Signal) wird aber etwas falsch ausgegeben, siehe "Bild 3".
In den Bildern 4, 5 und 6 sind nun die drei nächsten Signale zu sehen. Wobei soweit ich es verstanden habe, die ersten zwei als Start-Signal vom DHT11 aus gesendet werden.
Nun ist mir aber noch etwas weiteres aufgefallen, nämlich tritt so eine "korrekte Signalübertragung" gar nicht immer auf. Denn wie im "Bild 7" zu sehen ist, kommen manchmal auch nur Signale, welche nur für 18 ms auf low gehen und dann wieder auf high bleiben. (Für präzisere Zeitanzeige siehe "Bild 8")
Ich habe deshalb einmal den Code noch so umgeschrieben, dass wenn einmal eine "Korrekte Messung stattgefunden hat. Was geprüft wird indem ein Wert höher als 1 registriert wurde, dass der Code dann in einer while hängen bleibt und die LED durchgehend leuchtet. Jedoch aber ohne Erfolg die LED zum Leuchten zu bringen.
Nun ist mir aber noch etwas weiteres aufgefallen, nämlich tritt so eine
"korrekte Signalübertragung" gar nicht immer auf. Denn wie im "Bild 7"
zu sehen ist, kommen manchmal auch nur Signale, welche nur für 18 ms auf
low gehen und dann wieder auf high bleiben. (Für präzisere Zeitanzeige
siehe "Bild 8")
Du scheinst offensichtlich immer exakt 18ms als Startsignal zu verwenden. Das ist Blödsinn, denn der DHT will >18ms haben, und nicht exakt 18ms, so daß es auch gar keine Not gibt, die 18ms genau einhalten zu wollen. Damit hängst Du immer an der Start-Detektionsgrenze des DHT, so daß er offensichtlich gerne auch etliche Startsignale übersieht, was Du dann wohl auch im Bild 7 siehst.
Zumal der DHT es mit dem Timing der Pulse selber nicht so genau nimmt, sondern offensichtlich leicht "nachgeht". Sieht man ja an deinen Messungen, die immer leicht über den DB-Angaben liegen. Also solltest Du beim Startsignal auch entsprechend mindestens leicht drüber liegen.
Nimm einfach >25ms Start, und gut ...
(Kamera)fotos von irgendwas bitte immer(!) als JPEG posten. Auch wenn sie "Screenshots" ersetzen. Und richtige Screenshots von digital erzeugten Bildern (Coumputer- und Bedienoberflächen) dann besser als PNG. Man sollte das Werkzeug namens "Bildformat" schon kennen und wissen welches Bildformat das richtige Tool für welchen Zweck ist.
BTW: mein Rigol 4-Kanal-Oszi hat einen USB-Slot für genau solche Screenshots. Tolle Sache.
Ich habe jetzt einmal den ersten Delay auf 25 ms geändert, jedoch ohne Erfolg.
Deshalb habe ich den Code einmal etwas umgeändert, so dass ich während des Debuggen sehen kann bei welcher Stelle er die Funktion "Read_DHT" verlässt (siehe Code unten)
Im ersten Durchlauf beim Debuggen bekomme ich den Rückgabewert 0xFA.
Ab dann bekomme ich nach jedem Durchlauf den Rückgabewert 0x00, was eigentlich gut ist und bedeutet, dass das Messen des Sensors erfolgreich war. Jedoch ist in jedem der fünf Variablen des Arrays data[0]...data[4] 0x00 hinterlegt.
Ich habe darauf noch das zweite Delay von ursprünglich 40 us auf 30 us geändert, da im DB steht dieses Delay soll zwischen 20 us - 40 us liegen. Aber auch dies lieferte mir die gleichen Ergebnisse.
Hat jemand eine Idee woran das liegen könnte.
1
#include<xc.h>
2
#include<stdbool.h>
3
#include<stdint.h>
4
5
#define _XTAL_FREQ 10000000 // external oscillator frequency of 10MHz
6
7
#define LOOP_DELAY 1 // Loop-Delay in ms (milliseconds)
8
9
10
#define WARN_LED LATBbits.LATB0
11
#define SENSOR PORTBbits.RB1
12
13
14
15
uint8_tRead_DHT(uint8_t*data);
16
17
voidsetup(void)
18
{
19
OSCCON=0b01111000;// use external oscillator
20
21
ANSELB=0x00;// PORTB to digital
22
23
TRISBbits.TRISB0=0;// LED as OUTPUT
24
25
TRISBbits.TRISB1=0;// Sensor as output
26
27
WARN_LED=0;// LED off
28
29
}
30
31
voidloop(void)
32
{
33
34
uint8_tdata[5]={0};
35
36
uint8_tresult=Read_DHT(data);// Breakpoint is here
Hallo,
dein spezieller Code, viiile Leerzeilen, x-mal 10000 "timeout", dazu die "Messungen" mit 36 Mbyte .png Bildern (Fotos von einem Scope welches echte Screenshots kann, --- nur noch abpausen auf Butterbrotpapier wäre besser ---), alles recht sehr viel eigen... Ohh ohhhhh ohhhhhhhhhhh!
Kaum mehr auszuhalten...
Daher habe ich jetzt zu später Stunde im WWW ein besseres Beispiel gesucht und hoffentlich auch gefunden.
Bitte das auf deinen uC anpassen und probieren.