//https://advancecad.edu.vn/tao-man-hinh-voi-led-7-doan-va-thanh-ghi-thay-doi-74hc595-du-an-arduino/
#define LED_RED 5
#define LED_YELLOW 18
#define LED_GREEN 19
//Blynk
#define BLYNK_TEMPLATE_ID "TMPL6f6vHkGfD"
#define BLYNK_TEMPLATE_NAME "Đèn giao thông"
#define BLYNK_AUTH_TOKEN "TZCN7Tto2U1BE3ffsWAwCsnEEmDWzw_u"
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 14, 27, 26, 25, 33); //các pin tương ứng nếu thay vị trí phải thay pin
const char ssid[] = "Wokwi-GUEST"; // Your WiFi SSID
const char password[] = ""; // Your WiFi password
const char auth[] = BLYNK_AUTH_TOKEN;
int TimeGreen = 101000; // sáng đèn xanh
int TimeRed = 15000; // sáng đèn đỏ
int TimeYellow=2000;
int demRed=0;
int demYellow=0;
int demGreen=0;
BLYNK_WRITE(V0)
{
int valueRed = param.asInt();
TimeRed = valueRed*1000;
}
BLYNK_WRITE(V1)
{
int valueYellow = param.asInt();
TimeYellow = valueYellow*1000;
}
BLYNK_WRITE(V2)
{
int valueGreen = param.asInt();
TimeGreen = valueGreen*1000;
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Hello, ESP32!");
pinMode(LED_RED, OUTPUT);
pinMode(LED_YELLOW, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
}
Blynk.begin(auth, ssid, password);
lcd.begin(16, 2); //setup màn hình
lcd.print("Thanh Come Here!!");
delay(1000);
lcd.clear();//Xóa trắng màn hình lcd
}
void loop() {
// put your main code here, to run repeatedly:
Blynk.run();
int preti = millis(); //Khởi tạo biến thời gian hiện tại
int nowti = millis(); //Khởi tạo biến thời gian hiện tại
int numlcd = 0; //biến để cập nhật Giây hiện lên màn hình LCD
int count=(nowti - preti); //Đếm thời gian trong khoảng (preti, nowti)
lcd.setCursor(4,1);//vị trí con trỏ của lcd cột 4 x hàng 1
lcd.print("s"); //hiện đơn vị giây
//Đèn đỏ
demRed=TimeRed; //Nạp dữ liệu thời gian thu được từ
lcd.setCursor(0,0); //Cột x hàng
lcd.print("RED TIME!!!");
if(demRed>0){ //nếu giờ cập nhật lớn hơn 0
digitalWrite(LED_RED, HIGH); //thì cho sáng đèn đỏ
/*
- thay thế hàm delay bằng while có điều kiện
- demRed là thời gian đặt được đổi từ s sang ms
- count là số ms tính từ thời gian bắt đầu của biến preti=millis(),biến này
để tính số giây đèn đỏ bắt đầu sáng
*/
while(demRed - count > 0){
count = (nowti - preti);
numlcd = (demRed - count)/1000; //cập nhật số s để hiển thị lcd
if(numlcd<10){
tranhLoi();//hàm tránh lỗi hiển thị lcd
}
if(numlcd<100){
tranhLoi1();//hàm tránh lỗi hiển thị lcd
}
lcd.setCursor(0,1); //cột x hàng con trỏ vì lcd là ma trận 16 cột x 2 hàng
lcd.print(numlcd); //hiển thị
nowti = millis(); //cập nhật ms hiện tại cho biến nowti
// lcd.clear();
}
demRed=0; //đưa giá trị giây sáng đèn về 0
}
digitalWrite(LED_RED, LOW); //tắt led đỏ
lcd.clear(); //XÓa trắng màn hình lcd
//mấy cái dưới tương tự-----------------------------------
//Đèn vàng
preti = millis();
nowti = millis();
numlcd = 0;
count=(nowti - preti);
demYellow=TimeYellow;
lcd.setCursor(0,0); //Cột x hàng
lcd.print("YELLOW TIME!!!");
lcd.setCursor(4,1);
lcd.print("s");
if(demYellow>0){
digitalWrite(LED_YELLOW, HIGH);
while(demYellow - count > 0){
count = (nowti - preti);
numlcd = (demYellow - count)/1000;
if(numlcd<10){
tranhLoi();//hàm tránh lỗi hiển thị lcd
}
if(numlcd<100){
tranhLoi1();//hàm tránh lỗi hiển thị lcd
}
lcd.setCursor(0,1);
lcd.print(numlcd);
nowti = millis();
// lcd.clear();
}
demYellow=0;
}
digitalWrite(LED_YELLOW, LOW);
lcd.clear(); //XÓa trắng màn hình lcd
//mấy cái dưới tương tự-----------------------------------
//Đèn xanh
preti = millis();
nowti = millis();
numlcd = 0;
count=(nowti - preti);
demGreen=TimeGreen;
lcd.setCursor(0,0); //Cột x hàng
lcd.print("GREEN TIME!!!");
lcd.setCursor(4,1);
lcd.print("s");
if(demGreen>0){
digitalWrite(LED_GREEN, HIGH);
while(demGreen - count > 0){
count = (nowti - preti);
numlcd = (demGreen - count)/1000;
if(numlcd<10){
tranhLoi();//hàm tránh lỗi hiển thị lcd
}
if(numlcd<100){
tranhLoi1();//hàm tránh lỗi hiển thị lcd
}
lcd.setCursor(0,1);
lcd.print(numlcd);
nowti = millis();
// lcd.clear();
}
demGreen=0;
}
digitalWrite(LED_GREEN, LOW);
lcd.clear(); //XÓa trắng màn hình lcd
//mấy cái dưới tương tự-----------------------------------
//Đèn vàng
preti = millis();
nowti = millis();
numlcd = 0;
count=(nowti - preti);
demYellow=TimeYellow;
lcd.setCursor(0,0); //Cột x hàng
lcd.print("YELLOW TIME!!!");
lcd.setCursor(4,1);
lcd.print("s");
if(demYellow>0){
digitalWrite(LED_YELLOW, HIGH);
while(demYellow - count > 0){
count = (nowti - preti);
numlcd = (demYellow - count)/1000;
if(numlcd<10){
tranhLoi();//hàm tránh lỗi hiển thị lcd
}
if(numlcd<100){
tranhLoi1();//hàm tránh lỗi hiển thị lcd
}
lcd.setCursor(0,1);
lcd.print(numlcd);
nowti = millis();
// lcd.clear();
}
demYellow=0;
}
digitalWrite(LED_YELLOW, LOW);
lcd.clear(); //XÓa trắng màn hình lcd
}
//tránh lỗi khi chuyển về hàng đơn vị
void tranhLoi(){
lcd.setCursor(1,1);//vị trí con trỏ của lcd cột 1 x hàng 1
lcd.print(" "); //tránh lỗi
}
//tránh lỗi khi chuyển về hàng chục
void tranhLoi1(){
lcd.setCursor(2,1);//vị trí con trỏ của lcd cột 2 x hàng 1
lcd.print(" "); //tránh lỗi
}
//tránh lỗi khi chuyển về hàng trăm
void tranhLoi2(){
lcd.setCursor(3,1);//vị trí con trỏ của lcd cột 3 x hàng 1
lcd.print(" "); //tránh lỗi
}