From c50aca8850f065a4194fde19392682e0e9c1343b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=91=D0=BC=20=D0=9D=D0=BE=D0=B2=D0=B8?= =?UTF-8?q?=D0=BA=D0=BE=D0=B2?= <stud126169@vyatsu.ru> Date: Sun, 17 Mar 2024 17:25:17 +0000 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20DHT=5F22.cpp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DHT_22.cpp | 146 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 DHT_22.cpp diff --git a/DHT_22.cpp b/DHT_22.cpp new file mode 100644 index 0000000..04340e9 --- /dev/null +++ b/DHT_22.cpp @@ -0,0 +1,146 @@ +#include "DHT_22.h" +#include <avr/io.h> + +//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<<dPos); + } // 0 + else + { + data[dNum] |= (1<<dPos); + } // 1 + dPos--; + if ( dPos < 0) + { + dPos=7; dNum++; + } + } + if ( dht_save_time_id == 42 ) + { + interrupt_flag++; + dht_check_act = true; + dht_done = true; + + DHT_DDR |= (1 << DHT_BIT); // Пин как выход + DHT_PORT |= (1 << DHT_BIT); // Выход HIGH + } +} + +void T0_CA(){ + TCNT0 = 0; + dht_en_timer++; + if ( dht_en_timer >= 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++; + } +}