C#系列 NanoFramework+ESP32学习笔记(2 - 跑马灯)

前言

    本章的设计思路是使用Boot按钮来控制跑马灯的启用情况。

Gitee地址:ESP32_NanoFramework: 使用NanoFramework操作Esp32

1. 前期准备工作

    1.1 使用硬件介绍

          需要使用到的硬件有ESP32、面包板、杜邦线(需要用到母公线和公公线)、LED、电阻等。

      1.1.1 面包板

          使用面包板可以比较方便的搭建硬件电路。如下图所示,中间字母部分的孔洞纵向连通(abcde和fghij是不相通的),上下的窄边为横向连通(如框中的部分,同一行的所以孔洞都是相通的)。具体可以参考百度百科 面包板

313fc777a71e412789728cd0d84244d9.webp

ce99b5e5461a41b4a37fd3b35188cbd3.png

      1.1.2 电阻色环识别

            黑0 棕1 红2 橙3 黄4 绿5 蓝6 紫7 灰8 白9 金、银表示误差。

            四色环:第一条色环:阻值的第一位数字;第二条色环:阻值的第二位数字;第三条色环:10的幂数;第四条色环:误差表示

            五色环:第一条色环:阻值的第一位数字;第二条色环:阻值的第二位数字;第三条色环:阻值的第三未数字;第四条色环:阻值乘数的10的幂数;第五条色环:误差(常见是棕色,误差为1%)四色环电阻误差为5-10%,五色环常为1%

        1.1.3 LED

            LED的长脚为正极,短脚为负极。

20fd3b5ff5b84f44a68ea8e6dba50abc.webp

    1.2 电路连接图 

        使用的是四个LED和一个电阻,每一个 LED 的正极与开发板一个 GPIO 引脚相连,并串联一个电阻(一定要连接一个电阻,防止LED烧坏),负极接 GND,如下图所示,使用的GPIO引脚分别为D13、D12、D14、D27。

ca777010ee6d4ee29cb5776e149a0c20.png

    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. 引用说明

关于硬件部分连接可以参考 https://docs.geeksman.com/esp32/Arduino/04.esp32-breadboard.htmlhttps://docs.geeksman.com/esp32/Arduino/04.esp32-breadboard.html

NanoFramework接口说明可以查看官网文档https://docs.nanoframework.net/api/System.Device.Gpio.GpioController.html

代码Gitee路径 Git路径https://gitee.com/Perkins_Yang/esp32_-nano-framework.git 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值