1
1
//
2
2
// FILE: DHT_simulator.ino
3
3
// AUTHOR: Rob Tillaart
4
- // VERSION: 0.1.00
4
+ // VERSION: 0.1.01
5
5
// PURPOSE:
6
6
// DATE: 2014-06-14
7
7
// URL:
12
12
// TODO
13
13
// - robustness
14
14
// - timeout loops
15
- // - get timing accurate
16
15
17
16
const int dataPin = 5 ;
18
17
byte b[5 ];
19
18
20
19
void setup ()
21
20
{
22
21
Serial.begin (115200 );
23
- Serial.println (" Start " );
22
+ Serial.print (" Start " );
23
+ Serial.println (__FILE__);
24
24
25
25
pinMode (dataPin, INPUT_PULLUP);
26
26
}
@@ -46,80 +46,80 @@ void loop()
46
46
if (digitalRead (dataPin) == LOW)
47
47
{
48
48
uint32_t start = micros ();
49
- // wait until signal goes high // todo timeout onblocking loop?
50
- while (digitalRead (dataPin) == LOW);
49
+ // wait until signal goes high
50
+ // todo timeout on blocking loop
51
+ while (digitalRead (dataPin) == LOW)
52
+ {
53
+ if (micros () - start > 1500 ) return ;
54
+ }
51
55
if (micros () - start > 500 ) // serious request...
52
56
{
53
-
54
- pinMode (dataPin, OUTPUT);
55
- // send ACK
56
- digitalWrite (dataPin, LOW);
57
- delayMicroseconds (80 ); // overhead digitalwrite (2..4us)
58
- digitalWrite (dataPin, HIGH);
59
- delayMicroseconds (80 );
60
-
61
57
DHTsend (H, T);
62
58
63
- digitalWrite (dataPin, LOW);
64
- delayMicroseconds (50 );
65
- pinMode (dataPin, INPUT_PULLUP);
66
-
67
- // for (int i = 0; i < 5; i++)
68
- // {
69
- // Serial.print(b[i]);
70
- // Serial.print(" ");
71
- // }
72
- // Serial.println();
73
-
74
59
Serial.print (H);
75
60
Serial.print (" \t " );
76
61
Serial.println (T);
77
62
}
78
63
}
79
64
}
80
65
66
+
81
67
void DHTsend (int H, int T)
82
68
{
83
- // prepare data
69
+ pinMode (dataPin, OUTPUT);
70
+ // SEND ACK
71
+ digitalWrite (dataPin, LOW);
72
+ delayMicroseconds (80 ); // 80 us
73
+ digitalWrite (dataPin, HIGH);
74
+ delayMicroseconds (80 ); // 80 us
75
+
76
+ // PREPARE DATA
84
77
b[0 ] = H / 256 ;
85
78
b[1 ] = H & 255 ;
86
79
87
- uint16_t t;
88
- if (T >= 0 )
89
- {
90
- t = T;
91
- b[2 ] = 0 ;
92
- }
93
- else
80
+ b[2 ] = 0 ;
81
+ if (T < 0 )
94
82
{
95
- t = -T;
83
+ T = -T;
96
84
b[2 ] = 0x80 ;
97
85
}
98
- Serial.println (t);
99
86
100
- b[2 ] |= (t / 256 ) ;
101
- b[3 ] = (t & 255 ) ;
102
-
103
- b[4 ] = b[0 ] + b[1 ] + b[2 ] + b[3 ]; // CRC
87
+ b[2 ] |= T / 256 ;
88
+ b[3 ] = T & 255 ;
89
+ // CRC
90
+ b[4 ] = b[0 ] + b[1 ] + b[2 ] + b[3 ];
104
91
92
+ // SEND DATA
105
93
for (int i = 0 ; i < 5 ; i++)
106
94
{
107
95
DHTsendbyte (b[i]);
108
96
}
97
+
98
+ // END OF TRANSMISSION SIGNAL
99
+ digitalWrite (dataPin, LOW);
100
+ delayMicroseconds (50 ); // 50 us
101
+ pinMode (dataPin, INPUT_PULLUP);
102
+
103
+ // DEBUG
104
+ // for (int i = 0; i < 5; i++)
105
+ // {
106
+ // Serial.print(b[i]);
107
+ // Serial.print(" ");
108
+ // }
109
+ // Serial.println();
109
110
}
110
111
112
+ // timing manual tuned
111
113
void DHTsendbyte (byte b)
112
114
{
113
115
byte mask = 128 ;
114
116
for (int i = 0 ; i < 8 ; i++)
115
117
{
116
118
digitalWrite (dataPin, LOW);
117
- delayMicroseconds (45 ); // overhead digitalwrite (2..4us)
119
+ delayMicroseconds (45 ); // 50 us
118
120
digitalWrite (dataPin, HIGH);
119
-
120
- if (b & mask) delayMicroseconds (60 ); // idem
121
- else delayMicroseconds (24 ); // idem
122
-
121
+ if (b & mask) delayMicroseconds (60 ); // 70 us
122
+ else delayMicroseconds (24 ); // 26 us
123
123
mask >>= 1 ;
124
124
}
125
125
}
@@ -139,3 +139,6 @@ void DHTsendbyte(byte b)
139
139
140
140
141
141
142
+
143
+
144
+
0 commit comments