han back / Mbed OS CLEO_UART_DHT11
Committer:
SMART_CLEO
Date:
Thu Sep 28 04:17:59 2017 +0000
Revision:
1:f77e8ece5ad9
Parent:
0:7b99226f4969
SMART_CLEO

Who changed what in which revision?

UserRevisionLine numberNew contents of line
SMART_CLEO 0:7b99226f4969 1 #include "mbed.h"
SMART_CLEO 0:7b99226f4969 2
SMART_CLEO 0:7b99226f4969 3 struct UART_buf
SMART_CLEO 0:7b99226f4969 4 {
SMART_CLEO 0:7b99226f4969 5 uint8_t STA;
SMART_CLEO 0:7b99226f4969 6 uint8_t MODE;
SMART_CLEO 0:7b99226f4969 7 uint8_t CMD;
SMART_CLEO 0:7b99226f4969 8 uint8_t LEN;
SMART_CLEO 0:7b99226f4969 9 uint8_t DATA[32];
SMART_CLEO 0:7b99226f4969 10 uint8_t END;
SMART_CLEO 0:7b99226f4969 11
SMART_CLEO 0:7b99226f4969 12 };
SMART_CLEO 0:7b99226f4969 13
SMART_CLEO 0:7b99226f4969 14
SMART_CLEO 0:7b99226f4969 15 #define DHTLIB_OK 0
SMART_CLEO 0:7b99226f4969 16 #define DHTLIB_ERROR_CHECKSUM -1
SMART_CLEO 0:7b99226f4969 17 #define DHTLIB_ERROR_TIMEOUT -2
SMART_CLEO 0:7b99226f4969 18
SMART_CLEO 0:7b99226f4969 19 PinName pin_DHT11 = PA_15;
SMART_CLEO 0:7b99226f4969 20
SMART_CLEO 0:7b99226f4969 21 Serial SerialUART(PA_2, PA_3);
SMART_CLEO 0:7b99226f4969 22
SMART_CLEO 0:7b99226f4969 23 uint8_t Buffer[37];
SMART_CLEO 0:7b99226f4969 24
SMART_CLEO 0:7b99226f4969 25 DigitalInOut data_pin(pin_DHT11);
SMART_CLEO 0:7b99226f4969 26
SMART_CLEO 0:7b99226f4969 27 UART_buf RX_BUF;
SMART_CLEO 0:7b99226f4969 28
SMART_CLEO 0:7b99226f4969 29 Timer tmr;
SMART_CLEO 0:7b99226f4969 30 Timer tmr1;
SMART_CLEO 0:7b99226f4969 31
SMART_CLEO 0:7b99226f4969 32 int humi;
SMART_CLEO 0:7b99226f4969 33 int temp;
SMART_CLEO 0:7b99226f4969 34
SMART_CLEO 0:7b99226f4969 35 void SerialUARTRX_ISR(void);
SMART_CLEO 0:7b99226f4969 36 void Timer_setting(uint8_t cmd, uint8_t value);
SMART_CLEO 0:7b99226f4969 37 void Sensor_Read(void);
SMART_CLEO 0:7b99226f4969 38 int dht_read(void);
SMART_CLEO 0:7b99226f4969 39
SMART_CLEO 0:7b99226f4969 40 uint32_t T_period = 2000;
SMART_CLEO 0:7b99226f4969 41 uint32_t timer_check = 0;
SMART_CLEO 0:7b99226f4969 42
SMART_CLEO 0:7b99226f4969 43 int main() {
SMART_CLEO 0:7b99226f4969 44
SMART_CLEO 0:7b99226f4969 45 SerialUART.baud(115200);
SMART_CLEO 0:7b99226f4969 46
SMART_CLEO 0:7b99226f4969 47 SerialUART.attach(&SerialUARTRX_ISR);
SMART_CLEO 0:7b99226f4969 48
SMART_CLEO 1:f77e8ece5ad9 49 //Timer_setting(0x06, 2);
SMART_CLEO 0:7b99226f4969 50
SMART_CLEO 0:7b99226f4969 51 while(1)
SMART_CLEO 0:7b99226f4969 52 {
SMART_CLEO 0:7b99226f4969 53 if((timer_check + T_period) < tmr1.read_ms())
SMART_CLEO 0:7b99226f4969 54 {
SMART_CLEO 0:7b99226f4969 55 Sensor_Read();
SMART_CLEO 0:7b99226f4969 56 timer_check += T_period;
SMART_CLEO 0:7b99226f4969 57 }
SMART_CLEO 0:7b99226f4969 58 }
SMART_CLEO 0:7b99226f4969 59 }
SMART_CLEO 0:7b99226f4969 60
SMART_CLEO 0:7b99226f4969 61 void SerialUARTRX_ISR(void)
SMART_CLEO 0:7b99226f4969 62 {
SMART_CLEO 0:7b99226f4969 63 static uint8_t RX_count = 0, RX_Len = 32, RX_Status = 0;
SMART_CLEO 0:7b99226f4969 64 uint8_t rx_da = SerialUART.getc();
SMART_CLEO 0:7b99226f4969 65 switch(RX_Status)
SMART_CLEO 0:7b99226f4969 66 {
SMART_CLEO 0:7b99226f4969 67 case 0:
SMART_CLEO 0:7b99226f4969 68 if(rx_da == 0x76)
SMART_CLEO 0:7b99226f4969 69 {
SMART_CLEO 0:7b99226f4969 70 RX_BUF.STA = rx_da;
SMART_CLEO 0:7b99226f4969 71 RX_Status++;
SMART_CLEO 0:7b99226f4969 72 }
SMART_CLEO 0:7b99226f4969 73 break;
SMART_CLEO 0:7b99226f4969 74 case 1:
SMART_CLEO 0:7b99226f4969 75 RX_BUF.MODE = rx_da;
SMART_CLEO 0:7b99226f4969 76 RX_Status++;
SMART_CLEO 0:7b99226f4969 77 break;
SMART_CLEO 0:7b99226f4969 78 case 2:
SMART_CLEO 0:7b99226f4969 79 RX_BUF.CMD = rx_da;
SMART_CLEO 0:7b99226f4969 80 RX_Status++;
SMART_CLEO 0:7b99226f4969 81 break;
SMART_CLEO 0:7b99226f4969 82 case 3:
SMART_CLEO 0:7b99226f4969 83 RX_BUF.LEN = rx_da;
SMART_CLEO 0:7b99226f4969 84 RX_Len = RX_BUF.LEN;
SMART_CLEO 0:7b99226f4969 85 RX_Status++;
SMART_CLEO 0:7b99226f4969 86 if(RX_Len == 0)
SMART_CLEO 0:7b99226f4969 87 RX_Status++;
SMART_CLEO 0:7b99226f4969 88 break;
SMART_CLEO 0:7b99226f4969 89 case 4:
SMART_CLEO 0:7b99226f4969 90 RX_BUF.DATA[RX_count] = rx_da;
SMART_CLEO 0:7b99226f4969 91 RX_count++;
SMART_CLEO 0:7b99226f4969 92 if(RX_count == RX_Len)
SMART_CLEO 0:7b99226f4969 93 {
SMART_CLEO 0:7b99226f4969 94 RX_Status++;
SMART_CLEO 0:7b99226f4969 95 RX_count = 0;
SMART_CLEO 0:7b99226f4969 96 RX_Len = 32;
SMART_CLEO 0:7b99226f4969 97 }
SMART_CLEO 0:7b99226f4969 98 break;
SMART_CLEO 0:7b99226f4969 99 case 5:
SMART_CLEO 0:7b99226f4969 100 if(rx_da == 0x3E)
SMART_CLEO 0:7b99226f4969 101 {
SMART_CLEO 0:7b99226f4969 102 RX_BUF.END = rx_da;
SMART_CLEO 0:7b99226f4969 103 RX_Status = 0;
SMART_CLEO 0:7b99226f4969 104 switch(RX_BUF.MODE)
SMART_CLEO 0:7b99226f4969 105 {
SMART_CLEO 0:7b99226f4969 106 case 0x04:
SMART_CLEO 0:7b99226f4969 107 Timer_setting(RX_BUF.CMD, RX_BUF.DATA[0]);
SMART_CLEO 0:7b99226f4969 108 break;
SMART_CLEO 0:7b99226f4969 109 }
SMART_CLEO 0:7b99226f4969 110 }
SMART_CLEO 0:7b99226f4969 111 break;
SMART_CLEO 0:7b99226f4969 112 }
SMART_CLEO 0:7b99226f4969 113 }
SMART_CLEO 0:7b99226f4969 114
SMART_CLEO 0:7b99226f4969 115 void Timer_setting(uint8_t cmd, uint8_t value)
SMART_CLEO 0:7b99226f4969 116 {
SMART_CLEO 0:7b99226f4969 117 double Time_value = 0;
SMART_CLEO 0:7b99226f4969 118 tmr1.stop();
SMART_CLEO 0:7b99226f4969 119 tmr1.reset();
SMART_CLEO 0:7b99226f4969 120 switch(cmd)
SMART_CLEO 0:7b99226f4969 121 {
SMART_CLEO 0:7b99226f4969 122 case 0x01:
SMART_CLEO 0:7b99226f4969 123 Time_value = 30;
SMART_CLEO 0:7b99226f4969 124 break;
SMART_CLEO 0:7b99226f4969 125 case 0x02:
SMART_CLEO 0:7b99226f4969 126 Time_value = 60;
SMART_CLEO 0:7b99226f4969 127 break;
SMART_CLEO 0:7b99226f4969 128 case 0x03:
SMART_CLEO 0:7b99226f4969 129 Time_value = 120;
SMART_CLEO 0:7b99226f4969 130 break;
SMART_CLEO 0:7b99226f4969 131 case 0x04:
SMART_CLEO 0:7b99226f4969 132 Time_value = 300;
SMART_CLEO 0:7b99226f4969 133 break;
SMART_CLEO 0:7b99226f4969 134 case 0x05:
SMART_CLEO 0:7b99226f4969 135 Time_value = 600;
SMART_CLEO 0:7b99226f4969 136 break;
SMART_CLEO 0:7b99226f4969 137 case 0x06:
SMART_CLEO 0:7b99226f4969 138 Time_value = value;
SMART_CLEO 0:7b99226f4969 139 Time_value = 1.0/Time_value;
SMART_CLEO 0:7b99226f4969 140 break;
SMART_CLEO 0:7b99226f4969 141 }
SMART_CLEO 0:7b99226f4969 142 tmr1.start();
SMART_CLEO 0:7b99226f4969 143 timer_check = tmr.read_ms();
SMART_CLEO 0:7b99226f4969 144 T_period = Time_value * 1000;
SMART_CLEO 0:7b99226f4969 145 }
SMART_CLEO 0:7b99226f4969 146
SMART_CLEO 0:7b99226f4969 147 void Sensor_Read(void)
SMART_CLEO 0:7b99226f4969 148 {
SMART_CLEO 0:7b99226f4969 149 Buffer[0] = 0x76;
SMART_CLEO 0:7b99226f4969 150 Buffer[1] = 0x01;
SMART_CLEO 0:7b99226f4969 151 Buffer[2] = 0x05;
SMART_CLEO 0:7b99226f4969 152 Buffer[3] = 0x02;
SMART_CLEO 0:7b99226f4969 153 if(dht_read() == 0)
SMART_CLEO 0:7b99226f4969 154 {
SMART_CLEO 0:7b99226f4969 155 Buffer[4] = temp;
SMART_CLEO 0:7b99226f4969 156 Buffer[5] = humi;
SMART_CLEO 0:7b99226f4969 157 }
SMART_CLEO 0:7b99226f4969 158 else
SMART_CLEO 0:7b99226f4969 159 {
SMART_CLEO 0:7b99226f4969 160 Buffer[4] = 0;
SMART_CLEO 0:7b99226f4969 161 Buffer[5] = 0;
SMART_CLEO 0:7b99226f4969 162 }
SMART_CLEO 0:7b99226f4969 163 Buffer[6] = 0x3E;
SMART_CLEO 0:7b99226f4969 164 for(int i=0; i<7; i++)
SMART_CLEO 0:7b99226f4969 165 SerialUART.putc(Buffer[i]);
SMART_CLEO 0:7b99226f4969 166 }
SMART_CLEO 0:7b99226f4969 167
SMART_CLEO 0:7b99226f4969 168 int dht_read(void){
SMART_CLEO 0:7b99226f4969 169
SMART_CLEO 0:7b99226f4969 170 // BUFFER TO RECEIVE
SMART_CLEO 0:7b99226f4969 171 uint8_t bits[5];
SMART_CLEO 0:7b99226f4969 172 uint8_t cnt = 7;
SMART_CLEO 0:7b99226f4969 173 uint8_t idx = 0;
SMART_CLEO 0:7b99226f4969 174
SMART_CLEO 0:7b99226f4969 175 tmr.stop();
SMART_CLEO 0:7b99226f4969 176 tmr.reset();
SMART_CLEO 0:7b99226f4969 177
SMART_CLEO 0:7b99226f4969 178 // EMPTY BUFFER
SMART_CLEO 0:7b99226f4969 179 for(int i=0; i< 5; i++) bits[i] = 0;
SMART_CLEO 0:7b99226f4969 180
SMART_CLEO 0:7b99226f4969 181 // REQUEST SAMPLE
SMART_CLEO 0:7b99226f4969 182 data_pin.output();
SMART_CLEO 0:7b99226f4969 183 data_pin.write(0);
SMART_CLEO 0:7b99226f4969 184 wait_ms(18);
SMART_CLEO 0:7b99226f4969 185 data_pin.write(1);
SMART_CLEO 0:7b99226f4969 186 wait_us(10);
SMART_CLEO 0:7b99226f4969 187 data_pin.input();
SMART_CLEO 0:7b99226f4969 188 wait_us(40);
SMART_CLEO 0:7b99226f4969 189
SMART_CLEO 0:7b99226f4969 190 // ACKNOWLEDGE or TIMEOUT
SMART_CLEO 0:7b99226f4969 191 unsigned long loopCnt = 10000;
SMART_CLEO 0:7b99226f4969 192
SMART_CLEO 0:7b99226f4969 193 while(data_pin.read() == 0)if(!loopCnt--)return DHTLIB_ERROR_TIMEOUT;
SMART_CLEO 0:7b99226f4969 194
SMART_CLEO 0:7b99226f4969 195 loopCnt = 10000;
SMART_CLEO 0:7b99226f4969 196
SMART_CLEO 0:7b99226f4969 197 while(data_pin.read() == 1)if(!loopCnt--)return DHTLIB_ERROR_TIMEOUT;
SMART_CLEO 0:7b99226f4969 198
SMART_CLEO 0:7b99226f4969 199 // READ OUTPUT - 40 BITS => 5 BYTES or TIMEOUT
SMART_CLEO 0:7b99226f4969 200
SMART_CLEO 0:7b99226f4969 201 for(int i=0; i<40; i++){
SMART_CLEO 0:7b99226f4969 202
SMART_CLEO 0:7b99226f4969 203 loopCnt = 10000;
SMART_CLEO 0:7b99226f4969 204
SMART_CLEO 0:7b99226f4969 205 while(data_pin.read() == 0)if(loopCnt-- == 0)return DHTLIB_ERROR_TIMEOUT;
SMART_CLEO 0:7b99226f4969 206
SMART_CLEO 0:7b99226f4969 207 //unsigned long t = micros();
SMART_CLEO 0:7b99226f4969 208 //time_count = tmr.read_us();
SMART_CLEO 0:7b99226f4969 209
SMART_CLEO 0:7b99226f4969 210 tmr.start();
SMART_CLEO 0:7b99226f4969 211
SMART_CLEO 0:7b99226f4969 212 loopCnt = 10000;
SMART_CLEO 0:7b99226f4969 213
SMART_CLEO 0:7b99226f4969 214 while(data_pin.read())if(!loopCnt--)return DHTLIB_ERROR_TIMEOUT;
SMART_CLEO 0:7b99226f4969 215
SMART_CLEO 0:7b99226f4969 216 if(tmr.read_us() > 40) bits[idx] |= (1 << cnt);
SMART_CLEO 0:7b99226f4969 217
SMART_CLEO 0:7b99226f4969 218 tmr.stop();
SMART_CLEO 0:7b99226f4969 219 tmr.reset();
SMART_CLEO 0:7b99226f4969 220
SMART_CLEO 0:7b99226f4969 221 if(cnt == 0){ // next byte?
SMART_CLEO 0:7b99226f4969 222
SMART_CLEO 0:7b99226f4969 223 cnt = 7; // restart at MSB
SMART_CLEO 0:7b99226f4969 224 idx++; // next byte!
SMART_CLEO 0:7b99226f4969 225
SMART_CLEO 0:7b99226f4969 226 }else cnt--;
SMART_CLEO 0:7b99226f4969 227
SMART_CLEO 0:7b99226f4969 228 }
SMART_CLEO 0:7b99226f4969 229
SMART_CLEO 0:7b99226f4969 230 // WRITE TO RIGHT VARS
SMART_CLEO 0:7b99226f4969 231 // as bits[1] and bits[3] are allways zero they are omitted in formulas.
SMART_CLEO 0:7b99226f4969 232 humi = bits[0];
SMART_CLEO 0:7b99226f4969 233 temp = bits[2];
SMART_CLEO 0:7b99226f4969 234
SMART_CLEO 0:7b99226f4969 235 uint8_t sum = bits[0] + bits[1] + bits[2] + bits[3];
SMART_CLEO 0:7b99226f4969 236
SMART_CLEO 0:7b99226f4969 237 if(bits[4] != sum){return DHTLIB_ERROR_CHECKSUM;}
SMART_CLEO 0:7b99226f4969 238
SMART_CLEO 0:7b99226f4969 239 return DHTLIB_OK;
SMART_CLEO 0:7b99226f4969 240
SMART_CLEO 0:7b99226f4969 241 }