首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

乐鑫Esp32学习之旅 24 分享在 esp32 SDK实现冷暖光色温RGB/HSV平滑调节的封装,轻松集成到您的项目去。(附带Demo)

  • 23-11-14 06:23
  • 4304
  • 5049
blog.csdn.net

  • 本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途。如有不对之处,请留言,本人及时更改。

1、 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 “Hellow World”。
2、 巧用eclipes编辑器,官方教程在在Windows下搭建esp32开发环境,打印 “Hellow World”。
3、 认识基本esp32的GPIO接口,开始点亮您的第一盏 LED和中断回调实现按键功能 。
4、体会esp32的强大的定时器功能, 实现定时2s闪烁一盏LED灯。
5、接触实践esp32的pwm宽度脉冲功能, 实现呼吸效果闪烁一盏LED灯。
6、smartConfig和微信airKiss在esp32的实现,一键配网轻松快捷连接路由器。
7、利用GPIO中断做一个按键的短按和长按的回调事件,再也无须担心触发源。
8、esp32上实现本地 UDP 客户端和服务端角色,在局域网内实现通讯。
9、esp32上实现本地 TCP 客户端和服务端角色,可断线重连原路返回数据。
10、乐鑫esp32 SDK编程利用rmt驱动ws2812七彩灯,实现彩虹渐变效果。
11、入门 乐鑫esp-adf 音频框架开发,esp32造一个蓝牙耳机,实现切换歌曲,获取歌曲信息等功能。
12、开源一个微信公众号airkiss配网esp32以及局域网发现功能的工程,分享一个airkiss配网小工具。
13、esp32 内置 dns 服务器,无需外网访问域名返回指定网页。
14、esp32 sdk编程实现门户强制认证,连接esp32热点之后,自动强制弹出指定的登录界面。
15、认识本地离线语音唤醒识别框架 esp-skainet ,实现较低成本的硬件语音本地识别控制。
16、学习本地语音唤醒离线识别框架 esp-skainet ,如何修改唤醒词? 如何自定义命令词?如何做意图动作?
17、全网首发,乐鑫esp32 sdk直连京东微联·小京鱼 · IoT开放平台,实现叮咚音响语音智能控制。
18、入门京东微联·小京鱼的控制面板H5开发,读懂vue语法,做自己的控制页面。
19、重磅开源,如何在微信小程序上ble蓝牙配网esp32,blufi的那些事!
20、一篇好文,开发过程中编译esp32固件太大,无法正常启动?教你如何自定义分区表partitions.csv。
21、 esp32蓝牙配网blufi的高度封装,集成简单、使用简单、容易上手,提高开发效率!
22、讨论下程序员 “青春饭” 那些事,分享在esp32实现多种加密算法md5 |AES CBC-ECB| Sha1 | Sha256 等!
23、安信可 esp32-a1s 音频开发板移植最新 esp-adf 音频框架,小试牛刀如何实现在线文字转语音播放。
25、分享在 esp32 SDK实现冷暖光色温平滑调节的封装,轻松集成到您的项目去。

前言

     技术需要沉淀,很久没更新esp32的博文了,下个月的 esp32-s2 就要量产了,据说这是一个全新的芯片。已经在乐鑫 tao宝店铺预售了,我也预了一块,先玩玩吧。后面再给大家写些评论;

     最近一个月在忙 TB02 模块的开发,包括使用文档手册,都已经差不多了,感觉泰凌的代码 就是 很烂,一堆宏,学起来吃力,没有C语言基础是入门不了的;(纯个人观点)

     做了很多灯具接入各大云平台开发,接触的绝对多大数都是色温调光什么的。于是乎,这种外设是最常用的,所以,有必要给大家或自己以后的项目总结这样的模块,提高开发效率;

一、冷暖光的PWM关系;

     我们在买灯具时候,一般看我们的灯支持怎么样的调节,比如只是单色,冷暖色,还是RGB七彩控制的。

    一般地,家庭也就单色和冷暖光为多,而 RGB 是那些舞台音乐场景为多。所以,智能家居的灯具涉及,以单色和冷暖光为多,以 冷暖光为例,那些灯具的色温是怎么定义的? PWM 又是如何输出这样的效果呢? 这里,我一一为大家阐述:


2.1、色温的定义

    任何一种属性都有单位,比如温度有摄氏度,而色温的单位是 卡尔文 ,简称 K,下面一图说明了:

    色温数值越大,看到的效果越冷白;
    
误解:色温越大,就越暖光;
在这里插入图片描述

    而我们常买的灯具又是如何产生这样的效果呢? 聪明的开发者,采用冷白灯珠和暖光灯具各自产生的亮度不一样,就有了以上的效果!下面是我平时开发中常用的2钟灯珠类型,3.3v即可点亮;

在这里插入图片描述


2.2、PWM与指定的色温亮度的计算

     既然有2个灯珠同时在亮,各自的亮度不同来调节色温亮度,那么我们好奇的是如何通过 pwm 产生这样的关系呢?

     很多人也许会这样说:色温大小就是暖色灯珠的亮度明暗,而亮度大小就是冷白灯珠的亮度明暗,这样的说话是错误的!

     对于 PWM 和 色温亮度的计算的公式,博主接触到很多公式,这里以乐鑫开源的为例,如下:

  • color_temperature :用户预想的灯具的色温数值,范围[0,100]
  • brightness :用户预想的灯具的亮度数值,范围[0,100]
  • 计算过程如下,得到的cold_tmp是PWM冷灯珠的占空比,warm_tmp是PWM冷灯珠的占空比:
    uint8_t warm_tmp = color_temperature * brightness / 100;
    uint8_t cold_tmp = (100 - color_temperature) * brightness / 100;
  • 1
  • 2

     看了上面的计算步骤,是否很简单?我们可以假想一下:

  • 效果1 中性光 :
         入参 color_temperature = 50 ,brightness = 100 ;
         代入公式后得到:warm_tmp:50 ,cold_tmp :50 ;

  • 效果2 最冷光 :
         入参 color_temperature = 100 ,brightness = 100 ;
         代入公式后得到:warm_tmp:100 ,cold_tmp :0;

  • 效果3 最暖光 :
         入参 color_temperature = 0,brightness = 100 ;
         代入公式后得到:warm_tmp:0,cold_tmp :100 ;

效果预想的各路PWM输出以上公式算出来的PWM输出对比结果
中性光2路一样亮度的输出warm_tmp:50 ,cold_tmp :50符合
最冷光效果冷灯珠100亮度,暖灯珠0亮度warm_tmp:100 ,cold_tmp :0反了
最暖光效果冷灯珠 0亮度,暖灯珠100亮度warm_tmp:0,cold_tmp :100反了

     以上步骤,为啥结论是反了?因为上上图可以看到:色温数值越大表示越冷效果,意味着色温越大,其暖灯珠的PWM高电平占空比越小! 那么我们如何纠正这个错误呢?

在这里插入图片描述

     这不用我来说吧?把入参的 color_temperature 修改为即可:

color_temperature = 100 - color_temperature;
  • 1

二、 RGB/HSV

    这个应该是最简单的啦!博主读书的时候,经常接触这样的模型转换,下面给大家贴贴转换代码把?

HSV模型转RGB

static esp_err_t light_driver_hsv2rgb(uint16_t hue, uint8_t saturation, uint8_t value,
                                      uint8_t *red, uint8_t *green, uint8_t *blue)
{
    uint16_t hi = (hue / 60) % 6;
    uint16_t F = 100 * hue / 60 - 100 * hi;
    uint16_t P = value * (100 - saturation) / 100;
    uint16_t Q = value * (10000 - F * saturation) / 10000;
    uint16_t T = value * (10000 - saturation * (100 - F)) / 10000;

    switch (hi)
    {
    case 0:
        *red = value;
        *green = T;
        *blue = P;
        break;
    case 1:
        *red = Q;
        *green = value;
        *blue = P;
        break;
    case 2:
        *red = P;
        *green = value;
        *blue = T;
        break;
    case 3:
        *red = P;
        *green = Q;
        *blue = value;
        break;
    case 4:
        *red = T;
        *green = P;
        *blue = value;
        break;
    case 5:
        *red = value;
        *green = P;
        *blue = Q;
        break;
    default:
        return ESP_FAIL;
    }
    *red = *red * 255 / 100;
    *green = *green * 255 / 100;
    *blue = *blue * 255 / 100;
    return ESP_OK;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

RGB模型转 HSV

static void light_driver_rgb2hsv(uint16_t red, uint16_t green, uint16_t blue,
                                 uint16_t *h, uint8_t *s, uint8_t *v)
{
    double hue, saturation, value;
    double m_max = MAX(red, MAX(green, blue));
    double m_min = MIN(red, MIN(green, blue));
    double m_delta = m_max - m_min;

    value = m_max / 255.0;
    if (m_delta == 0)
    {
        hue = 0;
        saturation = 0;
    }
    else
    {
        saturation = m_delta / m_max;
        if (red == m_max)
        {
            hue = (green - blue) / m_delta;
        }
        else if (green == m_max)
        {
            hue = 2 + (blue - red) / m_delta;
        }
        else
        {
            hue = 4 + (red - green) / m_delta;
        }
        hue = hue * 60;
        if (hue < 0)
        {
            hue = hue + 360;
        }
    }
    *h = (int)(hue + 0.5);
    *s = (int)(saturation * 100 + 0.5);
    *v = (int)(value * 100 + 0.5);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

三、函数说明

  • light_driver_set_hue(uint16_t hue); //设置HSV模型的H

  • light_driver_set_saturation(uint8_t saturation); //设置HSV模型的S

  • light_driver_set_value(uint8_t value); //设置HSV模型的V

  • light_driver_set_color_temperature(uint8_t color_temperature); //设置色温

  • light_driver_set_brightness(uint8_t brightness); //设置俩亮度

  • light_driver_set_hsv(uint16_t hue, uint8_t saturation, uint8_t value); //设置HSV模型

  • light_driver_set_ctb(uint8_t color_temperature, uint8_t brightness); //设置色温亮度

  • light_driver_set_switch(bool status); //设置 开关

四、其他

  • 一般地,不能同时调节 RGB 和 冷暖灯珠的;
  • 具体的使用参考我的demo吧,也欢迎大家留言:
    https://github.com/xuhongv/StudyInEsp32/tree/master/17_light_utils_pwm

另外,不要把我的博客作为学习标准,我的只是笔记,难有疏忽之处,如果有,请指出来,也欢迎留言哈!

  • 玩转esp8266带你飞、加群QQ群,不喜的朋友勿喷勿加:434878850
  • esp8266源代码学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp8266
  • esp32源代码学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp32
  • 关注下面微信公众号二维码,干货多多,第一时间推送!
注:本文转载自blog.csdn.net的半颗心脏的文章"https://blog.csdn.net/xh870189248/article/details/105612478"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top