WS2812灯珠(四)---实现全彩呼吸灯效果
WS2812灯珠实现呼吸灯效果主要涉及到呼吸函数及颜色模型两部分的内容。清楚了这两点结合之前的灯珠驱动程序,便可以实现任意颜色的呼吸变换效果了。
呼吸函数
具体的呼吸函数细节这里就不介绍了,感兴趣的可以自行搜索。这里下面的呼吸灯曲线表是从呼吸函数中取得离散点,最大值为256(rgb的分别值最大为255),总共300个亮度等级,若每个亮度下亮10ms则整个过程持续3S,符合人实际呼吸的情况。
/* 呼吸灯曲线表 */
const uint16_t index_wave[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 18, 18, 19, 20, 20, 21, 22, 23, 24, 25, 25, 26, 27, 28, 30, 31, 32, 33, 34, 36, 37, 38, 40, 41, 43, 45, 46, 48, 50, 52, 54, 56, 58, 60, 62, 65, 67, 70, 72, 75, 78, 81, 84, 87, 90, 94, 97, 101, 105, 109, 113, 117, 122, 126, 131, 136, 141, 146, 152, 158, 164, 170, 176, 183, 190, 197, 205, 213, 221, 229, 238, 247, 256, 256, 247, 238, 229, 221, 213, 205, 197, 190, 183, 176, 170, 164, 158, 152, 146, 141, 136, 131, 126, 122, 117, 113, 109, 105, 101, 97, 94, 90, 87, 84, 81, 78, 75, 72, 70, 67, 65, 62, 60, 58, 56, 54, 52, 50, 48, 46, 45, 43, 41, 40, 38, 37, 36, 34, 33, 32, 31, 30, 28, 27, 26, 25, 25, 24, 23, 22, 21, 20, 20, 19, 18, 18, 17, 16, 16, 15, 15, 14, 14, 13, 13, 12, 12, 11, 11, 10, 10, 10, 9, 9, 9, 8, 8, 8, 7, 7, 7, 7, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
RGB与HSV转换
如果过采用rgb的方式实现呼吸变换,变换过程中需要同时改变RGB三个值,很难保证颜色不会改变。因此我们需要一种更好的表示颜色的模型HSV,H:色调、S:饱和度、V:亮度。只要H和S不变就能够保证颜色不改变。但因为WS2812是属于RGB控制的,因此我们需要两者之间互相转化的公式,先由RGB设定我们要实现呼吸变换的颜色,然后将该颜色的RGB值转为HSV的值,通过定时改变V的值来改变亮度。改变后再将HSV的值转换成RGB的值赋值给灯珠显示。
static float min(float a, float b, float c)
{float m;m = a < b ? a : b;return (m < c ? m : c);
}static float max(float a, float b, float c)
{float m;m = a > b ? a : b;return (m > c ? m : c);
}void rgb2hsv(uint8_t r, uint8_t g, uint8_t b, float *h, float *s, float *v)
{float red, green ,blue;float cmax, cmin, delta;red = (float)r / 255;green = (float)g / 255;blue = (float)b / 255;cmax = max(red, green, blue);cmin = min(red, green, blue);delta = cmax - cmin;/* H */if(delta == 0){*h = 0;}else{if(cmax == red){if(green >= blue){*h = 60 * ((green - blue) / delta);}else{*h = 60 * ((green - blue) / delta) + 360;}}else if(cmax == green){*h = 60 * ((blue - red) / delta + 2);}else if(cmax == blue) {*h = 60 * ((red - green) / delta + 4);}}/* S */if(cmax == 0){*s = 0;}else{*s = delta / cmax;}/* V */*v = cmax;
}void hsv2rgb(float h, float s, float v, uint8_t *r, uint8_t *g, uint8_t *b)
{int hi = ((int)h / 60) % 6;float f = h * 1.0 / 60 - hi;float p = v * (1 - s);float q = v * (1 - f * s);float t = v * (1- (1 - f) * s);switch (hi){case 0:*r = 255 * v;*g = 255 * t;*b = 255 * p;break;case 1:*r = 255 * q;*g = 255 * v;*b = 255 * p;break;case 2:*r = 255 * p;*g = 255 * v;*b = 255 * t;break;case 3:*r = 255 * p;*g = 255 * q;*b = 255 * v;break;case 4:*r = 255 * t;*g = 255 * p;*b = 255 * v;break;case 5:*r = 255 * v;*g = 255 * p;*b = 255 * q;break;}
}
WS2812灯珠(四)---实现全彩呼吸灯效果相关推荐
- 【杰理AC692X】6脚RGB 5050灯珠实现全彩呼吸灯的方法
在消费电子中,呼吸灯和渐变灯都很常见,常见的呼吸灯要么是六种颜色,要么是七种,因为做这7种颜色的呼吸灯只要让PWM同增同减就好,是最简单的做法. 但要做全彩呼吸灯就没这么简单了,可以用HSB(HSV) ...
- STM32F103_TIM3输出PWM波实现全彩呼吸灯
一.LED灯 1. 必须是全彩RGB_LED灯 2. 通过不同的红绿蓝三色LED混合出256种颜色,同电脑画图里的调色RGB888,每个灯各用8位控制其亮度,其中全灭表示黑色. 二. 1. LED亮度 ...
- Arduino Uno 全彩呼吸灯 三色LED灯渐变实例
共阳三色雾状LED灯 可以控制三种颜色 ,分别是红,绿,蓝, 通过控制其亮度,可以混合出各种颜色,非常漂亮哦 注意 共阳指接的是正极 共阴指接的是负极 实验效果 引脚 请查看产品大图,最长的引脚为共阳 ...
- STM32F103VET6实现全彩LED灯
全彩LED灯的实现 文章目录 全彩LED灯的实现 前言 一.相关知识 1.全彩 LED 灯简介 2.硬件简介 二.代码实现 1.编程要点 2.LED灯硬件相关宏定义 2.初始化 GPIO 3.定时器 ...
- 实战microPython(05)-WS2812全彩LED灯串的控制
实战microPython(05)-WS2812全彩LED灯串的控制 David Zou 2018-09-17 在喜庆的节日中,我们经常使用彩灯串来增加节日的气氛.最早期的使用的是单色的小灯珠,只有亮 ...
- STM32驱动全彩LED灯模块WS2812
STM32驱动全彩LED灯模块WS2812 WS2812全彩LED灯模块系列,可以进行级联实现灯带的效果,MCU端通过一个管脚可以控制所有级联的LED灯的不同发光颜色显示. 级联电路 WS2811(未 ...
- android 呼吸灯权限_小米新机搭载炫彩呼吸灯酷到爆;三星顶级旗舰Note 10正式官宣...
各位,早上好!即日起,魅族Meizu Pay京津冀互联互通卡免费开卡,你期待吗? 1,苦等436天!国产超优秀ROM终于换代 7月2日,有网友曝光了魅族Flyme 8的海报图片,图片显示:你所期待的我 ...
- 【基于 STM32CubeMX + PWM + DMA驱动SW2812b全彩RGB灯】
基于 STM32CubeMX + PWM + DMA驱动SW2812b全彩RGB灯 STM32CubeMX配置: 工程源码: END 以上就是相关配置,最需要注意的就是时钟以及pre数值以及芯片时钟频 ...
- 索骥馆-编程语言之《程序语言的奥妙:算法解读(四色全彩)》扫描版[PDF]
内容简介: 在我们生活的世界中,各种各样形形色色的事物和现象,其中都必定包含着科学的成分.在这些成分中,有些是你所熟知的,有些是你未知的,有些是你还一知半解的.面对未知的世界,好奇的你是不是有很多疑惑 ...
最新文章
- mysql replication延迟_MySQL Replication--复制延迟01--源码瞎猜
- 深入理解ByteBuffer
- 大数据2 Hadoop伪分布模式配置部署
- 聚焦云原生,阿里云与 CNCF 共话「云未来,新可能」
- php怎么计算图片的大小,php 根据比例计算图片缩放尺寸函数的用法
- 服务器ubuntu系统版本选型原则,系统集成 - 选择Ubuntu服务器版操作系统的六大理由_服务器应用_Linux公社-Linux系统门户网站...
- 继续说invoke伪指令
- Final Cut Pro X实用教程:FCPX安装插件位置以及如何删除插件
- 外网质量监控系统实践之路
- Python中的石头、剪刀、布游戏
- 又有微软AI科学家流向产业,小鹏汽车迎来视觉感知负责人郭彦东
- Java编程必备软件
- python判断图片相似度_图像检索系列——利用 Python 检测图像相似度!
- HTML中的音视频标签
- Trusted Computing and DRM
- Win 7 配置FTP权限
- Python每天练习——小程序006
- 分布式共识算法丨Raft丨Raft-Extended 论文翻译
- 在手机屏幕上移动APP的两种方式
- 如何用迅雷下载OneDrive文件
热门文章
- php redis dao,phpredis单库操作string(5.0)
- 4.23黄金极度不稳暴涨后暴跌?后续会回多?
- C++实践(四):C++实现AES-CMAC算法
- 服务器拒绝了您发送离线文件的请求,QQ发离线提示“服务器拒绝了您发送离线文件”解决方法...
- 手机关机代码_华为手机电池不耐用?只需在拨号键中输入一串代码,续航能力暴涨...
- [HIMCM暑期班]第3课:一个博弈问题
- Areca Backup 备份工具的使用
- 7家公司拿了5个offer,无非就是问源码、分布式微服务这些
- windows端口查询与状态详解
- SAP 租户HANA端口查询以及创建数据库指定端口