#define DHTPIN 2
#define PIN_RED 3
#define PIN_YELLOW 5
#define PIN_GREEN 6
int thermoPins[] = {7, 8, 9, 10, 11, 12, 13};
int thermoCount = 7;
int tempStep = 5;
int minTemp = 0;
int maxTemp = 35;
byte data[5];
float temperature = 0;
float humidity = 0;
unsigned long lastReadTime = 0;
void setup() {
Serial.begin(9600);
pinMode(PIN_RED, OUTPUT);
pinMode(PIN_YELLOW, OUTPUT);
pinMode(PIN_GREEN, OUTPUT);
for (int i = 0; i < thermoCount; i++) {
pinMode(thermoPins[i], OUTPUT);
}
turnOffHumidityLEDs();
turnOffThermoLEDs();
}
void loop() {
if (millis() - lastReadTime > 2000) {
if (readDHT22()) {
Serial.print("Влажность: ");
Serial.print(humidity);
Serial.print("% | Температура: ");
Serial.print(temperature);
Serial.println("°C");
controlHumidityLEDs(humidity);
controlThermoLEDs(temperature);
} else {
Serial.println("Ошибка чтения с датчика DHT!");
}
lastReadTime = millis();
}
}
bool readDHT22() {
memset(data, 0, sizeof(data));
pinMode(DHTPIN, OUTPUT);
digitalWrite(DHTPIN, LOW);
delay(2);
digitalWrite(DHTPIN, HIGH);
delayMicroseconds(40);
pinMode(DHTPIN, INPUT_PULLUP);
unsigned long timeout = micros() + 1000;
while (digitalRead(DHTPIN) == HIGH) {
if (micros() > timeout) return false;
}
timeout = micros() + 1000;
while (digitalRead(DHTPIN) == LOW) {
if (micros() > timeout) return false;
}
timeout = micros() + 1000;
while (digitalRead(DHTPIN) == HIGH) {
if (micros() > timeout) return false;
}
for (int i = 0; i < 40; i++) {
timeout = micros() + 1000;
while (digitalRead(DHTPIN) == LOW) {
if (micros() > timeout) return false;
}
unsigned long t = micros();
timeout = micros() + 1000;
while (digitalRead(DHTPIN) == HIGH) {
if (micros() > timeout) return false;
}
if ((micros() - t) > 40) {
data[i / 8] |= (1 << (7 - (i % 8)));
}
}
byte checksum = data[0] + data[1] + data[2] + data[3];
if (data[4] != checksum) return false;
humidity = word(data[0], data[1]) * 0.1;
int16_t temp = word(data[2] & 0x7F, data[3]);
temperature = temp * 0.1;
if (data[2] & 0x80) {
temperature = -temperature;
}
return true;
}
void controlHumidityLEDs(float humidity) {
turnOffHumidityLEDs();
if (humidity < 25) {
digitalWrite(PIN_RED, HIGH);
} else if (humidity < 50) {
digitalWrite(PIN_YELLOW, HIGH);
} else {
digitalWrite(PIN_GREEN, HIGH);
}
}
void turnOffHumidityLEDs() {
digitalWrite(PIN_RED, LOW);
digitalWrite(PIN_YELLOW, LOW);
digitalWrite(PIN_GREEN, LOW);
}
void controlThermoLEDs(float temperature) {
controlThermoLEDs();
}