#define BLYNK_TEMPLATE_ID "TMPL6z9L8dlAz"
#define BLYNK_TEMPLATE_NAME "fyp"
#define BLYNK_AUTH_TOKEN "FwYIoHYIHaEpYQDvNqUz-d2pv17mvDOz"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
// WiFi credentials
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pin definitions
const int analogPin = 35; // Analog input for magnetic field
const int ledFieldPin = 26; // LED for magnetic field
const int ledTempPin = 27; // LED for temperature threshold
const int dhtPin = 18; // DHT22 data pin
#define DHTTYPE DHT22
DHT dht(dhtPin, DHTTYPE);
// Thresholds
const int fieldThreshold = 3000;
const float tempThreshold = 30.0;
// System state
bool systemOn = true;
bool lastSystemState = true;
bool lastFieldState = false;
bool lastTempState = false;
// Blynk virtual pin V5 for switch control
BLYNK_WRITE(V5) {
int switchState = param.asInt();
systemOn = switchState == 1;
}
void setup() {
Serial.begin(9600);
pinMode(ledFieldPin, OUTPUT);
pinMode(ledTempPin, OUTPUT);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Connecting...");
dht.begin();
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
delay(1000);
lcd.clear();
}
void loop() {
Blynk.run();
// If system is OFF
if (!systemOn) {
lcd.setCursor(0, 0);
lcd.print("System OFF ");
lcd.setCursor(0, 1);
lcd.print(" ");
digitalWrite(ledFieldPin, LOW);
digitalWrite(ledTempPin, LOW);
Blynk.virtualWrite(V3, 0);
Blynk.virtualWrite(V4, 0);
if (lastSystemState) {
Blynk.logEvent("system_offline");
lastSystemState = false;
}
return;
}
// System turned ON
if (!lastSystemState) {
Blynk.logEvent("system_online");
lastSystemState = true;
}
// Read sensors
int analogValue = analogRead(analogPin);
float voltage = analogValue * (3.3 / 4095.0);
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// Display magnetic field
lcd.setCursor(0, 0);
lcd.print("Mag: ");
lcd.print(analogValue);
lcd.print(" Wb "); // Pad to clear leftovers
// Display temperature
lcd.setCursor(0, 1);
if (isnan(temperature)) {
lcd.print("Temp: Err ");
} else {
lcd.print("Temp: ");
lcd.print(temperature, 1);
lcd.print(" C ");
}
// LED control
bool isFieldHigh = analogValue > fieldThreshold;
bool isTempHigh = temperature > tempThreshold;
digitalWrite(ledFieldPin, isFieldHigh ? HIGH : LOW);
digitalWrite(ledTempPin, isTempHigh ? HIGH : LOW);
// Serial output
Serial.print("Magnetic Field: ");
Serial.print(analogValue);
Serial.print(" Wb | Voltage: ");
Serial.print(voltage, 2);
Serial.print(" V | Temp: ");
Serial.print(temperature);
Serial.print(" C | Hum: ");
Serial.println(humidity);
// Send data to Blynk
Blynk.virtualWrite(V0, analogValue);
Blynk.virtualWrite(V1, temperature);
Blynk.virtualWrite(V2, humidity);
Blynk.virtualWrite(V3, isFieldHigh ? 255 : 0);
Blynk.virtualWrite(V4, isTempHigh ? 255 : 0);
Blynk.virtualWrite(V6, voltage);
// Notification for high magnetic field
if (isFieldHigh && !lastFieldState) {
Blynk.logEvent("high_magnetic");
lastFieldState = true;
} else if (!isFieldHigh) {
lastFieldState = false;
}
// Notification for high temperature
if (isTempHigh && !lastTempState) {
Blynk.logEvent("high_temperature_reading");
lastTempState = true;
} else if (!isTempHigh) {
lastTempState = false;
}
delay(2000);
}