void ICACHE_FLASH_ATTR dht22_init(){ DHT_DBG("dht22_init"); //nothing to do actually }
void ICACHE_FLASH_ATTR dht22_init() { DHT_DBG("dht22_init"); os_timer_disarm(&dht_timer); os_timer_setfn(&dht_timer, (os_timer_func_t *)dht22_timer_cb, NULL); os_timer_arm(&dht_timer, 5000, 1); //Start os task system_os_task(dht22_task, 1 ,taskQueue, 2); system_os_post(1, SIG_DHT, NULL ); }
static void ICACHE_FLASH_ATTR dht22_task(os_event_t *e) { DHT_DBG("dht22_task"); if(e->sig != SIG_DHT) return; //put dht pin on output mode with pullup platform_gpio_mode(DHT_PIN,PLATFORM_GPIO_OUTPUT,PLATFORM_GPIO_PULLUP); uint64_t data; os_memset(&data,0,sizeof(uint64_t)); //init sequence platform_gpio_write(DHT_PIN,1); delay_ms(5); platform_gpio_write(DHT_PIN,0); delay_ms(1); platform_gpio_write(DHT_PIN,1); //enable input reading platform_gpio_mode(DHT_PIN,PLATFORM_GPIO_INPUT,PLATFORM_GPIO_PULLUP); //find ACK start //wait pin to drop int timeout = 100; while(platform_gpio_read(DHT_PIN) == 1 && timeout > 0) { os_delay_us(5); timeout-=5; } if(timeout==0) { DHT_DBG("\tACK start timeout"); return; } //find ACK end //wait pin to rise timeout = 100; while(platform_gpio_read(DHT_PIN) == 0 && timeout > 0) { os_delay_us(10); timeout-=10; } if(timeout==0) { DHT_DBG("\tACK end timeout"); return; } //continue to read data while(1) { //wait pin to go low, signaling next bit timeout = 200; while(platform_gpio_read(DHT_PIN) == 1 && timeout > 0) { os_delay_us(5); timeout-=5; } if(timeout==0) { //NODE_DBG("\tdata signal timeout"); break; } //wait start of bit timeout = 200; while(platform_gpio_read(DHT_PIN) == 0 && timeout > 0) { os_delay_us(5); timeout-=5; } if(timeout==0) { //NODE_DBG("\tdata bit start timeout"); break; } //mearure pulse lenght timeout = 200; while(platform_gpio_read(DHT_PIN) == 1 && timeout > 0) { os_delay_us(5); timeout-=5; } if(timeout==0) { //NODE_DBG("\tdata bit read timeout"); break; } int pulseWidth = 200 - timeout; //shift data data <<= 1; if(pulseWidth > 40) { //bit is 1 data |=1; } else { //bit is 0 //nothing to do } } //do the math float temp_p, hum_p; uint8_t data_part[5]; data_part[4] = ((uint8_t*)&data)[0]; data_part[3] = ((uint8_t*)&data)[1]; data_part[2] = ((uint8_t*)&data)[2]; data_part[1] = ((uint8_t*)&data)[3]; data_part[0] = ((uint8_t*)&data)[4]; int checksum = (data_part[0] + data_part[1] + data_part[2] + data_part[3]) & 0xFF; if (data_part[4] == checksum) { // yay! checksum is valid hum_p = data_part[0] * 256 + data_part[1]; hum_p /= 10; temp_p = (data_part[2] & 0x7F)* 256 + data_part[3]; temp_p /= 10.0; if (data_part[2] & 0x80) temp_p *= -1; read.temp = temp_p; read.hum = hum_p; } }
int ICACHE_FLASH_ATTR dht22_read(dht_data *read){ DHT_DBG("dht22_read"); //put dht pin on output mode with pullup platform_gpio_mode(DHT_PIN,PLATFORM_GPIO_OUTPUT,PLATFORM_GPIO_PULLUP); uint64_t data; os_memset(&data,0,sizeof(uint64_t)); //init sequence platform_gpio_write(DHT_PIN,1); delay_ms(5); platform_gpio_write(DHT_PIN,0); delay_ms(1); platform_gpio_write(DHT_PIN,1); //enable input reading platform_gpio_mode(DHT_PIN,PLATFORM_GPIO_INPUT,PLATFORM_GPIO_PULLUP); //find ACK start //wait pin to drop int timeout = 100; while(platform_gpio_read(DHT_PIN) == 1 && timeout > 0) { os_delay_us(5); timeout-=5; } if(timeout==0){ DHT_DBG("\tACK start timeout"); return 0; } //find ACK end //wait pin to rise timeout = 100; while(platform_gpio_read(DHT_PIN) == 0 && timeout > 0) { os_delay_us(10); timeout-=10; } if(timeout==0){ DHT_DBG("\tACK end timeout"); return 0; } //continue to read data while(1){ //wait pin to go low, signaling next bit timeout = 200; while(platform_gpio_read(DHT_PIN) == 1 && timeout > 0) { os_delay_us(5); timeout-=5; } if(timeout==0){ //NODE_DBG("\tdata signal timeout"); break; } //wait start of bit timeout = 200; while(platform_gpio_read(DHT_PIN) == 0 && timeout > 0) { os_delay_us(5); timeout-=5; } if(timeout==0){ //NODE_DBG("\tdata bit start timeout"); break; } //mearure pulse lenght timeout = 200; while(platform_gpio_read(DHT_PIN) == 1 && timeout > 0) { os_delay_us(5); timeout-=5; } if(timeout==0){ //NODE_DBG("\tdata bit read timeout"); break; } int pulseWidth = 200 - timeout; //shift data data <<= 1; if(pulseWidth > 40) { //bit is 1 data |=1; } else{ //bit is 0 //nothing to do } } //do the math float temp_p, hum_p; uint8_t data_part[5]; data_part[4] = ((uint8_t*)&data)[0]; data_part[3] = ((uint8_t*)&data)[1]; data_part[2] = ((uint8_t*)&data)[2]; data_part[1] = ((uint8_t*)&data)[3]; data_part[0] = ((uint8_t*)&data)[4]; int checksum = (data_part[0] + data_part[1] + data_part[2] + data_part[3]) & 0xFF; if (data_part[4] == checksum) { // yay! checksum is valid hum_p = data_part[0] * 256 + data_part[1]; hum_p /= 10; temp_p = (data_part[2] & 0x7F)* 256 + data_part[3]; temp_p /= 10.0; if (data_part[2] & 0x80) temp_p *= -1; read->temp = temp_p; read->hum = hum_p; #ifdef DHT_DEBUG_ON char * buff = (char *)os_zalloc(64); c_sprintf(buff,"%f",read->temp); DHT_DBG("dht22_init temp : %s C",buff); os_memset(buff,0,64); c_sprintf(buff,"%f",read->hum); DHT_DBG("dht22_init humidity : %s %%",buff); os_free(buff); #endif } return 1; }