Обновить DHT_22.cpp

This commit is contained in:
Артём Новиков 2024-03-27 16:57:24 +00:00
parent 63c96a0562
commit 8394b46156

View File

@ -1,8 +1,6 @@
#include "DHT_22.h"
#include "dht.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;
@ -14,106 +12,118 @@ float temperature, humidity;
float last_temperature, last_humidity;
unsigned char data[5];
uint8_t dt[48];
uint8_t dtcnt;
uint16_t dt[48];
int dtcnt;
bool dht_check_act = false;
// Таймер для задержки
volatile unsigned int timer_counter = 0;
int dht_en_timer = 0;
//----------------------------------------------------------------------------------------------------
// Установка таймера
void setup_timer(void)
{
// Настраиваем таймер 1 в режиме CTC
TCCR0B = 0b00000101;
// Устанавливаем значение сравнения для частоты 1 Гц
OCR0A = 250;
// Разрешаем прерывание сравнения A
TIMSK0 |= (1 << OCIE0A);
// Настраиваем таймер 1 в режиме CTC
TCCR1A = 0b00000000;
TCCR1B = 0b00000000;
// Устанавливаем значение сравнения для частоты 1 Гц
OCR1A = 250;
// Разрешаем прерывание сравнения A
TIMSK1 = 0b00100010;
}
//----------------------------------------------------------------------------------------------------
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;
TCNT1 = 0; //
OCR1A = 288; //
TCCR1A = 0b00000000; //
TIMSK1 = 0b00000010;
TCCR1B = 0b00000101;
}
// Настройка таймера для захвата времени таймером T1
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;
DHT_PORT |= (1 << DHT_BIT); // Пин в 1цу
DHT_DDR &= ~(1 << DHT_BIT); // Пин порта на вход
TCNT1 = 0; // Сброс значения счётчика таймера
OCR1A = 10000;
TCCR1A = 0b00000000; //
TCCR1B = 0b10000001; // 1<<ICNC1 Антидребезг, 1<<CS10 Делитель таймера 1:1,
TIFR1 = 0b00000000; //
TIMSK1 = 0b00100010; // 1<<ICF1 Прерывание по захвату, 1<<OCF1A Совпадение канал A
}
// Вычисляем температуру и влажность
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;
return DHT_check_data();
}
float dht_humidity(){
//------------------------------------------------------------------------
float dht_humidity()
{
return humidity;
}
float dht_temperature(){
//------------------------------------------------------------------------
float dht_temperature()
{
return temperature;
}
//------------------------------------------------------------------------
void DHT_get_bit(){
dtcnt++;
dt[ dtcnt ] = ICR1;
}
//------------------------------------------------------------------------
bool DHT_check_data(){
void T1_CAPT(){
TCNT1 = 0;
dht_save_time_id++;
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 ( dtcnt == 43 ){
dtcnt = 0; //
dPos = 7; //
dNum = 0;
/*
Цикл анализа принятых данных dt[] и распределение бит по байтам data[]
*/
for ( uint8_t i=4; i<44;i++){
if ( dt[ i ]<1500 ) // если время dt[i] < 1500 то data[dNum][dPos] = 0, иначе =1
{
data[dNum] &= ~(1<<dPos);
} // 0
else
{
data[dNum] |= (1<<dPos);
} // 1
dPos--;
if ( dPos < 0) // если прошли 8бит, то пишем в следующий байт
{
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
}
}
temperature = (data[3] * 0.1) + ((data[2] & 0b01111111) * 25.6);
if (data[2] & 0b10000000) temperature *= -1;
humidity = (data[1] * 0.1) + (data[0] * 25.6);
return true;
}
return false;
}
//------------------------------------------------------------------------
void T0_CA(){
TCNT0 = 0;
dht_en_timer++;
@ -126,10 +136,9 @@ void T0_CA(){
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;