#include <LiquidCrystal_I2C.h>
#define LED1 2 // Đèn LED thứ nhất
#define LED2 4 // Đèn LED thứ hai
#define LED3 12 // Đèn LED thứ ba
// Định nghĩa các chân cho Seven Segment Display
#define sevseg_A 23
#define sevseg_B 22
#define sevseg_C 21
#define sevseg_D 19
#define sevseg_E 18
#define sevseg_F 17
#define sevseg_G 16
// Khởi tạo màn hình LCD
LiquidCrystal_I2C lcd(0x27, 20, 2); // Địa chỉ I2C 0x27, màn hình 20 cột và 2 dòng
unsigned long previousMillisLED = 0; // Lưu trữ thời gian trước đó của LED
unsigned long previousMillisLCD = 0; // Lưu trữ thời gian trước đó của LCD
const long intervalLED = 1000; // Thời gian trễ cho LED (1 giây)
const long intervalLCD = 2000; // Thời gian trễ cho LCD (2 giây)
int ledState1 = LOW; // Trạng thái ban đầu của LED1
int ledState2 = LOW; // Trạng thái ban đầu của LED2
int ledState3 = LOW; // Trạng thái ban đầu của LED3
void setup() {
// Khởi tạo màn hình LCD
lcd.init();
lcd.backlight();
// Đặt các chân LED là OUTPUT
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
// Đặt các chân sevseg là OUTPUT
pinMode(sevseg_A, OUTPUT);
pinMode(sevseg_B, OUTPUT);
pinMode(sevseg_C, OUTPUT);
pinMode(sevseg_D, OUTPUT);
pinMode(sevseg_E, OUTPUT);
pinMode(sevseg_F, OUTPUT);
pinMode(sevseg_G, OUTPUT);
}
void displayLCD() {
unsigned long currentMillis = millis(); // Lấy thời gian hiện tại
// Kiểm tra nếu thời gian trôi qua đủ lâu để cập nhật LCD
if (currentMillis - previousMillisLCD >= intervalLCD) {
previousMillisLCD = currentMillis; // Cập nhật thời gian
lcd.clear(); // Xóa màn hình
lcd.setCursor(0, 0); // Di chuyển con trỏ đến (0, 0)
lcd.print("CONG NGHE IOT"); // In thông điệp
lcd.setCursor(5, 1); // Di chuyển con trỏ đến (5, 1)
lcd.print("DKSON"); // In thông điệp
delay(2000); // Hiển thị trong 2 giây
lcd.clear(); // Xóa màn hình
lcd.setCursor(2, 0); // Di chuyển con trỏ đến (2, 0)
lcd.print("LCD I2C MODE"); // In thông điệp
lcd.setCursor(6, 1); // Di chuyển con trỏ đến (6, 1)
lcd.print("16x2"); // In thông điệp
delay(2000); // Hiển thị trong 2 giây
}
}
void controlLEDs() {
unsigned long currentMillis = millis(); // Lấy thời gian hiện tại
// Kiểm tra nếu thời gian trôi qua đủ lâu để cập nhật LED1
if (currentMillis - previousMillisLED >= intervalLED) {
previousMillisLED = currentMillis; // Cập nhật thời gian
// Đổi trạng thái của LED1, LED2, LED3
ledState1 = !ledState1;
ledState2 = !ledState2;
ledState3 = !ledState3;
digitalWrite(LED1, ledState1); // Cập nhật trạng thái LED1
digitalWrite(LED2, ledState2); // Cập nhật trạng thái LED2
digitalWrite(LED3, ledState3); // Cập nhật trạng thái LED3
}
}
void displaySevenSegment(int num) {
// Tắt tất cả các segments
digitalWrite(sevseg_A, HIGH);
digitalWrite(sevseg_B, HIGH);
digitalWrite(sevseg_C, HIGH);
digitalWrite(sevseg_D, HIGH);
digitalWrite(sevseg_E, HIGH);
digitalWrite(sevseg_F, HIGH);
digitalWrite(sevseg_G, HIGH);
// Tùy vào số được truyền vào, bật các segments thích hợp
switch (num) {
case 0:
digitalWrite(sevseg_A, LOW);
digitalWrite(sevseg_B, LOW);
digitalWrite(sevseg_C, LOW);
digitalWrite(sevseg_D, LOW);
digitalWrite(sevseg_E, LOW);
digitalWrite(sevseg_F, LOW);
break;
case 1:
digitalWrite(sevseg_B, LOW);
digitalWrite(sevseg_C, LOW);
break;
case 2:
digitalWrite(sevseg_A, LOW);
digitalWrite(sevseg_B, LOW);
digitalWrite(sevseg_D, LOW);
digitalWrite(sevseg_E, LOW);
digitalWrite(sevseg_G, LOW);
break;
case 3:
digitalWrite(sevseg_A, LOW);
digitalWrite(sevseg_B, LOW);
digitalWrite(sevseg_C, LOW);
digitalWrite(sevseg_D, LOW);
digitalWrite(sevseg_G, LOW);
break;
// Bạn có thể thêm các trường hợp cho các số còn lại từ 4 đến 9
}
}
void loop() {
displayLCD(); // Gọi hàm hiển thị LCD
controlLEDs(); // Gọi hàm điều khiển ba đèn LED
// Hiển thị số 1 trên SSD (ví dụ)
displaySevenSegment(1);
delay(1000); // Hiển thị trong 1 giây
}