#include <U8g2lib.h>
#ifdef U8X8_USE_HW_SPI
#include <U8x8_spi.h>
#endif
#ifdef U8X8_USE_HW_I2C
#include <U8x8_i2c.h>
#endif
// SSD1306 OLED显示屏配置(通过I2C接口)
U8G2_SSD1306_128X64_NONAME_I2C_2_SW_SPI u8g2(U8G2_R0, /* clock=*/ 21, /* data=*/ 22, /* reset=*/ U8X8_PIN_NONE);
#define LED_LEFT 26 // 假设LED_LEFT连接到GPIO 2
#define LED_RIGHT 5 // 假设LED_RIGHT连接到GPIO 4
#define BUTTON_LEFT 25 // 假设BUTTON_LEFT连接到GPIO 12
#define BUTTON_RIGHT 33 // 假设BUTTON_RIGHT连接到GPIO 13
#define BUTTON_BOTH 18 // 假设BUTTON_BOTH连接到GPIO 14
// 假设按钮连接方式为低电平有效(即按下时连接到GND)
#define BUTTON_PRESSED LOW
// 初始化按钮引脚为输入模式,并启用内部上拉电阻
void initButtons() {
pinMode(BUTTON_LEFT, INPUT_PULLUP);
pinMode(BUTTON_RIGHT, INPUT_PULLUP);
pinMode(BUTTON_BOTH, INPUT_PULLUP);
}
// 检查按钮是否被按下
bool isButtonPressed(int buttonPin) {
return digitalRead(buttonPin) == BUTTON_PRESSED;
}
void setup() {
pinMode(LED_LEFT, OUTPUT);
pinMode(LED_RIGHT, OUTPUT);
initButtons();
// 初始化OLED显示屏
u8g2.begin();
u8g2.clearBuffer(); // 清除屏幕缓冲区
u8g2.setFont(u8g2_font_ncenB10_tr); // 选择字体
u8g2.drawStr(0, 20, "Ready"); // 在屏幕上显示"Ready"
u8g2.sendBuffer(); // 发送缓冲区到OLED显示屏
}
void loop() {
// 检查左按钮是否被按下
if (isButtonPressed(BUTTON_LEFT)) {
// 左闪和屏幕显示L
digitalWrite(LED_LEFT, HIGH);
digitalWrite(LED_RIGHT, LOW);
u8g2.clearBuffer();
u8g2.drawStr(0, 20, "L");
u8g2.sendBuffer();
delay(500); // 亮灯时间
digitalWrite(LED_LEFT, LOW);
u8g2.clearBuffer();
u8g2.sendBuffer(); // 清除屏幕内容
delay(500); // 灭灯时间
// 等待按钮释放
while (isButtonPressed(BUTTON_LEFT)) {
delay(10); // 防止代码在此处阻塞
}
}
// 检查右按钮是否被按下(代码类似左按钮)
// ...
// 检查双闪按钮是否被按下(代码类似,但LED和屏幕显示不同)
// ...
// 如果没有按钮被按下,可以在这里添加其他逻辑或休眠以减少CPU使用率
delay(10); // 稍微延迟一下,减少CPU占用
}