使用.Net nanoFramework获取ESP32板载按键的点击事件
本文以 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开发板的板载按键进行交互。如果你有任何问题或者想法,欢迎在评论区留言。
最后,期待看到你使用这些知识创造出更多有趣的项目和产品。祝编程愉快!
相关文章:
使用.Net nanoFramework获取ESP32板载按键的点击事件
本文以 ESP32-S3-Zero 板载的按键为例,介绍了GPIO的使用方法,以及如何获取按键的点击事件。板载按钮作为自带的天然用户按钮,除了其本身的功能外,也可以作为某些应用场景下的简单的交互方式。 1. 引言 对于一般的产品来说&#x…...
安全远控如何设置?揭秘ToDesk、TeamViewer 、向日葵安全远程防御大招
写在前面一、远程控制:安全性不可忽略二、远控软件安全设置实测 ◉ ToDesk◉ TeamViewer◉ 向日葵 三、远控安全的亮点功能四、个人总结与建议 写在前面 说到远程办公,相信大家都不陌生。远程工作是员工在家中或者其他非办公场所上班的一种工作模式&am…...
Spring AOP(详解)
目录 1.AOP概述 2.AOP相关术语 3.Spring AOP的原理机制 3.1JDK动态代理 3.2 CGLIB动态代理 3.3简单代码展示 3.3.1JDK动态代理 3.3.2CGLIB动态代理 4.Spring的AOP配置 4.1pom.xml 4.2增强方法 4.3切点 4.4切面 5.基于注解的AOP配置 5.1.创建工程 5.2.增强 5.3AOP…...
Linux系统编程之进程
目录 1、进程关键概念 1.什么是程序,什么是进程,有什么区别 2.如何查看系统中有那些进程 3.什么是进程标识符 4.什么叫父进程,什么叫子进程 5.C语言的存储空间是如何分配的 2、进程创建 1.fork函数创建进程 2.vfork函数创建进程 3、…...
Vue中使用require.context自动引入组件的方法介绍
我们项目开发中,经常需要import或者export各种模块,那么有没有什么办法可以简化这种引入或者导出操作呢?答案是肯定的,下面就为大家介绍一下require.context require.context 是 webpack 提供的一个 API,用于创建 con…...
Java 监控诊断利器 Arthas monitor/watch/trace 命令使用详解
目录 一、命令介绍二、测试Demo三、命令使用示例3.1、monitor 命令3.1.1、监控primeFactors方法调用情况(5秒一个周期,每过5秒将这5秒统计的信息输出)3.1.2、监控primeFactors方法调用情况(5秒一个周期,每过5秒将这5秒…...
论文阅读:基于MCMC的能量模型最大似然学习剖析
On the Anatomy of MCMC-Based Maximum Likelihood Learning of Energy-Based Models 相关代码:点击 本文只介绍关于MCMC训练的部分,由此可知,MCMC常常被用于训练EBM。最后一张图源于Implicit Generation and Modeling with Energy-Based Mod…...
【Verilog】期末复习——设计一个带异步复位端且高电平有效的32分频电路
系列文章 数值(整数,实数,字符串)与数据类型(wire、reg、mem、parameter) 运算符 数据流建模 行为级建模 结构化建模 组合电路的设计和时序电路的设计 有限状态机的定义和分类 期末复习——数字逻辑电路分…...
基于springboot的java读取文档内容(超简单)
读取一个word文档里面的内容,并取出来。 代码: SneakyThrowsGetMapping(value "/readWordDoc")ApiOperationSupport(order 1)ApiOperation(value "文档读取 ", notes "文档读取 ")public R ReadWordDoc () {System.o…...
K8S亲和性,反亲和性,及污点
nodeName:硬匹配,不走调度策略 nodeSelector:根据节点的标签选择,会走调度的算法 只要是走调度算法,在不满足预算策略的情况下,所有pod都是pending node节点的亲和性: 硬策略:必…...
2024年,AI、Web3、区块链、元宇宙:有没有“相互成就“的可能性?
加密圈最近有点冷清,曾经是科技界的宠儿,去年中旬开始一直在被SEC的诉讼困扰着,而且正处冷清的熊市,被迫居于 AI 后面的次要地位。 曾在 Web3 领域活跃并具有影响力的企业家 Jeremiah Owyang 住在旧金山,目前也深入研…...
Mac电脑好用的修图软件:Affinity Photo 2中文 for Mac
Affinity Photo 2提供了广泛的图像编辑和调整工具,使用户能够对照片进行精确的编辑和改进。它支持图像裁剪、旋转、缩放、变形等操作,以及曝光、色彩、对比度、饱和度等调整。 非破坏性编辑:软件采用非破坏性编辑方式,即对原始图…...
数据结构之Radix和Trie
数据结构可视化演示链接,也就是视频中的网址 Radix树:压缩后的Trie树 Radix叫做基数树(压缩树),就是有相同前缀的字符串,其前缀可以作为一个公共的父节点。同时在具体存储上,Radix树的处理是以…...
ctrl+c与kill -2的区别
单进程场景 在单进程的情况下,ctrlc和kill -2是一模一样的,都是向指定的进程发送SIGINT信号. 如果进程中注册了捕捉SIGINT信号的处理函数,那么这个信号会被进程处理,例如: void processB() {// Set signal handler …...
每日算法打卡:分巧克力 day 9
文章目录 原题链接题目描述输入格式输出格式数据范围输入样例:输出样例: 题目分析示例代码 原题链接 1227. 分巧克力 题目难度:简单 题目来源:第八届蓝桥杯省赛C A/B组,第八届蓝桥杯省赛Java A/B/C组 题目描述 儿童节那天有 …...
Golang switch 语句
简介 switch 语句提供了一种简洁的方式来执行多路分支选择 基本使用 基本语法如下: switch expression { case value1:// 当 expression 的值等于 value1 时执行 case value2:// 当 expression 的值等于 value2 switch 的每个分支自动提供了隐式的 break&#x…...
可碧教你C++——位图
本章节是哈希的延申 可碧教你C——哈希http://t.csdnimg.cn/3R8TU 一文详解C——哈希 位图 位图是基于哈希表的原理产生的一种新的container——bitset 基于哈希映射的原理,我们在查找的时候,可以直接去定址到元素的具体位置,然后直接访问该…...
2024年虚拟DOM技术将何去何从?
从诞生之初谈起,从命令式到声明式,Web开发的演变之路 Web开发的起源与jQuery的统治 在Web开发的早期阶段,操作DOM元素主要依赖命令式编程。当时,jQuery因其易用性而广受欢迎。使用jQuery,开发者通过具体的命令操作DOM&…...
基于51单片机的恒温淋浴器控制电路设计
标题:基于51单片机的智能恒温淋浴器控制系统设计与实现 摘要: 本论文主要探讨了一种基于STC89C51单片机为核心控制器的恒温淋浴器控制系统的详细设计与实现。系统通过集成温度传感器实时监测水温,结合PID算法精确控制加热元件工作状态&#…...
【redis】redis的bind配置
在配置文件redis.conf中,默认的bind 接口是127.0.0.1,也就是本地回环地址。这样的话,访问redis服务只能通过本机的客户端连接,而无法通过远程连接, 这样可以避免将redis服务暴露于危险的网络环境中,防止一些…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
