// void setup() {
// // put your setup code here, to run once:
// Serial.begin(115200);
// Serial.println("Hello, ESP32!");
// }
// void loop() {
// // put your main code here, to run repeatedly:
// delay(10); // this speeds up the simulation
// }
#define BLYNK_TEMPLATE_ID "TMPL5nSk0cChp"
#define BLYNK_TEMPLATE_NAME "seminar"
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
// Blynk Auth Token
char auth[] = "9e0q0OyWt28hnLdgeT5ANNIZeKksMysG";
// WiFi credentials
const char* ssid = "Wokwi-GUEST";
const char* pass = "";
// DHT Sensor
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// OLED display
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Relay
#define RELAY_PIN 23
bool heaterState = false;
// Variables
float temperature = 0;
float humidity = 0;
float setTemperature = 25; // Default set temperature
// Blynk virtual pins
#define VPIN_TEMP V2
#define VPIN_HUMIDITY V3
#define VPIN_SET_TEMP V4
#define VPIN_HEATER V0
BlynkTimer timer;
void reconnectBlynk() {
if (!Blynk.connected()) {
Serial.print("Reconnecting to Blynk...");
while (!Blynk.connected()) {
Blynk.connect();
delay(1000);
Serial.print(".");
}
Serial.println(" Reconnected!");
}
}
void setup() {
// Serial setup
Serial.begin(9600);
// WiFi setup
Serial.print("Connecting to WiFi");
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
// Blynk setup
Blynk.begin(auth, ssid, pass);
// DHT sensor setup
dht.begin();
// OLED setup
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.display();
delay(2000);
display.clearDisplay();
// Relay setup
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW); // Turn off relay by default
// Timer setup
timer.setInterval(2000L, sendSensorData);
timer.setInterval(10000L, reconnectBlynk); // Check Blynk connection every 10 seconds
}
void sendSensorData() {
// Read temperature and humidity
humidity = dht.readHumidity();
temperature = dht.readTemperature();
// Check if any reads failed and exit early (to try again).
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Print to Serial Monitor
Serial.print("Temperature: ");
Serial.print(temperature);
// Serial.print("temperature is high ");
Serial.print(" °C, Humidity: ");
Serial.print(humidity);
Serial.println(" %");
// Display on OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("Temp: ");
display.print(temperature);
display.print(" C");
display.setCursor(0, 10);
display.print("Hum: ");
display.print(humidity);
display.print(" %");
display.setCursor(0, 20);
display.print("Set Temp: ");
display.print(setTemperature);
display.print(" C");
display.setCursor(0, 30);
display.print("Heater: ");
display.print(heaterState ? "ON" : "OFF");
display.display();
// Send to Blynk
Blynk.virtualWrite(VPIN_TEMP, temperature);
Blynk.virtualWrite(VPIN_HUMIDITY, humidity);
// Control the heater
if (temperature < setTemperature) {
digitalWrite(RELAY_PIN, HIGH);
heaterState = true;
} else {
digitalWrite(RELAY_PIN, LOW);
heaterState = false;
}
// Send heater state to Blynk
Blynk.virtualWrite(VPIN_HEATER, heaterState);
}
BLYNK_WRITE(VPIN_SET_TEMP) {
setTemperature = param.asFloat();
Serial.print("Set temperature: ");
Serial.println(setTemperature);
}
BLYNK_WRITE(VPIN_HEATER) {
bool command = param.asInt();
if (command) {
digitalWrite(RELAY_PIN, HIGH);
heaterState = true;
} else {
digitalWrite(RELAY_PIN, LOW);
heaterState = false;
}
Serial.print("Heater state: ");
Serial.println(heaterState ? "ON" : "OFF");
}
void loop() {
Blynk.run();
timer.run();
}