|
爱科技、爱创意、爱折腾、爱极致,我们都是技术控
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 2545889167 于 2022-10-20 12:02 编辑
两年前从坛友处入手了一个智能排插,一直堆灰没用
包邮 出口东南亚美标智能插排(带独立usb充电)
https://www.mydigit.cn/thread-200921-1-1.html
(出处: 数码之家)
最近买了个小爱音响pro 拿出来玩玩,吧家里面的几个灯具都接上,省的用手开关麻烦
排插原装的固件是涂鸦平台的,下载个智能生活APP就能用,但是我看了下涂鸦平台的排插居然不支持小爱同学控制??(天猫精灵是可以的)
这给我搞蒙了,总不能再换个音响吧,那行,我改程序!
原帖有比较详细的外观图,就不拍了
直接拆开
可以看到有四个继电器和5V供电的AC-DC
AC-DC控制器 内置mos 应该是支持5V2A 不过总体来说usb供电这块有点简陋,四个口才给2A的电流,用料也一般般,还不支持快充,估计也就用来充下耳机手电之类的小设备
这边使用的是涂鸦的模块 整套方案应该是涂鸦OEM的,模块里面是esp8266+1M flash
其实就是个低配版ESP12F
考虑到原来的模块还是支持涂鸦平台的,那就换一个模块吧,说不好啥时候又用得到涂鸦平台控制,到时候程序擦除了就改不回去了
轻松拆下
找到一个不记得哪里拆的 焊盘都干掉的esp12F模块 底部的焊盘不影响使用,所以也无所谓了
上自制的ESP12F/ESP01测试/烧录一体化转接板
有自动复位电路,免得手工操作
最后装回就没有拍照了 只用下载一次含有OTA的代码 以后就可以直接用wifi升级,免去了拆开下载程序的麻烦
wifi升级的时候在arduino的端口(串口)选择位置可以看到一个ip地址,选那个地址就可以,升级密码是posystorage,可以自己在程序里面改
- // Hostname defaults to esp8266-[ChipID]
- //ArduinoOTA.setHostname("myesp8266");
- // No authentication by default
- ArduinoOTA.setPassword("posystorage");
复制代码
程序使用arduino+点灯科技的平台,个人用户有5个免费额度,还是够用了
界面如下
这边要吧自己的密钥填写到程序里面再下载烧录,界面配置可以用我到处的现成的,见红圈
配网使用smartconfig 上电30秒超时 可以在乐鑫的微信公众号用微信配网
界面配置文件
- {¨version¨¨2.0.0¨¨config¨{¨headerColor¨¨transparent¨¨headerStyle¨¨dark¨¨background¨{¨img¨¨assets/img/headerbg.jpg¨}}¨dashboard¨|{¨type¨¨btn¨¨ico¨¨fad fa-siren-on¨¨mode¨Ê¨t0¨¨开关2¨¨clr¨¨#389BEE¨¨t1¨¨文本2¨¨bg¨É¨cols¨Ë¨rows¨Ë¨key¨¨btn-k2a¨´x´Ë´y´Ë¨speech¨|÷¨lstyle¨É}{ßB¨tex¨ßG¨四路插座带usb¨ßK´´ßMËßD´´ßNÍßOÊßP¨tex-272¨´x´É´y´ÊßR|÷ßSÊßI¨#FFF¨¨size¨¨20¨}{ßBßCßD¨fad fa-lightbulb-on¨ßFÊßG¨开关1¨ßKßLßMÉßNËßOËßP¨btn-k1a¨´x´É´y´ËßR|÷ßSÉßIßJ}{ßB¨deb¨ßFÉßMÉßNÑßOÌßP¨debug¨´x´É´y´Ï}{ßBßCßD¨fal fa-power-off¨ßFÊßG¨开关3¨ßKßLßMÉßNËßOËßP¨btn-k3a¨´x´Í´y´ËßSÊ}{ßBßCßDßeßFÊßG¨开关4¨ßKßLßMÉßNËßOËßP¨btn-k4a¨´x´Ï´y´ËßSÊ}{ßBßCßD¨fad fa-charging-station¨ßFÊßG¨USB开关¨ßKßLßMÉßNËßOËßP¨btn-u5a¨´x´É´y´ÍßI¨#076EEF¨}÷¨actions¨|¦¨cmd¨¦¨switch¨‡¨text¨‡¨on¨¨打开?name¨¨off¨¨关闭?name¨—÷¨triggers¨|{¨source¨ßp¨source_zh¨¨开关状态¨¨state¨|ßrßt÷¨state_zh¨|´打开´´关闭´÷}÷´rt´|÷}
复制代码 程序 用arduino开发 环境搭建方法满大街都可以找到了
反正我只是个面向百度编程,满大街复制粘贴的糊裱匠
注意 我自己修改了blinker库文件,我发现blinker库没有状态反馈,所以夹带了点“私货”代码,在库中读取wifi连接状态/服务器连接状态等等,并向外反馈
使用时需要替换BlinkerApi.h文件,修改的代码不允许别的使用Blinker库的任何功能,别的用blinker库的程序不受任何影响,只是加了个状态读取函数而已
BlinkerApi.h文件所在地址 C:\Users\你的用户名\AppData\Local\Arduino15\libraries\blinker-library\src\Blinker
不想改的话 屏蔽这段代码就行 就是模块板载led不显示状态罢了
- BlinkerWLANStatus_t last_state = PRO_DEV_DISCONNECTED;
- void LED_Blink_Service(void)
- {
- BlinkerWLANStatus_t BlinkerStatus = Blinker.wlan_status();
- ....
- }
复制代码
完整代码:::
- #define BLINKER_MIOT_MULTI_OUTLET //设置为小爱多个插座的模式
- #define BLINKER_PRINT Serial
- #define BLINKER_WIFI
- #define BLINKER_ESP_SMARTCONFIG
- #include <Blinker.h>
- #include "OneButton.h"
- #include <ArduinoOTA.h>
- #define Socket1 12
- #define Socket2 14
- #define Socket3 15
- #define Socket4 4
- #define SocketUSB 0
- #define User_key 13
- #define LED_wifi 16
- #define LED_build_in 2
- #define LED_Power 5
- char auth[] = "your auth key";/****秘钥****/
- char Port;
- bool Updata = false;
- long F_time = 0;
- int count=0;
- bool WIFI_Status = true;
- // 新建组件对象
- BlinkerButton Button1("btn-k1a"); //设置blinkerapp内数据键名
- BlinkerButton Button2("btn-k2a");
- BlinkerButton Button3("btn-k3a");
- BlinkerButton Button4("btn-k4a");
- BlinkerButton ButtonUSB("btn-u5a");
- // button trigged when pin input level is LOW
- OneButton button_key(User_key, true);
- void deviceWifiReset()
- {
- // Reset device ,erase WiFi config.
- Blinker.reset();
- }
- void Set_Butt(int num) //on反馈
- {
- if (num == 1) {
- Button1.print("on");
- } else if (num == 2) {
- Button2.print("on");
- } else if (num == 3) {
- Button3.print("on");
- } else if (num == 4) {
- Button4.print("on");
- } else if (num == 0) {
- ButtonUSB.print("on");
- }
- }
- void Reset_Butt(int num) //off反馈
- {
- if (num == 1) {
- Button1.print("off");
- } else if (num == 2) {
- Button2.print("off");
- } else if (num == 3) {
- Button3.print("off");
- } else if (num == 4) {
- Button4.print("off");
- } else if (num == 0) {
- ButtonUSB.print("off");
- }
- }
- bool Get_Power_On_State(void)
- {
- bool Power_On = false;
- if(digitalRead(Socket1))Power_On = true;
- if(digitalRead(Socket2))Power_On = true;
- if(digitalRead(Socket3))Power_On = true;
- if(digitalRead(Socket4))Power_On = true;
- if(Power_On)digitalWrite(LED_Power, HIGH);
- else digitalWrite(LED_Power, LOW);
- return Power_On;
- }
- bool Get_Power_On_State_Charger(void)
- {
- bool Power_On = false;
- if(!digitalRead(SocketUSB))Power_On = true;
- if(digitalRead(Socket3))Power_On = true;
- if(digitalRead(Socket4))Power_On = true;
- return Power_On;
- }
- void miotPowerState(const String & state, uint8_t num) //小爱控制函数
- {
- BLINKER_LOG("need set outlet: ", num, ", power state: ", state);
- if (num == 1) {
- Port = Socket1; //指定每一路开关对应在开发板上的通道接口
- } else if (num == 2) {
- Port = Socket2;
- } else if (num == 3) {
- Port = Socket3;
- } else if (num == 4) {
- Port = Socket4;
- }else if (num == 0) {
- Port = SocketUSB;
- }
- if (state == BLINKER_CMD_ON) {
- if (num == 0)digitalWrite(Port, LOW);
- else digitalWrite(Port, HIGH);
- BlinkerMIOT.powerState("on", num);
- BlinkerMIOT.print();
- }
- else if (state == BLINKER_CMD_OFF) {
- if (num == 0)digitalWrite(Port, HIGH);
- else digitalWrite(Port, LOW);
- BlinkerMIOT.powerState("off", num);
- BlinkerMIOT.print();
- }
- Get_Power_On_State();
- Updata = true;
- }
- //小爱设备查询的回调函数,查询设备状态,例如:“插座插孔一状态”
- void miotQuery(int32_t queryCode,uint8_t num)
- {
- BLINKER_LOG("插孔",num,"状态",",codes:", queryCode);
- switch (num)
- {
- case 0 :
- BLINKER_LOG("USB状态:");
- BlinkerMIOT.powerState(digitalRead(SocketUSB) ? "off" : "on");
- BlinkerMIOT.print();
- break;
- case 1 :
- BLINKER_LOG("插孔1状态:");
- BlinkerMIOT.powerState(digitalRead(Socket1) ? "on" : "off");
- BlinkerMIOT.print();
- break;
- case 2 :
- BLINKER_LOG("插孔2状态:");
- BlinkerMIOT.powerState(digitalRead(Socket2) ? "on" : "off");
- BlinkerMIOT.print();
- break;
- case 3 :
- BLINKER_LOG("插孔3状态:");
- BlinkerMIOT.powerState(digitalRead(Socket3) ? "on" : "off");
- BlinkerMIOT.print();
- break;
- case 4 :
- BLINKER_LOG("插孔4状态:");
- BlinkerMIOT.powerState(digitalRead(Socket4) ? "on" : "off");
- BlinkerMIOT.print();
- break;
- default :
- BlinkerMIOT.powerState(digitalRead(Socket1) ? "on" : "off");
- BlinkerMIOT.powerState(digitalRead(Socket2) ? "on" : "off");
- BlinkerMIOT.powerState(digitalRead(Socket3) ? "on" : "off");
- BlinkerMIOT.powerState(digitalRead(Socket4) ? "on" : "off");
- BlinkerMIOT.powerState(digitalRead(SocketUSB) ? "off" : "on");
- BlinkerMIOT.print();
- break;
- }
- Updata = true;
- }
- void button1_callback(const String & state) //点灯app内控制按键触发
- {
- BLINKER_LOG("get button 1 state: ", state);
- if (state == "on")
- {
- digitalWrite(Socket1, HIGH);
- Button1.print("on");
- }
- if (state == "off")
- {
- digitalWrite(Socket1, LOW);
- Button1.print("off");
- }
- Get_Power_On_State();
- }
- void button2_callback(const String & state) //点灯app内控制按键触发
- {
- BLINKER_LOG("get button 2 state: ", state);
- if (state == "on")
- {
- digitalWrite(Socket2, HIGH);
- Button2.print("on");
- }
- if (state == "off")
- {
- digitalWrite(Socket2, LOW);
- Button2.print("off");
- }
- Get_Power_On_State();
- }
- void button3_callback(const String & state) //点灯app内控制按键触发
- {
- BLINKER_LOG("get button 3 state: ", state);
- if (state == "on")
- {
- digitalWrite(Socket3, HIGH);
- Button3.print("on");
- }
- if (state == "off")
- {
- digitalWrite(Socket3, LOW);
- Button3.print("off");
- }
- Get_Power_On_State();
- }
- void button4_callback(const String & state) //点灯app内控制按键触发
- {
- BLINKER_LOG("get button 4 state: ", state);
- if (state == "on")
- {
- digitalWrite(Socket4, HIGH);
- Button4.print("on");
- }
- if (state == "off")
- {
- digitalWrite(Socket4, LOW);
- Button4.print("off");
- }
- Get_Power_On_State();
- }
- void buttonusb_callback(const String & state) //点灯app内控制按键触发
- {
- BLINKER_LOG("get button usb state: ", state);
- if (state == "on")
- {
- digitalWrite(SocketUSB, LOW);
- ButtonUSB.print("on");
- }
- if (state == "off")
- {
- digitalWrite(SocketUSB, HIGH);
- ButtonUSB.print("off");
- }
- }
- void dataRead_callback(const String & data)
- {
- BLINKER_LOG("Blinker readString: ", data);
- Blinker.vibrate();
-
- uint32_t BlinkerTime = millis();
-
- Blinker.print("millis", BlinkerTime);
- }
- //心跳包刷新状态
- void heartbeat(void)
- {
- Button1.print(digitalRead(Socket1) ? "on" : "off");
- Button2.print(digitalRead(Socket2) ? "on" : "off");
- Button3.print(digitalRead(Socket3) ? "on" : "off");
- Button4.print(digitalRead(Socket4) ? "on" : "off");
- ButtonUSB.print(digitalRead(SocketUSB) ? "off" : "on");
- }
-
- void UserKey_Onoff()
- {
- if(Get_Power_On_State())
- {
- digitalWrite(Socket1, LOW);
- digitalWrite(Socket2, LOW);
- digitalWrite(Socket3, LOW);
- digitalWrite(Socket4, LOW);
- digitalWrite(SocketUSB, HIGH);
- }
- else
- {
- digitalWrite(Socket1, HIGH);
- digitalWrite(Socket2, HIGH);
- digitalWrite(Socket3, HIGH);
- digitalWrite(Socket4, HIGH);
- digitalWrite(SocketUSB, LOW);
- }
- Get_Power_On_State();
- Updata = true;
- }
- void UserKey_DoubleClick_Onoff(void)
- {
- if(Get_Power_On_State_Charger())
- {
- digitalWrite(Socket3, LOW);
- digitalWrite(Socket4, LOW);
- digitalWrite(SocketUSB, HIGH);
- }
- else
- {
- digitalWrite(Socket3, HIGH);
- digitalWrite(Socket4, HIGH);
- digitalWrite(SocketUSB, LOW);
- }
- Get_Power_On_State();
- Updata = true;
- }
-
- bool Update_Last = false;
- unsigned long Update_startTime;
- void Update_Service(void)
- {
- if(Updata)
- {
- if(Update_Last == false)
- {
- Update_startTime = millis();
- Update_Last = true;
- }
- if(Update_startTime>millis())Update_startTime = millis();//溢出
- if((millis()-Update_startTime)>1000)
- {
- heartbeat();
- Updata = false;
- Update_Last = false;
- }
- }
- }
- unsigned long previousMillis1,previousMillis2;
- void LED_Blink_Build_in(uint32_t period)
- {
- unsigned long currentMillis = millis(); /* 记录当前时间 */
- int ledState;
- if(previousMillis1>millis())previousMillis1 = millis();//溢出
- if ( currentMillis - previousMillis1 >= period ) /* 检查 "period" ms是否通过 */
- {
- ledState = digitalRead( LED_build_in );
- previousMillis1 = currentMillis; /* 保存上次闪烁LED时 */
- if ( ledState == LOW ) /* 如果LED关闭,则打开,反之亦然 */
- {
- ledState = HIGH;
- } else {
- ledState = LOW;
- }
- digitalWrite( LED_build_in, ledState ); /* LED为ledState状态 */
- }
- }
- void LED_Blink_Wifi(uint32_t period)
- {
- unsigned long currentMillis = millis(); /* 记录当前时间 */
- int ledState;
- if(previousMillis2>millis())previousMillis2 = millis();//溢出
- if ( currentMillis - previousMillis2 >= period ) /* 检查 "period" ms是否通过 */
- {
- ledState = digitalRead( LED_wifi );
- previousMillis2 = currentMillis; /* 保存上次闪烁LED时 */
- if ( ledState == LOW ) /* 如果LED关闭,则打开,反之亦然 */
- {
- ledState = HIGH;
- } else {
- ledState = LOW;
- }
- digitalWrite( LED_wifi, ledState ); /* LED为ledState状态 */
- }
- }
- BlinkerWLANStatus_t last_state = PRO_DEV_DISCONNECTED;
- void LED_Blink_Service(void)
- {
- BlinkerWLANStatus_t BlinkerStatus = Blinker.wlan_status();
- if(last_state!=BlinkerStatus)
- {
- printf("wlan status: %d \r\n", BlinkerStatus);
- last_state = BlinkerStatus;
- if(BlinkerStatus == PRO_DEV_CONNECTED)
- {
- digitalWrite(Socket3, HIGH);
- digitalWrite(Socket4, HIGH);
- digitalWrite(SocketUSB, LOW);
- digitalWrite(LED_Power, HIGH);
- Updata = true;
- }
- }
- if(BlinkerStatus == PRO_WLAN_CONNECTING)
- {
- LED_Blink_Wifi(300);
- digitalWrite( LED_build_in, HIGH);
- }
- else if((BlinkerStatus == PRO_WLAN_CONNECTED)||(BlinkerStatus == PRO_DEV_CONNECTING))
- {
- LED_Blink_Wifi(600);
- digitalWrite( LED_build_in, LOW);
- }
- else if(BlinkerStatus == PRO_WLAN_SMARTCONFIG_BEGIN)
- {
- LED_Blink_Wifi(150);
- digitalWrite( LED_build_in, HIGH);
- }
- else if(BlinkerStatus == PRO_DEV_CONNECTED)
- {
- digitalWrite( LED_wifi, LOW);
- LED_Blink_Build_in(800);
- }
- else
- {
- LED_Blink_Wifi(50);
- LED_Blink_Build_in(300);
- }
- }
- void setup() {
- // 初始化串口
- Serial.begin(921600);
- #if defined(BLINKER_PRINT)
- BLINKER_DEBUG.stream(BLINKER_PRINT);
- #endif
- // 初始化有LED的IO
- pinMode(Socket1, OUTPUT);
- digitalWrite(Socket1, LOW);
- pinMode(Socket2, OUTPUT);
- digitalWrite(Socket2, LOW);
- pinMode(Socket3, OUTPUT);
- digitalWrite(Socket3, LOW);
- pinMode(Socket4, OUTPUT);
- digitalWrite(Socket4, LOW);//初始化输出低电平
- pinMode(SocketUSB, OUTPUT);
- digitalWrite(SocketUSB, HIGH);//USB初始化输出低电平 WIFI连接后高电平
- pinMode(LED_wifi, OUTPUT);
- pinMode(LED_Power, OUTPUT);
- digitalWrite(LED_Power, LOW);
- pinMode(LED_build_in, OUTPUT);
- digitalWrite(LED_build_in, HIGH);
- //WIFI_Set();
- // 初始化blinker
- //Blinker.begin(auth, WiFi.SSID().c_str(), WiFi.psk().c_str());
- Blinker.begin(auth);
- Blinker.attachData(dataRead_callback);
- Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态
-
- Button1.attach(button1_callback);//注册按键回调函数
- Button2.attach(button2_callback);
- Button3.attach(button3_callback);
- Button4.attach(button4_callback);
- ButtonUSB.attach(buttonusb_callback);
- BlinkerMIOT.attachPowerState(miotPowerState);
- BlinkerMIOT.attachQuery(miotQuery);
- digitalWrite(LED_wifi, HIGH);
- button_key.attachLongPressStart(deviceWifiReset);
- button_key.attachClick(UserKey_Onoff);
- button_key.attachDoubleClick(UserKey_DoubleClick_Onoff);
- button_key.setPressTicks(3500);
- // Port defaults to 8266
- ArduinoOTA.setPort(8266);
- // Hostname defaults to esp8266-[ChipID]
- //ArduinoOTA.setHostname("myesp8266");
- // No authentication by default
- ArduinoOTA.setPassword("posystorage");
- ArduinoOTA.onStart([]() {
- String type;
- if (ArduinoOTA.getCommand() == U_FLASH) {
- type = "sketch";
- } else { // U_FS
- type = "filesystem";
- }
- // NOTE: if updating FS this would be the place to unmount FS using FS.end()
- Serial.println("Start updating " + type);
- });
- ArduinoOTA.onEnd([]() {
- Serial.println("\nEnd");
- });
- ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
- Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
- });
- ArduinoOTA.onError([](ota_error_t error) {
- Serial.printf("Error[%u]: ", error);
- if (error == OTA_AUTH_ERROR) {
- Serial.println("Auth Failed");
- } else if (error == OTA_BEGIN_ERROR) {
- Serial.println("Begin Failed");
- } else if (error == OTA_CONNECT_ERROR) {
- Serial.println("Connect Failed");
- } else if (error == OTA_RECEIVE_ERROR) {
- Serial.println("Receive Failed");
- } else if (error == OTA_END_ERROR) {
- Serial.println("End Failed");
- }
- });
- ArduinoOTA.begin();
-
- }
- void loop() {
- Blinker.run();
- ArduinoOTA.handle();
- button_key.tick();
- Update_Service();
- LED_Blink_Service();
- }
复制代码
有钱人也可以下载附件
4key 代码.zip
(63.38 KB, 下载次数: 0)
没钱的可以打个赏或者回个帖 平民通道在这里
链接: https://pan.baidu.com/s/1aYv-b40PGoXc6kcDTDqK7Q?pwd=7s7e 提取码: 7s7e
|
打赏
-
查看全部打赏
|