Peter1001
New member
Собственно такая проблема.
Подключил DHT22, написал скетч.
Залил. Но он не работает.
Стал смотреть, а на 4й ноге
типа всегда 1.
В чём может быть проблема?
Питаю датчик от 3.3. источник питания тот же что и у esp
проверяю таким кодом
пробовал 4, 19 и 20 пин... 19 и 20 всегда 0
Подключил DHT22, написал скетч.
Залил. Но он не работает.
Стал смотреть, а на 4й ноге
Код:
digitalRead(pin)
В чём может быть проблема?
Питаю датчик от 3.3. источник питания тот же что и у esp
проверяю таким кодом
Код:
void loop() {
/*Dht22 reader = Dht22(4);
auto dhtData = reader.ReadDht();
Serial.println("{ \"temperature\":" + String(dhtData.Temperature) + ", \"humidity\":" + String(dhtData.Humidity) + ", \"checkSumm\":" + String(dhtData.CheckSumm) + " }");*/
pinMode(4, OUTPUT);
digitalWrite(4, LOW);
delay(20);
pinMode(4, INPUT_PULLUP);
delayMicroseconds(10);
for(int i=0; i<250; i++){
Serial.println(digitalRead(4));
}
Serial.println("======================");
delay(10000); // интервал между запросами 10 сек
}
Код:
#include "Dht22.h"
#define SetPinOut(pin) pinMode(pin, OUTPUT)
#define SetPinIn(pin) pinMode(pin,INPUT_PULLUP)
#define Pull0(pin) digitalWrite(pin,LOW)
#define Pull1(pin) digitalWrite(pin,HIGH)
#define Read(pin) digitalRead(pin)
#define TimeLimit 150
#define Dealy 50
Dht22::Dht22(unsigned char pin)
{
_pin = pin;
_dataLenght = 5;
}
Dht22::~Dht22()
{
}
Dht22Result Dht22::ReadDht()
{
auto source = ReadSource();
return Dht22Result(source.Temperature / 10.0f, source.Humidity / 10.0f, source.CheckSumm);
}
void Dht22::Init() {
SetPinOut(_pin); //Стартовая последовательность
Pull0(_pin);
delay(20);
SetPinIn(_pin);
delayMicroseconds(10);
}
DhtSource Dht22::ReadSource() {
// массив считаных байт с датчика
// 0 и 1 = влажность * 10
// 2 и 3 = температура * 10
// 4 - контрольная сумма
//Serial.println("BEGIN->Dht22::ReadArray");
DhtSource source = DhtSource();
Init();
if (!TestPin(LOW, TimeLimit))
return source;
if (!TestPin(HIGH, TimeLimit))
return source;
if (!TestPin(LOW, TimeLimit))
return source;
for (unsigned char count = 0; count < _dataLenght * 8; count++) {
if (!TestPin(HIGH, TimeLimit))
return source;
unsigned char result = TestPin(LOW, TimeLimit);
if (!result)
return source;
(source.Humidity <<= count < 16) += result > 50;
(source.Temperature <<= count < 32) += result > 50;
(source.CheckSumm <<= count >= 32) += result > 50;
}
//Serial.println("END->Dht22::ReadArray");
return source;
}
unsigned char Dht22::TestPin(unsigned char level, unsigned char timeLimit)
{
unsigned char timecount = 0;
delayMicroseconds(5);
while (Read(_pin) != level)
{
timecount++;
if (timecount > timeLimit)
return 0;
}
return timecount;
}
Последнее редактирование: