Esp8266 进阶之路35【项目篇】借助机智云平台用乐鑫esp8266芯片做一个商业化的七彩RGB灯泡可调整体方案项目,炫彩夺目高大尚。

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://xuhong.blog.csdn.net/article/details/88898831

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

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进阶之路第1篇: [小实战上篇]Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。
10、 Esp8266进阶之路第2篇: [小实战下篇]Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。
11、 Esp8266进阶之路第3篇: 8266接入阿里智能,点亮一盏LED灯,期待天猫精灵语音控制的不约而至!
12、 Esp8266进阶之路第4篇: 图文并茂学习阿里云主机搭建8266MQTT服务器,实现移动网络远程控制一盏LED。
13、 Esp8266进阶之路第5篇: 动手做个8266毕设小案例,smartConfig + MQTT协议轻松实现远程控制一盏LED。
14、 Esp8266进阶之路第6篇: esp8266的 FreeRtos系统学习的正确姿势 ------ 环境搭建、烧录。
15、 Esp8266进阶之路第7篇: esp8266的 物联网又一股清流,8266接入阿里云平台非阿里智能的SDS服务,点亮一盏LED灯。
16、 Esp8266进阶之路第8篇: esp8266的 基于Nonos移植红外线H1838,实现红外遥控器配网,远程控制一盏灯。
17、 Esp8266进阶之路第9篇: esp8266自研的快速上电开关五次 (开-关为一次) ,无需按键触发则8266进去一键配网模式。
18、 Esp8266进阶之路第10篇: esp8266 基于NONOS 实现 OTA 远程升级,实现无线“ 热修复 ”升级固件程序。
19、 Esp8266进阶之路第11篇esp8266驱动 ds18b20、dht11 温湿度传感器,采集温湿度传感器到服务器。
20、 Esp8266进阶之路第12篇深入学习esp8266的esp now模式,仿机智云做一个小网关,实现无需网络下轻松彼此连接通讯交互数据。
21、 Esp8266进阶之路第13篇浅谈 esp8266 如何在本地局域网网络情况下实现最大效率地和前端实现数据交互。
22、 Esp8266进阶之路第14篇esp8266的工程如何添加第三方静态库文件以及如何自定义文件夹,聊聊那些makeFile的事。。
23、 Esp8266进阶之路第15篇再来一波 esp8266 基于 freeRtos系统连接自己私有的服务器实现OTA远程升级,接触下 lwip的基本知识。。
24、 Esp8266进阶之路第16篇渗透学习回顾下esp8266的外置spi芯片25q系列,熟悉8266代码块在其的分布,得心应手放置图片或其他资料。
25、 Esp8266进阶之路第17篇深聊下esp8266的串口 Uart 通讯中断编程,为您准备好了 NONOS 版本 和 RTOS 系统的串口驱动文件。
26、 Esp8266进阶之路第18篇RTOS分析 MQTT 实现过程,实现移植 MQTT协议在 esp8266 rtos实时系统,可断线重连。
27、 Esp8266进阶之路第19篇跟紧脚步,用VisualStudio Code开发 esp8266 rtos SDK v3.0版本,全新的 idf 框架,节省内存模块化开发。
28、 Esp8266进阶之路第20篇教你轻松自如使用cJson在乐鑫 esp8266 如何解析一段json数据以及如何生成一段json数据。
29、 Esp8266进阶之路第21篇百万条消息免费之乐鑫esp8266使用TCP直连模式MQTT协议接入阿里云物联网平台,支持私家服务器对接支持阿里云规则引擎。
30、 Esp8266进阶之路第22篇乐鑫esp8266 SDK编程使用 IIC总线驱动 0.96寸的OLED显示屏,显示天气预报信息。
31、 Esp8266进阶之路第23篇当esp8266遇到 Html,该怎么内置网页控制设备,理清内置网页的实现过程,实现无需路由器手机也可以控制esp8266。
32、 Esp8266进阶之路第24篇细聊HmacMD5的加密方法带来的安全性,并实践在esp8266上,最大保障传输的过程的信息的安全性。
33、 Esp8266进阶之路第25篇如何优雅地像乐鑫原厂封装esp8266底层寄存器的逻辑思维,做成自己的静态库库文件,让第三方人使用?
34、 Esp8266进阶之路第26篇乐鑫esp8266 NONOS SDK 3.0编程使用 SPI 驱动基于Max7219芯片的八位数码管,显示日期信息。
35、 Esp8266进阶之路第27篇乐鑫esp8266芯片借助机智云平台做一个商业化的七彩RGB灯泡可调整体方案项目,炫彩夺目高大尚。
36、 Esp8266学习rtos3.0笔记第1篇认识esp8266 Rtos 3.0 sdk 工程结构,esp8266如何向esp-idf工程靠近的,如何自定义头文件编译?
37、 Esp8266学习rtos3.0笔记第2篇你要找的基本外设功能都在这里了,包括Gpio、Pwm 和 Uart 接口使用。
38、 Esp8266学习rtos3.0笔记第3篇 一篇文章带你搞掂存储技术 NVS 的认识和使用,如何利用NVS保存整型、字符串、数组以及结构体。
39、 Esp8266学习rtos3.0笔记第4篇 带你捋一捋市面上的微信公众号配网智能设备 esp8266 并绑定设备的过程,移植并成功实现在 esp8266 rtos3.1 sdk。
40、 Esp8266学习rtos3.0笔记第5篇 基于乐鑫idf框架,研究出超稳定、掉线重连、解决内存泄露问题的Mqtt框架!支持esp8266和esp32!
41、 Esp8266学习rtos3.0笔记第6篇 esp8266-12模块基于rtos3.1版本ota功能远程空中升级固件,官网基础之上增加dns域名解析!


  • 很多人怎么联系我一起学习进步,下面打个小小公告和干货无偿分享:

玩转esp8266带你飞、加群付费QQ群,提高门槛,不喜的朋友勿喷勿加:434878850
esp8266源代码免费学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp8266
esp32源代码免费学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp32


一、前言。


     感谢这么可爱的你还来我这里看我的博客,更多干货等着你吸收!嘻嘻~~

     下面先出一个从某商店看到的一个产品图,哇!很炫是不?

在这里插入图片描述


     鉴定完毕!上面的效果做起来难吗?咳咳!不难!我承诺本博文完全可以是自己把全部做出来

     最近又是大学生的毕业季了,很多人愁着做毕设找不到好的题材!那么这里,我就拿出我前年做好的一个小项目,照顾下大家!很炫的哦,不喜勿喷!

     首先给大家一个昨晚拍的diy图片,我想只有那个手机里面的界面吸住了你把?但是,我郑重告诉你,这个圆盘的取色可以直接同步到右边的灯带哦!咳咳!下面听我完整为大家详细阐述整个制作流程!我的键盘开始疯狂翘起来了

在这里插入图片描述


二、制作准备材料。


2.1 材料:

  • 机智云账号一个,请自行注册:https://dev.gizwits.com/zh-cn/developer/product/
  • AndroidStudio开发环境,请自行搭建!
  • esp8266 nonos sdk开发环境准备,请自行搭建!
  • 硬件准备:esp8266模组,ws2812b灯珠,以及杜邦线若干条!

2.2 我的硬件:

在这里插入图片描述


2.3 电路图:

在这里插入图片描述


三、机智云平台注册产品。


  • 为什么选择机智云,因为我个人比较喜欢它的自动生成代码工程的功能!包括上位机和mcu代码,非常方便!
  • 至于整个注册账号流程我不多说了,下面主要列下数据点:

在这里插入图片描述

在这里插入图片描述


  • 那么我们开始生成 esp8266代码啦!我们选择 32Mbit的,soc方案;应用配置我们选择 安卓就好了!

在这里插入图片描述


四、ws2812 灯珠认识。


  • 关于这个灯珠的资料网上多的是,我总的概述:
    • 1、每颗灯珠内置一个驱动芯片,我们只需要和这个驱动芯片通讯就可以达成调光的目的了!所以,我们不需要用 pwm 调节!!!
    • 2、其的管脚引出有四个,2个是供电用 的!还有2个是通讯的,DIN是输入,DOUT是输出!以及其是 5v 电压供电!切记!
    • 3、根据不同的厂商生产不同,驱动的方式有所不一样!下面发送数据顺序是:green -- Red -- Blue ,或者还有一种是 Red --- green -- blue , 如果发现你想调节红色变成看绿色,但是蓝色没变化!说明驱动问题!

在这里插入图片描述


4.1 机智云社区提供的esp8266驱动ws2812下载:


  • 机智云社区下载传送门:http://club.gizwits.com/thread-6116-1-1.html
  • 咳咳!这个机智云社区发现的这个驱动一个缺点是:只能是 gpio0来和灯珠通讯!之后,我和群里的一个小伙伴彭工细聊了下,发现驱动写得有问题,之后,我们整理下,也就兼容全部 io 了。除了 gpio16!!

4.2 整理过后的驱动适配!


  • 根据自己的硬件连接在 ws2812.h适配修改,以下面的gpio12为例!
// gpio口配置
#define WS2812_PIN 12
#define WS2812_FUN FUNC_GPIO12
#define WS2812_MUX PERIPHS_IO_MUX_MTDI_U
#define PIXEL_MAX   24  //灯珠个数
  • 上面提到 不同的厂商驱动的方式顺序有所不一样,如果发现不正确,请修改 ws2812.c下面的宏定义:
#if 0
#define RGB_TO_GRB(c)   (uint32)((c&0x000000ff)|((c>>8)&0x0000ff00)|((c<<8)&0x00ff0000))
#else
#define RGB_TO_GRB(c)   c
#endif

  • 具体的修改内容我就不贴了!看源码把!

五、esp8266 工程概述。


5.1 程序入口:

  • 因为我喜欢用波特率74880来看信息打印,所以去掉了机智云的串口方式!注意我们要把 初始化灯珠的代码放在这里!基本如下了!
void ICACHE_FLASH_ATTR user_init(void)
{
    uint32_t system_free_size = 0;
    wifi_station_set_auto_connect(1); //设置自动连接
    wifi_set_sleep_type(NONE_SLEEP_T);//不允许睡眠
    espconn_tcp_set_max_con(10);
    GIZWITS_LOG( "---------------SDK version:%s--------------\n", system_get_sdk_version());
    WS2812_Init();
    gizwitsInit();
}


5.2 业务处理;

  • 其实整个业务处理是在 gizwits_product.c文件进行的!这里面的 gizwitsEventProcess()方法是处理从机智云 app下发的数据处理,这些数据定义都在服务器定义相约好的!有枚举、调色!

int8_t ICACHE_FLASH_ATTR gizwitsEventProcess(eventInfo_t *info, uint8_t *data, uint32_t len)
{
    uint8_t i = 0;
    dataPoint_t * dataPointPtr = (dataPoint_t *)data;
    moduleStatusInfo_t * wifiData = (moduleStatusInfo_t *)data;

    if((NULL == info) || (NULL == data))
    {
        GIZWITS_LOG("!!! gizwitsEventProcess Error \n");
        return -1;
    }

    for(i = 0; i < info->num; i++)
    {
        switch(info->event[i])
        {
        //电源开关
        case EVENT_power :
        	currentDataPoint.valueLED_Color = 3 ;
            currentDataPoint.valuepower = dataPointPtr->valuepower;
			GIZWITS_LOG("Evt: EVENT_power %d \n", currentDataPoint.valuepower);
            //开灯
			if (0x01 == currentDataPoint.valuepower) {
				currentDataPoint.valueLED_R = 0;
				currentDataPoint.valueLED_G = 250;
				currentDataPoint.valueLED_B = 0;
				//user handle
				WS2812_SetFillColor(currentDataPoint.valueLED_R,currentDataPoint.valueLED_G,currentDataPoint.valueLED_B);
			  //关灯			
			} else {
				currentDataPoint.valueLED_R = 0;
				currentDataPoint.valueLED_G = 0;
				currentDataPoint.valueLED_B = 0;
				//user handle
				WS2812_SetFillColor(currentDataPoint.valueLED_R,currentDataPoint.valueLED_G,currentDataPoint.valueLED_B);
			}
			break;
       //指定颜色下发。
        case EVENT_LED_Color:
			currentDataPoint.valueLED_Color = dataPointPtr->valueLED_Color;
			GIZWITS_LOG("Evt: EVENT_LED_Color %d\n", currentDataPoint.valueLED_Color)	;
			switch (currentDataPoint.valueLED_Color) {
			//黄色
			case LED_Color_VALUE0:
				currentDataPoint.valueLED_R = 254;
				currentDataPoint.valueLED_G = 251;
				currentDataPoint.valueLED_B = 0;
				//user handle
				WS2812_SetFillColor(currentDataPoint.valueLED_R,currentDataPoint.valueLED_G,currentDataPoint.valueLED_B);
				break;
			//紫色
			case LED_Color_VALUE1:
				currentDataPoint.valueLED_R = 167;
				currentDataPoint.valueLED_G = 0;
				currentDataPoint.valueLED_B = 254;
				//user handle
				WS2812_SetFillColor(currentDataPoint.valueLED_R,currentDataPoint.valueLED_G,currentDataPoint.valueLED_B);
				break;
			//橙色
			case LED_Color_VALUE2:
				//user handle
				currentDataPoint.valueLED_R = 254;
				currentDataPoint.valueLED_G = 0;
				currentDataPoint.valueLED_B = 57;
				//user handle
				WS2812_SetFillColor(currentDataPoint.valueLED_R,currentDataPoint.valueLED_G,currentDataPoint.valueLED_B);
				break;
			case LED_Color_VALUE3:
				break;
			}
            break;

        case EVENT_LED_R:
        	currentDataPoint.valueLED_Color = 3 ;
            currentDataPoint.valueLED_R= dataPointPtr->valueLED_R;
            GIZWITS_LOG("Evt:EVENT_LED_R %d\n",currentDataPoint.valueLED_R);
            //user handle
            WS2812_SetFillColor(currentDataPoint.valueLED_R,currentDataPoint.valueLED_G,currentDataPoint.valueLED_B);
            break;
        case EVENT_LED_G:
        	currentDataPoint.valueLED_Color = 3 ;
            currentDataPoint.valueLED_G= dataPointPtr->valueLED_G;
            GIZWITS_LOG("Evt:EVENT_LED_G %d\n",currentDataPoint.valueLED_G);
            //user handle
            WS2812_SetFillColor(currentDataPoint.valueLED_R,currentDataPoint.valueLED_G,currentDataPoint.valueLED_B);
            break;
        case EVENT_LED_B:
        	currentDataPoint.valueLED_Color = 3 ;
            currentDataPoint.valueLED_B= dataPointPtr->valueLED_B;
            GIZWITS_LOG("Evt:EVENT_LED_B %d\n",currentDataPoint.valueLED_B);
            //user handle
            WS2812_SetFillColor(currentDataPoint.valueLED_R,currentDataPoint.valueLED_G,currentDataPoint.valueLED_B);
            break;

        case WIFI_SOFTAP:
            break;
        case WIFI_AIRLINK:
            break;
        case WIFI_STATION:
            break;
        case WIFI_CON_ROUTER:
            GIZWITS_LOG("@@@@ connected router\n");

            break;
        case WIFI_DISCON_ROUTER:
            GIZWITS_LOG("@@@@ disconnected router\n");
 
            break;
        case WIFI_CON_M2M:
            GIZWITS_LOG("@@@@ connected m2m\n");
			setConnectM2MStatus(0x01);
 
            break;
        case WIFI_DISCON_M2M:
            GIZWITS_LOG("@@@@ disconnected m2m\n");
			setConnectM2MStatus(0x00);
 
            break;
        case WIFI_RSSI:
            GIZWITS_LOG("@@@@ RSSI %d\n", wifiData->rssi);
            break;
        case TRANSPARENT_DATA:
            GIZWITS_LOG("TRANSPARENT_DATA \n");
            //user handle , Fetch data from [data] , size is [len]
            break;
        case MODULE_INFO:
            GIZWITS_LOG("MODULE INFO ...\n");
            break;
            
        default:
            break;
        }
    }
    system_os_post(USER_TASK_PRIO_2, SIG_UPGRADE_DATA, 0);
    
    return 0; 
}

  • 原理图还有一个按键,我这里 的业务是 长按是 配网模式 ,短按是切换颜色,代码如下:
int flag = 0;
void timerSmartConfig_callback(void) {
	flag++;
	switch (flag) {
	//切换为蓝色
	case 1:
		currentDataPoint.valueLED_R = 0;
		currentDataPoint.valueLED_G = 0;
		currentDataPoint.valueLED_B = 254;
		//user handle
		WS2812_SetFillColor(currentDataPoint.valueLED_R,
				currentDataPoint.valueLED_G, currentDataPoint.valueLED_B);
		break;
	//切换为红色
	case 2:
		currentDataPoint.valueLED_R = 254;
		currentDataPoint.valueLED_G = 0;
		currentDataPoint.valueLED_B = 0;
		//user handle
		WS2812_SetFillColor(currentDataPoint.valueLED_R,
				currentDataPoint.valueLED_G, currentDataPoint.valueLED_B);
		break;
	//切换为绿色
	case 3:
		currentDataPoint.valueLED_R = 0;
		currentDataPoint.valueLED_G = 254;
		currentDataPoint.valueLED_B = 0;
		//user handle
		WS2812_SetFillColor(currentDataPoint.valueLED_R,
				currentDataPoint.valueLED_G, currentDataPoint.valueLED_B);
		break;
	case 4:
		gizwitsSetMode(WIFI_AIRLINK_MODE);
		flag = 0;
		break;
	}

}

LOCAL void ICACHE_FLASH_ATTR keyLongPress(void) {
	currentDataPoint.valueLED_R = 0;
	currentDataPoint.valueLED_G = 254;
	currentDataPoint.valueLED_B = 0;
	//user handle
	WS2812_SetFillColor(currentDataPoint.valueLED_R,currentDataPoint.valueLED_G, currentDataPoint.valueLED_B);
	gizwitsSetMode(WIFI_AIRLINK_MODE);
	GIZWITS_LOG("#### key2 long press, airlink mode\n");
}

/**
* Key to initialize
* @param none
* @return none
*/
LOCAL void ICACHE_FLASH_ATTR keyInit(void)
{
    singleKey[0] = keyInitOne(KEY_0_IO_NUM, KEY_0_IO_MUX, KEY_0_IO_FUNC,
                                keyLongPress, keyShortPress);
    keys.singleKey = singleKey;
    keyParaInit(&keys);
}


六、安卓工程概述。


  • 此章节读懂更需要一定的安卓基础,您可以从机智云自动生成应用下载自动生成的安卓工程,当然了,也可以直接从我打开工程!
  • 官网提供 的那个自动生成的安卓工程的控制界面是简陋的,我们需要去修改下控制界面,达到我们的需求!
  • 这个七彩控件的制作博文,请到我这个博文:https://blog.csdn.net/xh870189248/article/details/78406131
  • 集成进去的流程需要安卓基础,如果不懂集成流程,可以留言问我!下面是集成好的截图!

在这里插入图片描述


  • 其中 GosDeviceControlActivity.java是我们主控制代码。只要你学过安卓基础,这个非常容易上手! 下面我只贴这个七彩控件下发的代码:
         mMSeekBarColorPicker.setGizwitLight(true);
         //设置点击事件回调
        mMSeekBarColorPicker.setSeekBarColorPickerChangeListener(new SeekBarColorPicker.SeekBarColorPickerChangeListener() {
            @Override
            public void onProgressChange(SeekBarColorPicker seekBarColorPicker, int color, String htmlColor) {
                data_LED_R = Color.red(color);
                data_LED_G = Color.green(color);
                data_LED_B = Color.blue(color);
                sendRgbCmd(KEY_LED_R, data_LED_R, KEY_LED_G, data_LED_G, KEY_LED_B, data_LED_B);
            }
        });

  • 编译后,界面就这样了:

在这里插入图片描述


七、下载。

  • app的集成和8266的调试是花费蛮多时间的,最重要的是,这博文是花费几乎3个小时排版和编写,哈哈!各位能力强的朋友就参考我思路可以了,群里有些人要Bug我的代码,所以,我也就放在咸鱼了。需要的去看看吧!
  • 因为这个是我以后的面试作品,需要的就光顾下,价格绝对地便宜,不喜勿喷哈!不喜勿喷哈!博文技术参考还是可以的!哈哈!!咸鱼APP扫描即可!骚扰者请不要扫描了啦,只求真诚交易!非实物售卖!
  • 咸鱼app扫描之后,可以看到整个项目的演示效果,很炫!!


展开阅读全文

没有更多推荐了,返回首页