#define BLYNK_TEMPLATE_ID "TMPL3CBjPyEa5"
#define BLYNK_TEMPLATE_NAME "Battery status and Temp monitor and SMS alert"
#define BLYNK_AUTH_TOKEN "F4ndr-sTV5j1FozyxHvgaZNwKgAzL6EN"
#define BLYNK_PRINT Serial
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
// Blynk credentials
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// Display and sensor config
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Pins and variables
int buzzer = 5;
float H, T;
BlynkTimer timer;
// Battery status notifier
void notifyBatterystatus() {
int Batterystatus = analogRead(34);
Serial.println(Batterystatus);
if (Batterystatus <= 900 ) {
Serial.println("low battery");
Blynk.logEvent("low_battery", "low battery, quickly turn on power supply");
} else if (Batterystatus >= 3700 ) {
Serial.println("full battery");
Blynk.logEvent("full_battery", "battery full, turn off power supply");
}
}
void setup() {
Serial.begin(9600);
pinMode(buzzer, OUTPUT);
pinMode(14, OUTPUT);
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
dht.begin();
lcd.init();
lcd.backlight();
// OLED init
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Failed to start SSD1306 OLED"));
while (1);
}
oled.clearDisplay();
oled.setTextSize(2);
oled.setTextColor(WHITE);
oled.setCursor(15, 30);
oled.println("Hii !!");
oled.display();
delay(1000);
oled.clearDisplay();
oled.setCursor(15, 30);
oled.println("Loading..");
oled.display();
// Speed up WiFi connection with timeout
WiFi.begin(ssid, pass);
unsigned long startAttemptTime = millis();
const unsigned long timeout = 5000; // 5 seconds max
while (WiFi.status() != WL_CONNECTED && millis() - startAttemptTime < timeout) {
delay(500);
Serial.print(".");
}
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi Failed!");
} else {
Serial.println("WiFi Connected!");
Blynk.begin(auth, ssid, pass); // Only call Blynk.begin if WiFi connected
}
timer.setInterval(10000L, notifyBatterystatus);
}
void loop() {
Blynk.run();
timer.run();
H = dht.readHumidity();
T = dht.readTemperature();
Serial.print("Humidity: "); Serial.print(H); Serial.print("% ");
Serial.print("Temperature: "); Serial.print(T); Serial.println("°C");
// Display alerts
if (H >= 70.00 && T >= 30.00) {
digitalWrite(14, HIGH); digitalWrite(13, LOW); digitalWrite(12, LOW);
lcd.setCursor(0, 0); lcd.println(" Too warm! ");
lcd.setCursor(0, 1); lcd.println(" Cool down! ");
tone(buzzer, 900, 100); delay(400);
noTone(buzzer); delay(400);
} else {
digitalWrite(14, LOW); digitalWrite(13, LOW); digitalWrite(12, HIGH);
lcd.setCursor(0, 0); lcd.println("Temp. & hum. are");
lcd.setCursor(0, 1); lcd.println("in normal limits");
noTone(buzzer);
}
if (H < 70.00 && T >= 30.00) {
digitalWrite(14, LOW); digitalWrite(13, HIGH); digitalWrite(12, LOW);
lcd.setCursor(0, 0); lcd.println("Be ware! ");
lcd.setCursor(0, 1); lcd.println("Temp. too high! ");
tone(buzzer, 400, 400); delay(400);
}
if (H >= 70.00 && T < 30.00) {
digitalWrite(14, LOW); digitalWrite(13, HIGH); digitalWrite(12, LOW);
lcd.setCursor(0, 0); lcd.println("Be ware! ");
lcd.setCursor(0, 1); lcd.println("Hum. too high! ");
tone(buzzer, 400, 400); delay(400);
}
// Battery display
int batteryLevel = analogRead(34);
int batteryPercent = map(batteryLevel, 0, 4095, 0, 100);
oled.clearDisplay();
oled.setTextSize(2);
oled.setTextColor(SSD1306_WHITE);
oled.setCursor(0, 0);
oled.print("Battery ");
oled.setCursor(10, 17);
oled.print("Level:");
oled.setTextSize(2.5);
oled.setCursor(40, 40);
oled.print(batteryPercent);
oled.print("%");
oled.display();
// Send to Blynk
Blynk.virtualWrite(V3, T);
Blynk.virtualWrite(V1, H);
Blynk.virtualWrite(V2, batteryPercent);
delay(1000);
}