本文以 ESP32-S3-Zero 板载的按键为例,介绍了GPIO的使用方法,以及如何获取按键的点击事件。板载按钮作为自带的天然用户按钮,除了其本身的功能外,也可以作为某些应用场景下的简单的交互方式。
1. 引言
对于一般的产品来说,比如路由器等,都提供了 RESET 功能,我们通过板载的按键就可以轻松的实现,并获取到按钮按下的时间。我们也可以使用其作为配网按钮,当用户按下按钮时,设备进入配网模式,这样,就可以方便的实现设备的配网功能。
在这篇文章中,我们主要使用其进行一些简单的交互:按下 BOOT
按钮,点亮板载的 LED 灯,松开灯灭。
2. 板载按键
ESP32-S3-Zero 板载了两个按键,不同于一般的载板只有一个按键,同时用于复位或者进入下载模式。这就意味着,我们可以在自己的程序中使用一个按钮,方便用户进行交互。如下图所示,板载的两个按键,分别是标号6的 BOOT
和 标号7的 RESET
按键。
根据原理图,我们可以看到,这两个按键都是通过一个电阻分压电路,将按键的电平变化转换为电压信号,然后通过一个 IO 口输入到 ESP32-S3 芯片中。如下图所示,已经标出了 BOOT
按键 K2 的电压信号输入到了 IO0 引脚。当按键按下时,IO0 引脚与 GND 短接,电压为 0V,当按键松开时,IO0 引脚与 3.3V 之间有一个 10K 的电阻,电压为 3.3V。也就是说,当用户按下 BOOT
按钮时,IO0 引脚的电平会变为低电平,当用户松开时,IO0 引脚的电平会变为高电平。
知道了原理,我们就可以通过程序来获取按键的点击事件了。不过,虽然有两个按键,但是我们只能使用一个,因为另一个按键是用于复位的,当按下 RESET
按钮时,ESP32-S3 芯片会复位,这样,我们就无法获取到按键的点击事件了。
3. 获取按键的点击事件
在 nanoFramework 中,我们可以通过 GpioController
类来获取 IO 口的状态,也就是获取 IO 口的电平。我们可以通过 ValueChanged
事件来获取 IO 口电平的变化,从而获取到按键的点击事件。
在下面的代码中,我们 Ws2812c
类来控制板载的 LED 灯,ESP32-S3-Zero 的板载 LED 引脚为21,只有1个灯珠。我们通过 Image
属性来获取到灯珠的图像,然后通过 SetPixel
方法来设置灯珠的颜色,最后通过 Update
方法来更新灯珠的状态:
public static void Main()
{
// 1 个灯珠,1像素
int WS2812_Count = 1;
// ESP32-S3-Zero 灯珠的引脚
int WS2812_Pin = 21;
var gpioController = new GpioController();
var leddev = new Ws2812c(WS2812_Pin, WS2812_Count);
BitmapImage img = leddev.Image;
var userbtn = gpioController.OpenPin(0,PinMode.InputPullDown);
userbtn.ValueChanged += (s, e) =>
{
Debug.WriteLine("BOOT 按钮事件:" + e.ChangeType.ToString());
Debug.WriteLine("IO0 的值:" + userbtn.Read());
if (userbtn.Read() == PinValue.Low)
{
// 开灯
img.SetPixel(0, 0, Color.White);
}
else
{
// 关灯
img.SetPixel(0, 0, Color.Black);
}
leddev.Update();
};
Thread.Sleep(Timeout.Infinite);
}
如下图所示,我们可以看到,当按下 BOOT
按钮时,IO0 引脚的电平变为低电平,当松开时,电平变为高电平。在代码中我们根据当前的电平来设置灯珠的颜色,当按下按钮时,灯珠变为白色,当松开时,灯珠变为黑色,即灭灯。
通过上面的编码,我们很轻松的就制作了一个小电灯。当然,我们也可以通过修改代码,通过 flag 来控制灯珠的状态,这样,我们就可以实现按下按钮时,灯珠点亮,再次按下时,灯珠熄灭。
4. 最后
在这篇文章中,我们详细介绍了如何在.NET nanoFramework环境下,使用ESP32-S3-Zero开发板的板载按键进行简单的用户交互。我们了解了如何通过GPIO接口读取按键状态,并根据按键的状态控制板载LED的开关。这只是一个简单的示例,实际上,我们可以在这个基础上进行更多的扩展,比如,我们可以通过按键实现更复杂的功能,比如长按进入特定模式,或者双击执行特定操作等。
希望这篇文章能帮助你理解如何在.NET nanoFramework环境下,使用ESP32-S3-Zero开发板的板载按键进行交互。如果你有任何问题或者想法,欢迎在评论区留言。
最后,期待看到你使用这些知识创造出更多有趣的项目和产品。祝编程愉快!