目录
1. 前言
2. 硬件准备及改装
2.1 硬件准备
2.2 硬件改装
2.3 外挂电源
3. 在腾讯云平台上创建产品
3.1 登录腾讯云
3.2 新建项目
?3.3 新建产品
?3.4 新建设备
4. 从Github上下载esp-qcloud
4.1 下载代码
4.2 修改腾讯云三元组码
?4.3?配置设备控制引脚
4.4?修改设备数据点
5. 通过腾讯连连小程序控制设备
5.1 通过小程序给设备配网
?5.2 通过小程序控制设备
6. 结束语
1. 前言
? ? ? ?我之前在某宝上买了一个空调扇,入手不到一年半的时间里,外壳上的触摸按键经常失灵、无法启动,天气闷热又吹不了风扇的时候真的有一种怒砸机的冲动。好在今天是周末,索性就花小半天时间捣鼓一下,刚好手上有一个Esp32模组可以派上用场,我的目的就是切除空调扇原有控制,全部改为由Esp32联网控制。记得我去年用Esp32接入过腾讯云和苹果HomeKit,但是没有做详细的记录,不过接入步骤和流程大体还是知道的,所以本文就以Esp32接入腾讯云为例详细介绍接入流程,以便以后有需要的时候查看。
2. 硬件准备及改装
? ? 2.1 硬件准备
? ? 1)Esp32模组1个;
? ? 2)触控失灵的空调扇1台;
? ? 3)万用表1台;
? ? 4)直流电源1台;
? ? 5)电洛铁1台;
? ? 6)热熔胶枪1个;
? ? 7)镊子1个;
? ? 8)飞线、杜邦线若干;
? ? 9)220V转5V1A/2A开关电源一个。
? ? ? 其实也不用准备这么多,如果单纯只是熟悉怎么接入腾讯云的话,一个Esp32模组就够了哈,其他的工具是我为了改造空调扇的硬件电路而准备的。
? ? ? 2.2 硬件改装
? ? ? 首先拆掉空调扇,它后盖虽然有很多螺丝,但是用一把十字螺丝刀就可以全部搞定了,拧完所有螺丝,拆下后盖的样子如下图:

? ? ? ?接着是把空调扇的控制板拆出来,控制板在最上方的位置,也比较好拆,先取下上盖,然后同样的,用十字螺丝刀拧下固定控制板四个角的螺丝,控制板便顺利的取下来了。

? ? ? 拆好的控制板,正面和反面先拍个照,尴尬的是拆下来之后,触摸按键又能控制了,,不过这并不影响我继续拆下去的决心,既然能控制了那就顺便用万用表量一下控制口的信号,测量结果如下(这里有交流电,在测量的时候一定要小心):

? ? ? 通过上面的测量,理清楚了空调扇的工作逻辑,那么接下来就好干活了。
? ? ? 把上面图中灰、蓝、白、红四条信号线的控制端与控制板单片机IO之间的线路全部用镊子割断,主要是为了避免原有单片机IO信号对Esp32控制的影响?,而且原有单片机是5V系统,Esp32是3.3V系统。Esp32能不能直接驱动1A60可控硅达到控制电机的目的需要测试一下,实际测试是能直接控制的,这样就省去了额外搭电平转换电路的麻烦。四条信号线都用直流电源调到3.3V测试一下,确保给信号的时候电机会动,给制冷信号的时候,水泵会工作有响声。


? ? ? 2.3 外挂电源
? ? ? ?本来还想从原控制板上取5V的电给Esp32开发板供电的,结果把Esp32的5V和GND飞线焊上去测了下发现原控制板的5V电源带载能力不够,导致Esp32不停地重启,原控制板上的电源有一个器件一直在滋滋响,这样从这里取电的想法就果断放弃了。还好手上有两个以前买的两个220V转5V的小开关电源模块,正好派上用场了,使用起来也非常方便,输入端接市电L N,输出端输出5V。

? ? ? ?现在开始搭建电源,拔掉风扇的电源插头,先用烙铁将两根全公头的杜邦线焊接到开关电源的输入端,然后将杜邦线的另一端分别焊接到控制板的L N上。确定连接正常没有短路后,将风扇的电源插头插到排插上,看到开关电源的指示灯亮起,证明开关电源模块正常工作了。用万用表直流电压档量一下开关电源模块的输出端是不是有5V输出,如果有5V输出了,证明开关电源的输出是正常的。接下来,拔掉风扇电源插头,用两根电源线焊接到开关电源的输出端,然后通过一公一母的杜邦线连接到Esp32上,这样Esp32的电源就搞定了。由于Esp32还要控制风扇制冷和电机,所以原控制板的电源还需要和Esp32的电源共低,不然无法控制,再飞一根线将二者的地连接到一起就好了。


? ? ? 硬件调试完毕,并烧录程序,开始组装外壳,刚好风扇后面有一个矩形开孔,可以用来伸出Esp32的电源线和控制线,用透明胶粘一下并封住开口,以免里面电路受潮。
? ? ? 呼呼~,到这里,空调扇硬件电路上的改装工作就算完成了,开始下一步操作。

3. 在腾讯云平台上创建产品
? ? ? ?3.1 登录腾讯云
? ? ? ? 用微信扫码登录腾讯云,这是地址,没有账号的需要注册一下:登录 - 腾讯云
?选择我的资源里的物联网开发平台。 ?
?选择公共示例里的立即应用。

3.2 新建项目
3.3 新建产品
?选择好产品品类和通信方式。
选择好标准功能,也可以自定义功能。
?选择开发方式,我们采用的是C-SDK开发

配置小程序 ,面板配置选择免开发面板,保存。


设置配网引导。
?3.4 新建设备

设备三元组信息,后面程序里会用到。
?至此,设备就已经在腾讯云物联网平台创建成功了,可以启动虚拟设备、用微信扫码体验腾讯连连小程序操控效果。
4. 从Github上下载esp-qcloud
4.1 下载代码
? ? ? 乐鑫官方在Github上托管的esp-qcloud仓库地址:https://github.com/espressif/esp-qcloud
通过git clone命令或者网页直接下载,下载好的源码目录结构如下:

通过TERMINAL窗口输入命令:cd examples/led_light?,使命令行进入到examples/led_light路径。
4.2 修改腾讯云三元组码
找到esp-qcloud/src/iot_hub/esp_qcloud_device.c?文件,修改成自己创建的设备三元组码,这三个参数默认在kconfig配置文件里定义,如果在配置文件里修改这三个参数,工程又要重新全部编译一遍,所以我们可以自己定义三个宏定义,修改起来比较方便:
#define MY_PRODUCT_ID "HPPXC7FXXX"
#define MY_DEVICE_NAME "SmartColXXX"
#define MY_DEVICE_SECRET "ulITv8a/zwawB2XXXCIkyw=="

?4.3?配置设备控制引脚
还有对应的GPIO配置也要改一下,控制电机需要三个GPIO,制冷控制也需要一个GPIO,这是我的配置,放在app_main函数里调用一次即可(实际可根据自己的连线更改):
//GPIO DEFINITION
#define COLD_GPIO_NUM 12
#define LOW_SPEED_GPIO_NUM 14
#define MIDDLE_SPEED_GPIO_NUM 27
#define HIGH_SPEED_GPIO_NUM 26
//user driver init
gpio_reset_pin(COLD_GPIO_NUM);
gpio_set_direction(COLD_GPIO_NUM, GPIO_MODE_OUTPUT);
gpio_reset_pin(LOW_SPEED_GPIO_NUM);
gpio_set_direction(LOW_SPEED_GPIO_NUM, GPIO_MODE_OUTPUT);
gpio_reset_pin(MIDDLE_SPEED_GPIO_NUM);
gpio_set_direction(MIDDLE_SPEED_GPIO_NUM, GPIO_MODE_OUTPUT);
gpio_reset_pin(HIGH_SPEED_GPIO_NUM);
gpio_set_direction(HIGH_SPEED_GPIO_NUM, GPIO_MODE_OUTPUT);
4.4?修改设备数据点
? ? ? ?由于乐鑫官方接入腾讯云的示例是基于智能灯为例的,代码里的数据点也是灯的相关功能,所以需要修改,这个在app_main.c文件里,找到函数light_set_param,然后修改如下:
/* Callback to handle commands received from the QCloud cloud */
static esp_err_t light_set_param(const char *id, const esp_qcloud_param_val_t *val)
{
esp_err_t err = ESP_OK;
ESP_LOGI(TAG, "Received id: %s, val: %d", id, val->i);
/*if (!strcmp(id, "power_switch")) {
err = light_driver_set_switch(val->b);
} else if (!strcmp(id, "value")) {
err = light_driver_set_value(val->i);
} else if (!strcmp(id, "hue")) {
err = light_driver_set_hue(val->i);
} else if (!strcmp(id, "saturation")) {
err = light_driver_set_saturation(val->i);
} else {
ESP_LOGW(TAG, "This parameter is not supported");
}*/
static uint8_t onoff = 0;
static uint8_t mode = 0;
static uint8_t gear = 0;
if (!strcmp(id, "power_switch")) {
onoff = val->b;
if(onoff){
gpio_set_level(MIDDLE_SPEED_GPIO_NUM,LOW);
gpio_set_level(HIGH_SPEED_GPIO_NUM,LOW);
gpio_set_level(LOW_SPEED_GPIO_NUM,HIGH);
}else{
gpio_set_level(MIDDLE_SPEED_GPIO_NUM,LOW);
gpio_set_level(HIGH_SPEED_GPIO_NUM,LOW);
gpio_set_level(LOW_SPEED_GPIO_NUM,LOW);
gpio_set_level(COLD_GPIO_NUM,LOW);
}
} else if (!strcmp(id, "windspeed")) {
gear = val->i;
if(onoff){
switch(gear)
{
case 0://低
gpio_set_level(MIDDLE_SPEED_GPIO_NUM,LOW);
gpio_set_level(HIGH_SPEED_GPIO_NUM,LOW);
gpio_set_level(LOW_SPEED_GPIO_NUM,HIGH);
break;
case 1://中
gpio_set_level(LOW_SPEED_GPIO_NUM,LOW);
gpio_set_level(HIGH_SPEED_GPIO_NUM,LOW);
gpio_set_level(MIDDLE_SPEED_GPIO_NUM,HIGH);
break;
case 2://高
gpio_set_level(LOW_SPEED_GPIO_NUM,LOW);
gpio_set_level(MIDDLE_SPEED_GPIO_NUM,LOW);
gpio_set_level(HIGH_SPEED_GPIO_NUM,HIGH);
break;
}
}
} else if (!strcmp(id, "mode")) {
mode = val->i;
} else if (!strcmp(id, "timer")) {
} else if(!strcmp(id, "swing")){//制冷
if(onoff){
if(val->b){
gpio_set_level(COLD_GPIO_NUM,HIGH);
}else{
gpio_set_level(COLD_GPIO_NUM,LOW);
}
}
} else if(!strcmp(id, "cold")){
} else {
ESP_LOGW(TAG, "This parameter is not supported");
err = ESP_FAIL;
}
return err;
}
同样的,app_main函数里的数据点上报也需要修改一下:
/**< Register the properties of the device */
// ESP_ERROR_CHECK(esp_qcloud_device_add_property("power_switch", QCLOUD_VAL_TYPE_BOOLEAN));
// ESP_ERROR_CHECK(esp_qcloud_device_add_property("hue", QCLOUD_VAL_TYPE_INTEGER));
// ESP_ERROR_CHECK(esp_qcloud_device_add_property("saturation", QCLOUD_VAL_TYPE_INTEGER));
// ESP_ERROR_CHECK(esp_qcloud_device_add_property("value", QCLOUD_VAL_TYPE_INTEGER));
ESP_ERROR_CHECK(esp_qcloud_device_add_property("power_switch", QCLOUD_VAL_TYPE_BOOLEAN));
ESP_ERROR_CHECK(esp_qcloud_device_add_property("windspeed", QCLOUD_VAL_TYPE_INTEGER));
ESP_ERROR_CHECK(esp_qcloud_device_add_property("mode", QCLOUD_VAL_TYPE_INTEGER));
ESP_ERROR_CHECK(esp_qcloud_device_add_property("timer", QCLOUD_VAL_TYPE_INTEGER));
ESP_ERROR_CHECK(esp_qcloud_device_add_property("swing", QCLOUD_VAL_TYPE_BOOLEAN));
ESP_ERROR_CHECK(esp_qcloud_device_add_property("cold", QCLOUD_VAL_TYPE_BOOLEAN));
? 这样软件的移植工作就算完成了,是不是挺简单的哈,接下来就是通过小程序对设备进行控制!
5. 通过腾讯连连小程序控制设备
5.1 通过小程序给设备配网
? ? ? ?点“+”图标添加设备

? ? ? ?品类选择:家用电器→风扇

勾选 我已确认操作 然后点击 下一步

?输入路由器WiFi名称、密码,点击下一步,开始配网。

?
?由于小程序默认是一键配网模式,第一次配网会失败,不过不打紧,第二次我们选择,切换到热点配网。

前面两步和一键配网相同,第三步通过小程序连接设备热点:


第四步等待设备配网成功,即如下界面,设备成功添加。

?5.2 通过小程序控制设备
?风扇默认有5个功能,目前做了开关、制冷和挡位这三个功能,模式和定时有空的时候再加上。


? ? ? ?放一张改造后的图,哈哈,表面看起来和之前完全没区别(实则内脏已被我掏空)。
这下终于解决了触摸按键失灵的困扰,也不用管红外遥控器好不好使,开个WiFi就能随意控制!
6. 结束语
? ? ? ?这篇文章主要以智能冷空调扇为例介绍了Esp32接入腾讯云的具体过程,实际其他品类产品也可以采用类似方法,主要两点:第一是修改三元组码,第二是修改数据点下发和上报函数,其他基本都不用怎么改动。
? ? ? ?这是我第一次手动改装一个小电器并且全程详细记录了改装的整个过程,虽然说操作并不复杂,但是作为一个电子爱好者来说还是有那么一点成就感的。其实,我想说的是,硬件改装和代码调试并没有花多少时间,写这篇文章码字却花了我差不多三个晚上外加一个周末的下午,这个效率着实太低了。后面还需要继续创作,好好提升一下文字表达能力和动手创新能力,奥利给!
|