ESP32 Button (Nút Nhấn)

Button (nút nhấn) là một linh kiện cơ bản và được sử dụng rộng rãi trong nhiều dự án ESP32. Nó không đơn giản như vẻ ngoài (do đặc tính cơ học, vật lý). Người mới bắt đầu có thể gặp nhiều khó khăn với nó. Hướng dẫn này sẽ làm cho nó trở nên dễ dàng cho người mới bắt đầu. Hãy bắt đầu!

※ Lưu ý:

Trước khi trình bày về button, chúng tôi muốn lưu ý rằng có hai lỗi phổ biến mà người mới thường gặp:

  1. Vấn đề floating input (chân vào trôi nổi):
    • Triệu chứng: Khi kết nối button với chân input của ESP32, trạng thái của chân input là ngẫu nhiên và không khớp với trạng thái nhấn của button.
    • Nguyên nhân: Chân button KHÔNG sử dụng điện trở pull-down hoặc điện trở pull-up.
    • Giải pháp: ⇒ Sử dụng điện trở pull-down hoặc điện trở pull-up trên chân input. Chi tiết sẽ được mô tả sau trong hướng dẫn này.
  • Hiện tượng chattering (rung lắc)
    • Triệu chứng: Code trên ESP32 đọc trạng thái của button và xác định sự kiện nhấn bằng cách phát hiện sự thay đổi trạng thái (HIGH sang LOW, hoặc LOW sang HIGH). Khi button thực sự chỉ được nhấn một lần, code ESP32 phát hiện nhiều lần nhấn thay vì một lần.
    • Nguyên nhân: Do đặc tính cơ học và vật lý, khi bạn nhấn một lần vào button, trạng thái của chân input sẽ nhanh chóng chuyển đổi giữa LOW HIGH nhiều lần thay vì một lần
    • Giải pháp: ⇒ Debounce. Chi tiết sẽ được mô tả trong hướng dẫn ESP32 - Nút Nhấn - Debounce.

    Hiện tượng chattering gây ra trục trặc chỉ trong một số loại ứng dụng cần phát hiện chính xác số lần nhấn. Trong một số loại ứng dụng, nó không có hại.

    Phần cứng cần chuẩn bị

    1×mô-đun phát triển ESP-WROOM-32
    1×Alternatively, ESP32 Uno-form board
    1×Alternatively, ESP32 S3 Uno-form board
    1×USB Cable Type-A to Type-C (for USB-A PC)
    1×USB Cable Type-C to Type-C (for USB-C PC)
    1×breadboard-mount Button with Cap
    1×breadboard-mount Button Kit
    1×Panel-mount Push Button
    1×mô-đun nút nhấn
    1×breadboard (Bo mạch thí nghiệm)
    1×dây jumper (Dây jumper)
    1×(Tùy chọn) DC Power Jack
    1×(Khuyến nghị) Screw Terminal Expansion Board for ESP32
    1×(Khuyến nghị) Breakout Expansion Board for ESP32
    1×(Khuyến nghị) Power Splitter for ESP32

    Or you can buy the following kits:

    1×DIYables ESP32 Starter Kit (ESP32 included)
    1×DIYables Sensor Kit (30 sensors/displays)
    1×DIYables Sensor Kit (18 sensors/displays)

    Về Button (Nút Nhấn)

    Push button, còn được gọi là pushbutton, tactile button, hoặc momentary switch, là một loại công tắc đóng khi được nhấn và giữ, và mở khi được thả ra. Có nhiều loại push button khác nhau, được phân loại rộng rãi thành hai nhóm:

    • PCB-mount push button (phù hợp cho lắp trên breadboard)
    • Panel-mount push button
    ESP32 push nút nhấn

    Button Pinout

    Button gắn PCB thường có bốn chân được kết nối nội bộ thành từng cặp.

    nút nhấn sơ đồ chân

    Chúng ta chỉ cần sử dụng hai trong bốn chân, là những chân KHÔNG nằm trong cùng một cặp kết nối. Theo đó, có bốn cách để kết nối dây với button (xem hình bên dưới)

    how to use nút nhấn

    Thực tế, do tính đối xứng, bốn cách này trở thành hai cách. Phần còn lại của hướng dẫn này sẽ sử dụng hai chân: Pin A và Pin B không được kết nối với nhau.

    Tại sao button có bốn chân trong khi chúng ta chỉ cần hai chân?

    ⇒ Button nhận lực từ người dùng. Để làm cho nó đứng ổn định và chắc chắn trong PCB (bo mạch), nó có bốn chân để chống lại lực nhấn.

    Button gắn panel thường có hai chân.

    two-pin push nút nhấn sơ đồ chân
    image source: diyables.io

    Push button module bao gồm điện trở pull-down tích hợp, đảm bảo rằng đầu ra vẫn ở mức LOW khi button không được nhấn. Nó có ba chân:

    • GND: Kết nối chân này với ground.
    • VCC: Kết nối chân này với nguồn điện 3.3V.
    • OUT: Kết nối chân này với digital input trên ESP32 của bạn.

    Với cấu hình này, module xuất ra LOW khi button không được nhấn và xuất ra HIGH khi button được nhấn.

    Cách Button Hoạt Động

    • Khi button được nhấn, pin A được kết nối với pin B
    • Khi button KHÔNG được nhấn, pin A KHÔNG được kết nối với pin B
    how nút nhấn works

    ESP32 - Button

    Một chân của button được kết nối với chân digital input của ESP32. Chân còn lại được kết nối với VCC hoặc GND. Trong code ESP32, bằng cách đọc trạng thái của chân input, chúng ta có thể suy ra button được nhấn hay KHÔNG.

    Trạng Thái Input và Trạng Thái Nhấn

    Mối quan hệ giữa trạng thái của chân input và trạng thái nhấn của button phụ thuộc vào cách chúng ta kết nối button với ESP32 và thiết lập của chân ESP32. Có hai cách sử dụng button với ESP32:

    1. Một chân của button được kết nối với chân digital input của ESP32, chân còn lại được kết nối với VCC:
      • Điện trở pull-down PHẢI được sử dụng
      • Nếu button được nhấn, trạng thái chân ESP32 là HIGH. Ngược lại, trạng thái chân ESP32 là LOW
  • Một chân của button được kết nối với chân digital input của ESP32, chân còn lại được kết nối với GND:
    • Điện trở pull-up PHẢI được sử dụng
    • Nếu button được nhấn, trạng thái chân ESP32 là LOW. Ngược lại, trạng thái chân ESP32 là HIGH

    ※ Lưu ý:

    Nếu không sử dụng điện trở pull-down hoặc điện trở pull-up, trạng thái của chân input sẽ ngẫu nhiên giữa HIGH hoặc LOW (không ổn định, không cố định) khi button KHÔNG được nhấn. Điều này được gọi là "floating input problem". Điều này dẫn đến trục trặc.

    Để làm cho nó đơn giản cho người mới, hướng dẫn này rất khuyến khích người mới sử dụng điện trở pull-up nội bộ cho chân ESP32. Không cần điện trở bên ngoài. Điều này tiết kiệm phần cứng, đơn giản hóa sơ đồ kết nối.

    Sơ Đồ Kết Nối giữa Button và ESP32

    • Sơ đồ kết nối giữa ESP32 và PCB-mount button
    ESP32 nút nhấn sơ đồ đấu dây

    This image is created using Fritzing. Click to enlarge image

    Nếu bạn chưa rõ cách cấp nguồn cho ESP32 và các linh kiện khác, xem: Cách Cung Cấp Nguồn Điện Cho ESP32.

    • Sơ đồ kết nối giữa ESP32 và panel-mount button
    ESP32 two-pin push nút nhấn sơ đồ đấu dây

    This image is created using Fritzing. Click to enlarge image

    Cách Lập Trình Button

    • Khởi tạo chân ESP32 như một input pull-up nội bộ bằng cách sử dụng hàm pinMode(). Ví dụ, chân GPIO21:
    pinMode(21, INPUT_PULLUP); // cấu hình GPIO21 như chân input và bật điện trở pull-up nội bộ
    • Đọc trạng thái của chân input bằng cách sử dụng hàm digitalRead().
    int buttonState = digitalRead(BUTTON_PIN);

    ※ Lưu ý:

    Có hai trường hợp sử dụng phổ biến:

    • Trường hợp đầu tiên: Nếu trạng thái input là HIGH, làm gì đó. Nếu trạng thái input là LOW, làm việc khác.
    • Trường hợp thứ hai: Nếu trạng thái input thay đổi từ LOW sang HIGH, làm gì đó. Nếu trạng thái input thay đổi từ HIGH sang LOW, làm việc khác.

    Tùy thuộc vào ứng dụng, một trong số chúng được sử dụng. Ví dụ, trong trường hợp sử dụng button để điều khiển LED:

    • Nếu chúng ta muốn bật LED khi button được nhấn và tắt nó khi button KHÔNG được nhấn, chúng ta NÊN sử dụng trường hợp đầu tiên.
    • Nếu chúng ta muốn chuyển đổi LED giữa ON OFF mỗi lần button được nhấn, chúng ta NÊN sử dụng trường hợp thứ hai.

    Code ví dụ bên dưới cho thấy cách phát hiện sự thay đổi trạng thái từ LOW sang HIGH

    #define BUTTON_PIN 21 // chân GPIO21 kết nối với button // Các biến sẽ thay đổi: int lastState = HIGH; // trạng thái trước đó từ chân input int currentState; // giá trị đọc hiện tại từ chân input void setup() { Serial.begin(9600); // khởi tạo chân pushbutton như một pull-up input pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // đọc trạng thái của switch/button: currentState = digitalRead(BUTTON_PIN); if(lastState == LOW && currentState == HIGH) Serial.println("The state changed from LOW to HIGH"); // lưu trạng thái cuối cùng lastState = currentState; }

    ESP32 Code

    Các Bước Nhanh

    • Mới sử dụng ESP32? Hãy xem ESP32 - Cài Đặt Phần Mềm.
    • Thực hiện kết nối dây như hình trên.
    • Kết nối bo mạch ESP32 với PC của bạn qua cáp micro USB
    • Mở Arduino IDE trên PC của bạn.
    • Chọn đúng bo mạch ESP32 (ví dụ: ESP32 Dev Module) và cổng COM.
    • Sao chép code bên dưới và dán vào Arduino IDE.
    #define BUTTON_PIN 21 // GIOP21 pin connected to button void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); // initialize the pushbutton pin as an pull-up input // the pull-up input pin will be HIGH when the switch is open and LOW when the switch is closed. pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: int buttonState = digitalRead(BUTTON_PIN); // print out the button's state Serial.println(buttonState); }
    • Biên dịch và upload code lên bo mạch ESP32 bằng cách nhấp vào nút Upload trên Arduino IDE
    how to upload ESP32 code on Arduino ide
    • Mở Serial Monitor trên Arduino IDE
    how to open serial monitor on Arduino ide
    • Nhấn và thả button nhiều lần
    • Xem kết quả trên Serial Monitor. Nó sẽ như bên dưới:
    COM6
    Send
    1 1 1 0 0 0 0 0 0 1 1 1
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    1 là HIGH, 0 là LOW.

    Giải Thích Code Từng Dòng

    Code ESP32 trên có chứa giải thích từng dòng. Hãy đọc các comments trong code!

    Chỉnh Sửa ESP32 Code

    Hãy chỉnh sửa code để phát hiện các sự kiện nhấn và thả

    Các Bước Nhanh

    /* * Mã ESP32 này được phát triển bởi newbiely.vn * Mã ESP32 này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/esp32/esp32-button */ #define BUTTON_PIN 21 // GIOP21 pin connected to button // Variables will change: int lastState = LOW; // the previous state from the input pin int currentState; // the current reading from the input pin void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); // initialize the pushbutton pin as an pull-up input // the pull-up input pin will be HIGH when the switch is open and LOW when the switch is closed. pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: currentState = digitalRead(BUTTON_PIN); if (lastState == HIGH && currentState == LOW) Serial.println("The button is pressed"); else if (lastState == LOW && currentState == HIGH) Serial.println("The button is released"); // save the the last state lastState = currentState; }
    • Biên dịch và upload code lên bo mạch ESP32 bằng cách nhấp vào nút Upload trên Arduino IDE
    tải mã lên Arduino IDE
    • Mở Serial Monitor trên Arduino IDE
    how to open serial monitor on Arduino ide
    • Nhấn button và sau đó thả ra
    • Xem kết quả trên Serial Monitor. Nó sẽ như bên dưới:
    COM6
    Send
    The button is pressed The button is released
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    ※ Lưu ý:

    • Serial Monitor có thể in ra nhiều sự kiện nhấn và thả mặc dù bạn chỉ thực hiện một lần nhấn và thả. Đây là hành vi bình thường của button. Hành vi này được gọi là "chattering phenomenon" (hiện tượng rung lắc). Trong một số ứng dụng, chúng ta cần một phương pháp để loại bỏ nó. Bạn có thể tìm hiểu thêm trong ESP32 - Button Debounce tutorial.
    • Để làm cho nó đơn giản cho người mới bắt đầu, đặc biệt khi sử dụng nhiều button, chúng tôi đã tạo ra một thư viện gọi là ezButton. Bạn có thể tìm hiểu về thư viện ezButton ở đây.
    • Đối với button module, sử dụng pinMode(BUTTON_PIN, INPUT). Nó xuất ra LOW khi không nhấn và HIGH khi nhấn.

    Video Tutorial

    Việc sản xuất video tốn rất nhiều thời gian. Nếu video hướng dẫn hữu ích cho việc học của bạn, hãy đăng ký kênh YouTube để ủng hộ. Nếu nhu cầu đủ cao, chúng tôi sẽ cố gắng làm thêm nhiều video.

    Kiến Thức Bổ Sung

    Khi nào nên và KHÔNG nên sử dụng điện trở pull-down/pull-up?
    • NÊN: Nếu cảm biến có hai trạng thái: đóng và mở, nó cần điện trở pull-up hoặc pull-down để làm cho các trạng thái này trở thành hai trạng thái: LOW HIGH. Ví dụ, push-button, switch, magnetic contact switch (cảm biến cửa)...
    • KHÔNG NÊN: Nếu cảm biến xuất ra hai mức điện áp (LOW HIGH), nó KHÔNG cần điện trở pull-up hoặc pull-down. Ví dụ, ESP32 - Cảm biến chuyển động, ESP32 - Touch Sensor (Cảm Biến Cảm Ứng)...

    Tài Liệu Tham Khảo Ngôn Ngữ