#define BLYNK_TEMPLATE_ID "TMPL3osnHgTqu"
#define BLYNK_TEMPLATE_NAME "Harsha"
#define BLYNK_AUTH_TOKEN "Qr28QrW6cteMumkRw6Akxw2imvSSp7pz"
#include <Arduino.h>
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include "DHTesp.h"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// --------------------------------------------------
// WiFi
// --------------------------------------------------
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// --------------------------------------------------
// Pin definitions
// --------------------------------------------------
const int DHT_PIN = 15;
const int BUZZER_PIN = 18;
const int GREEN_LED_PIN = 19;
const int RED_LED_PIN = 5;
// OLED pins
const int SDA_PIN = 21;
const int SCL_PIN = 22;
// --------------------------------------------------
// Safe range
// --------------------------------------------------
const float TEMP_MIN = 36.0;
const float TEMP_MAX = 38.0;
const float HUMIDITY_MIN = 50.0;
const float HUMIDITY_MAX = 60.0;
// --------------------------------------------------
// OLED
// --------------------------------------------------
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define OLED_ADDRESS 0x3C
Adafruit_SSD1306 display(
SCREEN_WIDTH,
SCREEN_HEIGHT,
&Wire,
OLED_RESET
);
// --------------------------------------------------
// DHT22
// --------------------------------------------------
DHTesp dhtSensor;
// --------------------------------------------------
// Previous states
// --------------------------------------------------
bool previousTempOut = false;
bool previousHumidityOut = false;
// --------------------------------------------------
// Setup
// --------------------------------------------------
void setup() {
Serial.begin(115200);
// ------------------------------------------------
// Pins
// ------------------------------------------------
pinMode(BUZZER_PIN, OUTPUT);
pinMode(GREEN_LED_PIN, OUTPUT);
pinMode(RED_LED_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(GREEN_LED_PIN, LOW);
digitalWrite(RED_LED_PIN, LOW);
// ------------------------------------------------
// DHT22
// ------------------------------------------------
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
// ------------------------------------------------
// OLED
// ------------------------------------------------
Wire.begin(SDA_PIN, SCL_PIN);
if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDRESS)) {
Serial.println("OLED initialization failed!");
while (true);
}
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
display.setCursor(20, 25);
display.println("DHT22 SYSTEM");
display.display();
delay(2000);
// ------------------------------------------------
// Blynk connection
// ------------------------------------------------
Serial.println("Connecting to Blynk...");
Blynk.begin(
BLYNK_AUTH_TOKEN,
ssid,
pass
);
Serial.println("Blynk Connected!");
Serial.println("System Initialized.");
}
// --------------------------------------------------
// Loop
// --------------------------------------------------
void loop() {
// Keep Blynk connected
Blynk.run();
// ------------------------------------------------
// Read DHT22
// ------------------------------------------------
TempAndHumidity data =
dhtSensor.getTempAndHumidity();
float temp = data.temperature;
float humidity = data.humidity;
// ------------------------------------------------
// Sensor error
// ------------------------------------------------
if (isnan(temp) || isnan(humidity)) {
Serial.println("DHT22 read error!");
digitalWrite(GREEN_LED_PIN, LOW);
digitalWrite(RED_LED_PIN, HIGH);
tone(BUZZER_PIN, 1000);
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(2);
display.setCursor(15, 10);
display.println("ERROR");
display.setTextSize(1);
display.setCursor(10, 40);
display.println("DHT22 Read Failed");
display.display();
delay(2000);
return;
}
// ------------------------------------------------
// Send data to Blynk Datastreams (V0 & V1)
// ------------------------------------------------
Blynk.virtualWrite(V0, temp);
Blynk.virtualWrite(V1, humidity);
// ------------------------------------------------
// Check safe ranges
// ------------------------------------------------
bool tempOut =
(temp < TEMP_MIN || temp > TEMP_MAX);
bool humidityOut =
(humidity < HUMIDITY_MIN ||
humidity > HUMIDITY_MAX);
bool bothOut =
tempOut && humidityOut;
// ------------------------------------------------
// LED + Buzzer
// ------------------------------------------------
if (!tempOut && !humidityOut) {
// SAFE
digitalWrite(GREEN_LED_PIN, HIGH);
digitalWrite(RED_LED_PIN, LOW);
noTone(BUZZER_PIN);
Serial.println("STATUS: SAFE");
}
else {
// ALERT
digitalWrite(GREEN_LED_PIN, LOW);
digitalWrite(RED_LED_PIN, HIGH);
tone(BUZZER_PIN, 1000);
Serial.println("STATUS: ALERT");
}
// ------------------------------------------------
// BLYNK EVENTS / ALERTS
// ------------------------------------------------
// BOTH TEMPERATURE AND HUMIDITY OUT (Triggers event: "danger")
if (bothOut && !(previousTempOut && previousHumidityOut)) {
Blynk.logEvent(
"danger",
String("TEMPERATURE + HUMIDITY DANGER! Temp: ") +
String(temp, 1) +
" C, Humidity: " +
String(humidity, 1) +
" %"
);
Serial.println("BLYNK: DANGER EVENT LOGGED");
}
// ONLY TEMPERATURE OUT (Triggers event: "temperature_warning")
else if (tempOut && !humidityOut && !previousTempOut) {
Blynk.logEvent(
"temperature_warning",
String("Temperature Warning! ") +
String(temp, 1) +
" C (Safe: 36-38 C)"
);
Serial.println("BLYNK: TEMPERATURE WARNING LOGGED");
}
// ONLY HUMIDITY OUT (Triggers event: "humidity_warning")
else if (humidityOut && !tempOut && !previousHumidityOut) {
Blynk.logEvent(
"humidity_warning",
String("Humidity Warning! ") +
String(humidity, 1) +
" % (Safe: 50-60 %)"
);
Serial.println("BLYNK: HUMIDITY WARNING LOGGED");
}
// ------------------------------------------------
// Save current states
// ------------------------------------------------
previousTempOut = tempOut;
previousHumidityOut = humidityOut;
// ------------------------------------------------
// Serial Monitor
// ------------------------------------------------
Serial.print("Temperature: ");
Serial.print(temp, 2);
Serial.println(" C");
Serial.print("Humidity: ");
Serial.print(humidity, 1);
Serial.println(" %");
Serial.println("------------------------------------");
// ------------------------------------------------
// OLED DISPLAY
// ------------------------------------------------
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
// Title
display.setTextSize(1);
display.setCursor(25, 0);
display.println("DHT22 MONITOR");
// Temperature
display.setTextSize(2);
display.setCursor(0, 16);
display.print("T:");
display.print(temp, 1);
display.println(" C");
// Humidity
display.setCursor(0, 36);
display.print("H:");
display.print(humidity, 1);
display.println("%");
// Status
display.setTextSize(1);
display.setCursor(0, 56);
if (!tempOut && !humidityOut) {
display.print("STATUS: SAFE");
}
else {
display.print("STATUS: ALERT!");
}
display.display();
// ------------------------------------------------
// Reading interval
// ------------------------------------------------
delay(2000);
}Loading
esp32-devkit-c-v4
esp32-devkit-c-v4
Loading
ssd1306
ssd1306