- 本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板。仅仅做个人技术交流分享,不做任何商业用途。如有不对之处,请留言,本人及时更改。
1、 Esp8266之 搭建开发环境,开始一个“hellow world”串口打印。
2、 Esp8266之 利用GPIO开始使用按钮点亮你的“第一盏灯”。
3、 Esp8266之 利用 "软件定时器 " 定时0.5秒闪烁点亮一盏LED。
4 、Esp8266之 了解PWM,更为深入地用PWM控制一盏LED的亮度变化。
5 、Esp8266之 原生乐鑫SDK高级使用之封装Post与Get请求云端,拿到“天气预报信息”。
6 、Esp8266之 了解 SmartConfig与Airkiss一键配网,给8266配网上云端。无需把wifi名字密码写在固件里。
7 、Esp8266之 了解 softAP热点配网模式原理,仿“机智云”定义自己的热点配网模式协议。
8、 Esp8266之 你要找的8266作为UDP、TCP客户端或服务端的角色通讯,都在这了。
9、 Esp8266进阶之路: [小实战上篇]Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。
10、 Esp8266进阶之路: [小实战下篇]Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。
11、 Esp8266进阶之路: 8266接入阿里智能,点亮一盏LED灯,期待天猫精灵语音控制的不约而至!
12、 Esp8266进阶之路: 图文并茂学习阿里云主机搭建8266MQTT服务器,实现移动网络远程控制一盏LED。
13、 Esp8266进阶之路: 动手做个8266毕设小案例,smartConfig + MQTT协议轻松实现远程控制一盏LED。
14、 Esp8266进阶之路: esp8266的 FreeRtos系统学习的正确姿势 ------ 环境搭建、烧录。
15、 Esp8266进阶之路: esp8266的 物联网又一股清流,8266接入阿里云平台非阿里智能的SDS服务,点亮一盏LED灯。
16、 Esp8266进阶之路: esp8266的 基于Nonos移植红外线H1838,实现红外遥控器配网,远程控制一盏灯。
17、 Esp8266进阶之路: esp8266自研的快速上电开关五次 (开-关为一次) ,无需按键触发则8266进去一键配网模式。
18、 Esp8266进阶之路: esp8266 基于NONOS 实现 OTA 远程升级,实现无线“ 热修复 ”升级固件程序。
19、 Esp8266进阶之路: esp8266驱动 ds18b20、dht11 温湿度传感器,采集温湿度传感器到服务器。
20、 Esp8266进阶之路: 深入学习esp8266的esp now模式,仿机智云做一个小网关,实现无需网络下轻松彼此连接通讯交互数据。
21、 Esp8266进阶之路: 浅谈 esp8266 如何在本地局域网网络情况下实现最大效率地和前端实现数据交互。
22、 Esp8266进阶之路: esp8266的工程如何添加第三方静态库文件以及如何自定义文件夹,聊聊那些makeFile的事。。
23、 Esp8266进阶之路: 再来一波 esp8266 基于 freeRtos系统连接自己私有的服务器实现OTA远程升级,接触下 lwip的基本知识。。
24、 Esp8266进阶之路: 渗透学习回顾下esp8266的外置spi芯片25q系列,熟悉8266代码块在其的分布,得心应手放置图片或其他资料。
25、 Esp8266进阶之路: 深聊下esp8266的串口 Uart 通讯中断编程,为您准备好了 NONOS 版本 和 RTOS 系统的串口驱动文件。
26、 Esp8266进阶之路: RTOS分析 MQTT 实现过程,实现移植 MQTT协议在 esp8266 rtos实时系统,可断线重连。
27、 Esp8266进阶之路: 跟紧脚步,用VisualStudio Code开发 esp8266 rtos SDK v3.0版本,全新的 idf 框架,节省内存模块化开发。
28、 Esp8266进阶之路: 教你轻松自如使用cJson在乐鑫 esp8266 如何解析一段json数据以及如何生成一段json数据。
29、 Esp8266进阶之路: 百万条消息免费之乐鑫esp8266使用TCP直连模式MQTT协议接入阿里云物联网平台,支持私家服务器对接支持阿里云规则引擎。
30、 Esp8266进阶之路: 乐鑫esp8266 SDK编程使用 IIC总线驱动 0.96寸的OLED显示屏,显示天气预报信息。
31、 Esp8266进阶之路: 当esp8266遇到 Html,该怎么内置网页控制设备,理清内置网页的实现过程,实现无需路由器手机也可以控制esp8266。
32、 Esp8266进阶之路: 细聊HmacMD5的加密方法带来的安全性,并实践在esp8266上,最大保障传输的过程的信息的安全性。
33、 Esp8266进阶之路: 如何优雅地像乐鑫原厂封装esp8266底层寄存器的逻辑思维,做成自己的静态库库文件,让第三方人使用?
34、 Esp8266进阶之路: 乐鑫esp8266 NONOS SDK 3.0编程使用 SPI 驱动基于Max7219芯片的八位数码管,显示日期信息。
35、 Esp8266进阶之路: 乐鑫esp8266芯片借助机智云平台做一个商业化的七彩RGB灯泡可调整体方案项目,炫彩夺目高大尚。
36、 Esp8266之rtos3.0笔记: 认识esp8266 Rtos 3.0 sdk 工程结构,esp8266如何向esp-idf工程靠近的,如何自定义头文件编译?
37、 Esp8266之rtos3.0笔记: 你要找的基本外设功能都在这里了,包括Gpio、Pwm 和 Uart 接口使用。
38、 Esp8266之rtos3.0笔记: 一篇文章带你搞掂存储技术 NVS 的认识和使用,如何利用NVS保存整型、字符串、数组以及结构体。
39、 Esp8266之rtos3.0笔记: 捋一捋微信公众号配网智能设备 esp8266 并绑定设备的过程,移植并成功实现在 esp8266 rtos3.1 。
40、 Esp8266之rtos3.0笔记: 基于乐鑫idf框架,研究出超稳定、掉线重连、解决内存泄露问题的Mqtt框架!支持esp8266和esp32!
41、 Esp8266之rtos3.0笔记: esp8266-12模块基于rtos3.1版本ota功能远程空中升级固件,官网基础之上增加dns域名解析!
42、 Esp8266之rtos3.0笔记: 我又来了,基于rtos3.0版本 SDK编程 SPI 驱动 ws2812b 七彩灯,代码全部开源奉献给你们!
43、 Esp8266之rtos3.0笔记: esp8266-12模块基于rtos3.0版本扫描周围获取附近可用的 Wi-Fi 热点路由器信息,同样适合esp32。
44、 Esp8266之rtos3.0笔记: 整理分享那些我在项目中常用的esp8266 rtos3.0版本的常见驱动,Button按键长短按、PWM平滑调光等。
45、 Esp8266之rtos3.0笔记: 内置仅1M的Esp8285,如何攻破最棘手的OTA问题,大大节省资源成本开发产品。
46、 Esp8266之rtos3.0笔记: 详细分析Esp8266上电信息打印的数据,如何做到串口通讯上电不乱码打印。
47、 Esp8266之rtos3.0笔记: 无需外网,如何实现在本地局域网与控制端做数据交换的一些开发经验。
48、 Esp8266之rtos3.0笔记: 迟来的1024程序员祝福,开源分享一个驱动 ds18b20 获取温度的工程。
49、 Esp8266之rtos3.0笔记: aliyun sdk 直连接入阿里云物联网平台,实现天猫精灵找队友零配网功能和语音控制。
50、 Esp8266之rtos3.0笔记: esp产品量产方案初入门之 如何从外部读取 csv 文件的数据,比如从代码读取外部文件阿里云三元组。
51、 Esp8266之rtos3.0笔记: 体验下 Linux搭建 ESP8266_RTOS_SDK 3.0 最新环境的搭建和编译吧。
52、 Esp8266之rtos3.0笔记: 仅1M flash 的安信可 ESP-01S 模块,如何二次开发?如何对其 OTA 远程升级固件
53、 Esp8266之rtos3.0笔记: 分享在 esp8266 C SDK实现冷暖光色温平滑调节的封装,轻松集成到您的项目去。
-------- 学习笔记持续更新,欢迎关注我…
很多人怎么联系我一起学习进步,下面打个小小公告:
玩转esp8266
带你飞、加群
esp8266源代码免费学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp8266
esp32源代码免费学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp32
文章目录
前言
技术需要沉淀,这是我日常更新 ESP8266 专题的第54篇文章啦!后续,我不知道会多久更新,但肯定会的!
昨天,我更新了一篇:
好像这不太受大家的欢迎,好吧!这些日积月累的经验,我就当是我汇集大海的一条条大河,只有待到正确时候,才会拥有洪荒之力助我成功;
这里透漏一个信息,下个月我自研的物联网xClouds
架构就要开源和大家见面了,功能包括:
- 跨平台、开发快、全开源的宗旨;
- 微信公众号内 airkiss 配网和 MQTT 控制;
- 微信小程序内 smartConfig 配网和MQTT 控制;
- 设备端要求:支持 airkiss 配网和 MQTT 协议即可;
- 服务器端:有微信公众号业务和各云平台对接的业务,支持但不限于 天猫精灵、小爱同学、小度音箱、Alexa音箱等;
- 扩展性强,支持用户二次开发,可私定义协议;
- 三端开源:设备端、服务器端、前端;
一、冷暖光的PWM关系;
我们在买灯具时候,一般看我们的灯支持怎么样的调节,比如只是单色,冷暖色,还是RGB七彩控制的。
一般地,家庭也就单色和冷暖光为多,而 RGB 是那些舞台音乐场景为多。所以,智能家居的灯具涉及,以单色和冷暖光为多,以 冷暖光为例,那些灯具的色温是怎么定义的? PWM 又是如何输出这样的效果呢? 这里,我一一为大家阐述:
2.1、色温的定义
任何一种属性都有单位,比如温度有摄氏度,而色温的单位是 卡尔文 ,简称 K,下面一图说明了:
色温数值越大,看到的效果越冷白;
误解:色温越大,就越暖光;
而我们常买的灯具又是如何产生这样的效果呢? 聪明的开发者,采用冷白灯珠和暖光灯具各自产生的亮度不一样,就有了以上的效果!下面是我平时开发中常用的2钟灯珠类型,3.3v即可点亮;
2.2、PWM与指定的色温亮度的计算
PWM平滑调光已经在目前最新的 master 分支实现了,例子位置在:
这里带带大家简单入门这个例子:
- LEDC功能来源 ESP32 之鉴,
ledc_timer_config_t
的配置分辨率尤其重要,例子是采用13位的LEDC_TIMER_13_BIT
,又可以参照结构体设置其他分辨率; - 配置 GPIO 引脚的方法,参考官方例子;
- 然后,我们最关心的是设置占空比方法的对应方法入参,
ledc_set_fade_with_time(模式,通道,周期,渐变时间);
而设置周期的入参范围:[ 0 , 2的分辨率位数次方],以13位分辨率举个例子,就是 2的13次方,即 2^13=8192。所以,设置是13位分辨率的话,入参范围为:【0,8192】。 - 还有重要一步,开始设置,类似
pwm_start()
;采用ledc_fade_start(模式,通道 是否阻塞);
,后面的阻塞和非阻塞可能有些不懂,就是等待这个方法函数执行完毕再下一个方法,而如果是非阻塞,直接返回执行下一个函数;
而目前 2020.4.30 我本人今天在跑这个例子时候,发现一个bug,现已提交上去,具体的issue链接在这: issues/883,对于这个bug我也是无脑解决,具体的解决方法在上述的链接里面;
以上就是的带领大家简单入门 LEDC 的例子,下面步入正题;
既然有2个灯珠同时在亮,各自的亮度不同来调节色温亮度,那么我们好奇的是如何通过 pwm 产生这样的关系呢?
很多人也许会这样说:色温大小就是暖色灯珠的亮度明暗,而亮度大小就是冷白灯珠的亮度明暗,这样的说话是错误的!
对于 PWM 和 色温亮度的计算的公式,博主接触到很多公式,这里本人总结的为例,如下:
- color_temperature :用户预想的灯具色温数值,范围[2700,6500] ,这范围是参 阿里飞燕平台的;
- brightness :用户预想的灯具的亮度数值,范围[0,100]
- 下面的 8192 的是从上面 13位定时器
- 计算过程如下,得到的
cold_tmp
是PWM
冷灯珠的占空比,warm_tmp
是PWM
冷灯珠的占空比:
int part = (APK_MAX_COLORTEMP - APK_MIN_COLORTEMP) / 100;
int temp = APK_MAX_COLORTEMP - color_temperature;
int tempWW = ((temp) / part);
uint8_t outCW = (brightness - (brightness * tempWW / 100));
uint8_t outWW = (brightness * tempWW / 100);
int outBrightnessChannle = 8192 * outCW / 100;
int outColortempChannle = 8192 * outWW / 100;
看了上面的计算步骤,是否很简单?我们可以假想一下:
-
效果1 中性光 :
入参color_temperature
= 4096 ,brightness
= 100 ;
代入公式后得到:outColortempChannle
=4096 ,outBrightnessChannle
=50 ; -
效果2 最冷光 :
入参color_temperature
= 8192 ,brightness
= 100 ;
代入公式后得到:outColortempChannle
=8192 ,outBrightnessChannle
=0; -
效果3 最暖光 :
入参color_temperature
= 0,brightness
= 100 ;
代入公式后得到:outColortempChannle
=0,outBrightnessChannle
=8192 ;
效果 | 预想的各路PWM输出 | 以上公式算出来的PWM输出 | 对比结果 |
---|---|---|---|
中性光 | 2路一样亮度的输出 | warm_tmp =4096 ,cold_tmp =4096 |
符合 |
最冷光效果 | 冷灯珠100亮度,暖灯珠0亮度 | warm_tmp =8192 ,cold_tmp =0 |
反了 |
最暖光效果 | 冷灯珠 0亮度,暖灯珠100亮度 | warm_tmp =0,cold_tmp =8192 |
反了 |
以上步骤,为啥结论是反了?因为上上图可以看到:色温数值越大表示越冷效果,意味着色温越大,其暖灯珠的PWM高电平占空比越小! 那么我们如何纠正这个错误呢?
这不用我来说吧?把入参的 color_temperature
修改为即可:
color_temperature = 6500 - color_temperature + 2700
二、相关API接口
- 先看看我们的头文件,思路非常清晰,就是可开发性非常高。
- 根据自己的需求,修改 GPIO 引脚配置;
/*************** 用户可修改 start **********************/
#define LEDC_FADE_TIME (2000) //渐变时间
#define APK_MAX_COLORTEMP 6500 //用户定义最大的色温数值
#define APK_MID_COLORTEMP 4800 //用户定义中间的色温数值
#define APK_MIN_COLORTEMP 2700 //用户定义最小的色温数值
#define APK_MAX_COLOR 255 //用户定义最大的RGB数值
//pwm gpio口配置
#define CHANNLE_PWM_TOTAL 5 //五路
#define PWM_CW_OUT_IO_NUM 14 //冷灯珠
#define PWM_WW_OUT_IO_NUM 13 //暖灯珠
#define PWM_RED_OUT_IO_NUM 12 //红色灯珠
#define PWM_GREEN_OUT_IO_NUM 15 //绿色灯珠
#define PWM_BLUE_OUT_IO_NUM 5 //蓝色灯珠
//是否带有记忆功能
#define IS_SAVE_PARAMS true
/*************** 用户可修改 end**********************/
typedef struct User_dev_status_t
{
int Power;
int Mode;
int Brightness;
int Colortemp;
int Red;
int Green;
int Blue;
} User_dev_status_t;
/**
* @brief 设置
*/
esp_err_t pwm_init_data(); //gpio初始化
esp_err_t light_driver_set_color_temperature(uint8_t color_temperature);
esp_err_t light_driver_set_brightness(uint8_t brightness);
esp_err_t light_driver_set_colorTemperature(int colorTemperature);
esp_err_t light_driver_set_ctb(const int brightness, const int color_temperature); //设置色温亮度
esp_err_t light_driver_set_rgb(const uint8_t red, const uint8_t green, const uint8_t blue);
esp_err_t light_driver_set_switch(bool status); //设置开关
esp_err_t light_driver_set_mode(uint8_t mode); //设置模式
esp_err_t light_driver_set_cycle(uint8_t nums); // 设置呼吸效果
esp_err_t light_driver_set_ctb_from_last(); //恢复上次的状态
三、其他
- 一般地,不能同时调节 RGB 和 冷暖灯珠的;
- 具体的使用参考我的demo吧,也欢迎大家留言:
https://github.com/xuhongv/StudyInEsp8266/tree/master/47_ESP8266_Rtos3.0_Brightness_Colortemp
另外,不要把我的博客作为学习标准,我的只是笔记,难有疏忽之处,如果有,请指出来,也欢迎留言哈!
- 玩转
esp8266
带你飞、加群QQ
群,不喜的朋友勿喷勿加:434878850 - esp8266源代码学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp8266
- esp32源代码学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp32
- 关注下面微信公众号二维码,干货多多,第一时间推送!