Bài 7: Sử dụng nút nhấn để bật tắt đèn Led (Digital In + Digital Out)

Danh sách thiết bị

Mô tả dự án

_ Trong bài này, bạn sẽ cần sử dụng kết hợp kiến thức học từ những bài trước, như cách sử dụng nút nhấn, cách điều khiển đèn Led.

_ Để làm một ứng dụng có chức năng giống đèn cầu thang, cho phép bạn bật tắt đèn bằng nút nhấn, thay vì dùng công tắc gạt như thông thường.

Các bước thực hiện

Tạo code

  1. Mở phần mềm IDE Arduino và tạo một Sketch mới.
  2. Copy đoạn code sau vào file dự án.
// Chọn tốc độ truyền dữ liệu qua cổng Serial
#define BAUDRATE 115200 // Đơn vị bps (Bits Per Second)

// Chọn chân điều khiển đèn Led
#define LED_PIN 9 // D9

// Chọn mức tín hiệu để điều khiển đèn Led
#define ON_LED HIGH // Digital xuất HIGH để ON Led
#define OFF_LED LOW // Digital xuất LOW để OFF Led

// Chọn chân đọc tín hiệu Nút nhấn
#define BUTTON_PIN 10 // D10

// Chọn mức tín hiệu đọc từ Nút nhấn với trạng thái tương ứng
#define PRESS_BUTTON LOW    // Khi "nhấn nút" tín hiệu đọc được là LOW
#define RELEASE_BUTTON HIGH // Khi "nhả nút" tín hiệu đọc được là HIGH

// Chọn khoảng thời gian Nút nhấn có thể xảy ra "Debounce" để bỏ qua
#define TIME_DEBOUNCE 10 // Đơn vị (ms)

/* ----------------------------------------------------- */

// Lưu trữ trạng thái hiện tại của đèn Led (ON hoặc OFF)
bool stateLed = OFF_LED;

/* ----------------------------------------------------- */

void setup()
{
  // Mở cổng Serial Baudrate 115200 bps
  Serial.begin(BAUDRATE);

  // Thiết lập chân D9 là Output để điều khiển Led
  pinMode(LED_PIN, OUTPUT);
  // Khi mới khởi động, tắt Led
  digitalWrite(LED_PIN, OFF_LED);
}

/* ----------------------------------------------------- */

void loop()
{
  // Nghi vấn nút đang được "nhấn" ?
  if (digitalRead(BUTTON_PIN) == PRESS_BUTTON)
  {
    // Chờ qua khoảng thời gian có thể xảy ra "Debounce"
    delay(TIME_DEBOUNCE);

    // Xác thực chắc chắn nút đang được "nhấn"
    if (digitalRead(BUTTON_PIN) == PRESS_BUTTON)
    {
      while (digitalRead(BUTTON_PIN) == PRESS_BUTTON)
      {
        /* Chờ cho đến khi "nhả" nút */
      }

      // Đây là 1 Click ... cho đảo trạng thái Led
      stateLed = !stateLed;
      digitalWrite(LED_PIN, stateLed);
      // In thông tin trạng thái của Led
      if (stateLed == ON_LED)
      {
        Serial.println("ON Led");
      }
      else
      {
        Serial.println("OFF Led");
      }
      Serial.println("--- --- ---");
    }
  }
}

Giải thích code

Quá trình vận hành của chương trình như sau:

  • Bo mạch sẽ kiểm tra liên tục tín hiệu trên nút nhấn.
  • Bình thường khi nút không được nhấn, tín hiệu đọc được luôn là HIGH, bo mạch sẽ không làm gì cả.
  • Lúc này, chỉ cần bo mạch phát hiện nút được nhấn, tín hiệu đọc được là LOW.
  • Bo sẽ chờ qua khoảng "Debounce", sau đó kiểm tra lại một lần nữa có đúng là nút đang được nhấn hay không?
  • Nếu nút không được nhấn, thì bo không làm gì cả, bởi vì đây chỉ là nhiễu.
  • Ngược lại, bo tiếp tục kiểm tra liên tục nút nhấn, chờ cho đến khi nào phát hiện nút được "nhả ra", mới cho điều khiển đảo trạng thái của đèn Led.
  • Nếu đèn đang sáng thì tắt đèn, và ngược lại. Đồng thời cho gửi thông báo lên Serial.

Sơ đồ kết nối

MakerEDU Shield Thiết bị
Port D10 [MKE-M02] - Nút nhấn
Port D9 [MKE-M01] - Led 10mm

Nạp code

  1. Kết nối Module Nút nhấn đến Port D10 của MakerEdu Shield.
  2. Kết nối Module Led đến Port D9 của MakerEdu Shield.
  3. Dùng cáp USB-C kết nối giữa bo Vietduino Uno và máy tính.
  4. Vào mục Tools... thiết lập các cấu hình cho đúng với bo Vietduino Uno đang dùng.
  5. Nhấn vào "nút →" hoặc phím tắt [Ctrl+U] để nạp code cho bo mạch.

Kết quả

  1. Sau khi đã nạp code thành công, bạn có thể thao tác trên nút nhấn và xem kết quả trực tiếp qua Led.
  2. Hoặc mở Serial Monitor, nhấn phím tắt [Ctrl+Shift+M], để xem tiến trình hoạt động của bo mạch.
  3. Lưu ý, bạn cần phải chọn đúng 115200 baud mới xem được dữ liệu bo mạch gửi lên.

Bài tập thêm (nâng cao)

  • Bài tập 1 ★★☆☆☆:
    Viết chương trình, khi bạn "nhấn giữ" nút đèn sẽ bật, và khi "nhả" nút đèn sẽ tắt.
  • Bài tập 2 ★★★★☆:
    Viết chương trình, cũng có tính năng bật tắt đèn, nhưng được nâng cấp thêm tính năng: cài đặt độ sáng đèn Led bạn muốn mỗi khi bật Led.
    _ Bằng cách "giữ đè nút", lúc này bo sẽ vào chế độ cài đặt, làm liên tục thay đổi tăng giảm cường độ sáng Led. Khi tới mức độ sáng bạn muốn, hãy "nhả nút" để bo lưu lại giá trị này.
    _ Mỗi khi bạn thao tác 1 Click để bật hoặc tắt đèn. Khi đó, đèn Led sẽ bật ở độ sáng mà bạn đã chọn.
    Gợi ý: nếu mình chọn khoảng thời gian thay đổi trạng thái là 250ms.
    _ Thì khi thao tác từ lúc nhấn nút đến lúc nhả nút, nếu chưa tới 250ms được xem là [1 Click].
    _ Và ngược lại, kể từ lúc được nhấn nút đến hiện tại vẫn chưa nhả nút, mà đã hơn 250ms thì xem là đang [Hold Click].

Nguồn tài liệu (tham khảo thêm)