#define BLYNK_TEMPLATE_ID "TMPL6Q2ULC2Vv" //Id cua template tren blynk
#define BLYNK_TEMPLATE_NAME "smartHome" // ten cua template tren blynk
#define BLYNK_AUTH_TOKEN "xBFmGopuzHwtN2E7aJW4yRWJJ1KKa9Ak" // ma xac thuc(token) de ket noi voi blynk
//#include <WiFi.h>
#include <BlynkSimpleEsp32.h> // thu vien de ket noi voi blynk tren esp32
//----------------------------------
#include <Wire.h> //thu vien de ket noi I2c(ket noi voi LCD) ;giup giam chan cam
#include <LiquidCrystal_I2C.h> // thu vien ket noi man hinh dieu khien LCD
#include <ESP32Servo.h> // thu vien de dieu khien servo
#include <Keypad.h> // thu vien doc thong tin tu keypad
#define BEEPER_PIN 4
#define CLICK_FREQ 600
#define CLICK_FREQ_MS 10
#define LCD_I2C_ADDR 0x27 // dia chi cua module lcd I2C
LiquidCrystal_I2C lcd(0x27, 16, 2); // khoi tao doi tuong LCD I2C voi kich thuoc man hinh cu the
Servo servo; // khai bao servo co ten la servo
const byte ROW_NUM = 4; // khai bao so hang cua keypad
const byte COL_NUM = 4; // khai bao so cot cua keypad
const int ledPin = 19;
int startAngle = 90; // Góc bắt đầu (0 độ)
int targetAngle = 180; // Góc đích (90 độ)
int duration = 1000; // Thời gian chuyển động (1 giây)
int duration1 = 500;
int steps = 100; // Số bước để chia nhỏ chuyển động
boolean cf = true;
char keys[ROW_NUM][COL_NUM] = {
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
}; // khai bao mang 4x4 , voi cac gia tri la gia tri tren keypad tuong ung
byte pin_rows[ROW_NUM] = { 25, 26, 27, 14 }; // pin hang tu R1-4
byte pin_cols[COL_NUM] = { 5, 18, 32, 33 };// pin cot tu C1-4
Keypad keypad = Keypad(makeKeymap(keys), pin_rows, pin_cols, ROW_NUM, COL_NUM); // thiet lap keypad
String password = "1111"; // pass mac dinh la 1111
String passwordChange = "";
String passwordOld = "";
bool codeEntered = false; // trang thai pass da dung hay chua
String pwd = ""; // khai bao chuoi de luu pass nhap tu ban phim
int n = 0; // khai bao so gia tri duoc nhap vao tu ban phim
int resetPwd = 0; // khai bao gia tri so lan nhap pass
int nhay = 0;
//-------------------------------------
char auth[] = "xBFmGopuzHwtN2E7aJW4yRWJJ1KKa9Ak"; // ma xac thuc(token) de ket noi voi Blynk
char ssid[] = "Wokwi-GUEST"; // ten mang wifi ket noi den(ao vi day la mo phong)
char pass[] = "";//mat khau mang wifi(nay cung co san)
int p4;// cac bien lay du lieu tu blynk
void setup() {
// put your setup code here, to run once:
Serial.begin(9600); // thiet lap cong series de gui va nhan du lieu 9600 bit moi giay
Blynk.begin(auth, ssid, pass);
//-------------
servo.attach(23); // chan servo duoc gan
servo.write(90);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
// trang thai ban dau cua servo( dong cua)
lcd.init(); // khoi tao lcd
lcd.backlight();// bat den nen lcd
introScreen(); // goi ham introScreen() de hien thi
delay(200); // tre 0,2s
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass); // co gang ket noi voi blynk server theo cau hinh tuong ung
//---------------------
//---------------
}
void loop() {
// Serial.println(digitalRead(button));
// }
// neu mat khau dung, thi goi ham grantAccess() con khong thi tiep tuc goi ham checkCode()
//----------------------
if (!codeEntered)
{
checkCode();
}
else
{
grantAccess();
}
//------------------
Blynk.run(); // lay gia tri tu blynk server
//------------------
}
// lay gia tri tu blynk server va dat trang thai led tuong ung 0:tat, 1 : bat
BLYNK_WRITE(V3) {
p4 = param.asInt();
if (p4 == 1) {
servo.write(180);
//delay(500);
unsigned long startMillis = millis();
while (millis() - startMillis < 500) {
// Chờ 500ms
}
servo.write(90);
// delay(500);
unsigned long startMillis1 = millis();
while (millis() - startMillis1 < 500) {
// Chờ 500ms
}
} else {
servo.write(90);
//delay(500);
unsigned long startMillis2 = millis();
while (millis() - startMillis2 < 500) {
// Chờ 500ms
}
}
}
void checkCode() {
char key = keypad.getKey(); // lay gia tri nhap tu keypad
if (key != NO_KEY) {
if (key == '*') {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Doi mat khau");
lcd.setCursor(0, 1);
lcd.print("1.Ok");
lcd.setCursor(8, 1);
lcd.print("2.Thoat");
while (cf) {
key = keypad.getKey();
if (key != NO_KEY) {
cf = false;
}
}
if (key == '1') {
changePass();
}
else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Nhap mat khau"); // nhap mat khau
lcd.setCursor(0, 1);
}
}
else {
cf = true;
if (key == '#') {
if (pwd.equalsIgnoreCase(password)) {
codeEntered = true; // dung thi thi set tragn thai codeEntered = true de mo cua
} else {
passIncorrect();
}
n = 0; // set gia tri do dai mk ve 0 de nhap lai
}
else { // neu la key
digitalWrite(ledPin, LOW);
digitalWrite(ledPin, HIGH);
//delay(50);
unsigned long startMillis2 = millis();
while (millis() - startMillis2 < 50) {
// Chờ 50ms
}
digitalWrite(ledPin, LOW);
pwd += key; // noi key vao password
lcd.setCursor(n, 1); // set vi tri hien thi
lcd.print("*"); // hien thi dau * thay vi key
n++;
}
}
}
}
void grantAccess() { // ham mo cua
lcd.setCursor(0, 0);
lcd.println(" A C C E S S ");
lcd.setCursor(0, 1);
lcd.println(" G R A N T E D ");
codeEntered = false; // setcodeEntered ve khong de nguoi khac co the mo
pwd = ""; // set pwd ve rong de nhap pass lai
unsigned long startMillis = millis();
while (millis() - startMillis < 200) {
// Chờ 50ms
}
for (int i = steps; i <= 100; ++i) {
int currentAngle = startAngle + (targetAngle - startAngle) * i / steps;
servo.write(currentAngle);
delay(duration / steps);
}
delay(1000); // Dừng 1 giây trước khi quay ngược lại
// Chuyển về góc 90 độ
for (int i = steps; i <= 100; ++i) {
int currentAngle = targetAngle + (startAngle - targetAngle) * i / steps;
servo.write(currentAngle);
delay(duration1 / steps);
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Nhap mat khau");
}
void introScreen() { // hien thi nhung trang thai ban dau
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("Smart Home");
lcd.setCursor(2, 1);
lcd.print("Welcome back");
// delay(600);
unsigned long startMillis = millis();
while (millis() - startMillis < 600) {
// Chờ 50ms
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Nhap mat khau");
lcd.setCursor(0, 1);
}
void changePass() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Nhap mat khau cu");
char keyChange;
do {
keyChange = keypad.getKey();
if (keyChange == '#') {
break;
}
if (keyChange) {
lcd.setCursor(nhay, 1);
lcd.print("*");
passwordOld += keyChange;
nhay++;
}
} while (keyChange != '#');
nhay = 0;
Serial.println(passwordOld);
if (passwordOld.equalsIgnoreCase(password)) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Nhap pass moi");
do {
keyChange = keypad.getKey();
if (keyChange) {
lcd.setCursor(nhay, 1);
lcd.print("*");
passwordChange += keyChange;
nhay++;
}
} while (passwordChange.length() < 4);
delay(50);
password = passwordChange;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("DOi thanh cong");
delay(50);
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Incorrect.Not Change");
delay(50);
}
nhay = 0;
passwordOld = "";
passwordChange = "";
delay(1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Nhap mat khau"); // nhap mat khau
lcd.setCursor(0, 1);
}
void passIncorrect() {
lcd.setCursor(0, 0); // set vi tri de hien thi chu "Mat khau sai" h1c1
lcd.print("Mat khau sai"); // hien thi chu
resetPwd++; // so lan go mk tang len
if (resetPwd == 4) { // qua 4 lan go mk sai thi thong bao go sai, bat cho 5s de co the go tiep
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Thu lai sau 5s");
// delay(5000); // cho 5s
unsigned long startMillis = millis();
while (millis() - startMillis < 5000) {
// Chờ 5000ms
}
resetPwd = 0;// dat so lan go sai password ve 0 de co the tiep tuc nhap
}
lcd.setCursor(0, 1);
lcd.print("Nhap lai mkhau"); // nhap lai mat khau
//delay(500);
unsigned long startMillis1 = millis();
while (millis() - startMillis1 < 500) {
// Chờ 500ms
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Nhap mat khau"); // nhap mat khau
lcd.setCursor(0, 1);
pwd = ""; // pwd ve chuoi rong de nhap lai
}