解决ESP32板载WS2812B LED反色问题及工作状态灯的应用

本文主要介绍使用.Net nanoFramework驱动驱动 ESP32-S3-Zero 板载的 WS2812B LED的问题,以及如何设计一个灯光控制类,来方便的使用工作状态灯来显示设备的工作状态。

1. 引言

在使用Net nanoFramework驱动 ESP32-S3-Zero 的板载 WS2812B LED 时,你可能遇到一些挑战,如LED反色问题。本文将详细探讨如何解决这些问题,以及如何有效地利用工作状态灯来显示设备的工作状态。我们将使用Iot.Device.Ws28xx.Esp32库,这是一个专为ESP32板设计的库,用于驱动WS28xx系列的LED。

Ws28xx

2. 板载 LED 的使用

在硬件上的开发与纯软件不同,因为我们使用的硬件的一些特异性,往往同样的代码在不同的硬件上会有不同的表现。这就需要我们在开发的时候,对硬件的特性有一定的了解,这样才能更好的使用硬件。

一般来说通过 Iot.Device.Ws28xx.Esp32 库,我们即可方便的驱动自己的 LED。根据板子的资料我们可以查到 ESP32-S3-Zero 板载了一颗 WS2812B LED,这颗 LED 的引脚是 GPIO 21,我们可以通过以下代码来驱动这颗 LED:

int WS2812_Count = 1;
int WS2812_Pin = 21;
var leddev = new Ws2812b(WS2812_Pin, WS2812_Count);
BitmapImage img = leddev.Image;
img.SetPixel(0, 0, Color.Red);
leddev.Update();
Thread.Sleep(1000);
img.SetPixel(0, 0, Color.Green);
leddev.Update();
Thread.Sleep(1000);
img.SetPixel(0, 0, Color.Blue);
leddev.Update();

这样我们就可以通过这颗 LED 来显示不同的颜色了。但是实际情况是,灯光颜色奇奇怪怪,都趋近于白色。当我们将 Ws2812b 更换为 Ws2812c 时,可以驱动正常的颜色了,但是颜色却是反的。

3. 解决 LED 反色问题

通过官方仓库的 源码 我们可以看到,Ws2812b 类的构造函数中,使用了 BitmapImageNeo3 类来初始化 Image 属性,而 Ws2812c 类中使用的是 BitmapImageWs2808Grb。根据根据板子使用的 XL-0807RGBC-WS2812B 技术数据表来看,其颜色数据使用的是RGB顺序,这就不难发现问题所在了。

针对这种情况,我们可以通过继承 Ws28xx 类,然后自行修改,来解决这个问题。之前BitmapImageWs2808GrbBitmapImageWs2808 等这些类都是 internal,无法继承。目前最新的版本已经将这些类修改为 public,我们可以直接继承这些类,然后修改 Image 对象使用BitmapImageWs2808,来解决这个问题。

public class XlWs2812b : Ws28xx
{
    public XlWs2812b(int gpioPin, int width, int height = 1)
        : base(gpioPin, new BitmapImageWs2808(width, height))
    {
        ClockDivider = 2;
        OnePulse = new RmtCommand(32, true, 18, false);
        ZeroPulse = new RmtCommand(16, true, 34, false);
        ResetCommand = new RmtCommand(2000, false, 2000, false);
    }
}

添加好这个类,我们就可以通过 XlWs2812b 类来驱动我们的 LED 了。

4. 工作状态灯的应用

为了更好的了解设备的工作状态,我们可以通过工作状态灯来显示设备的工作状态。这样,我们就可以通过灯光的颜色来了解设备的工作状态。

4.1 工作状态灯的设计

首先我们先定义一个枚举,用于表示设备的工作状态:

/// <summary>
/// 定义设备状态
/// </summary>
public enum RunStatus
{
    /// <summary>
    /// 启动中,灯蓝色常亮
    /// </summary>
    Start,

    /// <summary>
    /// 请求识别,蓝色快闪
    /// </summary>
    OnIdentify,

    /// <summary>
    /// 验证成功,灯绿色常亮
    /// </summary>
    AuthSuccess,

    /// <summary>  
    /// wifi连接中,橙色快烁
    /// </summary>  
    Connecting,

    /// <summary>  
    /// wifi 配置问题,红色闪烁  
    /// </summary>  
    ConfigFailed,

    /// <summary>  
    /// wifi 连接失败,红色常亮  
    /// </summary>  
    ConnectFailed,

    /// <summary>  
    /// 正常工作中,绿色呼吸灯  
    /// </summary>
    Working,

    /// <summary>
    /// 关闭灯光
    /// </summary>
    Close
}

然后我们定义一个 BoardLedControl 类,用于控制灯光的显示,这个类的构造函数中,我们可以设置灯光的引脚,以及灯光的检查间隔。这个类中,我们使用了一个线程来检查灯光的状态,这样我们就可以在其他线程中,通过修改灯光的状态来控制灯光的显示。

/// <summary>
/// 工作灯控制
/// </summary>
/// <param name="pin">Gpio Pin</param>
/// <param name="checkDelay">控制检查间隔</param>
public BoardLedControl(int pin = 21,int checkDelay = 500)
{
    WS2812_Pin = pin;
    leddev = new XlWs2812b(WS2812_Pin, 1, 1);
    image = leddev.Image;

    statusThread = new Thread(() => {
        while (true)
        {
            if (autoUpdate)
            {
                UpdateLedStatus();
            }
        }
    });
    statusThread.Start();
}

4.2 几种灯光模式

BoardLedControl 类中,我们定义了几种灯光模式,常亮,闪烁,呼吸灯等。

/// <summary>
/// 灯光效果-闪烁
/// </summary>
/// <param name="color">颜色</param>
/// <param name="delay">时延</param>
public void LedBlink(Color color,int delay = 500)
{
    image.SetPixel(0, 0, color);
    leddev.Update();
    Thread.Sleep(delay);
    image.SetPixel(0, 0, Color.Black);
    leddev.Update();
    Thread.Sleep(delay);
}

/// <summary>
/// 灯光颜色设置
/// </summary>
/// <param name="color">颜色</param>
/// <param name="sleepDuration">等待</param>
public void LedSet(Color color, int sleepDuration = 0)
{
    image.SetPixel(0, 0, color);
    leddev.Update();
    if (sleepDuration > 0)
    {
        Thread.Sleep(sleepDuration);
    }
}

/// <summary>
/// 灯光效果-呼吸
/// </summary>
/// <param name="color">颜色</param>
/// <param name="duration">时长</param>
/// <param name="steps">步长</param>
public void LedBreath(Color color, int duration = 3900, int steps = 20)
{
    // 限制参数范围
    steps = steps < 10 ? 10 : steps;
    duration = duration < 1000 ? 1000 : duration;

    // 计算每一步的暂停时长 (单位:毫秒)  
    int sleepDuration = duration / (2 * steps);
    for (int i = 1; i <= steps; i++)
    {
        // 计算当前明度  
        float brightness = (float)i / steps;
        // 设置颜色  
        Color currentColor = Color.FromArgb(
            (int)(color.R * brightness),
            (int)(color.G * brightness),
            (int)(color.B * brightness));
        LedSet(currentColor, sleepDuration);
    }
    for (int i = steps; i > 0; i--)
    {
        float brightness = (float)i / steps;
        Color currentColor = Color.FromArgb(
            (int)(color.R * brightness),
            (int)(color.G * brightness),
            (int)(color.B * brightness));
        LedSet(currentColor, sleepDuration);
    }
}

4.3 灯光状态检查

BoardLedControl 类中,我们定义了一个 UpdateLedStatus 方法,用于检查灯光的状态,然后根据灯光的状态来控制灯光的显示。

/// <summary>
/// 更新灯光
/// </summary>
public void UpdateLedStatus()
{
    // 根据设备状态更新灯光
    switch (DeviceStatus)
    {
        case RunStatus.Start:
            LedSet(Color.Blue);
            break;
        case RunStatus.OnIdentify:
            LedBlink(Color.Blue, 200);
            break;
        case RunStatus.AuthSuccess:
            LedSet(Color.Green);
            break;
        case RunStatus.Connecting:
            LedBlink(Color.Orange, 200);
            break;
        case RunStatus.ConfigFailed:
            LedBlink(Color.Red);
            break;
        case RunStatus.ConnectFailed:
            LedSet(Color.Red);
            break;
        case RunStatus.Working:
            LedBreath(Color.Green);
            break;
        default:
            LedSet(Color.Black);
            break;
    }
}

4.4 使用工作状态灯

在使用工作状态灯时,我们可以通过以下代码来使用:

// 初始化灯光控制
var _led = new BoardLedControl();
// 开启工作灯,蓝色引擎启动!
_led.StartAutoUpdate();
// ....
// 更改状态
_led.DeviceStatus = RunStatus.OnIdentify;

启动

在使用中,我们可以通过修改 DeviceStatus 属性来控制灯光的显示,这样我们就可以通过灯光的颜色来了解设备的工作状态了。当然,也可以不启用自动更新StartAutoUpdate()或在合适时候使用StopAutoUpdate方法关闭自动更新,然后通过直接调用 LedSetLedBlinkLedBreath 等方法来控制灯光的显示。

5. 最后

虽然在使用 ESP32 的板载 WS2812B LED 可能会遇到一些问题,但只要你理解了这些问题的原因,就可以找到解决方案。同时,工作状态灯是一种非常有效的工具,可以帮助你更好地了解设备的工作状态。我们希望本文能对你在使用 ESP32驱动 WS2812B LED 时提供帮助。文章中的代码已经上传到 Github ESP32_S3_Samples 项目,欢迎大家下载使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/355667.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenDataLab 大模型训练数据集下载记录

1、访问网站&#xff1a;OpenDataLab 引领AI大模型时代的开放数据平台 &#xff08;操作之前需要先注册登录&#xff09; 2、点击数据类型&#xff0c;点击某个数据集进入&#xff0c;会看到数据集的各种详细信息如下图&#xff1a; 3、点击cli下载&#xff0c;第一次进入点击…

每日一题——LeetCode1365.有多少小于当前数字的数字

方法一 暴力循环 对于数组里的没一个元素都遍历一遍看有多少元素小于当前元素 var smallerNumbersThanCurrent function(nums) {let n nums.length;let ret [];for (let i 0; i < n; i) {let count 0;for (let j 0; j < n; j) {if (nums[j] < nums[i]) {count…

Docker 安装与基本操作

目录 一、Docker 概述 1、Docker 简述 2、Docker 的优势 3、Docker与虚拟机的区别 4、Docker 的核心概念 1&#xff09;镜像 2&#xff09;容器 3&#xff09;仓库 二、Docker 安装 1、命令&#xff1a; 2、实操&#xff1a; 三、Docker 镜像操作 1、命令&#xff1…

【算法与数据结构】139、LeetCode单词拆分

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题可以看做一个动态规划问题。其中&#xff0c;字符串s是背包&#xff0c;而字典中的单词就是物品。…

如何使用Docker部署WBO白板并实现公网地址远程访问

本文主要是如何使用Docker部署WBO白板并实现公网地址远程访问的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日一句&am…

AcWing 895. 最长上升子序列(DP序列模型)

[题目概述] 给定一个长度为 N 的数列&#xff0c;求数值严格单调递增的子序列的长度最长是多少。 输入格式 第一行包含整数 N。 第二行包含 N 个整数&#xff0c;表示完整序列。 输出格式 输出一个整数&#xff0c;表示最大长度。 数据范围 1 ≤ N ≤ 1000 &#xff0c; …

《HTML 简易速速上手小册》第1章:HTML 入门(2024 最新版)

文章目录 1.1 HTML 简介与历史&#xff08;&#x1f609;&#x1f310;&#x1f47d;踏上神奇的网页编程之旅&#xff09;1.1.1 从过去到现在的华丽蜕变1.1.2 市场需求 —— HTML的黄金时代1.1.3 企业中的实际应用 —— 不只是个网页1.1.4 职业前景 —— 未来属于你 1.2 基本 H…

HDFS Federation前世今生

一 背景 熟悉大数据的人应该都知道&#xff0c;HDFS 是一个分布式文件系统&#xff0c;它是基于谷歌的GFS实现的开源系统&#xff0c;设计目的就是提供一个高度容错性和高吞吐量的海量数据存储解决方案。在经典的HDFS架构中有2个NameNode和多个DataNode&#xff0c;如下 从上面…

Vue-Cli3 - 从安装 nodejs 配置环境 ~ 搭建 cli 脚手架项目全过程

目录 前言提示 一、安装 & 配置 nodejs 1.1、安装 nodejs 1.2、配置必要目录 1.3、配置环境变量 1.4、测试 安装&配置 是否成功 1.5、安装淘宝镜像 1.5、cnpm 安装&#xff08;推荐安装&#xff09; 二、vue-cli3 创建项目 2.1、vue-cli2 和 vue-cli3 主要区…

RBD —— 不同材质破碎

目录 Working with concrete Chipping Details Proxy geometry Constraints Working with glass Chipping Proxy geometry Constraints Resolving issues with glass fracturing Working with wood Clustering Using custom cutters Working with concrete Concr…

【STM32F103单片机】利用ST-LINK V2烧录程序 面包板的使用

1、ST‐LINK V2安装 参考&#xff1a; http://t.csdnimg.cn/Ulhhq 成功&#xff1a; 2、烧录器接线 背后有标识的引脚对应&#xff1a; 3、烧录成功 烧录成功后&#xff0c;按下核心板的RESET键复位&#xff01;&#xff01;&#xff01;即可成功&#xff01; 4、面包板的…

Docker 安装篇(Ubuntu)

图省事一般采用第一种 一、 直接采用apt安装 apt install docker.io查看 /usr/lib/systemd/system/docker.service ubuntu默认守护进程用的&#xff1a;fd:// ps -ef | grep docker root 775237 1 0 11:14 ? 00:01:07 /usr/bin/dockerd -H fd:// --cont…

SELINUX导致的网络服务问题解决

第一&#xff1a;开启相关服务&#xff0c;监控SELINUX 相关服务&#xff1a;setroubleshoot,auditd,大多数都是以se开头的 如果没有此服务&#xff0c;先yum下&#xff0c;然后查看状态 这里关于auditd说明&#xff0c;centos7不可以用systemctl重启auditd服务&#xff0c;…

Python 拼接字符串的 7 种方式

忘了在哪看到一位编程大牛调侃&#xff0c;他说程序员每天就做两件事&#xff0c;其中之一就是处理字符串。相信不少同学会有同感。 几乎任何一种编程语言&#xff0c;都把字符串列为最基础和不可或缺的数据类型。而拼接字符串是必备的一种技能。今天&#xff0c;我跟大家一起来…

剧本杀小程序的诞生:重塑线下娱乐的数字化未来

随着科技的不断发展&#xff0c;人们对于娱乐方式的需求也在不断升级。近年来&#xff0c;剧本杀作为一种新型的线下社交娱乐方式&#xff0c;以其独特的魅力和深度的人际互动性&#xff0c;受到了广大年轻人的喜爱。然而&#xff0c;传统的剧本杀模式存在一些问题&#xff0c;…

【王道数据结构】【chapter3队列】【P86t3】

利用两个栈S1和S2来模拟一个队列&#xff0c;已知栈的4个运算定义如下 Push(S,x); Pop(S,x); StackEmpty(S); StackOverflow(S); 如何利用栈的运算来实现该队列的3个运算&#xff08;形参由读者根据要求自己设计&#xff09; Enqueue;//将元素x入队 Dequeue;//出队&#xff0c;…

canvas自定义扩展示例,新增属性和方法

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

CSAPP shelllab

CSAPP shell lab shell lab 的目标 实现shell 功能&#xff0c;包括解析命令&#xff0c;调用可执行文件和内置命令&#xff0c;(quit, jobs,fg, 和bg)。实现job控制和signal handler。 shell 介绍 Shell中的作业&#xff08;job&#xff09;管理是一种用于跟踪和控制正在运…

游戏开发丨基于Tkinter的扫雷小游戏

文章目录 写在前面扫雷小游戏需求分析程序设计程序分析运行结果系列文章写在后面 写在前面 本期内容 基于tkinter的扫雷小游戏 所需环境 pythonpycharm或anaconda 下载地址 https://download.csdn.net/download/m0_68111267/88790713 扫雷小游戏 扫雷是一款广为人知的单…

2024年搭建幻兽帕鲁服务器价格多少?如何自建Palworld?

自建幻兽帕鲁服务器租用价格表&#xff0c;2024阿里云推出专属幻兽帕鲁Palworld游戏优惠服务器&#xff0c;配置分为4核16G和4核32G服务器&#xff0c;4核16G配置32.25元/1个月、3M带宽96.75元/1个月、8核32G配置10M带宽90.60元/1个月&#xff0c;8核32G配置3个月271.80元。ECS…