Добавить DHT_22.cpp
This commit is contained in:
parent
7b5e8d50e8
commit
c50aca8850
146
DHT_22.cpp
Normal file
146
DHT_22.cpp
Normal 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++;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user