


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();   }