diff --git a/DHT 22 .c b/DHT 22 .c new file mode 100644 index 0000000..2612c43 --- /dev/null +++ b/DHT 22 .c @@ -0,0 +1,105 @@ +unsigned char data[5]; +float temperature, humidity; +unsigned int read_dht_hum() //подпрограмма работы с DHT +{ + #define DHT_PORT PORTD + #define DHT_DDR DDRD + #define DHT_PIN PIND + #define DHT_BIT 4 //по ардуиновски D5 + int temp; + unsigned char i, j; + ReLoad: //метка для ошибок + //=============MCU send START + DHT_DDR |= (1« DHT_BIT); //выход + DHT_PORT &= ~(1« DHT_BIT); //низкий уровень, подтягиваем линию, разбудим датчик + delayEquivalent2(18); //18 мс по условиям документации. + DHT_PORT |= (1« DHT_BIT); //отпускаем линию + DHT_DDR &= ~(1« DHT_BIT); //пин как выход + //============= инциализация DHT + delayEquivalent3(1); //задержка по условию + if (DHT_PIN & (1« DHT_BIT)) { + Serial.println("NO init "); + goto ReLoad; + } //датчик должен ответить 0 + delayEquivalent4(0.99); + //по истечению 80 мкс, датчик должен отпустить шину + //===============Приём 40 бит данных + while (DHT_PIN & (1« DHT_BIT)); //ждем пока на шине появится 1 + for (j = 0; j < 5; j++) //цикл для 0-4 байт + { + data[j] = 0; + for (i = 0; i < 8; i++) //приём битов и укладка их в байты + { + while (!(DHT_PIN & (1« DHT_BIT))); //ждем когда датчик отпустит шину + delayEquivalent5(0.99); //задержка высокого уровня при 0 30 мкс + if (DHT_PIN & (1« DHT_BIT)) //если по истечению времени сигнал на линии высокий, значит передается 1 + data[j] |= 1«(7 - i); //тогда i-й бит устанавливаем 1 + while (DHT_PIN & (1« DHT_BIT)); // ждем окончание 1 + } + } + + if ((unsigned char)(data[0] + data[1] + data[2] + data[3]) != data[4]) //checksum + { + Serial.println("checksum Error "); + goto ReLoad; + } +} //конец подрограммы +void setup() { + Serial.begin(9600); +} + +void delayEquivalent2(uint8_t delayTime) //Для 18 Милисеунд +{ + for (volatile uint8_t i1 = 0; i1 < 10; ++i1) { + for (volatile uint8_t i2 = 0; i2 < 100; ++i2) { + for (volatile uint8_t i3 = 0; i3 < delayTime; ++i3) { + + } + } + } +} + +void delayEquivalent3(uint8_t delayTime1) //Для 50 микросекунд +{ + for (volatile uint8_t i1 = 0; i1 < 10; ++i1) { + for (volatile uint8_t i2 = 0; i2 < 5; ++i2) { + for (volatile uint8_t i3 = 0; i3 < delayTime1; ++i3) { + + } + } + } +} + +void delayEquivalent4(uint8_t delayTime2) //Для 80 микросекунд +{ + for (volatile uint8_t i1 = 0; i1 < 10; ++i1) { + for (volatile uint8_t i2 = 0; i2 < 8; ++i2) { + for (volatile uint8_t i3 = 0; i3 < delayTime2; ++i3) { + + } + } + } +} + +void delayEquivalent5(uint8_t delayTime3) //Для 80 микросекунд +{ + for (volatile uint8_t i1 = 0; i1 < 10; ++i1) { + for (volatile uint8_t i2 = 0; i2 < 3; ++i2) { + for (volatile uint8_t i3 = 0; i3 < delayTime3; ++i3) { + + } + } + } +} + +void loop() { + read_dht_hum(); //вызов подпрограммы DHT11 + temperature = (data[3] * 0.1) + ((data[2] & 0b01111111) * 25.6); //нюанс расчета температуры для DHT22 + if (data[2] & 0b10000000) temperature *= -1; //если отрицательная температура + humidity = (data[1] * 0.1) + (data[0] * 25.6); //нюанс расчета влажности для DHT22 + Serial.print(humidity); //относительная влажность в %; + Serial.print("% "); + Serial.print(temperature); //температура в °C; + Serial.println("C"); + delay(200); //хватает задержки в 1 сек, для этого скетча хватает скорости 180 +} \ No newline at end of file