#define BLYNK_TEMPLATE_ID "TMPL3I2IanZ2T"
#define BLYNK_TEMPLATE_NAME "EmbedX Smart Greenhouse Management System"
#define BLYNK_AUTH_TOKEN "KuahdvzJoEp3JOzDULw6JkEJbjYPA8mZ"
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <HX711.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
char auth[] = "KuahdvzJoEp3JOzDULw6JkEJbjYPA8mZ";
#define LED 2
#define GAS_SENSOR 34
#define LOADCELL_DOUT_PIN 21
#define LOADCELL_SCK_PIN 22
#define RELAY_PIN 4
#define DHT22PIN 15
#define DHTTYPE DHT22
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_ROWS 2
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_ROWS);
HX711 scale;
DHT dht(DHT22PIN, DHTTYPE);
BlynkTimer timer;
int gasValue;
int screen = 0;
float temp, hum;
float weightKg;
// ✅ Your original calibration logic restored
float calibration_factor = 419.8;
const int temp_threshold = 29;
void setup() {
pinMode(LED, OUTPUT);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
Serial.begin(115200);
Serial.println("ESP32 Multi-Sensor Start");
Wire.begin(5, 23);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("System Starting");
delay(1500);
lcd.clear();
// ✅ Original HX711 logic restored
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
scale.set_scale(calibration_factor);
scale.tare();
dht.begin();
lcd.setCursor(0, 0);
lcd.print("Connecting...");
Blynk.begin(auth, ssid, pass);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Connected!");
delay(1000);
timer.setInterval(3000, sendToBlynk);
}
void loop() {
Blynk.run();
timer.run();
hum = dht.readHumidity();
temp = dht.readTemperature();
// Gas logic unchanged
int rawGas = analogRead(GAS_SENSOR);
gasValue = map(rawGas, 0, 4095, 0, 4040);
if (gasValue < 0) gasValue = 0;
if (gasValue > 4040) gasValue = 4040;
if (isnan(hum) || isnan(temp)) {
Serial.println("DHT Error!");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("DHT Error");
delay(2000);
return;
}
// ✅ Original weight logic restored
if (scale.is_ready()) {
weightKg = scale.get_units(10); // average of 10 readings
if (weightKg < 0.02) weightKg = 0;
if (weightKg < 0) weightKg = 0;
if (weightKg > 5) weightKg = 5;
} else {
Serial.println("Scale not ready");
weightKg = 0;
}
Serial.printf("Temp: %.1f Hum: %.1f Gas: %d Weight: %.2f\n",
temp, hum, gasValue, weightKg);
// LED logic unchanged
if (temp > temp_threshold) {
digitalWrite(LED, HIGH);
} else {
digitalWrite(LED, LOW);
}
// Relay logic unchanged
if (temp > temp_threshold) {
digitalWrite(RELAY_PIN, HIGH);
} else {
digitalWrite(RELAY_PIN, LOW);
}
// LCD display unchanged
lcd.clear();
if (screen == 0) {
lcd.setCursor(0, 0);
lcd.print("Temp:");
lcd.print(temp, 1);
lcd.print((char)223);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Hum:");
lcd.print(hum, 0);
lcd.print("%");
} else {
lcd.setCursor(0, 0);
lcd.print("Gas:");
lcd.print(gasValue);
lcd.setCursor(0, 1);
lcd.print("Weight:");
lcd.print(weightKg, 1);
lcd.print("kg");
}
screen = (screen + 1) % 2;
delay(1500);
}
// Blynk send logic unchanged
void sendToBlynk() {
Blynk.virtualWrite(V0, temp);
Blynk.virtualWrite(V1, hum);
Blynk.virtualWrite(V2, weightKg);
Blynk.virtualWrite(V3, gasValue);
}
// Manual relay control
BLYNK_WRITE(V4) {
int fanState = param.asInt();
digitalWrite(RELAY_PIN, fanState);
}