#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define DHT22_PIN 2
#define LED_PIN 13 // Белый светодиод на пине 3
Adafruit_SSD1306 display(128, 64, &Wire, -1);
float read_dht22_humidity() {
uint8_t data[5] = {0};
uint8_t bit_count = 0;
uint8_t byte_count = 0;
pinMode(DHT22_PIN, OUTPUT);
digitalWrite(DHT22_PIN, LOW);
delay(2);
digitalWrite(DHT22_PIN, HIGH);
delayMicroseconds(40);
pinMode(DHT22_PIN, INPUT_PULLUP);
delayMicroseconds(10);
unsigned long timeout = micros() + 1000;
while (digitalRead(DHT22_PIN) == HIGH) {
if (micros() > timeout) return -1;
}
timeout = micros() + 1000;
while (digitalRead(DHT22_PIN) == LOW) {
if (micros() > timeout) return -1;
}
timeout = micros() + 1000;
while (digitalRead(DHT22_PIN) == HIGH) {
if (micros() > timeout) return -1;
}
for (int i = 0; i < 40; i++) {
timeout = micros() + 1000;
while (digitalRead(DHT22_PIN) == LOW) {
if (micros() > timeout) return -1;
}
unsigned long duration = micros();
timeout = micros() + 1000;
while (digitalRead(DHT22_PIN) == HIGH) {
if (micros() > timeout) return -1;
}
duration = micros() - duration;
if (duration > 40) {
data[byte_count] |= (1 << (7 - bit_count));
}
bit_count++;
if (bit_count == 8) {
bit_count = 0;
byte_count++;
}
}
uint8_t checksum = data[0] + data[1] + data[2] + data[3];
if (data[4] != checksum) return -1;
int16_t humidity_raw = (data[0] << 8) | data[1];
return humidity_raw / 10.0;
}
void update_led(float humidity) {
if (humidity < 0) {
static bool blink_state = false;
static unsigned long last_blink = 0;
if (millis() - last_blink > 200) {
blink_state = !blink_state;
analogWrite(LED_PIN, blink_state ? 255 : 0);
last_blink = millis();
}
return;
}
int brightness = map(humidity, 0, 100, 0, 255);
brightness = constrain(brightness, 0, 255);
analogWrite(LED_PIN, brightness);
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.print("%, LED: ");
Serial.println(brightness);
}
void display_humidity(float humidity) {
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(20, 20);
if (humidity < 0) {
display.print("ERROR");
} else {
display.print(humidity, 1);
display.print("%");
}
display.display();
}
void setup() {
Serial.begin(9600);
Serial.println("HUMIDITY DISPLAY START");
pinMode(LED_PIN, OUTPUT);
pinMode(DHT22_PIN, INPUT_PULLUP);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED failed");
for(;;);
}
Serial.println("OLED OK");
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(30, 25);
display.print("READY");
display.display();
delay(1000);
}
void loop() {
float humidity = read_dht22_humidity();
update_led(humidity);
display_humidity(humidity);
delay(2000);
}