本帖最后由 嘎嘣脆ovo 于 2021-1-15 13:35 编辑
【写在前面】
本着认真分享,让其他和我一样有需要的朋友轻松上手,能有参考意义,所以可能较啰嗦。
特别提示:家用电器220V高压危险,请自行判断,无把握请勿操作!本帖只做经验分享,请自行评估风险,若有意外与本人无关。
硬件设备是:乐鑫ESP32、5V继电器 、可拔插220V连接线1平方、220V转5V电源,给继电器供电(ESP32只能输出3.3V,且电源更有保障不占用插座)
环境安装:
1.Ardunio IDE 点此下载。 中国大陆安装方法。
2.Ardunio ESP32 Blinke支持库
Windows:将下载好的blinker库解压到 我的电脑>文档>Arduino>libraries 文件夹中
Mac OS:将下载好的blinker库解压到 文稿>Arduino>libraries 文件夹中
3.Ardunio安装ESP32开发板。选择ESP32 Dev Module。重要!!
ESP32开发板安装方法:在Ardunio IDE——文件——首选项——附加开发板管理网址中加入 https://dl.espressif.com/dl/package_esp32_index.json ;
接着Ardunio IDE——工具——开发板——开发板管理器,搜索 ESP32 安装即可。
【案例一】前些天脸上冒痘,去医院拿了点药,吃完皮肤更干了。冬天房间一干,更是起皮,贼不爽。于是乎,翻出了不知道啥时候公司节日礼品——超声波加湿器。但是,每天手动开关就很烦,希望和温湿度计联动自动开关。于是就研究了下点灯接入小爱。
完整代码跳转查看:
- https://github.com/kuole-o/IoT_xiaoai_blinker/blob/main/xiaoai_on_off/xiaoai_on_off.ino
复制代码 加湿器是“微动开关”,(微动开关:按一次on,再按一次off那种)我的加湿器更扯,开始工作后,再按一次电源似乎是无响应,也就是按两次才能off。在qq群一位老哥指导下,实现了相关效果。后来直接换了加湿器,因此这部分代码实现且测试过,但硬件没搞。
完整代码跳转查看:
- https://github.com/kuole-o/IoT_xiaoai_blinker/blob/main/xiaoai_MicroSwitch_1on_2off/xiaoai_MicroSwitch_1on_2off.ino
复制代码
【案例二】
后来发现加湿器效果弱,只能从 35%湿度提升到42%左右,17平的卧室。。于是,干脆下单了米家纯净式加湿器。效果果然上来了 不加电,纯蒸发都能保持 55%~60%湿度。
于是乎,又把ESP32改成控制取暖器,夏天控制电风扇。因为想着兼容性强,后面随时控制其他家电,而且继电器还剩一个没用,就按2400w电路设计(导致线材有些粗,1平方的)。下面开干。
- 首先是控制部分,ESP32控制程序。担心大篇幅代码影响阅读体验,所以完整代码在文末,想现在就看的,用下面链接。
- https://github.com/kuole-o/IoT_xiaoai_blinker/blob/main/xiaoai_4_no_off_BlinkerButton5/xiaoai_4_no_off_BlinkerButton5.ino
复制代码
硬件连接:
至此,硬件电路链接完成。实测效果如下:
【我的所有相关代码见GitHub】
- https://github.com/kuole-o/IoT_xiaoai_blinker
复制代码
【案例2完整代码】
欢迎一起交流,本人纯外行小白,代码若有不妥望指正!
- /* *****************************************************************
- Download latest Blinker library here:
- https://github.com/blinker-iot/blinker-library/archive/master.zip
- Blinker is a cross-hardware, cross-platform solution for the IoT.
- It provides APP, device and server support,
- and uses public cloud services for data transmission and storage.
- It can be used in smart home, data monitoring and other fields
- to help users build Internet of Things projects better and faster.
- Make sure installed 2.7.4 or later ESP8266/Arduino package,
- if use ESP8266 with Blinker.
- https://github.com/esp8266/Arduino/releases
- Make sure installed 1.0.4 or later ESP32/Arduino package,
- if use ESP32 with Blinker.
- https://github.com/espressif/arduino-esp32/releases
- Docs: https://diandeng.tech/doc
- * *****************************************************************
- Blinker 库下载地址:
- https://github.com/blinker-iot/blinker-library/archive/master.zip
- Blinker 是一套跨硬件、跨平台的物联网解决方案,提供APP端、设备端、
- 服务器端支持,使用公有云服务进行数据传输存储。可用于智能家居、
- 数据监测等领域,可以帮助用户更好更快地搭建物联网项目。
- 如果使用 ESP8266 接入 Blinker,
- 请确保安装了 2.7.4 或更新的 ESP8266/Arduino 支持包。
- https://github.com/esp8266/Arduino/releases
- 如果使用 ESP32 接入 Blinker,
- 请确保安装了 1.0.4 或更新的 ESP32/Arduino 支持包。
- https://github.com/espressif/arduino-esp32/releases
- 文档: https://diandeng.tech/doc
- * *****************************************************************/
- #define BLINKER_WIFI
- #define BLINKER_MIOT_MULTI_OUTLET //设置为小爱多个插座的模式
- #include <Blinker.h>
- char i;
- char auth[] = "******";
- char ssid[] = "******";
- char pswd[] = "******";
- bool oState[5] = { false };
- // 新建组件对象,要和APP组件’数据键名’一致
- BlinkerButton Button1("btn_a");
- BlinkerButton Button2("btn_b");
- BlinkerButton Button3("btn_c");
- BlinkerButton Button4("btn_d");
- BlinkerButton Button5("btn_all");
- // 按下Blinker APP按键1即会执行该函数
- void button1_callback(const String & state)
- {
- BLINKER_LOG("get button state: ", state);
- digitalWrite(13, !digitalRead(13));
- if (state == "on") {
- digitalWrite(13, LOW);
- Button1.print("on");
- Button1.text("摇头:开");
- }
- else if (state == "off") {
- digitalWrite(13, HIGH);
- Button1.print("off");
- Button1.text("摇头:关");
- }
- }
- // 按下Blinker APP按键2即会执行该函数
- void button2_callback(const String & state)
- {
- BLINKER_LOG("get button state: ", state);
- digitalWrite(12, !digitalRead(12));
- if (state == "on") {
- digitalWrite(12, HIGH);
- Button2.print("on");
- Button2.text("低温/弱风");
- }
- else if (state == "off") {
- digitalWrite(12, LOW);
- Button2.print("off");
- Button2.text("低温/弱风");
- }
- }
- // 按下Blinker APP按键3即会执行该函数
- void button3_callback(const String & state)
- {
- BLINKER_LOG("get button state: ", state);
- digitalWrite(27, !digitalRead(27));
- if (state == "on") {
- digitalWrite(27, HIGH);
- Button3.print("on");
- Button3.text("高温/强风");
- }
- else if (state == "off") {
- digitalWrite(27, LOW);
- Button3.print("off");
- Button3.text("高温/强风");
- }
- }
- // 按下Blinker APP按键4即会执行该函数
- void button4_callback(const String & state)
- {
- BLINKER_LOG("get button state: ", state);
- digitalWrite(25, !digitalRead(25));
- if (state == "on") {
- digitalWrite(25, HIGH);
- Button4.print("on");
- Button4.text("未定义:开");
- }
- else if (state == "off") {
- digitalWrite(25, LOW);
- Button4.print("off");
- Button4.text("未定义:关");
- }
- }
- // 按下Blinker APP按键5即会执行该函数
- void button5_callback(const String & state)
- {
- BLINKER_LOG("get button state: ", state);
- digitalWrite(13, !digitalRead(13));
- digitalWrite(12, !digitalRead(12));
- if (state == "on") {
- digitalWrite(13, HIGH);
- digitalWrite(12, HIGH);
- Button1.print("on");
- Button2.print("on");
- Button1.text("摇头:开");
- Button2.text("低温/弱风");
- }
- else if (state == "off") {
- digitalWrite(12, LOW);
- digitalWrite(13, LOW);
- digitalWrite(27, LOW);
- Button1.print("off");
- Button2.print("off");
- Button3.print("off");
- Button1.text("摇头:关");
- Button2.text("低温/弱风");
- Button3.text("高温/强风");
- }
- }
- // 13-摇头/不摇头;12-低温/弱风;27-高温/强风
- void miotPowerState(const String & state, uint8_t num)
- {
- BLINKER_LOG("need set outlet: ", num, ", power state: ", state);
- i = 0; //初始化
- if (num == 1) {
- i = 13;
- }
- else if (num == 2) {
- i = 12;
- }
- else if (num == 3) {
- i = 27;
- }
- else if (num == 4) {
- i = 25;
- }
- if (state == BLINKER_CMD_ON) {
- switch (i) {
- case 12:
- digitalWrite(27, LOW);
- digitalWrite(i, !digitalRead(27));
- BlinkerMIOT.powerState("on", num);
- BlinkerMIOT.print();
- oState[num] = true;
- break;
- case 27:
- digitalWrite(12, LOW);
- digitalWrite(i, !digitalRead(12));
- BlinkerMIOT.powerState("on", num);
- BlinkerMIOT.print();
- oState[num] = true;
- break;
- default:
- digitalWrite(i, HIGH);
- BlinkerMIOT.powerState("on", num);
- BlinkerMIOT.print();
- oState[num] = true;
- }
- }
- else if (state == BLINKER_CMD_OFF) {
- switch (i) {
- case 12:
- digitalWrite(27, LOW);
- digitalWrite(i, LOW);
- BlinkerMIOT.powerState("off", num);
- BlinkerMIOT.print();
- oState[num] = false;
- break;
- case 27:
- digitalWrite(12, LOW);
- digitalWrite(i, LOW);
- BlinkerMIOT.powerState("off", num);
- BlinkerMIOT.print();
- oState[num] = false;
- break;
- default:
- digitalWrite(i, LOW);
- BlinkerMIOT.powerState("off", num);
- BlinkerMIOT.print();
- oState[num] = false;
- }
- if (num == 0) {
- for (uint8_t o_num = 0; o_num < 5; o_num++) {
- oState[o_num] = false;
- }
- }
- }
- }
- void miotQuery(int32_t queryCode, uint8_t num)
- {
- BLINKER_LOG("AliGenie Query outlet: ", num, ", codes: ", queryCode);
- switch (queryCode)
- {
- case BLINKER_CMD_QUERY_ALL_NUMBER :
- BLINKER_LOG("MIOT Query All");
- BlinkerMIOT.powerState(oState[num] ? "on" : "off", num);
- BlinkerMIOT.print();
- break;
- case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
- BLINKER_LOG("MIOT Query Power State");
- BlinkerMIOT.powerState(oState[num] ? "on" : "off", num);
- BlinkerMIOT.print();
- break;
- default :
- BlinkerMIOT.powerState(oState[num] ? "on" : "off", num);
- BlinkerMIOT.print();
- break;
- }
- }
- void dataRead(const String & data)
- {
- BLINKER_LOG("Blinker readString: ", data);
- Blinker.vibrate();
- uint32_t BlinkerTime = millis();
- Blinker.print("millis", BlinkerTime);
- }
- void setup()
- {
- Serial.begin(115200);
- BLINKER_DEBUG.stream(Serial);
- pinMode(13, OUTPUT);
- digitalWrite(13, LOW);
- pinMode(12, OUTPUT);
- digitalWrite(12, LOW);
- pinMode(27, OUTPUT);
- digitalWrite(27, LOW);
- pinMode(25, OUTPUT);
- digitalWrite(25, LOW);
- Blinker.begin(auth, ssid, pswd);
- Blinker.attachData(dataRead);
- Button1.attach(button1_callback);
- Button2.attach(button2_callback);
- Button3.attach(button3_callback);
- Button4.attach(button4_callback);
- Button5.attach(button5_callback);
- BlinkerMIOT.attachPowerState(miotPowerState);
- BlinkerMIOT.attachQuery(miotQuery);
- }
- void loop()
- {
- Blinker.run();
- }
复制代码 踩过的坑:
- 编译时,一定要选择合适的开发板,比如上面我用的那个 ESP32 Dev Module
- 小爱音箱、小爱同学 两个App的小爱训练是分开的,若要同时支持泛化指令,得都设置一遍。
- Ardunio IDE 编辑器很辣鸡,有时候一不留神多一个 { 没发现就报错,建议在其他编辑器里搞好代码,复制到IDE中编译。
- 买拔插接头,不要带焊锡的,很难剥皮。。
- 万用表很方便,可以搞一个。
- 电器里接头处,多用电胶布包扎。
- 遇到问题,多查资料。
家用电器220V高压危险,请自行判断,无把握请勿操作!本帖只做经验分享,请自行评估风险,若有意外与本人无关。
最后,祝你成功!本帖不定期来瞄一眼,欢迎一起交流。
|