首页 动态 版块 商城 我的
 退出
游客  
等级:
金币:
经验值:

GPIO的输入与输出 树莓派Pico与ESP32开发板输出输入例程【入门教程】

  6149 
 0
RASPI   ydxhuo.com 

Image


一:GPIO引脚输入与输出

GPIO(全称:General Purpose Input/Output,通用输入/输出) 是微控制器单片机(如 ESP32、树莓派、STM32等)与外部电路交互的核心通道。每个 GPIO 引脚都可以被编程配置为输入输出模式。


1. 输出模式(Output Mode)

芯片内部通过电路控制引脚输出高电平(1,通常为 3.3V)或低电平(0,即 0V/GND)。


推挽输出(Push-Pull): 最常用的模式,能主动输出高电平或低电平,适合驱动 LED、继电器、发送数字逻辑信号等。


开漏输出(Open-Drain): 引脚只能主动拉低,高电平靠外部上拉电阻拉高。常用于线与逻辑(如 I2C)或电平匹配。


2. 输入模式(Input Mode)

芯片通过内部检测引脚当前的电平状态,将其读取为数字信号(高电平为 1,低电平为 0)。


浮空输入(Floating): 引脚内部不接任何电阻。若外部悬空,易受环境电磁干扰,导致读取到的电平随机抖动。


上拉输入(Pull-Up): 内部接一个上拉电阻到 VCC。当外部无输入时,默认读取为高电平。适合接按键(按键另一端接地,按下时变为低电平)。


下拉输入(Pull-Down): 内部接一个下拉电阻到 GND。当外部无输入时,默认读取为低电平。适合接按键(按键另一端接 VCC,按下时变为高电平)。

二:Pico引脚输出/输入

1.引脚输出输入

在此示例中,使用 Pico 的 GP15 作为输入读取按键状态,使用 GP25(Pico 板载板载 LED)作为输出进行指示:当按键按下时(检测到低电平),点亮 LED。让我们从最基础的输出例子开始:使用输出电压来控制一颗 LED亮灭。

from machine import Pin
import time

# 配置 GPIO 25 为输出(控制 Pico 板载 LED)
led = Pin(25, Pin.OUT)

# 配置 GPIO 15 为输入,使能内部上拉电阻
# 按键接法:按键一端接 GP15,另一端接 GND
# 未按下时读到高电平(1),按下时被拉低读到低电平(0)
button = Pin(15, Pin.IN, Pin.PULL_UP)

while True:
    # 读取按键引脚状态
    btn_state = button.value()
    
    if btn_state == 0:  # 按键被按下(接地,低电平)
        led.value(1)    # 点亮 LED
        print("按键已按下,LED 点亮")
    else:
        led.value(0)    # 熄灭 LED
        
    time.sleep(0.05)    # 50ms 简单消抖与延时


代码说明:

首先导入必要的模块:Pin 用于引脚控制,time 用于延时

创建 Pin 对象,指定引脚号(GP0)和模式(输出)

在无限循环中:

使用 value(1) 使引脚输出高电平,点亮 LED

延时 1 秒

使用 value(0) 使引脚输出低电平,熄灭 LED

再延时 1 秒


2.读取按键输入状态

接下来我们学习如何读取数字输入,以读取A按键(GP22)输入为例,当按下时输入信号显示按键成功!

Image

from machine import Pin
import time

# 初始化GP22为输入模式,并启用内部上拉电阻
# 这样未按下时为高电平(1),按下时为低电平(0)
button_pin = Pin(22, Pin.IN, Pin.PULL_UP)

# 用于记录按键状态,避免重复触发
last_state = 1
debounce_time = 0.05  # 50ms防抖时间

print("等待按键触发...")

while True:
    # 读取当前引脚状态
    current_state = button_pin.value()
    
    # 检测到从高电平变为低电平(按键按下)
    if current_state == 0 and last_state == 1:
        print("按键成功")
        # 短暂延时防抖
        time.sleep(debounce_time)
    
    # 更新上一次状态
    last_state = current_state
    
    # 短暂延时,降低CPU占用
    time.sleep(0.01)
    

显示效果:

Image


代码说明:

引脚初始化:

我们将 GP22 配置为输入模式 Pin.IN

使用 Pin.PULL_UP 启用内部上拉电阻,这样在没有外部信号时,引脚会保持高电平

防抖处理:

加入了 50ms 的防抖时间 debounce_time,避免机械按键的抖动导致误触发

通过比较当前状态和上一次状态,只在状态变化时响应

检测逻辑:

当引脚从高电平 (1) 变为低电平 (0) 时,判定为按键按下

此时在终端打印 "按键成功" 的消息

低功耗考虑:

循环中加入了 10ms 的短暂延时,既保证了响应速度,又不会过度占用 CPU

你可以通过 Thonny IDE 运行这个程序,并在 Shell 窗口中看到 "按键成功" 的提示信息。如果需要,还可以在此基础上添加 LED 指示功能,让按键成功时 LED 点亮。


三:ESP32引脚输出/输入

在下面示例中,使用 ESP32 的 GPIO 18 作为输入读取按键状态,使用 GPIO 2(大部分 ESP32 开发板的板载 LED)作为输出:当按键按下时,点亮 LED。

#include <Arduino.h>

// 定义引脚编号
const int LED_PIN = 2;     // ESP32 板载 LED
const int BUTTON_PIN = 18; // 外部按键连接引脚

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

  // 配置 LED 引脚为输出模式
  pinMode(LED_PIN, OUTPUT);

  // 配置按键引脚为上拉输入模式 (Input with Internal Pull-Up)
  // 按键接法:一端接 GPIO 18,另一端接 GND
  pinMode(BUTTON_PIN, INPUT_PULLUP);
}

void loop() {
  // 读取 GPIO 18 的数字电平 (HIGH/1 或 LOW/0)
  int buttonState = digitalRead(BUTTON_PIN);

  if (buttonState == LOW) { // 按键被按下(导通到 GND)
    digitalWrite(LED_PIN, HIGH); // 输出高电平,点亮 LED
    Serial.println("按键已被按下,LED 亮");
  } else {
    digitalWrite(LED_PIN, LOW);  // 输出低电平,熄灭 LED
  }

  delay(50); // 50ms 延时
}



作者签名: www.ydxhuo.com   楼主  2024-07-09 12:57:39
回复列表
Powered by YDXHUO _VERSION
© 2017-2026 跃动芯火版权
您的IP: 216.73.216.31 , 2026-08-12 18:59:38
Powered by YDXHUO _VERSION
© 2017-2026 跃动芯火版权
(12) 分享
分享

请保存二维码或复制链接进行分享

取消
免责声明
1、本站资源,均来自网络与个人作者,所有资源和文章仅限用于学习和研究目的 。
2、不得用于商业或非法用途,否则,一切责任由该用户承担 !

侵权删除请致信 E-Mail:ydxho@qq.com
已有0次打赏