炫酷 RGB 之.NET nanoFramework 点灯大师

news/2023/5/28 7:06:49

前面介绍了 .NET nanoFramework 入门,本文继续以微雪的 ESP32-S2-Pico 为例介绍 .NET nanoFramework 的开发:控制 ESP32 板载 RGB 灯 和 外接 RGB 灯。内容包含 状态灯的意义、WS2812 、HSV、PWM 等相关知识。

文章目录

  • 1. 背景
  • 2. 状态灯的意义
  • 3. 板载 LED
  • 4. WS2812
    • 4.1 简介
    • 4.2 控制原理
  • 5. 板载 RGB 控制
    • 5.1 简单颜色测试
    • 5.2 HSV 颜色模型
    • 5.3 呼吸灯效果
    • 5.4 整体颜色测试
  • 6. 官方驱动库 Ws28xx.Esp32
  • 7. 全彩 RGB
  • 8. 最后

1. 背景

ESP32 开发第一步,基本是先点灯吧?点灯,点灯,点灯,没想到我这个点灯,点了 2 周。一是工作比较忙,只有闲暇时间搞搞这个,再者也是需要查找学习各种资料,因为这个板载的灯没有那么好点,一时疏忽,找错了方向。

2. 状态灯的意义

我不清楚是不是有 ESP32 开发第一步要先点灯这个说法,但是设备的状态指示灯的作用还是非常大的,通过它可以向用户提供设备的工作状态信息。设备状态灯通常用不同颜色或闪烁频率来表示设备的不同工作状态。例如:

  • 绿色:设备正常工作。
  • 红色:设备出现故障。
  • 黄色:设备正在进行某项操作,如升级。
  • 闪烁:设备正在进行某项操作,如数据传输。

设备状态灯是一种非常简单易懂的人机交互手段,使用户能够快速了解设备的工作状态,并能够及时采取措施。

通常设备状态灯在设备外部或者是设备前面,方便用户查看,比如说一个路由器上面有个红绿灯,绿灯就是网络正常,红灯就是网络有问题。再比如一些简单的小家电,红灯表示正在充电,灯灭则表示充满。

3. 板载 LED

ESP32-S2-Pico 这款板载的 LED 硬件有过版本修改,通过简单的 GPIO 拉高并不能点亮。

硬件变化

查找原理图我们可以发现,LED 接的是 GPIO9 ,LED 这一块的电路是 WS2812B-0807,这一部分的原理图如下图所示,仅有一个灯珠:

WS2812

4. WS2812

4.1 简介

WS2812 是一种高性能、低成本的全彩 LED 灯带。它是一种串联控制的灯,可以将多个 LED 灯连接在一起,通过串行信号控制各个 LED 灯的颜色和亮度。

WS2812 的主要特点是具有色彩丰富、高亮度、高动态范围、高精度的色温调节能力,可以实现 256 级灰度调节。

WS2812 的控制方式是通过一种称为单总线控制的方式。这种控制方式是通过单线控制所有 LED 灯,并且每个 LED 灯都有一个内置的控制器,可以接收单线信号并解码。这样可以使得控制器只需要通过单线发送信号,就可以控制所有 LED 灯的颜色和亮度。

WS2812 在很多领域都有广泛的应用,如:LED灯带、LED点阵屏幕、LED灯管、LED灯环等。

4.2 控制原理

WS2812 每个 LED 灯都有一个内置的控制器,它可以接收单线信号并解码。控制器通过接收单线信号来控制 LED 灯的颜色和亮度。

控制器解码信号的方式是通过高电平和低电平的时间来区分不同的数据位。

通常每个 LED 灯的颜色都由三个数据位(红、绿、蓝)组成,每个数据位可以表示 8 级亮度。

当控制器接收到单线信号时,首先会检测到一个高电平脉冲,这个脉冲用来同步数据。接下来是 24 位数据,其中 8 位红色数据、8 位绿色数据和 8 位蓝色数据。控制器按照这样的数据格式解码信号,并设置 LED 灯的颜色和亮度。

毕竟文章重点不同,在这里只是做了简单的介绍,知道了原理是可以自己写出驱动的,当然要查阅相关硬件的手册文档,更详细的了解相关数据发送的方式,不同灯珠通讯时序的具体时间要求会不大相同。感兴趣的同学可以自行查找资料,进行尝试。

原理介绍:https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf

这里我们只需要使用写好的驱动就可以了,比如 MicroPython 的 neopixel 类库。当然 .NET nanoFramework 也有相关的类库: Ws28xx.Esp32。

5. 板载 RGB 控制

这里我们采用 ESP32 WS2812 Driver ,代码仓库:https://github.com/nanoframework/nf-Community-Contributions/tree/master/drivers/ESP32-WS2812,提供了 PixelController 控制的帮助类,可以让我们轻松的实现 WS2812 的控制,你也可以通过源代码了解驱动的实现。

5.1 简单颜色测试

PixelController 构造函数提供三个参数,分别是 GPIO ,像素数,可选参数是否为 RGBW 灯带控制,默认 false

PixelController controller = new PixelController(9, 1);
// 简单测试颜色
controller.SetColor(0,255,0,0);//红
controller.UpdatePixels();
Thread.Sleep(1000);
controller.SetColor(0, 0, 255, 0);//绿
controller.UpdatePixels();
Thread.Sleep(1000);
controller.SetColor(0, 0, 0, 255);//蓝
controller.UpdatePixels();
Thread.Sleep(1000);
controller.SetColor(0, 255, 255, 255);//白
controller.UpdatePixels();
Thread.Sleep(1000);

效果:

效果

5.2 HSV 颜色模型

上一节简单测试了灯光的红、绿、蓝、白几种颜色,使用的 SetColor ,这个方法是设置灯光的 RGB 颜色。另外一个设置颜色的方式是使用 SetHSVColor,这个方式使用的 HSV 颜色模型。

HSV (Hue, Saturation, Value) 和 RGB (Red, Green, Blue) 是两种不同的颜色空间。在 HSV 颜色模型中:

  • Hue(色调),表示颜色的类型,如红色、黄色、蓝色等。Hue 的值用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,紫色为300°;
  • Saturation(饱和度),表示颜色接近光谱色的程度,值越大颜色越饱和,值越小颜色越灰暗。Saturation 的值范围为 0 到 1。
  • Value(明度),表示颜色的明亮程度,值越大颜色越亮,值越小颜色越暗。Value 的值范围为 0 到 1。

HSV

与传统的 RGB 相比 HSV 可以非常方便的通过调整明度来平滑的显示颜色亮度变化。

5.3 呼吸灯效果

要想实现呼吸灯的效果,我们只需要通过 SetHSVColor 来设置不同明度的色彩即可平滑的实现呼吸灯的亮度变化效果。

// 呼吸灯效果
PixelController controller = new PixelController(9, 1);
var ts = 0;
for (; ; )
{var add = true;var v = 0f;for (; ; ){controller.SetHSVColor(0, 240, 50, v);controller.UpdatePixels();if (add){v += 0.05f;}else{v -= 0.05f;}if (v >= 1) add = false;if (v <= 0) break;Thread.Sleep(50);}if (ts > 5) break;ts++;
}

效果:

在这里插入图片描述

5.4 整体颜色测试

色彩 RGB 我们可以通过随机三个 255 以内的数字来生成随机的颜色。了解了 HSV 后,我们也可以通过 Hue(色调)的取值,直接在圆环中均匀的截取颜色。

 // 生成多少种颜色 或是 灯带的灯珠数量
uint ledCount = 25;
PixelController controller = new PixelController(9, ledCount);// 添加开始时设置的 ledCount 种颜色
// step 是步长
int step = (int)(360 / ledCount);
var hue = 0;
for (uint i = 0; i < ledCount; i++)
{// HSV// 色调H 取值范围为0°~360°// 饱和度S 取值范围为0%~100%,值越大,颜色越饱和// 明度V 表示颜色明亮的程度,通常取值范围为0%(黑)到100%(白)// V 这个取值挺好的,设置为1 差点亮瞎controller.SetHSVColor((short)i, (short)hue, 1, 0.05f);hue = hue + step;controller.UpdatePixels();
}// 循环变换颜色
for (; ; )
{controller.MovePixelsByStep(1);controller.UpdatePixels();Thread.Sleep(500);
}

这段代码比较适合灯带,因为微雪的 ESP32-S2-Pico 只有一个灯珠,MovePixelsByStep 变换后位置后使用 UpdatePixels 也是可以看到颜色变化的。

许多玩家都是喜欢 RBG 光效这种“光污染”的,用这个控制灯带也是可以大有玩头的。

6. 官方驱动库 Ws28xx.Esp32

当然,最好是使用官方的 nanoFramework.Iot.Device.Ws28xx.Esp32 包,通过 Nuget 安装即可,需要注意的是,选对版本,其依赖的其他 nanoFramework 包需要和刷写的固件对应。

使用的方法也很简单,如下是简单的 RGB 颜色控制示例:

// 1 个灯珠,1像素
const int Count = 1;
// 微雪的 ESP32-S2-Pico 的 LED Pin
const int Pin = 9;
public static void Main()
{Ws28xx neo = new Ws2812c(Pin, Count);BitmapImage img = neo.Image;for (; ; ){img.SetPixel(0, 0, Color.Red);neo.Update();Thread.Sleep(500);img.SetPixel(0, 0, 0, 255, 0);neo.Update();Thread.Sleep(500);img.SetPixel(0, 0, 0, 0, 255);neo.Update();Thread.Sleep(500);}
}

但是,这里需要注意的是:Ws28xx 这里需要使用 Ws2812c 来实例化,不然颜色控制会不对。

7. 全彩 RGB

这一节演示通过 PWM 端口控制全彩红绿蓝三基色 LED 灯。

LED

可以看到该模块有4 Pin,其电压为 5V,接 VBUS 引脚即可,其他三个引脚为 RBG 控制引脚接 GP2-4。

接线

接好设备后面就是写代码了,首先编写初始化功能,定义 R_Pin、 B_Pin、 G_Pin,对应的 GPIO 使用 PWM 需要先进行设置,使用 Configuration.SetPinFunction 将对应 Pin 进行配置。然后使用 PwmChannel.CreateFromPin 从三个引脚创建 PWM 通道,接着启动控制。

/// <summary>
/// 定义 RBG 的 PWM 通道
/// </summary>
private static PwmChannel R_Pin, B_Pin, G_Pin;/// <summary>
/// 初始化 配置PWM 信息
/// </summary>
public static void Init() {// 先设置引脚 , RBG 分别接的 GP2-4Configuration.SetPinFunction(2, DeviceFunction.PWM2);Configuration.SetPinFunction(3, DeviceFunction.PWM3);Configuration.SetPinFunction(4, DeviceFunction.PWM4);// 从三个引脚创建 PWM 通道R_Pin = PwmChannel.CreateFromPin(2, 40000, 0);B_Pin = PwmChannel.CreateFromPin(3, 40000, 0);G_Pin = PwmChannel.CreateFromPin(4, 40000, 0);// 启动 PWMR_Pin.Start();B_Pin.Start();G_Pin.Start();
}

核心的控制代码也很简单,这里随机生成 255 以内的数然后映射到百分比,PwmChannel 的占空比是个百分比,double 类型,取值 0-1 。

public static void Main()
{Init();Random random = new Random();while (true){R_Pin.DutyCycle = random.Next(255) / 255.0;B_Pin.DutyCycle = random.Next(255) / 255.0;G_Pin.DutyCycle = random.Next(255) / 255.0;Thread.Sleep(500);}}

8. 最后

本文相关代码和之前相关系列文章的代码均已在 Github 开源,感兴趣的同学可以查阅:
https://github.com/sangyuxiaowu/ESP32_S2_PICO。

如有错漏之处,敬请指正。

声明:本文来自“桑榆肖物”,仅允许规范转载。

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

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

HBuilder X 运行模拟器时一直转圈,搜索不到模拟器

模拟器能正常打开,项目运行也不报错,运行到模拟器的时候就是一直这样转圈圈, 出现这种问题的时候,在网上搜到很多方法,比如覆盖adb文件更新版本,配置adb环境变量啥的,问题一直没解决,最后卸载HBuilder重写下载就好了,现在怀疑之前的Hbuilder版本有点老,和模拟器不兼容,下载一个…

【HBuilder运行到MuMu模拟器无法安装基座的问题,一直卡在安装基座...】

HBuilder运行到MuMu模拟器无法安装基座的问题&#xff0c;一直卡在安装基座… 首先&#xff0c;模拟器端口要配置对&#xff0c;MuMu模拟器端口默认是7555&#xff0c;基本上配了端口就能检测到设备&#xff0c;不需要配置adb 在模拟器设置里找到开发者选项&#xff0c;将不锁…

【人工智能】无人车系统仿真软件-PreScan

自重驾驶的核心不是传感器&#xff0c;不是导航、不是自动控制&#xff0c;而是仿真。——无水先生 PreScan 功能 | TASS International (siemens.com) 目录 一、前言 二、计算机仿真器软件 2.1 常见仿真器种类 2.2 驾驶仿真特点 2.3 软件仿真优缺点 三、prescan 官网…

String test=args[0];提示数据越界为什么,好菜哦,都是细节

String testargs[0];提示数据越界为什么 public class ExTestDrive { public static void main(String[] args){ String testargs[0];

SSH服务器拒绝了密码。请再试一次。解决方法汇总。浪费我一下午的时间,只好承认自己好菜。

问题图 解决方案1&#xff1a;在ubuntu终端中&#xff0c;输入 vim /etc/ssh/sshd_config 找到这段代码 修改为 按insert 开始编辑&#xff0c;编辑结束后按esc&#xff0c;然后输入 &#xff1a;wq即可保存 如果保存不成功&#xff0c;就输入 &#xff1a;wq&#xff01;强制…

预制菜前景可观,怎么打开销路实现有效拓客?

前两天还在某博刷到了预制菜的热搜&#xff0c;据说前景非常可观&#xff0c;不出意外的话&#xff0c;之后应该会有很多商家涌入&#xff0c;这个市场怕是要激烈竞争一番了。 预制菜怎么快速打开销路&#xff0c;找到客户是我们今天要讲的内容。 1、确定目标客户 首先要确定…

《大话设计模式》之--第13章 好菜每回味不同----建造者模式

第13章 好菜每回味不同----建造者模式 13.1炒面没放盐 “小菜&#xff0c;讲了半天&#xff0c;肚子饿得厉害&#xff0c;走&#xff0c;去吃夜宵去。”大鸟摸着肚子说道。 “你请客&#xff1f;” “我教了你这么多&#xff0c;你也不打算报答一下&#xff0c;还要我请客?…

四川泡菜母水做法 如何做泡菜母水

四川有很多闻名全国的美食&#xff0c;四川泡菜就是嘉许胡晓的存在&#xff0c;据说在四川很多地区&#xff0c;家家户户都有祖传下来的老坛泡菜水&#xff0c;他也被人们称为四川泡菜母水&#xff0c;很多其它地区的人都想学习这种泡菜母水的制作方法&#xff0c;想让自己的家…

jfow-core 代码分析

EntityNoName目录概述需求&#xff1a;设计思路实现思路分析1.code:2.code2&#xff1a;3.FLows4.frm5.code3:code4:EntityTreeAttrEntitiesNoNameenum:JUmp way参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full bu…

32岁辞职读博,博三还没有文章,焦虑,如何调节?

链接&#xff1a;https://www.zhihu.com/question/418159010编辑&#xff1a;深度学习与计算机视觉声明&#xff1a;仅做学术分享&#xff0c;侵删可能因为在企业工作过&#xff0c;觉得自己现在研究的东西全是表面功夫&#xff0c;一点不实用。导师不管&#xff0c;不发钱&…

38.“财务自由“,喂给创业者的童话故事

现在我们拼搏两三年&#xff0c;等公司上市后&#xff0c;就实现财务自由&#xff0c;就能过上好日子。上面是我看到有些人拉创业者入伙时说的话&#xff0c;很具有蛊惑性。我很疑惑&#xff0c;怎么“财务自由”就和“过上好日子”画上了等号呢&#xff1f;记得“财务自由”这…

普通人怎么去赚钱?想实现财务自由只能去创业。丨国仁网络资讯

大家好&#xff0c;我是猫哥&#xff0c;今天要给大家分享的仍然是怎么去赚钱&#xff0c;我们就死磕赚钱。 近朱者赤近墨者黑。这是我一直信奉的一句真理。如果你身边的人都是穷人&#xff0c;那么你毫无意外&#xff0c;一定也是一个穷人&#xff0c;如果你身边有很多富人&a…

亚马逊云科技携手普华永道,助力泉峰集团破解数据治理与使用难题

大数据时代的到来&#xff0c;掀起了企业数字化转型的热潮&#xff0c;对于制造行业的企业来说&#xff0c;除了顺应发展潮流快速开启数字转型之外&#xff0c;以创新思维不断拓展业务广度&#xff0c;对于自身发展也有着格外重要的意义。数字化水平能否与创新发展的脚步保持一…

(二十三:2020.12.14)CVPR 2020 学习(二)《U^2 Net》

《U^2 Net: Going Deeper with Nested U-Structure for Salient Object Detection》《借助嵌套U型结构深入研究显着物体》讲在前面摘要论文内容1.介绍2.之前的相关工作2.1 多级的深度特征整合2.2 多尺度特征提取3.我们提出的方法3.1 残差U型块3.2 U2-Net的结构3.3 监督策略4.实…

SVM入门(六)至(十)

原文转自&#xff1a;http://www.blogjava.net/zhenandaci/archive/2009/03.html 感谢原创作者~~ SVM入门&#xff08;六&#xff09;线性分类器的求解——问题的转化&#xff0c;直观角度 让我再一次比较完整的重复一下我们要解决的问题&#xff1a;我们有属于两个类别的样本…

SVM入门(十)将SVM用于多类分类

&#xfeff;&#xfeff;&#xff08;一&#xff09;SVM的八股简介 支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的&#xff0c;它在解决小样本、非线性及高维模式识别中表现出许多特有的优势&#xff0c;并能够推广应用到函数拟合等其他机器学习问题…

SVM入门(五)到十

从最一般的定义上说&#xff0c;一个求最小值的问题就是一个优化问题&#xff08;也叫寻优问题&#xff0c;更文绉绉的叫法是规划——Programming&#xff09;&#xff0c;它同样由两部分组成&#xff0c;目标函数和约束条件&#xff0c;可以用下面的式子表示&#xff1a; &…

网随电通!海思PLC技术致创能源,让城市路灯更智慧

2020年以来&#xff0c;随着中央一系列会议对“新基建”密集部署&#xff0c;新基建已成为未来中国经济发展的新引擎。5G智慧路灯杆作为新基建建设的主要载体&#xff0c;已经受到各地政府的普遍认可和重视。 那么除了在路灯上安装5G、各种传感器等高大上的应用&#xff0c;还…

基于STM32的实时操作系统FreeRTOS(待更新……)

摘要&#xff1a;RTOS很简单&#xff0c;听起来叫做实时操作系统&#xff0c;有一点吓唬人。但是学起来真的很简单&#xff0c;你不要把他想象的太复杂。这玩意其实就是一个任务调度器&#xff0c;在裸机中程序只有一个死循环&#xff0c;但是使用了RTOS程序中就有了多个死循环…

平台赋能,生态共赢- PLC远程监控

由山东省经信委、省财政厅、省企业上云服务联盟等联合举办的云行齐鲁COSMOPlat专场——青岛站”专题活动会议于今天在海尔冰山之角举行。湖南华辰智通科技有限公司作为主办方的生态合作伙伴&#xff0c;受邀参会。 本次“云行齐鲁COSMOPlat专场——青岛站”专题活动会议由山东省…