前言
本章的设计思路是使用Boot按钮来控制跑马灯的启用情况。
Gitee地址:ESP32_NanoFramework: 使用NanoFramework操作Esp32
1. 前期准备工作
1.1 使用硬件介绍
需要使用到的硬件有ESP32、面包板、杜邦线(需要用到母公线和公公线)、LED、电阻等。
1.1.1 面包板
使用面包板可以比较方便的搭建硬件电路。如下图所示,中间字母部分的孔洞纵向连通(abcde和fghij是不相通的),上下的窄边为横向连通(如框中的部分,同一行的所以孔洞都是相通的)。具体可以参考百度百科 面包板
1.1.2 电阻色环识别
黑0 棕1 红2 橙3 黄4 绿5 蓝6 紫7 灰8 白9 金、银表示误差。
四色环:第一条色环:阻值的第一位数字;第二条色环:阻值的第二位数字;第三条色环:10的幂数;第四条色环:误差表示
五色环:第一条色环:阻值的第一位数字;第二条色环:阻值的第二位数字;第三条色环:阻值的第三未数字;第四条色环:阻值乘数的10的幂数;第五条色环:误差(常见是棕色,误差为1%)四色环电阻误差为5-10%,五色环常为1%
1.1.3 LED
LED的长脚为正极,短脚为负极。
1.2 电路连接图
使用的是四个LED和一个电阻,每一个 LED 的正极与开发板一个 GPIO 引脚相连,并串联一个电阻(一定要连接一个电阻,防止LED烧坏),负极接 GND,如下图所示,使用的GPIO引脚分别为D13、D12、D14、D27。
1.3 函数说明
1.3.1 主函数
下面是主函数部分,先使能Boot按钮,然后检测按钮状态,通过按下的次数来操作对应内容。
public static void Main()
{
//nanoff --platform esp32 --target ESP32_REV3 --serialport COM3 --update
/*
* 大致思路
利用Boot按钮来控制跑马灯的开启状况
*/
var button = GpioHelper.Instance.GpioCtl.OpenPin(Gpio.IO00, PinMode.Input);//使能 Boot 按钮
//事件绑定 检测按钮状态改变
button.ValueChanged += (s, e) =>
{
//检测按钮按下并抬起来则记一次数
if (e.ChangeType == PinEventTypes.Rising) //Triggered when pin value goes from low to high.
{
GpioHelper.Instance.LEDKeepOn(Gpio.IO02, PinValue.Low);
if (flag == 1)
{
start_flag = 1;
isbreak = false;
}
else if (flag == 2)
{
isbreak = true;
flag = 0;
start_flag = 2;
}
}
else if (e.ChangeType == PinEventTypes.Falling) //Triggered when pin value goes from high to low.
{
GpioHelper.Instance.LEDKeepOn(Gpio.IO02, PinValue.High);
flag++;
}
};
//循环判断标志位,是否进行跑马灯
var lst_pin = new int[] { Gpio.IO13, Gpio.IO12, Gpio.IO14, Gpio.IO27 };
while (true)
{
if (start_flag == 1)
{
while (!isbreak)
{
GpioHelper.Instance.Marquee(lst_pin, 800, true); //跑马灯
}
}
else if (start_flag == 2)
{
GpioHelper.Instance.CloseAllLed(lst_pin); //关闭所有的灯
start_flag = 0;
}
Thread.Sleep(500);
}
// Browse our samples repository: https://github.com/nanoframework/samples
// Check our documentation online: https://docs.nanoframework.net/
// Join our lively Discord community: https://discord.gg/gCyBu8T
}
static int flag = 0;
static int start_flag = 0;//0 初始状态 1 按钮按下一次 2 按钮再次按下
static bool isbreak = true;
1.3.2 LED电平设置
下面的代码是LED设置电平,思路是只使能一次,然后使用了List来存放使能之后的内容。
/// <summary>
/// GPIO控制器
/// </summary>
private readonly GpioController gpioCtl;
private readonly ArrayList lstGpioPin;
/// <summary>
/// Led灯设置电平状态
/// </summary>
/// <param name="gpio_index">GPIO口</param>
/// <param name="pinValue">高电平 or 低电平</param>
public void LEDKeepOn(int gpio_index, PinValue pinValue)
{
var findGpioPin = lstGpioPin.Find(gpio_index);
if (findGpioPin == null || findGpioPin.GetPinMode() != PinMode.Output) //不存在或者模式不正确就先打开并添加到列表中间
{
if (findGpioPin != null)
{
findGpioPin.Dispose();
lstGpioPin.RemoveAt(lstGpioPin.FindAt(gpio_index));//先移除
}
var gpioPin = gpioCtl.OpenPin(gpio_index, PinMode.Output);
lstGpioPin.Add(new GpioPinBund
{
GpioNum = gpio_index,
GpioPin = gpioPin
});
findGpioPin = lstGpioPin.Find(gpio_index);
}
findGpioPin?.Write(pinValue);
}
1.3.3 跑马灯实现
下面的代码则为跑马灯的主要实现了,作用就是依次点亮LED。
/// <summary>
/// 跑马灯
/// </summary>
/// <param name="lstpin"></param>
/// <param name="timeout">延时</param>
/// <param name="isreciprocate">是否往复运动</param>
public void Marquee(int[] lstpin, int timeout = 500, bool isreciprocate = false)
{
for (int i = 0; i < lstpin.Length; i++)
{
var pin = lstpin[i];
LEDKeepOn(pin, PinValue.High);
if (i != 0)
{
LEDKeepOn(lstpin[i - 1], PinValue.Low);
}
Thread.Sleep(timeout);
}
//LEDKeepOn(lstpin[lstpin.Length - 1], PinValue.Low);
if (isreciprocate)
{
for (int i = lstpin.Length - 1; i >= 0; i--)
{
var pin = lstpin[i];
LEDKeepOn(pin, PinValue.High);
if (i != lstpin.Length - 1)
{
LEDKeepOn(lstpin[i + 1], PinValue.Low);
if (i == 0 && isreciprocate){ }
else
Thread.Sleep(timeout);
}
}
//LEDKeepOn(lstpin[0], PinValue.Low);
}
}
1.3.4 关闭所有LED
下面的代码则为关闭所有LED灯
/// <summary>
/// 关闭所有灯
/// </summary>
/// <param name="lstpin"></param>
public void CloseAllLed(int[] lstpin)
{
for (int i = 0; i < lstpin.Length; i++)
{
var pin = lstGpioPin.Find(lstpin[i]);
if (pin != null)
{
// if (pin.Read() == PinValue.High)
{
pin.Write(PinValue.Low);
}
}
}
}
2. 引用说明
NanoFramework接口说明可以查看官网文档https://docs.nanoframework.net/api/System.Device.Gpio.GpioController.html
代码Gitee路径 Git路径https://gitee.com/Perkins_Yang/esp32_-nano-framework.git