#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>
#include <Wire.h> // Library for I2C communication
#include <LiquidCrystal_I2C.h> // Library for LCD via I2C
#include <ESP32Servo.h> // Library for servo motor
#define DHTPIN 14 // GPIO pin for DHT22 sensor
#define DHTTYPE DHT22 // DHT 22
const int trigPin = 2; // GPIO pin numbers for ultrasonic sensors
const int echoPin = 4;
const int trig1Pin = 5;
const int echo1Pin = 18;
const int servoPin = 12; // GPIO pin for servo motor
Servo myServo; // Create a servo object
DHT dht(DHTPIN, DHTTYPE); // Initialize DHT sensor
LiquidCrystal_I2C lcd(0x27, 16, 2); // Set the LCD address to 0x27 for a 16 chars and 2 line display
int icecreamQuantity = 0;
int chocolateQuantity = 0;
char auth[] = "YourAuthToken"; // Your Blynk Auth Token
char ssid[] = "YourNetworkName"; // Your WiFi network SSID
char pass[] = "YourPassword"; // Your WiFi network password
BlynkTimer timer;
void setup() {
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
dht.begin(); // Initialize DHT sensor
myServo.attach(servoPin); // Attach the servo to its pin
lcd.init();
lcd.backlight();
timer.setInterval(1000L, sendSensorData); // Send sensor data every second
}
void loop() {
Blynk.run(); // Call Blynk functions
timer.run(); // Run timer
}
void sendSensorData() {
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
int servoStatus = (temperature > 12) ? 1 : 0;
Blynk.virtualWrite(V1, icecreamQuantity); // Virtual pin V1 for Icecream quantity
Blynk.virtualWrite(V2, chocolateQuantity); // Virtual pin V2 for Chocolate quantity
Blynk.virtualWrite(V3, temperature); // Virtual pin V3 for temperature
Blynk.virtualWrite(V4, humidity); // Virtual pin V4 for humidity
Blynk.virtualWrite(V5, servoStatus); // Virtual pin V5 for servo status
}
void Product1() {
delay(500); // reading will be taken after 500 milliseconds
Serial.println("\n");
int duration, distance;
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration / 2) / 29.1;
calculateQuantity(distance, icecreamQuantity);
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
displayOnLCD("Icecream", icecreamQuantity, temperature, humidity);
if (temperature > 12) {
activateServo();
}
}
void Product2() {
delay(500); // reading will be taken after 500 milliseconds
Serial.println("\n");
int duration, distance;
digitalWrite(trig1Pin, HIGH);
delayMicroseconds(10);
digitalWrite(trig1Pin, LOW);
duration = pulseIn(echo1Pin, HIGH);
distance = (duration / 2) / 29.1;
calculateQuantity(distance, chocolateQuantity);
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
displayOnLCD("Chocolate", chocolateQuantity, temperature, humidity);
if (temperature > 12) {
activateServo();
}
}
void calculateQuantity(int distance, int& quantity) {
if (distance < 23) {
quantity = 5;
} else if (distance >= 23 && distance < 35) {
quantity = 4;
} else if (distance >= 35 && distance < 47) {
quantity = 3;
} else if (distance >= 47 && distance < 60) {
quantity = 2;
} else if (distance >= 60 && distance < 70) {
quantity = 1;
} else {
quantity = 0;
}
}
void displayOnLCD(String product, int quantity, float temperature, float humidity) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(product);
lcd.print(":");
lcd.print(quantity);
lcd.setCursor(0, 1);
lcd.print("T:");
lcd.print(temperature);
lcd.print("C H:");
lcd.print(humidity);
Serial.print("Product: ");
Serial.print(product);
Serial.print(" - Qty: ");
Serial.print(quantity);
Serial.print(" - Temp: ");
Serial.print(temperature);
Serial.print("C - Hum: ");
Serial.print(humidity);
Serial.println("%");
}
void activateServo() {
myServo.write(90); // Rotate servo to 90 degrees
delay(1000); // Wait for servo to reach its position
myServo.write(0); // Rotate servo back to 0 degrees
}