#include <WiFi.h>
#include <WiFiClient.h>
#include <string.h>
#define NTP_SERVER "pool.ntp.org"
#define UTC_OFFSET 0
#define UTC_OFFSET_DST 0
#include <stdio.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#define BLYNK_TEMPLATE_ID "TMPL6NvzUgtLw"
#define BLYNK_TEMPLATE_NAME "LED CONTROL"
#define BLYNK_AUTH_TOKEN "dJU-mLH_8pN5djKnWpNcyG-sRx4W0ipC"
#define I2C_SDA 21 // Chân SDA
#define I2C_SCL 22 // Chân SCL
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2);
#define BLYNK_PRINT Serial
#include <BlynkSimpleEsp32.h>
#include <ESP32Servo.h>
#include <DHT.h>
#define DHTPIN 14 //chan cam bien
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
char ssid[] = "Wokwi-GUEST" ;
char pass[] = "" ;
#define servoPin 19
#define blue 2
Servo myServo;
BLYNK_WRITE(V0)
{
int buttonState = param.asInt();
if (buttonState ==1 )
{
digitalWrite(blue, HIGH);
lcd.clear();
lcd.print("LED ON");
delay(500);
displayWelcomeScreen();
}
if (buttonState == 0 )
{
digitalWrite(blue,LOW);
lcd.clear();
lcd.print("LED OFF");
delay(500);
displayWelcomeScreen();
}
}
BLYNK_WRITE(V1) // nut 2 dkhien dong co
{
int buttonState = param.asInt();
if (buttonState == 1) {
myServo.write(45); // Xoay động cơ 30 độ
lcd.clear();
lcd.print("Dang cho an");
delay(500);
displayWelcomeScreen();
} else if (buttonState == 0) { // Sửa lỗi so sánh
myServo.write(90); // Dừng servo
lcd.clear();
lcd.print("dung cho an");
delay(500);
displayWelcomeScreen();
}
}
WidgetLED ledConnect(V2);
unsigned long timesBlinkLed=millis();
BLYNK_CONNECTED() {
// Request Blynk server to re-send latest values for all pins
Blynk.syncAll();
//Blynk.syncVirtual(V0, V2);
}
WidgetLED StatusEat(V3);
BLYNK_WRITE(V3) // nut 2 dkhien dong co
{
int buttonState = param.asInt();
if (buttonState == 1) {
myServo.write(45); // Xoay động cơ 45 độ
delay(2000);
myServo.write(90);
StatusEat.off();
}
}
BLYNK_WRITE(V4) // nút B
{
int buttonState = param.asInt();
if (buttonState == 1) {
}
}
void setup() {
Serial.begin(115200);
dht.begin();
Wire.begin(I2C_SDA, I2C_SCL);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Connecting to ");
lcd.setCursor(0, 1);
lcd.print("WiFi ");
WiFi.begin("Wokwi-GUEST", "");
while (WiFi.status() != WL_CONNECTED) {
delay(250);
spinner();
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.println("Online");
lcd.setCursor(0, 1);
lcd.println("Updating time...");
configTime(UTC_OFFSET, UTC_OFFSET_DST, NTP_SERVER);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
lcd.clear();
displayWelcomeScreen();
pinMode(blue,OUTPUT);
digitalWrite(blue,LOW);
myServo.attach(servoPin);
myServo.write(90);
}
void spinner() {
static int8_t counter = 0;
const char* glyphs = "\xa1\xa5\xdb";
lcd.setCursor(15, 1);
lcd.print(glyphs[counter++]);
if (counter == strlen(glyphs)) {
counter = 0;
}
}
void printLocalTime() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
lcd.setCursor(0, 1);
lcd.println("Connection Err");
return;
}
// Thêm 7 giờ để hiển thị đúng múi giờ của Việt Nam (UTC+7)
timeinfo.tm_hour = (timeinfo.tm_hour + 7) % 24;
lcd.setCursor(8, 0);
lcd.printf("%02d:%02d:%02d", timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);
lcd.setCursor(6, 1);
lcd.printf("%02d/%02d/%04d", timeinfo.tm_mday, timeinfo.tm_mon + 1, timeinfo.tm_year + 1900);
}
void displayWelcomeScreen() {
lcd.clear();
lcd.backlight(); // Bật đèn nền LCD
printLocalTime();
}
void loop() {
lcd.display(); // Hiển thị nội dung trên LCD
printLocalTime();
delay(300);
Blynk.run();
float h = dht.readHumidity();
Blynk.virtualWrite(V4, h);
if(millis()-timesBlinkLed>1000){
if(ledConnect.getValue()){
ledConnect.off();
}else{
ledConnect.on();
}
}
}