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灯珠(四)---实现全彩呼吸灯效果相关推荐

  1. 【杰理AC692X】6脚RGB 5050灯珠实现全彩呼吸灯的方法

    在消费电子中,呼吸灯和渐变灯都很常见,常见的呼吸灯要么是六种颜色,要么是七种,因为做这7种颜色的呼吸灯只要让PWM同增同减就好,是最简单的做法. 但要做全彩呼吸灯就没这么简单了,可以用HSB(HSV) ...

  2. STM32F103_TIM3输出PWM波实现全彩呼吸灯

    一.LED灯 1. 必须是全彩RGB_LED灯 2. 通过不同的红绿蓝三色LED混合出256种颜色,同电脑画图里的调色RGB888,每个灯各用8位控制其亮度,其中全灭表示黑色. 二. 1. LED亮度 ...

  3. Arduino Uno 全彩呼吸灯 三色LED灯渐变实例

    共阳三色雾状LED灯 可以控制三种颜色 ,分别是红,绿,蓝, 通过控制其亮度,可以混合出各种颜色,非常漂亮哦 注意 共阳指接的是正极 共阴指接的是负极 实验效果 引脚 请查看产品大图,最长的引脚为共阳 ...

  4. STM32F103VET6实现全彩LED灯

    全彩LED灯的实现 文章目录 全彩LED灯的实现 前言 一.相关知识 1.全彩 LED 灯简介 2.硬件简介 二.代码实现 1.编程要点 2.LED灯硬件相关宏定义 2.初始化 GPIO 3.定时器 ...

  5. 实战microPython(05)-WS2812全彩LED灯串的控制

    实战microPython(05)-WS2812全彩LED灯串的控制 David Zou 2018-09-17 在喜庆的节日中,我们经常使用彩灯串来增加节日的气氛.最早期的使用的是单色的小灯珠,只有亮 ...

  6. STM32驱动全彩LED灯模块WS2812

    STM32驱动全彩LED灯模块WS2812 WS2812全彩LED灯模块系列,可以进行级联实现灯带的效果,MCU端通过一个管脚可以控制所有级联的LED灯的不同发光颜色显示. 级联电路 WS2811(未 ...

  7. android 呼吸灯权限_小米新机搭载炫彩呼吸灯酷到爆;三星顶级旗舰Note 10正式官宣...

    各位,早上好!即日起,魅族Meizu Pay京津冀互联互通卡免费开卡,你期待吗? 1,苦等436天!国产超优秀ROM终于换代 7月2日,有网友曝光了魅族Flyme 8的海报图片,图片显示:你所期待的我 ...

  8. 【基于 STM32CubeMX + PWM + DMA驱动SW2812b全彩RGB灯】

    基于 STM32CubeMX + PWM + DMA驱动SW2812b全彩RGB灯 STM32CubeMX配置: 工程源码: END 以上就是相关配置,最需要注意的就是时钟以及pre数值以及芯片时钟频 ...

  9. 索骥馆-编程语言之《程序语言的奥妙:算法解读(四色全彩)》扫描版[PDF]

    内容简介: 在我们生活的世界中,各种各样形形色色的事物和现象,其中都必定包含着科学的成分.在这些成分中,有些是你所熟知的,有些是你未知的,有些是你还一知半解的.面对未知的世界,好奇的你是不是有很多疑惑 ...

最新文章

  1. mysql replication延迟_MySQL Replication--复制延迟01--源码瞎猜
  2. 深入理解ByteBuffer
  3. 大数据2 Hadoop伪分布模式配置部署
  4. 聚焦云原生,阿里云与 CNCF 共话「云未来,新可能」
  5. php怎么计算图片的大小,php 根据比例计算图片缩放尺寸函数的用法
  6. 服务器ubuntu系统版本选型原则,系统集成 - 选择Ubuntu服务器版操作系统的六大理由_服务器应用_Linux公社-Linux系统门户网站...
  7. 继续说invoke伪指令
  8. Final Cut Pro X实用教程:FCPX安装插件位置以及如何删除插件
  9. 外网质量监控系统实践之路
  10. Python中的石头、剪刀、布游戏
  11. 又有微软AI科学家流向产业,小鹏汽车迎来视觉感知负责人郭彦东
  12. Java编程必备软件
  13. python判断图片相似度_图像检索系列——利用 Python 检测图像相似度!
  14. HTML中的音视频标签
  15. Trusted Computing and DRM
  16. Win 7 配置FTP权限
  17. Python每天练习——小程序006
  18. 分布式共识算法丨Raft丨Raft-Extended 论文翻译
  19. 在手机屏幕上移动APP的两种方式
  20. 如何用迅雷下载OneDrive文件

热门文章

  1. php redis dao,phpredis单库操作string(5.0)
  2. 4.23黄金极度不稳暴涨后暴跌?后续会回多?
  3. C++实践(四):C++实现AES-CMAC算法
  4. 服务器拒绝了您发送离线文件的请求,QQ发离线提示“服务器拒绝了您发送离线文件”解决方法...
  5. 手机关机代码_华为手机电池不耐用?只需在拨号键中输入一串代码,续航能力暴涨...
  6. [HIMCM暑期班]第3课:一个博弈问题
  7. Areca Backup 备份工具的使用
  8. 7家公司拿了5个offer,无非就是问源码、分布式微服务这些
  9. windows端口查询与状态详解
  10. SAP 租户HANA端口查询以及创建数据库指定端口