Skip to main content

button

Buzzer circuit diagram Buzzer circuit diagram Buzzer circuit diagram

上拉/下拉按键示例 示例功能: 综合板中已经集成了4个按键,其中2个硬件添加了上拉,另外2个按键添加了下拉。同时读取按键的数值会得出2种不同的结果。根据测试情况,我们了解上拉和下拉的作用。 硬件连接: 上拉按键模块——GPIO12
下拉按键模块——GPIO14

特征对比:

对比项外部上拉按键外部下拉按键
抗干扰能力高(默认 HIGH 不易受地噪声影响)中(默认 LOW 易受地弹跳干扰)
适用场景- 按键与控制器共地
- 长导线连接
- 按键与控制器共电源
- 短距离布线

进阶学习:

  1. 软件程序中添加上拉、下拉测试。
  2. 按键(软件)防抖。
#define EXT_PULLUP_BUTTON   12   // 外部上拉按键引脚
#define EXT_PULLDOWN_BUTTON 11 // 外部下拉按键引脚

// 保存按键前一次状态的变量
bool prevExtPullUpState = HIGH; // 上拉按键初始为高电平(未按下)
bool prevExtPullDownState = LOW; // 下拉按键初始为低电平(未按下)

void setup() {
Serial.begin(115200);

// 引脚模式配置(高阻态输入)
pinMode(EXT_PULLUP_BUTTON, INPUT);
pinMode(EXT_PULLDOWN_BUTTON, INPUT);
}

void loop() {
// 读取当前电平状态
bool extPullUpState = digitalRead(EXT_PULLUP_BUTTON);
bool extPullDownState = digitalRead(EXT_PULLDOWN_BUTTON);

// 检测上拉按键的下降沿(按下时从高变低)
if (extPullUpState == LOW && prevExtPullUpState == HIGH) {
delay(50); // 防抖延时
extPullUpState = digitalRead(EXT_PULLUP_BUTTON); // 重新确认状态
if (extPullUpState == LOW) {
Serial.println("[外部上拉按键] 触发:从高电平被拉低至GND");
}
}
prevExtPullUpState = extPullUpState; // 更新状态记录

// 检测下拉按键的上升沿(按下时从低变高)
if (extPullDownState == HIGH && prevExtPullDownState == LOW) {
delay(50); // 防抖延时
extPullDownState = digitalRead(EXT_PULLDOWN_BUTTON);
if (extPullDownState == HIGH) {
Serial.println("[外部下拉按键] 触发:从低电平被拉高至3.3V");
}
}
prevExtPullDownState = extPullDownState; // 更新状态记录

delay(100); // 主循环延时以减少频繁检测
}

范例,通过OLED屏幕显示上下拉按键输出的电压


#include <U8g2lib.h>
#include <Wire.h>

// 使用软件 I2C 构造函数,指定 SCL 为 GPIO5、SDA 为 GPIO4,复位引脚未使用
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, 43, 44, U8X8_PIN_NONE);

// 定义电位器连接的 ADC 引脚(IO13)
const int potPin = 13;

void setup(){
Serial.begin(115200);

// 设置 OLED 显示屏的 I2C 地址(0x3C 左移一位)
u8g2.setI2CAddress(0x3C * 2);
u8g2.begin();
// 启用 UTF8 支持,确保中文能正确显示
u8g2.enableUTF8Print();

// 可选:设置 ADC 读取分辨率为 12 位(ESP32 默认即为 12 位)
analogReadResolution(12);
}

void loop(){
// 从电位器对应的引脚读取 ADC 数值,范围 0~4095
int adcValue = analogRead(potPin);

// 将 ADC 数值转换为电压值:0~4095 对应 0~3.3V
float voltage = adcValue * (3.3 / 4095.0);

// 将 ADC 数值映射到 0~270 度范围
float angle = (adcValue * 270.0) / 4095.0;

// 开始分块绘图,逐页更新显示内容
u8g2.firstPage();
do {
// 第一行:显示电位器 ADC 数值(使用支持中文的 12 点字体)
u8g2.setFont(u8g2_font_wqy12_t_gb2312);
u8g2.setFontPosTop();
u8g2.setCursor(0, 4);
u8g2.print("模拟量数值: ");
u8g2.print(adcValue);

// 第二行:显示电压值(使用支持中文的 16 点字体)
u8g2.setFont(u8g2_font_wqy16_t_gb2312);
u8g2.setCursor(0, 24);
u8g2.print("电压: ");
u8g2.print(voltage, 2); // 保留两位小数
u8g2.print("V");

// 第三行:显示对应的角度(使用支持中文的 16 点字体)
u8g2.setCursor(0, 44);
u8g2.print("角度: ");
u8g2.print(angle, 1); // 保留一位小数
u8g2.print("°");

} while(u8g2.nextPage());

// 延时 5 毫秒,降低刷新频率,便于观察数值变化
delay(5);
}