ESP32 Đếm Số Lần Nhấn Nút OLED
Trong hướng dẫn này, chúng ta sẽ khám phá ESP32 để đạt được những mục tiêu sau:
Đếm số lần một nút được nhấn.
Hiển thị số đếm trên màn hình OLED.
Thực hiện tự động căn giữa theo chiều dọc và chiều ngang cho số đếm trên màn hình OLED.
Ngoài ra, hướng dẫn này sẽ giải quyết vấn đề debouncing của nút nhấn mà không sử dụng hàm delay(). Để hiểu tại sao debouncing là cần thiết, hãy tham khảo giải thích được cung cấp trong Tại sao chúng ta cần debouncing?.
Hướng dẫn toàn diện này sẽ giúp bạn tích hợp liền mạch chức năng đếm lần nhấn nút, hiển thị OLED, và kỹ thuật debouncing với dự án ESP32 của bạn.
| 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 | × | SSD1306 I2C OLED Display 128x64 | | |
| 1 | × | SSD1306 I2C OLED Display 128x32 | | |
| 1 | × | breadboard | | |
| 1 | × | dây jumper | | |
| 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) | | |
Chưa quen thuộc với OLED và button (nút nhấn), bao gồm pinout, chức năng và lập trình? Khám phá các hướng dẫn toàn diện về những chủ đề này bên dưới:

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.
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <ezButton.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
ezButton button(27);
unsigned long lastCount = 0;
void setup() {
Serial.begin(9600);
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
while (true);
}
delay(2000);
oled.clearDisplay();
oled.setTextSize(2);
oled.setTextColor(WHITE);
oled.setCursor(0, 10);
button.setDebounceTime(50);
button.setCountMode(COUNT_FALLING);
}
void loop() {
button.loop();
unsigned long count = button.getCount();
if (lastCount != count) {
Serial.println(count);
oled.clearDisplay();
oled.println(count);
oled.display();
lastCount != count;
}
}
Thực hiện đấu nối như hình ả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 bo mạch ESP32 phù hợp (ví dụ: ESP32 Dev Module) và cổng COM.
Nhấp vào biểu tượng Libraries trên thanh bên trái của Arduino IDE.
Tìm kiếm "ezButton", sau đó tìm thư viện button của ArduinoGetStarted
Nhấp nút Install để cài đặt thư viện ezButton.
Copy code trên và mở bằng Arduino IDE
Nhấp nút Upload trên Arduino IDE để upload code lên ESP32
Nhấn nút nhiều lần
Xem số đếm thay đổi trên OLED
Code trên chỉ hiển thị số đếm lần nhấn nút ở góc trên bên trái. Hãy sửa đổi code để căn giữa nó!
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <ezButton.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
ezButton button(27);
unsigned long lastCount = 0;
void setup() {
Serial.begin(9600);
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
while (true);
}
delay(2000);
oled.clearDisplay();
oled.setTextSize(2);
oled.setTextColor(WHITE);
oled.setCursor(0, 10);
button.setDebounceTime(50);
button.setCountMode(COUNT_FALLING);
}
void loop() {
button.loop();
unsigned long count = button.getCount();
if (lastCount != count) {
Serial.println(count);
String text = String(count);
oledDisplayCenter(text);
lastCount != count;
}
}
void oledDisplayCenter(String text) {
int16_t x1;
int16_t y1;
uint16_t width;
uint16_t height;
oled.getTextBounds(text, 0, 0, &x1, &y1, &width, &height);
oled.clearDisplay();
oled.setCursor((SCREEN_WIDTH - width) / 2, (SCREEN_HEIGHT - height) / 2);
oled.println(text);
oled.display();
}
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.