0

0

张高兴的 .NET IoT 入门指南:(二)GPIO 的使用

蓮花仙者

蓮花仙者

发布时间:2025-06-28 11:20:10

|

588人浏览过

|

来源于php中文网

原创

什么是 gpio

GPIO 是 General Purpose Input Output 的缩写,即“通用输入输出”。Raspberry Pi 有两列 GPIO 引脚, Raspberry Pi 通过这两行引脚进行一些硬件上的扩展,与传感器进行交互等等。

张高兴的 .NET IoT 入门指南:(二)GPIO 的使用

Raspberry Pi B+/2B/3B/3B+/Zero 引脚图

简单的讲,每一个 GPIO 引脚都有两种模式:输出模式(OUTPUT)和输入模式(INPUT)。输出模式类似于一个电源,Raspberry Pi 可以控制这个电源是否向外供电,比如打开外部的 LED 小灯,当然最有用的还是向外部设备发送信号。和输出模式相反,输入模式是接收外部设备发来的信号。其中还包含两种特殊的输入模式:上拉输入(INPUT_PULLUP)和下拉输入(INPUT_PULLDOWN)。上拉输入就是内部的上拉电阻接 VCC ,将该引脚设置为高电平,下拉输入则相反。

GPIO 通常采用标准逻辑电平,即高电平和低电平,用二进制 0 和 1 表示。在这两值中间还有阈值电平,即高电平和低电平之间的界限。Arduino 会将 -0.5 ~ 1.5 V 读取为低电平,3 ~ 5.5 V 读取为高电平, Raspberry Pi 未查到相关资料。GPIO 还可用于中断请求,即设置 GPIO 为输入模式,值达到相应的要求时进行中断。

相关类

GPIO 操作主要依赖于 GpioController 类 。这个类位于 System.Device.Gpio 名称空间下。

GpioController代码语言:javascript代码运行次数:0运行复制
<code class="javascript">// GpioController 即 GPIO 控制器// GPIO 引脚依靠 GpioController 初始化public class GpioController : IGpioController, IDisposable{    // 构造函数    public GpioController();    // PinNumberingScheme 即引脚编号方案,是一个枚举类型,包含 Board 和 Logical 两个值。    // 可以看上方的 Raspberry Pi 引脚图,以 GPIO 17 为例,如果实例化时选 Logical ,那么打开引脚时需要填写 17。    // 如果实例化时选 Board ,那么打开引脚时需要填写右侧灰色方框内的值,即 11 。    public GpioController(PinNumberingScheme numbering);    // GpioDriver 用于指定要使用的 GPIO 驱动,比如 libgpiod 或 sysfs    public GpioController(PinNumberingScheme numberingScheme, GpioDriver driver);    // 方法    // 打开 GPIO 引脚    // pinNumber 需要填写和 PinNumberingScheme 相对应的值。    // PinMode 是设置 GPIO 的模式,如输入、输出、上拉、下拉    public void OpenPin(int pinNumber, PinMode mode);    // 关闭 GPIO 引脚    public void ClosePin(int pinNumber);    // 判断某个引脚是否打开    // 注意:引脚连续打开会抛出异常    public bool IsPinOpen(int pinNumber);     // 读取指定引脚的值    public PinValue Read(int pinNumber);    // 向指定的引脚写入值    public void Write(int pinNumber, PinValue value);    // 为指定引脚的值改变时注册回调(即上文中提到的 GPIO 中断)    // PinEventTypes 是值改变的类型,包括上升沿(Rising,0->1)和下降沿(Falling,1->0),注意当设置为 None 时不会触发    // PinChangeEventHandler 为回调事件    public void RegisterCallbackForPinValueChangedEvent(int pinNumber, PinEventTypes eventTypes, PinChangeEventHandler callback);    // 为指定引脚的值改变时注销回调    public void UnregisterCallbackForPinValueChangedEvent(int pinNumber, PinChangeEventHandler callback);}</code>

人体红外传感器实验

人体红外传感器是基于周围区域的红外热来检测运动的,也称被动红外传感器(Passive Infra-Red, PIR)。这里使用的是 HC-SR501 。当传感器检测到人体时,LED 小灯亮,当传感器未检测到人体时,LED 小灯灭。

传感器图像
张高兴的 .NET IoT 入门指南:(二)GPIO 的使用

HC-SR501

硬件需求

名称

数量

HC-SR501

x1

LED 小灯

x1

220 Ω 电阻

Okaaaay
Okaaaay

适用于所有人的AI文本和内容生成器

下载

x1

杜邦线

若干

电路

张高兴的 .NET IoT 入门指南:(二)GPIO 的使用

HC-SR501

VCC - 5VGND - GNDOUT - GPIO 17 (Pin 11)

LED

VCC & 220 Ω resistor - GPIO 27 (Pin 14)GND - GND

使用 Docker 运行示例

示例地址:https://github.com/ZhangGaoxing/dotnet-core-iot-demo/tree/master/src/Hcsr501

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">docker build -t pir-sample -f Dockerfile .docker run --rm -it --device /dev/gpiomem pir-sample</code>

代码

打开 Visual Studio ,新建一个 .NET Core 控制台应用程序,项目名称为“PIR”。

引入 System.Device.Gpio NuGet 包。

新建类 Hcsr501,替换如下代码:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">public class Hcsr501 : IDisposable{    private GpioController _controller;    private readonly int _outPin;    /// <summary>    /// 构造函数    /// </summary>    /// <param name="pin">OUT Pin</param>    public HCSR501(int outPin, PinNumberingScheme pinNumberingScheme = PinNumberingScheme.Logical)    {        _outPin = outPin;        _controller = new GpioController(pinNumberingScheme);        _controller.OpenPin(outPin, PinMode.Input);    }    /// <summary>    /// 是否检测到人体    /// </summary>    public bool IsMotionDetected => _controller.Read(_outPin) == PinValue.High;    /// <summary>    /// Cleanup    /// </summary>    public void Dispose()    {        _controller?.Dispose();        _controller = null;    }}</code>

在 Program.cs 中,将主函数代码替换如下:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">static void Main(string[] args){    // HC-SR501 OUT Pin    int hcsr501Pin = 17;    // LED Pin    int ledPin = 27;    // 获取 GPIO 控制器    using GpioController ledController = new GpioController(PinNumberingScheme.Logical);    // 初始化 PIR 传感器    using Hcsr501 sensor = new Hcsr501(hcsr501Pin, PinNumberingScheme.Logical);    // 打开 LED 引脚    ledController.OpenPin(ledPin, PinMode.Output);    while (true)    {        // 检测到了人体        if (sensor.IsMotionDetected == true)        {            ledController.Write(ledPin, PinValue.High);            Console.WriteLine("Detected! Turn the LED on.");        }        else        {            ledController.Write(ledPin, PinValue.Low);            Console.WriteLine("Undetected! Turn the LED off.");        }        Thread.Sleep(1000);    }}</code>

发布、拷贝、更改权限、运行

效果图

张高兴的 .NET IoT 入门指南:(二)GPIO 的使用
张高兴的 .NET IoT 入门指南:(二)GPIO 的使用

? 如何改进?

剔除主函数循环,尝试使用 RegisterCallbackForPinValueChangedEvent() 注册一个回调进行检测。

参考General-purpose input/output - Wikipedia:https://en.wikipedia.org/wiki/General-purpose_input/outputGPIO - Raspberry Pi Documentation:https://www.raspberrypi.org/documentation/usage/gpio/GPIO source code:https://github.com/dotnet/iot/tree/master/src/System.Device.Gpio/System/Device/Gpio

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
点击input框没有光标怎么办
点击input框没有光标怎么办

点击input框没有光标的解决办法:1、确认输入框焦点;2、清除浏览器缓存;3、更新浏览器;4、使用JavaScript;5、检查硬件设备;6、检查输入框属性;7、调试JavaScript代码;8、检查页面其他元素;9、考虑浏览器兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

197

2023.11.24

github中文官网入口 github中文版官网网页进入
github中文官网入口 github中文版官网网页进入

github中文官网入口https://docs.github.com/zh/get-started,GitHub 是一种基于云的平台,可在其中存储、共享并与他人一起编写代码。 通过将代码存储在GitHub 上的“存储库”中,你可以: “展示或共享”你的工作。 持续“跟踪和管理”对代码的更改。

3726

2026.01.21

k8s和docker区别
k8s和docker区别

k8s和docker区别有抽象层次不同、管理范围不同、功能不同、应用程序生命周期管理不同、缩放能力不同、高可用性等等区别。本专题为大家提供k8s和docker区别相关的各种文章、以及下载和课程。

280

2023.07.24

docker进入容器的方法有哪些
docker进入容器的方法有哪些

docker进入容器的方法:1. Docker exec;2. Docker attach;3. Docker run --interactive --tty;4. Docker ps -a;5. 使用 Docker Compose。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

516

2024.04.08

docker容器无法访问外部网络怎么办
docker容器无法访问外部网络怎么办

docker 容器无法访问外部网络的原因和解决方法:配置 nat 端口映射以将容器端口映射到主机端口。根据主机兼容性选择正确的网络驱动(如 host 或 overlay)。允许容器端口通过主机的防火墙。配置容器的正确 dns 服务器。选择正确的容器网络模式。排除主机网络问题,如防火墙或连接问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

416

2024.04.08

docker镜像有什么用
docker镜像有什么用

docker 镜像是预构建的软件组件,用途广泛,包括:应用程序部署:简化部署,提高移植性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

453

2024.04.08

Docker容器化部署与DevOps实践
Docker容器化部署与DevOps实践

本专题面向后端与运维开发者,系统讲解 Docker 容器化技术在实际项目中的应用。内容涵盖 Docker 镜像构建、容器运行机制、Docker Compose 多服务编排,以及在 DevOps 流程中的持续集成与持续部署实践。通过真实场景演示,帮助开发者实现应用的快速部署、环境一致性与运维自动化。

38

2026.02.11

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2862

2024.08.16

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 4.1万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.6万人学习

Git中文开发手册
Git中文开发手册

共0课时 | 94人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号