Добавить DHT_22.cpp

This commit is contained in:
Артём Новиков 2024-03-17 17:25:17 +00:00
parent 7b5e8d50e8
commit c50aca8850

146
DHT_22.cpp Normal file
View File

@ -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++;
}
}