GSOE Webserver ESP01 DHT11
Dependencies: LCD_i2c_GSOE ESP8266WebserverGSOE
Diff: main.cpp
- Revision:
- 0:8fe7d36af056
- Child:
- 1:e6f838f99eeb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Mar 17 12:35:48 2014 +0000 @@ -0,0 +1,221 @@ + +#include "mbed.h" + +DigitalOut LCD_RS(D8); +DigitalOut LCD_EN(D9); +DigitalOut LCD_D4(D4); +DigitalOut LCD_D5(D5); +DigitalOut LCD_D6(D6); +DigitalOut LCD_D7(D7); + + +//######################################## +// LCD Library +//######################################## + +//send data to lcd +void write_lcd(uint8_t d){ + + LCD_D4 = (d & 0x10)?1:0; + LCD_D5 = (d & 0x20)?1:0; + LCD_D6 = (d & 0x40)?1:0; + LCD_D7 = (d & 0x80)?1:0; + + wait_us(2); + LCD_EN = 1; + wait_us(2); + LCD_EN = 0; + +} + +//lcd write byte +void lcd_write_byte(uint8_t byte){ + + write_lcd(byte); + write_lcd(byte << 4); + +} + +//write command +void lcd_putcmd(uint8_t c){ + + wait_ms(5); + lcd_write_byte(c); + +} + +//write one char +void lcd_putc(uint8_t d){ + + wait_ms(1); + LCD_RS = 1; + lcd_write_byte(d); + LCD_RS = 0; + +} + + + +//print string +void lcd_puts(char * p){ + + while(* p)lcd_putc(* p++); + +} + +//lcd initial interface +void lcd_initial(void){ + + uint8_t x = 3; + + LCD_RS = 0; + LCD_EN = 0; + + LCD_D4 = 0; + LCD_D5 = 0; + LCD_D6 = 0; + LCD_D7 = 0; + + wait_ms(50); + + while(x--){ + + write_lcd(0x30); + wait_ms(5); + + } + + write_lcd(0x20); //4bit interface + + lcd_putcmd(0x28); //function set + lcd_putcmd(0x08); //display off + lcd_putcmd(0x01); //display clear + lcd_putcmd(0x06); //entry mode set + lcd_putcmd(0x0c); //display on + +} +//######################################## +// End of LCD Library +//######################################## + +#define DHTLIB_OK 0 +#define DHTLIB_ERROR_CHECKSUM -1 +#define DHTLIB_ERROR_TIMEOUT -2 + +Timer tmr; + +DigitalInOut data_pin(A1); + +int humidity; +int temperature; + +//######################################## +// DHT11 Library +//######################################## +int dht_read(void){ + + // BUFFER TO RECEIVE + uint8_t bits[5]; + uint8_t cnt = 7; + uint8_t idx = 0; + + tmr.stop(); + tmr.reset(); + + // EMPTY BUFFER + for(int i=0; i< 5; i++) bits[i] = 0; + + // REQUEST SAMPLE + data_pin.output(); + data_pin.write(0); + wait_ms(18); + data_pin.write(1); + wait_us(40); + data_pin.input(); + + // ACKNOWLEDGE or TIMEOUT + unsigned int loopCnt = 10000; + + while(!data_pin.read())if(!loopCnt--)return DHTLIB_ERROR_TIMEOUT; + + loopCnt = 10000; + + while(data_pin.read())if(!loopCnt--)return DHTLIB_ERROR_TIMEOUT; + + // READ OUTPUT - 40 BITS => 5 BYTES or TIMEOUT + for(int i=0; i<40; i++){ + + loopCnt = 10000; + + while(!data_pin.read())if(loopCnt-- == 0)return DHTLIB_ERROR_TIMEOUT; + + //unsigned long t = micros(); + tmr.start(); + + loopCnt = 10000; + + while(data_pin.read())if(!loopCnt--)return DHTLIB_ERROR_TIMEOUT; + + if(tmr.read_us() > 40) bits[idx] |= (1 << cnt); + + tmr.stop(); + tmr.reset(); + + if(cnt == 0){ // next byte? + + cnt = 7; // restart at MSB + idx++; // next byte! + + }else cnt--; + + } + + // WRITE TO RIGHT VARS + // as bits[1] and bits[3] are allways zero they are omitted in formulas. + humidity = bits[0]; + temperature = bits[2]; + + uint8_t sum = bits[0] + bits[2]; + + if(bits[4] != sum)return DHTLIB_ERROR_CHECKSUM; + + return DHTLIB_OK; + +} + +char buffer[17]; + +//######################################## +// End of DHT11 Library +//######################################## + +int main(void){ + + lcd_initial(); + + lcd_puts("=Nucleo - DHT11="); + + for(;;){ + + if(!dht_read()){ + + //sprintf(buffer, "Temp %2d C ", temperature); + //lcd_putcmd(0x80); + //lcd_puts(buffer); + sprintf(buffer, "Hum %2d%% Tmp %2dc", humidity, temperature); + lcd_putcmd(0xc0); + lcd_puts(buffer); + wait(0.5); + + }else{ + + lcd_putcmd(0x80); + lcd_puts("Sensor Error !!!"); + lcd_putcmd(0xc0); + lcd_puts(" "); + + } + + } + +}