Hi!
Habe mir einen DHT22 bestellt um damit vorrangig die Luftfeuchtigkeit zu
messen. Habe eine Routine für den 8051 geschrieben um ihn anzusteuern,
kann das ganze aber leider noch nicht ausprobieren, da der Sensor noch
unterwegs ist.
Die delays habe ich per Oszi gemessen und entsprechend gewählt. Dennoch
bin ich mir nicht sicher ob ich was im Datenblatt übersehen oder falsch
verstanden habe.
https://www.adafruit.com/datasheets/Digital%20humidity%20and%20temperature%20sensor%20AM2302.pdf
Es wäre daher super wenn sich jemand, der das schonmal gemacht hat
angucken, und mir Tipps geben könnte was ich noch verbessern kann.
Fragen, die ich mir stelle sind, ob die Timings so stimmen und wie man
mehrere Sensoren ansteueren könnte.
Danke fürs Angucken!
1 | #include <dht22.h>
|
2 |
|
3 | //Returns 1 if error, 0 if no error
|
4 | unsigned char ReadData()
|
5 | {
|
6 | unsigned char checksum=0;
|
7 | unsigned char humi_low=0, humi_high=0;
|
8 | unsigned char temp_low=0, temp_high=0;
|
9 |
|
10 | if (!SendStartSignal())
|
11 | return 1;
|
12 |
|
13 | humi_low = ReadByte();
|
14 | humi_high = ReadByte();
|
15 |
|
16 | temp_low = ReadByte();
|
17 | temp_high = ReadByte();
|
18 |
|
19 | checksum = ReadByte();
|
20 |
|
21 | if (checksum == (humi_low + humi_high + temp_low + temp_high))
|
22 | {
|
23 | HUMI = humi_high;
|
24 | HUMI <<= 8;
|
25 | HUMI |= humi_low;
|
26 |
|
27 | TEMP = temp_high;
|
28 | TEMP <<= 8;
|
29 | TEMP |= temp_low;
|
30 | return 0;
|
31 | }
|
32 | else
|
33 | {
|
34 | HUMI = 0;
|
35 | TEMP = 0;
|
36 | return 1;
|
37 | }
|
38 | }
|
39 |
|
40 | unsigned char SendStartSignal()
|
41 | {
|
42 | unsigned char i=0, buf=0;
|
43 |
|
44 | DATA = 0; //Pull low 1-10ms
|
45 | Wait1Ms(5); //Delay 5ms
|
46 | DATA = 1; //Pull up 20-40us
|
47 | for (i=0; i<5; i++); //Delay ~47us
|
48 | buf = DATA;
|
49 | for (i=0; i<10; i++); //Delay ~83us
|
50 | for (i=0; i<10; i++); //Delay ~83us
|
51 | return buf; //0 = Slave vorhanden, 1 = kein Slave vorhanden
|
52 | }
|
53 |
|
54 | unsigned char ReadByte()
|
55 | {
|
56 | unsigned char i;
|
57 | unsigned char byte=0;
|
58 |
|
59 | for (i=0; i<8; i++)
|
60 | {
|
61 | byte |= ReadBit();
|
62 | byte <<= 1;
|
63 | }
|
64 | return byte;
|
65 | }
|
66 |
|
67 | unsigned char ReadBit()
|
68 | {
|
69 | unsigned char i;
|
70 |
|
71 | while (!DATA); //Waiting for start of bit
|
72 | for (i=0; i<3; i++); //Delay ~32us
|
73 | if (DATA)
|
74 | {
|
75 | for (i=0; i<3; i++); //Delay ~32us
|
76 | return 1;
|
77 | }
|
78 | else
|
79 | return 0;
|
80 | }
|