read dht11 for CORE-1000

Dependencies:   mbed

Committer:
odb
Date:
Fri Feb 03 07:52:55 2017 +0000
Revision:
1:4e3a5fe26557
Parent:
0:8fe7d36af056
CORE-1000 First

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JENG 0:8fe7d36af056 1
JENG 0:8fe7d36af056 2 #include "mbed.h"
JENG 0:8fe7d36af056 3
odb 1:4e3a5fe26557 4 /*DigitalOut LCD_RS(PC_6);
odb 1:4e3a5fe26557 5 DigitalOut LCD_EN(PC_5);
odb 1:4e3a5fe26557 6 DigitalOut LCD_D4(PD_8);
odb 1:4e3a5fe26557 7 DigitalOut LCD_D5(PA_12);
odb 1:4e3a5fe26557 8 DigitalOut LCD_D6(PA_11);
odb 1:4e3a5fe26557 9 DigitalOut LCD_D7(PB_12);
JENG 0:8fe7d36af056 10
JENG 0:8fe7d36af056 11
JENG 0:8fe7d36af056 12 //########################################
JENG 0:8fe7d36af056 13 // LCD Library
JENG 0:8fe7d36af056 14 //########################################
JENG 0:8fe7d36af056 15
JENG 0:8fe7d36af056 16 //send data to lcd
JENG 0:8fe7d36af056 17 void write_lcd(uint8_t d){
JENG 0:8fe7d36af056 18
JENG 0:8fe7d36af056 19 LCD_D4 = (d & 0x10)?1:0;
JENG 0:8fe7d36af056 20 LCD_D5 = (d & 0x20)?1:0;
JENG 0:8fe7d36af056 21 LCD_D6 = (d & 0x40)?1:0;
JENG 0:8fe7d36af056 22 LCD_D7 = (d & 0x80)?1:0;
JENG 0:8fe7d36af056 23
JENG 0:8fe7d36af056 24 wait_us(2);
JENG 0:8fe7d36af056 25 LCD_EN = 1;
JENG 0:8fe7d36af056 26 wait_us(2);
JENG 0:8fe7d36af056 27 LCD_EN = 0;
JENG 0:8fe7d36af056 28
JENG 0:8fe7d36af056 29 }
JENG 0:8fe7d36af056 30
JENG 0:8fe7d36af056 31 //lcd write byte
JENG 0:8fe7d36af056 32 void lcd_write_byte(uint8_t byte){
JENG 0:8fe7d36af056 33
JENG 0:8fe7d36af056 34 write_lcd(byte);
JENG 0:8fe7d36af056 35 write_lcd(byte << 4);
JENG 0:8fe7d36af056 36
JENG 0:8fe7d36af056 37 }
JENG 0:8fe7d36af056 38
JENG 0:8fe7d36af056 39 //write command
JENG 0:8fe7d36af056 40 void lcd_putcmd(uint8_t c){
JENG 0:8fe7d36af056 41
JENG 0:8fe7d36af056 42 wait_ms(5);
JENG 0:8fe7d36af056 43 lcd_write_byte(c);
JENG 0:8fe7d36af056 44
JENG 0:8fe7d36af056 45 }
JENG 0:8fe7d36af056 46
JENG 0:8fe7d36af056 47 //write one char
JENG 0:8fe7d36af056 48 void lcd_putc(uint8_t d){
JENG 0:8fe7d36af056 49
JENG 0:8fe7d36af056 50 wait_ms(1);
JENG 0:8fe7d36af056 51 LCD_RS = 1;
JENG 0:8fe7d36af056 52 lcd_write_byte(d);
JENG 0:8fe7d36af056 53 LCD_RS = 0;
JENG 0:8fe7d36af056 54
JENG 0:8fe7d36af056 55 }
JENG 0:8fe7d36af056 56
JENG 0:8fe7d36af056 57
JENG 0:8fe7d36af056 58
JENG 0:8fe7d36af056 59 //print string
JENG 0:8fe7d36af056 60 void lcd_puts(char * p){
JENG 0:8fe7d36af056 61
JENG 0:8fe7d36af056 62 while(* p)lcd_putc(* p++);
JENG 0:8fe7d36af056 63
JENG 0:8fe7d36af056 64 }
JENG 0:8fe7d36af056 65
JENG 0:8fe7d36af056 66 //lcd initial interface
JENG 0:8fe7d36af056 67 void lcd_initial(void){
JENG 0:8fe7d36af056 68
JENG 0:8fe7d36af056 69 uint8_t x = 3;
JENG 0:8fe7d36af056 70
JENG 0:8fe7d36af056 71 LCD_RS = 0;
JENG 0:8fe7d36af056 72 LCD_EN = 0;
JENG 0:8fe7d36af056 73
JENG 0:8fe7d36af056 74 LCD_D4 = 0;
JENG 0:8fe7d36af056 75 LCD_D5 = 0;
JENG 0:8fe7d36af056 76 LCD_D6 = 0;
JENG 0:8fe7d36af056 77 LCD_D7 = 0;
JENG 0:8fe7d36af056 78
JENG 0:8fe7d36af056 79 wait_ms(50);
JENG 0:8fe7d36af056 80
JENG 0:8fe7d36af056 81 while(x--){
JENG 0:8fe7d36af056 82
JENG 0:8fe7d36af056 83 write_lcd(0x30);
JENG 0:8fe7d36af056 84 wait_ms(5);
JENG 0:8fe7d36af056 85
JENG 0:8fe7d36af056 86 }
JENG 0:8fe7d36af056 87
JENG 0:8fe7d36af056 88 write_lcd(0x20); //4bit interface
JENG 0:8fe7d36af056 89
JENG 0:8fe7d36af056 90 lcd_putcmd(0x28); //function set
JENG 0:8fe7d36af056 91 lcd_putcmd(0x08); //display off
JENG 0:8fe7d36af056 92 lcd_putcmd(0x01); //display clear
JENG 0:8fe7d36af056 93 lcd_putcmd(0x06); //entry mode set
JENG 0:8fe7d36af056 94 lcd_putcmd(0x0c); //display on
JENG 0:8fe7d36af056 95
JENG 0:8fe7d36af056 96 }
odb 1:4e3a5fe26557 97 */
JENG 0:8fe7d36af056 98 //########################################
JENG 0:8fe7d36af056 99 // End of LCD Library
JENG 0:8fe7d36af056 100 //########################################
JENG 0:8fe7d36af056 101
JENG 0:8fe7d36af056 102 #define DHTLIB_OK 0
JENG 0:8fe7d36af056 103 #define DHTLIB_ERROR_CHECKSUM -1
JENG 0:8fe7d36af056 104 #define DHTLIB_ERROR_TIMEOUT -2
JENG 0:8fe7d36af056 105
JENG 0:8fe7d36af056 106 Timer tmr;
JENG 0:8fe7d36af056 107
odb 1:4e3a5fe26557 108 DigitalInOut data_pin(PB_10);
JENG 0:8fe7d36af056 109
JENG 0:8fe7d36af056 110 int humidity;
JENG 0:8fe7d36af056 111 int temperature;
JENG 0:8fe7d36af056 112
JENG 0:8fe7d36af056 113 //########################################
JENG 0:8fe7d36af056 114 // DHT11 Library
JENG 0:8fe7d36af056 115 //########################################
JENG 0:8fe7d36af056 116 int dht_read(void){
JENG 0:8fe7d36af056 117
JENG 0:8fe7d36af056 118 // BUFFER TO RECEIVE
JENG 0:8fe7d36af056 119 uint8_t bits[5];
JENG 0:8fe7d36af056 120 uint8_t cnt = 7;
JENG 0:8fe7d36af056 121 uint8_t idx = 0;
JENG 0:8fe7d36af056 122
JENG 0:8fe7d36af056 123 tmr.stop();
JENG 0:8fe7d36af056 124 tmr.reset();
JENG 0:8fe7d36af056 125
JENG 0:8fe7d36af056 126 // EMPTY BUFFER
JENG 0:8fe7d36af056 127 for(int i=0; i< 5; i++) bits[i] = 0;
JENG 0:8fe7d36af056 128
JENG 0:8fe7d36af056 129 // REQUEST SAMPLE
JENG 0:8fe7d36af056 130 data_pin.output();
JENG 0:8fe7d36af056 131 data_pin.write(0);
JENG 0:8fe7d36af056 132 wait_ms(18);
JENG 0:8fe7d36af056 133 data_pin.write(1);
JENG 0:8fe7d36af056 134 wait_us(40);
JENG 0:8fe7d36af056 135 data_pin.input();
JENG 0:8fe7d36af056 136
JENG 0:8fe7d36af056 137 // ACKNOWLEDGE or TIMEOUT
JENG 0:8fe7d36af056 138 unsigned int loopCnt = 10000;
JENG 0:8fe7d36af056 139
JENG 0:8fe7d36af056 140 while(!data_pin.read())if(!loopCnt--)return DHTLIB_ERROR_TIMEOUT;
JENG 0:8fe7d36af056 141
JENG 0:8fe7d36af056 142 loopCnt = 10000;
JENG 0:8fe7d36af056 143
JENG 0:8fe7d36af056 144 while(data_pin.read())if(!loopCnt--)return DHTLIB_ERROR_TIMEOUT;
JENG 0:8fe7d36af056 145
JENG 0:8fe7d36af056 146 // READ OUTPUT - 40 BITS => 5 BYTES or TIMEOUT
JENG 0:8fe7d36af056 147 for(int i=0; i<40; i++){
JENG 0:8fe7d36af056 148
JENG 0:8fe7d36af056 149 loopCnt = 10000;
JENG 0:8fe7d36af056 150
JENG 0:8fe7d36af056 151 while(!data_pin.read())if(loopCnt-- == 0)return DHTLIB_ERROR_TIMEOUT;
JENG 0:8fe7d36af056 152
JENG 0:8fe7d36af056 153 //unsigned long t = micros();
JENG 0:8fe7d36af056 154 tmr.start();
JENG 0:8fe7d36af056 155
JENG 0:8fe7d36af056 156 loopCnt = 10000;
JENG 0:8fe7d36af056 157
JENG 0:8fe7d36af056 158 while(data_pin.read())if(!loopCnt--)return DHTLIB_ERROR_TIMEOUT;
JENG 0:8fe7d36af056 159
JENG 0:8fe7d36af056 160 if(tmr.read_us() > 40) bits[idx] |= (1 << cnt);
JENG 0:8fe7d36af056 161
JENG 0:8fe7d36af056 162 tmr.stop();
JENG 0:8fe7d36af056 163 tmr.reset();
JENG 0:8fe7d36af056 164
JENG 0:8fe7d36af056 165 if(cnt == 0){ // next byte?
JENG 0:8fe7d36af056 166
JENG 0:8fe7d36af056 167 cnt = 7; // restart at MSB
JENG 0:8fe7d36af056 168 idx++; // next byte!
JENG 0:8fe7d36af056 169
JENG 0:8fe7d36af056 170 }else cnt--;
JENG 0:8fe7d36af056 171
JENG 0:8fe7d36af056 172 }
JENG 0:8fe7d36af056 173
JENG 0:8fe7d36af056 174 // WRITE TO RIGHT VARS
JENG 0:8fe7d36af056 175 // as bits[1] and bits[3] are allways zero they are omitted in formulas.
JENG 0:8fe7d36af056 176 humidity = bits[0];
JENG 0:8fe7d36af056 177 temperature = bits[2];
JENG 0:8fe7d36af056 178
JENG 0:8fe7d36af056 179 uint8_t sum = bits[0] + bits[2];
JENG 0:8fe7d36af056 180
JENG 0:8fe7d36af056 181 if(bits[4] != sum)return DHTLIB_ERROR_CHECKSUM;
JENG 0:8fe7d36af056 182
JENG 0:8fe7d36af056 183 return DHTLIB_OK;
JENG 0:8fe7d36af056 184
JENG 0:8fe7d36af056 185 }
JENG 0:8fe7d36af056 186
JENG 0:8fe7d36af056 187 char buffer[17];
JENG 0:8fe7d36af056 188
JENG 0:8fe7d36af056 189 //########################################
JENG 0:8fe7d36af056 190 // End of DHT11 Library
JENG 0:8fe7d36af056 191 //########################################
JENG 0:8fe7d36af056 192
JENG 0:8fe7d36af056 193 int main(void){
JENG 0:8fe7d36af056 194
odb 1:4e3a5fe26557 195 // lcd_initial();
JENG 0:8fe7d36af056 196
odb 1:4e3a5fe26557 197 // lcd_puts("=Nucleo - DHT11=");
JENG 0:8fe7d36af056 198
JENG 0:8fe7d36af056 199 for(;;){
JENG 0:8fe7d36af056 200
JENG 0:8fe7d36af056 201 if(!dht_read()){
JENG 0:8fe7d36af056 202
JENG 0:8fe7d36af056 203 //sprintf(buffer, "Temp %2d C ", temperature);
JENG 0:8fe7d36af056 204 //lcd_putcmd(0x80);
JENG 0:8fe7d36af056 205 //lcd_puts(buffer);
odb 1:4e3a5fe26557 206 // sprintf(buffer, "Hum %2d%% Tmp %2dc", humidity, temperature);
odb 1:4e3a5fe26557 207 // lcd_putcmd(0xc0);
odb 1:4e3a5fe26557 208 // lcd_puts(buffer);
odb 1:4e3a5fe26557 209 printf("Hum %2d%% Tmp %2dc\n\r", humidity, temperature);
JENG 0:8fe7d36af056 210 wait(0.5);
JENG 0:8fe7d36af056 211
odb 1:4e3a5fe26557 212 }
odb 1:4e3a5fe26557 213 else{
JENG 0:8fe7d36af056 214
odb 1:4e3a5fe26557 215 // lcd_putcmd(0x80);
odb 1:4e3a5fe26557 216 // lcd_puts("Sensor Error !!!");
odb 1:4e3a5fe26557 217 // lcd_putcmd(0xc0);
odb 1:4e3a5fe26557 218 // lcd_puts(" ");
odb 1:4e3a5fe26557 219 printf("Sensor Error !!!\n\r");
JENG 0:8fe7d36af056 220 }
JENG 0:8fe7d36af056 221
JENG 0:8fe7d36af056 222 }
JENG 0:8fe7d36af056 223
JENG 0:8fe7d36af056 224 }