树莓派开发笔记(五):GPIO引脚介绍和GPIO的输入输出使用(驱动LED灯、检测按键)

简介: 树莓派开发笔记(五):GPIO引脚介绍和GPIO的输入输出使用(驱动LED灯、检测按键)

若该文为原创文章,未经允许不得转载

原博主博客地址:https://blog.csdn.net/qq21497936

原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062

本文章博客地址:https://blog.csdn.net/qq21497936/article/details/79758560

各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究

红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中...(点击传送门)

树莓派开发专栏(点击传送门)

上一篇:《树莓派开发笔记(四):更便捷的开发,qt远程运行(主机qt开发一键远程运行到目标机上)

下一篇:《树莓派开发笔记(六):GPIO口的UART的使用(串口通讯)

 

前话

搭建好完整的Qt开发环境,对于开发Qt应用按照正常的开发即可,操作io口涉及到单片机硬件知识,本篇介绍树莓派类似于单片机的GPIO口使用(硬件+软件)。

 

树莓派GPIO口硬件资源介绍

引脚分布和功能图

统计下硬件资源

  • GPIO引脚 x 26
  • UART总线 x 1
  • SPI总线 x 1
  • I2C总线 x 1
  • 5V x 2
  • 3.3V x 2
  • GND x 8

 

模块化代码

我们模块化代码,写一个引脚输出的程序,以后需要类似直接修改引脚编号(或枚举)即可。

引入libwiringPi库。

 

关于wiringPi库

在qt中控制GPIO主要是使用wiring,树莓派已自带,我们查询树莓派的物理引脚与wiringPi库的编号对应表,如下图:

如果我们要操作GPIO2,对应的物理引脚为3,如下图:

我们操作引脚的时候,引脚序号就为8(wPI),当前模式为输出,V代表的是当前的输入电压,1:3.3V,0:0V。

更详细的具体参照Demo1理解。

同时,我们在工程中要加入对应的头文件和库,如何调用wiringPi,请参照具体例程。

 

Demo1:GPIO口的输出

使用物理引脚3,默认功能为GPIO2,我们使用GPIO2驱动LED,此时涉及到硬件知识,树莓派的GPIO口的输出电压为3.3V,所以先设置GPIO为输出高低电平,间隔1s,因为是测试,不使用限流电阻。

限流电阻解释下:电路VCC--->电阻R--->LED--->GND,LED分压为固定的,VCC减去LED压降后得到的电压除以电阻R则是该条电路的电流,所以电阻决定了电流大小,故称之为限流电阻,一般的GPIO口都对电流有要求,例如stm32的单个GPIO口不超过25mA,总的电流也有限制,所以在开发的过程中,需要根据实际情况设计电路原理图。

电路原理图

跳线的电路原理图如下:

关键代码

初始化

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    _gpioOut.init(GpioOut::GPIO2, false);
    ui->label_gpio2->setStyleSheet(QString("background-color: %1").arg("green"));
    startTimer(1000);
}

每1s钟切换

void MainWindow::timerEvent(QTimerEvent *event)
{
    if(_gpioOut.readOutput(GpioOut::GPIO2))
    {
        _gpioOut.setOutput(GpioOut::GPIO2, false);
        ui->label_gpio2->setStyleSheet(QString("background-color: %1").arg("green"));
    }else{
        _gpioOut.setOutput(GpioOut::GPIO2, true);
        ui->label_gpio2->setStyleSheet(QString("background-color: %1").arg("red"));
    }
}

模块代码

gpiocout.h

#ifndef GPIOOUT_H
#define GPIOOUT_H
#include <QObject>
#include <QMap>
#include <QDebug>
#include "wiringPi.h"
class GpioOut : public QObject
{
    Q_OBJECT
public:
    enum GPIO{
        GPIO2  = 3,
    };
public:
    explicit GpioOut(QObject *parent = 0);
public slots:
    void init(GPIO pin, bool output = false);
    void setOutput(GpioOut::GPIO pin, bool output);
    bool readOutput(GpioOut::GPIO pin);
private:
    QMap<GPIO, int> _mapPhysical2Wiring;
};
#endif // GPIOOUT_H
gpioout.cpp
#include "gpioout.h"
GpioOut::GpioOut(QObject *parent) : QObject(parent)
{
    wiringPiSetup();
    _mapPhysical2Wiring.insert(GPIO2, 8);
}
void GpioOut::init(GpioOut::GPIO pin, bool output)
{
    pinMode(_mapPhysical2Wiring.value(pin), OUTPUT);
    digitalWrite(_mapPhysical2Wiring.value(pin), output?HIGH:LOW);
}
void GpioOut::setOutput(GpioOut::GPIO pin, bool output)
{
    digitalWrite(_mapPhysical2Wiring.value(pin), output?HIGH:LOW);
}
bool GpioOut::readOutput(GpioOut::GPIO pin)
{
    return digitalRead(_mapPhysical2Wiring.value(pin));
}

运行效果

 

Demo2:GPIO口的输入

使用物理引脚3,默认功能为GPIO2,我们使用GPIO2接受输入,此时涉及到硬件知识,让树莓派的GPIO口的输入电压为3.3V/0V即为输入1还是输入0,也涉及到限流电阻,一般使用1K或者10K的,因为是测试,此处不使用限流电阻,在开发的过程中,需要根据实际情况设计电路原理图。

电路原理图

关键代码

初始化

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    _gpioIn.init(GpioIn::GPIO2);
    bool in = _gpioIn.readOutput(GpioIn::GPIO2);
    ui->label_gpio2->setStyleSheet(QString("background-color: %1").arg(in?"red":"green"));
    startTimer(1000);
}

每一秒钟检测一次

void MainWindow::timerEvent(QTimerEvent *event)
{
    bool in = _gpioIn.readOutput(GpioIn::GPIO2);
    ui->label_gpio2->setStyleSheet(QString("background-color: %1").arg(in?"red":"green"));
}

模块代码

gpioin.h

#ifndef GPIOIN_H
#define GPIOIN_H
#include <QObject>
#include <QMap>
#include <QDebug>
#include "wiringPi.h"
class GpioIn : public QObject
{
    Q_OBJECT
public:
    enum GPIO{
        GPIO2  = 3,
    };
public:
    explicit GpioIn(QObject *parent = 0);
public slots:
    void init(GPIO pin);
    bool readOutput(GpioIn::GPIO pin);
private:
    QMap<GPIO, int> _mapPhysical2Wiring;
};
#endif // GPIOIN_H
gpioin.h
#include "gpioin.h"
GpioIn::GpioIn(QObject *parent)
    : QObject(parent)
{
    wiringPiSetup();
    _mapPhysical2Wiring.insert(GPIO2, 8);
}
void GpioIn::init(GpioIn::GPIO pin)
{
    pinMode(_mapPhysical2Wiring.value(pin), OUTPUT);
}
bool GpioIn::readOutput(GpioIn::GPIO pin)
{
    return digitalRead(_mapPhysical2Wiring.value(pin));
}

运行效果

 

上一篇:《树莓派开发笔记(四):更便捷的开发,qt远程运行(主机qt开发一键远程运行到目标机上)

下一篇:《树莓派开发笔记(六):GPIO口的UART的使用(串口通讯)

 

原博主博客地址:https://blog.csdn.net/qq21497936

原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062

本文章博客地址:https://blog.csdn.net/qq21497936/article/details/79758560


相关文章
|
13天前
|
人工智能 安全 API
1715+OpenClaw技能加持!2026年OpenClaw Skills一键部署指南
2026年的AI智能代理赛道,OpenClaw(前身为Moltbot,最初名Clawdbot)凭借其开放的Skills技能生态彻底打破了AI工具“只会说不会做”的桎梏,这款被网友亲切称为“小龙虾”的工具,在裸奔状态下只是个能理解自然语言的“实习生”,而搭载Skills技能生态后,瞬间变身能处理各类实际任务的“全能打工人”。截至2026年2月,OpenClaw Skills生态已汇聚1715+个社区贡献技能,覆盖31个核心分类,从代码开发、自动化办公到智能家居控制,几乎包揽所有日常与工作场景。本文将从基础概念、阿里云一键部署步骤、Skills安装方法、核心分类、实战组合、最佳实践六大维度,全方位
1356 0
|
索引
树莓派 Raspberry Pi (bullseye)更换阿里云源方法
树莓派 Raspberry Pi (bullseye)更换阿里云源方法
13744 2
|
机器人 异构计算 SoC
实例2:树莓派GPIO控制外部LED灯闪烁
本文是一个关于使用树莓派GPIO控制外部LED灯闪烁的实验教程,介绍了树莓派的基本概念、GPIO接口的使用、RPi.GPIO库的基本操作,以及通过Python编程实现LED灯周期性闪烁的详细步骤和代码示例。
722 1
实例2:树莓派GPIO控制外部LED灯闪烁
|
5月前
|
机器学习/深度学习 传感器 算法
基于yolo8的深度学习室内火灾监测识别系统
本研究基于YOLO8算法构建室内火灾监测系统,利用计算机视觉技术实现火焰与烟雾的实时识别。相比传统传感器,该系统响应更快、精度更高,可有效提升火灾初期预警能力,保障生命财产安全,具有重要的应用价值与推广前景。
|
弹性计算 Linux Shell
阿里云ecs linux系统如何进行系统盘的扩容
【1月更文挑战第25天】【1月更文挑战第122篇】阿里云ecs linux系统如何进行系统盘的扩容
871 1
|
监控 Ubuntu Linux
使用VSCode通过SSH远程登录阿里云Linux服务器异常崩溃
通过 VSCode 的 Remote - SSH 插件远程连接阿里云 Ubuntu 22 服务器时,会因高 CPU 使用率导致连接断开。经排查发现,VSCode 连接根目录 ".." 时会频繁调用"rg"(ripgrep)进行文件搜索,导致 CPU 负载过高。解决方法是将连接目录改为"root"(或其他具体的路径),避免不必要的文件检索,从而恢复正常连接。
|
Web App开发
笔记本电脑能连接WiFi但浏览器无法打开网页的解决办法
笔记本电脑能连接WiFi但浏览器无法打开网页的解决办法
16679 0
笔记本电脑能连接WiFi但浏览器无法打开网页的解决办法
|
Ubuntu 安全 网络协议
|
Linux 网络安全 数据安全/隐私保护
【最新教程】树莓派安装系统及VNC远程桌面连接
【最新教程】树莓派安装系统及VNC远程桌面连接
|
网络架构
移远EC20、EC200S-CN上网测试
移远EC20、EC200S-CN上网测试
1610 2