本来周末是要搞个大的,WIFI 和 Web网页之类的,奈何搞了两天,并与外国友人聊过后,才发现是固件有问题,晚上与大佬进行交流后才发现,原来ESP32S的官方固件有问题,搞不了。

所以,建议买的话买ESP32,不带任何型号的就可以了。

我买的新板子已经在路上了,只能等板子来了才能后续了。

目前也能搞一些简单的,就先搞一下下。

嵌入式的基础知识

如果对单片机,嵌入式了解少的,还是有必要深入了解一下硬件的基础知识的。

可以参考 《零死角玩转STM32—F429挑战者.pdf 》来了解大多数相关知识,看看基础部分即可,当然多看点更好。

虽然,板子都不一样,但是,基础知识是差不多的,都是差不多的架构方式。

比如 STM32可以达到一百多个引脚,而ESP32可能只有40左右个引脚,除了内置WIFI已经占用的,大部分IO口都已经引了出来,可以自己对其进行硬件级的设计。

在开发板上,一般这样的引脚会单独引出来,供开发测试使用。

GPIO

啥是GPIO,英文: General-purpose input/output 中文就是 通用型之输入输出的简称,简单来说,就是CPU可以控制的引脚,通过CPU芯片的GPIO引脚与外部设备(传感器了,AD采集之类的设备)连接起来,从而实现与外部通讯、控制以及数据采集的功能。

GPIO 基本的输入和输出

基本的输入

最基本的输出,就是检测外部输入电平,比如,判断当前按键是否按下等。

基本的输出

最基本的输出就是控制芯片引脚输出高,低电平,实现开关控制,比如GPIO引脚接入到LED灯,那就可以控制LED灯的亮灭。接入到继电器或三极管,那就可以通过继电器或三极管控制外部大功率电路的开关或者说通断。

GPIO 图解



esp32 socket中断接收 esp32 socket最多几个_嵌入式

以上就是GPIO的原理图,当然,硬件可能会有升级,但是,大致原理是一样的。

深度的解释可以自己看看书上的介绍和网上的资料,这里我说说我的大概解释。

IO口本身上来讲就表现了两个意思,输入和输出。

所以,这个电路的作用就是尽量保证它的输入和输出稳定,安全,可靠。

当然,更安全的可靠的还是靠外部上拉等,它本身还是挺弱的,电压3.3V左右,电流估计更小,偏向于控制信号级。

所以,想获得外部的信息,还是输出信息到外部,可以通过图上大致了解到,图上也表现了这两条路,一个是输入,一个是输出。

C# 实现点灯和获取按钮项目

板子相关资料

我当前的板子是ESP32S,找了官方,终于找到了资料,地址如下:

https://docs.ai-thinker.com/esp32/boards/nodemcu_32s

大部分资料可以参考,可以下载

以下是它的功能引脚图



esp32 socket中断接收 esp32 socket最多几个_单片机_02

以下是它的全的电路图



esp32 socket中断接收 esp32 socket最多几个_esp32 socket中断接收_03

我们要点灯,和按键,所以需要找到这两个功能的IO是哪些。

LED和Button的GPIO

从图可知 LED 的 GPIO 是 IO2 (GPIO 2 的意思,就是第二个IO引脚)



esp32 socket中断接收 esp32 socket最多几个_java_04

按键的话,一个是EN,就是板子的开关使能键,这个键,用不了,我们只能用另外一个,那就是IO0,第0个键。



esp32 socket中断接收 esp32 socket最多几个_esp32 socket中断接收_05

代码相关

需要新增几个Nuget包

Install-Package nanoFramework.Hardware.Esp32 -Version 1.3.6.7
Install-Package nanoFramework.Runtime.Events -Version 1.10.0
Install-Package nanoFramework.System.Device.Gpio -Version 1.0.4

然后,增加点代码,逻辑很简单,按下Boot按键,把灯点亮,松开按键,把灯熄灭。

public class Program
{
    public static GpioPin led;
    public static GpioPin button;
    public static void Main()
    {
        var gpioController = new GpioController();
        button = gpioController.OpenPin(Gpio.IO00, PinMode.Input);
        led = gpioController.OpenPin(Gpio.IO02, PinMode.Output);
        button.ValueChanged += Button_ValueChanged;

        while (true)
        {
            Thread.Sleep(1000);
        }
    }

    private static void Button_ValueChanged(object sender, PinValueChangedEventArgs e)
    {
        Debug.WriteLine("按键事件 : " + e.ChangeType.ToString());
        Debug.WriteLine("按键当前值: " + button.Read());

        if (e.ChangeType != PinEventTypes.Rising)
        {
            //按下点亮灯
            led.Write(PinValue.High);
        }
        else
        {
            //松开手把灯搞灭
            led.Write(PinValue.Low);
        }
    }
}

运行的结果



esp32 socket中断接收 esp32 socket最多几个_单片机_06

可以明显看到,按下按键的时候, 当前值是 Low,松开后,是High。



esp32 socket中断接收 esp32 socket最多几个_单片机_07

上边是按下按键的小图。

我自己反复试了试,启动的话大概2秒就可以按键有效了。按键与灯的逻辑,反应也十分的快。

总结

整体来看,操作方便了很多,还可以调试,就是板子要与固件要保持一致,要不然,会有很多的小问题,需要去克服。

代码地址

https://github.com/kesshei/NanoFreamworkKeyOrButtonDemo.git

https://gitee.com/kesshei/NanoFreamworkKeyOrButtonDemo.git

一键三连呦!,感谢大佬的支持,您的支持就是我的动力!