#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPL6KL2JSrQ0"
#define BLYNK_TEMPLATE_NAME "SmartHome"
#define BLYNK_AUTH_TOKEN "Drdiv6g-_sV4eAHRGhrZ_js66SIQ7ZFA"
#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[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
BlynkTimer timer;
void setup() {
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
dht.begin(); // Initialize DHT sensor
// configure the trigger pin to output mode
pinMode(trigPin, OUTPUT);
// configure the echo pin to input mode
pinMode(echoPin, INPUT);
// configure the trigger pin to output mode
pinMode(trig1Pin, OUTPUT);
// configure the echo pin to input mode
pinMode(echo1Pin, INPUT);
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
Product1();
Product2();
}
void sendSensorData() {
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
int servoStatus = (temperature > 12) ? 1 : 0;
Blynk.virtualWrite(V3, icecreamQuantity); // Virtual pin V1 for Icecream quantity
Blynk.virtualWrite(V1, chocolateQuantity); // Virtual pin V2 for Chocolate quantity
Blynk.virtualWrite(V0, temperature); // Virtual pin V3 for temperature
Blynk.virtualWrite(V4, humidity); // Virtual pin V4 for humidity
Blynk.virtualWrite(V2, servoStatus); // Virtual pin V5 for servo status
}
void Product1() {
delay(500); // reading will be taken after 500 milliseconds
Serial.println("\n");
int duration, distance_cm; // Change variable name to distance_cm
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance_cm = duration * 0.034 / 2; // Convert duration to distance in centimeters
Serial.println(distance_cm);
calculateQuantity(distance_cm, icecreamQuantity); // Pass distance_cm to calculateQuantity
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_cm; // Change variable name to distance_cm
digitalWrite(trig1Pin, HIGH);
delayMicroseconds(10);
digitalWrite(trig1Pin, LOW);
duration = pulseIn(echo1Pin, HIGH);
distance_cm = duration * 0.034 / 2; // Convert duration to distance in centimeters
Serial.println(distance_cm);
calculateQuantity(distance_cm, chocolateQuantity); // Pass distance_cm to calculateQuantity
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("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
}