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