#include "DHT_22.h" #include //volatile unsigned char interrupt_flag; int dht_save_time_id; // Флаг прерывания volatile unsigned char interrupt_flag = 1; bool dht_done = false; int dht_check_icp; uint8_t dht_state, dht_last_state; int T1time, dPos, dNum; float temperature, humidity; float last_temperature, last_humidity; unsigned char data[5]; uint8_t dt[48]; uint8_t dtcnt; bool dht_check_act = false; // Таймер для задержки volatile unsigned int timer_counter = 0; int dht_en_timer = 0; //---------------------------------------------------------------------------------------------------- bool dht_check( void ) { bool valid_data = false; if (dht_check_act) { dht_check_act = false; //-----[ 01. Старт, выжидание 18мс ]----- if ( interrupt_flag == 1) { // Запускаем таймер на 18 мс посылка start на dht // Serial.print("Start DHT -> "); DHT_DDR |= (1 << DHT_BIT); // Пин как выход DHT_PORT &= ~(1 << DHT_BIT); // Выход ноль TCNT1 = 0; OCR1A = 288; TCCR1A = 0b00000000; TIMSK1 = 0b00000010; TCCR1B = 0b00000101; } if ( interrupt_flag == 2) { DHT_PORT |= (1 << DHT_BIT); DHT_DDR &= ~(1 << DHT_BIT); dht_save_time_id = 0; TCNT1 = 0; OCR1A = 10000; TCCR1A = 0b00000000; TCCR1B = 0b10000001; TIFR1 = 0b00000000; TIMSK1 = 0b00100010; dPos = 7; dNum = 0; dht_last_state = false; } // Вычисляем температуру и влажность if ( dht_done ) { dht_done = false; temperature = (data[3] * 0.1) + ((data[2] & 0b01111111) * 25.6)/6; if (data[2] & 0b10000000) temperature *= -1; humidity = (data[1] * 0.1) + (data[0] * 25.6)/50; valid_data = true; } } return valid_data; } float dht_humidity(){ return humidity; } float dht_temperature(){ return temperature; } void T1_CAPT(){ TCNT1 = 0; dht_save_time_id++; if ( dht_save_time_id == 43 ) { } if ( dht_save_time_id > 3 ) { dt[dtcnt] = ICR1<<8; dtcnt++; if ( ICR1<1500 ) { data[dNum] &= ~(1<= 65) { dht_en_timer =0; dht_done = false; dtcnt=0; interrupt_flag = 1; dht_check_act = true; DHT_DDR |= (1 << DHT_BIT); // Пин как выход DHT_PORT |= (1 << DHT_BIT); // Выход HIGH dht_save_time_id = 0; } } void T1_CA(){ TCNT1 = 0; dht_check_act = true; TCCR1B = 0b00000000; if ( interrupt_flag < 3 ) { interrupt_flag++; } }