锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

.NET Core IoT 应用之使用GPIO实现人体热传感器实验

时间:2023-11-25 15:07:02 电流传感器220v

请访问获得最佳阅读体验:https://zhangyue.xin

什么是 GPIO

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

18ae0141c95120f13adf07d85bd407f3.png

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

简单地说,每一个 GPIO 引脚有两种模式:输出模式(OUTPUT)和输入模式(INPUT)。输出模式类似于电源,Raspberry Pi 它可以控制电源是否向外供电,例如打开外部 LED 小灯,当然,最有用的是向外部设备发送信号。输入模式相当于电源的阴极,还是 LED 以小灯为例,只是这次 LED 小灯的阳极然后是外部电源。只有当电路产生电压差时,才会有电流。因此,为了使小灯亮起,有必要让电流流入 Raspberry Pi 中。与输出模式相反,输入模式是接收外部设备的信号。

GPIO 一般采用标准逻辑电平,即高电平和低电平,采用二进制 0 和 1 表示。两个值之间还有阈值电平,即高电平和低电平之间的界限。Arduino 会将 -0.5 ~ 1.5 V 读低电平,3 ~ 5.5 V 读高电平, Raspberry Pi 未发现相关信息。GPIO 也可用于中断请求,即设置 GPIO 当值满足相应要求时,中断输入模式。

相关类(Class)

这里默认你是面向对象的程序员,有一定的 C# 基础,这里只介绍我认为常用的方法,以代码注释的形式介绍。

GPIO 操作主要依赖两类:GpioControllerGpioPin 。这两类位于 System.Devices.Gpio 在名称空间下。

GpioController

// GpioController 即 GPIO 控制器 // GPIO 引脚依靠 GpioController 初始化 public class GpioController : IDisposable { // 构造函数 /* PinNumberingScheme 即引脚编号方案,它是一种枚举类型,包括 Board 和 Gpio 两个值。    * 看上面的 Raspberry Pi 引脚图,以 GPIO 17 例如,如果实例化选择 Gpio ,打开引脚时需要填写 17。    * 看上面的 Raspberry Pi 引脚图,以 GPIO 17 例如,如果实例化选择 Gpio ,打开引脚时需要填写 17。    * 如果实例化时选 Board ,打开引脚时需要填写右侧灰色方框内的值,即 11 。   */ public GpioController(PinNumberingScheme numbering = PinNumberingScheme.Gpio); // 在第二个构造函数中 GpioDriver 应用于扩展,一般还是用 Raspberry Pi 默认的 GPIO 驱动。 public GpioController(GpioDriver driver, PinNumberingScheme numbering = PinNumberingScheme.Gpio);  // 属性 // 获得已打开的一切 GPIO 引脚 public IEnumerable OpenPins { get; }  // 方法 // 打开 GPIO 引脚,pinNumber 需要填写和 PinNumberingScheme 相应的值。 public GpioPin OpenPin(int pinNumber); // 关闭 GPIO 引脚 public void ClosePin(int pinNumber); public void ClosePin(GpioPin pin); // 判断引脚是否打开 // 注:连续打开引脚会抛出异常 public bool IsPinOpen(int pinNumber); }

GpioPin

// GpioPin 表示单个引脚实体 // 需要通过 GpioController.OpenPin() 获取 public class GpioPin : IDisposable { // 属性 // 一个抖动时间,即在此时间隔内引脚电平变化,不触发 ValueChanged 事件 public TimeSpan DebounceTimeout { get; set; }  // 事件 // 触发引脚电平变化 public event EventHandler ValueChanged;  // 方法 // 读取当前引脚电平 public PinValue Read(); // 将指定电平写入引脚 public void Write(PinValue value); }

红外传感器实验

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

人体红外传感器是基于周围区域的红外热来检测运动的,也称为被动红外传感器(Passive Infra-Red, PIR)。

这里用的是 HC-SR501 。当传感器检测到人体时,LED 当传感器没有检测到人体时,小灯亮了,LED 小灯灭。

传感器图像

HC-SR501

硬件

名称 数量
HC-SR501 x1
LED 小灯 x1
220 Ω 电阻 x1
杜邦线 若干

电路

HC-SR501

  • VCC - 5V

  • GND - GND

  • OUT - GPIO 17

LED

  • VCC & 220 Ω resistor - GPIO 27

  • GND - GND

代码

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

  2. 引入 System.Devices.Gpio NuGet 包。

  3. 新建类 HCSR501,更换以下代码(这里稍微简化一下,只是为了必要的代码,不包括自定义事件,可以详细查看提供的示例):

public class HCSR501 : IDisposable { private GpioPin sensor; private readonly int pinOut;  ///  /// 构造函数 ///  /// OUT Pin public HCSR501(int pin) { pinOut = pin; }  ///  /// 初始化 ///  public void Initialize() { // 实例化 GpioController GpioController controller = new GpioController(PinNumberingScheme.Gpio); // 打开引脚,设置模式为输入模式 sensor = controller.OpenPin(pinOut, PinMode.Input); }  ///  /// 读取 ///  /// 是否检测到人体 public bool Read() { // 当电平高时,认为检测到人体 if (sensor.Read() == PinValue.High) { return true; } else { return false; } } }
  1. Program.cs 主函数代码替换如下:

static void Main(string[] args) { // get te GPIO controller
// 获取 GPIO 控制器
GpioController controller = new GpioController(PinNumberingScheme.Gpio);
// open PIN 27 for led
// 为 led 打开引脚 27
GpioPin led = controller.OpenPin(27, PinMode.Output);

// initialize PIR sensor
// 初始化传感器
HCSR501 sensor = new HCSR501(17);
sensor.Initialize();

// loop
// 循环
while (true)
{
if (sensor.Read() == true)
{
// turn the led on when the sensor detected infrared heat
// 当传感器检测到热量时打开 led
led.Write(PinValue.High);
Console.WriteLine("Detected! Turn the LED on.");
}
else
{
// turn the led off when the sensor undetected infrared heat
// 当传感器未检测到热量时关闭 led
led.Write(PinValue.Low);
Console.WriteLine("Undetected! Turn the LED off.");
}

// wait for a second
// 等待 1s
Thread.Sleep(1000);
}
}
  1. 发布、拷贝、更改权限、运行

效果图

如何改进?

剔除主函数循环,尝试在自定义事件中进行检测,即 GpioPin 的 ValueChanged 事件。

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章