


Preview text:
lOMoAR cPSD| 58970315
Thực hành 2: Lập trình Arduino với màn hình LCD 1602 Bài 1:
- Nội dung: phát triển thiết bị ếm giờ sử dụng công tắc và màn hình LCD 1602. Khi mới bật
Arduino, màn hình hiển thị nội dung: “Click to start”, èn LED tắt. Khi nhấn vào nút, nội
dung màn hình thay ổi thành: dòng 1: “Click to reset”, dòng 2 hiển thị số ếm ngược từ 10
về 0 theo từng giây. Khi màn hình hiển thị số 0, èn LED ược bật sáng, nội dung dòng 1 của
LCD trở thành “Time over”. Nếu màn hình chưa hiện 0 mà người dùng nhấn nút, thời gian
ược reset về 10, èn tắt và lại tiếp tục ếm ến 0. - Yêu cầu:
o Phần cứng: Arduino UNO, Button, LED, Breadboard, điện trở 220Ω, dây cắm các loại,
Relay 1 kênh, LCD 1602, module I2C cho LCD 1602.
o Kỹ năng lập trình: sử dụng ngắt, điều khiển với button bằng chế độ INPUT PULLUP, xuất
điện thế ra chân digital, điều khiển LCD 1602 qua I2C. - Hướng dẫn: o Sơ đồ gợi ý: Wireframe lOMoAR cPSD| 58970315
Chú ý: kết nối trên thiết bị thật thì chân SCL và SDA của module I2C kết nối lần lượt với A5,A4 của Arduino o Chỉ dẫn lập trình:
Thiết lập chế độ chân D2 phải là INPUT_PULLUP
Sử dụng ngắt khi xử lý button
Thiết bị hoạt động với 3 trạng thái: bắt đầu, đếm và hết giờ. Mỗi trạng thái thiết
bị sẽ có các hàm xử lý riêng biệt -> sử dụng một biến lưu trữ trạng thái + rẽ
nhánh gọi các hàm tương ứng với biến trạng thái.
Thư viện làm việc với màn hình LCD 1602 qua module I2C: LiquidCrystal_I2C.h
Gợi ý (code chạy trên tinkercad, nếu chạy trên thiết bị thật cần sử dụng thư viện
LiquidCrystal_I2C.h thay cho Adafruit_LiquidCrystal.h, chú ý tham khảo code ví dụ
của LiquidCrystal_I2C để thực hiện các lệnh cho LCD1602 ) : // C++ code // #include int seconds = 0;
int state=0;//0: beginning, 1: counting, 2: timeout int countdown=10; int relayPin = 10;
Adafruit_LiquidCrystal lcd_1(0); void nextState() { if (state==0){ state=1; }
if (state==1&&countdown>0){ countdown=10; lOMoAR cPSD| 58970315 } if (state==2){ state=1; countdown=10; } } void handleStart(){ lcd_1.setCursor(0, 0);
lcd_1.print("Click to start"); digitalWrite(relayPin, LOW); } void handleCounting(){
//hiển thị thông báo lên LCD //hiển thị số counting //giảm counting
//kiểm tra nếu counting=0 thì nhảy sang state=2 } void handleTimeout(){ //In thông báo lên LCD
// bật relay bằng cách thiết lập chân relayPin mức HIGH } void setup() { lcd_1.begin(16, 2);
pinMode(10, OUTPUT); pinMode(2, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(2), nextState, FALLING); handleStart(); } void loop() { if(state==0){ handleStart(); } else if(state==1){ handleCounting(); } else
if(state==2){ handleTimeout(); }