// [email protected]
//Warehouse@2024
#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPL2NYDTnL7-"
#define BLYNK_TEMPLATE_NAME "FISH DRYING WAREHOUSE"
#define BLYNK_AUTH_TOKEN "PeB6LBT2OI6uO17tRyXJyDOd9EaTw1l6"
#define heater 27
#define fan 33
#define cled 23
#define ir1 26
#define ir2 25
#define buzzer 4
#define DHT_PIN 15
#define rainPin 35
#define moisturePin 34
#define en1 16
#define en2 17
#define rainLed 14
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <LiquidCrystal_I2C.h>
#include "DHTesp.h"
DHTesp dhtSensor;
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
LiquidCrystal_I2C lcd(0x27, 20, 4);
const int tempMin = 30;
const int rainMax = 100;
const int rainMin = 50;
const int moistureMin = 50;
float Temperature, Humidity, Moisture, Rain;
void setup()
{
lcd.init();
lcd.backlight();
loadingdisplay();
Serial.begin(115200);
delay(500);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
pinMode(en1, OUTPUT);
pinMode(en2, OUTPUT);
pinMode(ir1, INPUT_PULLUP);
pinMode(ir2, INPUT_PULLUP);
pinMode(heater, OUTPUT);
pinMode(fan, OUTPUT);
pinMode(cled, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(ir1, OUTPUT); // Ensure the IR LEDs are set to output
pinMode(ir2, OUTPUT); // Ensure the IR LEDs are set to output
pinMode(rainLed, OUTPUT); // Set the rain LED pin as output
digitalWrite(buzzer, LOW);
digitalWrite(heater, LOW);
digitalWrite(fan, LOW);
Blynk.begin(auth, ssid, pass);
digitalWrite(cled, HIGH);
digitalWrite(ir1, HIGH); // Set ir1 HIGH
digitalWrite(ir2, HIGH); // Set ir2 HIGH
}
void loop()
{
Blynk.run();
get_data();
send_update();
homedisplay();
// Check rain value and control relay, IR LED, buzzer, and rain LED
if (Rain >= rainMax) {
digitalWrite(heater, HIGH); // Turn on relay
digitalWrite(ir1, HIGH); // Turn on IR LED
digitalWrite(ir2, LOW); // Turn off IR2 LED
digitalWrite(buzzer, HIGH); // Turn on buzzer
digitalWrite(rainLed, HIGH); // Turn on rain LED
alert_display(" IT IS RAINING ");
Alert(3);
} else {
digitalWrite(heater, LOW); // Turn off relay
digitalWrite(ir1, LOW); // Turn off IR1 LED
digitalWrite(ir2, HIGH); // Turn on IR2 LED
digitalWrite(buzzer, LOW); // Turn off buzzer
digitalWrite(rainLed, LOW); // Turn off rain LED
}
// Other existing logic
if (Moisture <= moistureMin && Moisture > 0) { // Check moisture
alert_display("DRYING COMPLETE");
Alert(3);
}
if (Temperature <= tempMin) { // Check temperature
digitalWrite(fan, HIGH);
} else {
digitalWrite(fan, LOW);
}
// Motor control logic
if(Rain >= rainMax) // Check rain
{
while(digitalRead(ir1) == HIGH)
{
digitalWrite(en1, HIGH);
digitalWrite(en2, LOW);
}
digitalWrite(en1, LOW);
digitalWrite(en2, LOW);
}
else
{
while(digitalRead(ir2) == LOW)
{
digitalWrite(en1, LOW);
digitalWrite(en2, HIGH);
}
digitalWrite(en1, LOW);
digitalWrite(en2, LOW);
}
}
void get_data()
{
TempAndHumidity data = dhtSensor.getTempAndHumidity();
Temperature = data.temperature;
Humidity = data.humidity;
delay(1000);
Moisture = map(analogRead(moisturePin), 0, 4095, 0, 1000);
// Read rain data from the sensor pin
Rain = map(analogRead(rainPin), 0, 4095, 0, 1000);
}
void send_update()
{
Blynk.virtualWrite(V0, Temperature);
Blynk.virtualWrite(V1, Humidity);
Blynk.virtualWrite(V2, Moisture);
Blynk.virtualWrite(V3, Rain);
delay(150);
}
void loadingdisplay()
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SMART WARE-HOUSE FOR");
lcd.setCursor(0, 1);
lcd.print(" FISH DRYING ");
lcd.setCursor(0, 2);
lcd.print(" SYSTEM INITIALIZE ");
lcd.setCursor(0, 3);
lcd.print("PLEASE WAIT");
for (int k = 11; k < 20; k++)
{
lcd.setCursor(k, 3);
lcd.print(".");
delay(500);
}
}
void homedisplay()
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("WARE-HOUSE CONDITION");
lcd.setCursor(0, 1);
lcd.print("TEMP:");
lcd.setCursor(5, 1);
lcd.print(Temperature, 1);
lcd.print("°C");
lcd.setCursor(0, 2);
lcd.print("HUM:");
lcd.setCursor(5, 2);
lcd.print(Humidity, 1);
lcd.print("%");
lcd.setCursor(0, 3);
lcd.print("MST:");
lcd.setCursor(5, 3);
lcd.print(Moisture, 1);
lcd.print("%");
lcd.setCursor(10, 3);
lcd.print("RAIN:");
lcd.setCursor(15, 3);
lcd.print(Rain >= rainMax ? "Yes" : "No");
delay(500);
}
void alert_display(String textAlert)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("-WAREHOUSE OP.ALERT-");
lcd.setCursor(0, 1);
lcd.print("********************");
lcd.setCursor(0, 2);
lcd.print("*");
lcd.setCursor(1, 2);
lcd.print(textAlert);
lcd.setCursor(19, 2);
lcd.print("*");
lcd.setCursor(0, 3);
lcd.print("********************");
// Send alert to Blynk
Blynk.virtualWrite(V4, textAlert);
// Wait for a while before clearing the alert
delay(3000); // Adjust the delay as needed
// Clear the alert and return to normal display
homedisplay();
}
void Alert(uint8_t num)
{
for (num; num > 0; num--)
{
digitalWrite(buzzer, HIGH);
delay(750);
digitalWrite(buzzer, LOW);
delay(500);
}
}