数码之家

 找回密码
 立即注册
搜索
查看: 1971|回复: 26

[Arduino] 改四路带USB充电排插,支持小爱同学+APP远程控制+局域网OTA升级(开源)

[复制链接]
发表于 2022-10-20 12:01:04 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 2545889167 于 2022-10-20 12:02 编辑

两年前从坛友处入手了一个智能排插,一直堆灰没用

包邮 出口东南亚美标智能插排(带独立usb充电)
https://www.mydigit.cn/thread-200921-1-1.html
(出处: 数码之家)

最近买了个小爱音响pro 拿出来玩玩,吧家里面的几个灯具都接上,省的用手开关麻烦

排插原装的固件是涂鸦平台的,下载个智能生活APP就能用,但是我看了下涂鸦平台的排插居然不支持小爱同学控制??(天猫精灵是可以的)
这给我搞蒙了,总不能再换个音响吧,那行,我改程序!


原帖有比较详细的外观图,就不拍了
直接拆开
0d95124b07ae4971155b8de60d5d102.jpg
可以看到有四个继电器和5V供电的AC-DC

1.JPG
AC-DC控制器 内置mos 应该是支持5V2A 不过总体来说usb供电这块有点简陋,四个口才给2A的电流,用料也一般般,还不支持快充,估计也就用来充下耳机手电之类的小设备

db2439a6c2541392e5fdd707c93352d.jpg
这边使用的是涂鸦的模块 整套方案应该是涂鸦OEM的,模块里面是esp8266+1M flash

其实就是个低配版ESP12F

2.JPG
考虑到原来的模块还是支持涂鸦平台的,那就换一个模块吧,说不好啥时候又用得到涂鸦平台控制,到时候程序擦除了就改不回去了
轻松拆下

f46200b4093f69f119abd6a7211e146.jpg
找到一个不记得哪里拆的 焊盘都干掉的esp12F模块 底部的焊盘不影响使用,所以也无所谓了

3.JPG
上自制的ESP12F/ESP01测试/烧录一体化转接板
有自动复位电路,免得手工操作

a4896d68c12e424ea9194bc8e526102.jpg
最后装回就没有拍照了 只用下载一次含有OTA的代码 以后就可以直接用wifi升级,免去了拆开下载程序的麻烦
wifi升级的时候在arduino的端口(串口)选择位置可以看到一个ip地址,选那个地址就可以,升级密码是posystorage,可以自己在程序里面改
  1. // Hostname defaults to esp8266-[ChipID]
  2. //ArduinoOTA.setHostname("myesp8266");
  3. // No authentication by default
  4. ArduinoOTA.setPassword("posystorage");
复制代码




程序使用arduino+点灯科技的平台,个人用户有5个免费额度,还是够用了
界面如下

df4faa91ac0a35a8d9899c6529b45ec.jpg
这边要吧自己的密钥填写到程序里面再下载烧录,界面配置可以用我到处的现成的,见红圈

c8040d109069c36a599a5c2c208ad81.jpg
配网使用smartconfig 上电30秒超时 可以在乐鑫的微信公众号用微信配网

界面配置文件
  1. {¨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不显示状态罢了
  1. BlinkerWLANStatus_t last_state = PRO_DEV_DISCONNECTED;
  2. void LED_Blink_Service(void)
  3. {
  4. BlinkerWLANStatus_t BlinkerStatus = Blinker.wlan_status();
  5. ....
  6. }
复制代码

完整代码:::

  1. #define BLINKER_MIOT_MULTI_OUTLET    //设置为小爱多个插座的模式
  2. #define BLINKER_PRINT Serial
  3. #define BLINKER_WIFI
  4. #define BLINKER_ESP_SMARTCONFIG

  5. #include <Blinker.h>
  6. #include "OneButton.h"
  7. #include <ArduinoOTA.h>

  8. #define Socket1 12
  9. #define Socket2 14
  10. #define Socket3 15
  11. #define Socket4 4
  12. #define SocketUSB 0
  13. #define User_key 13
  14. #define LED_wifi 16
  15. #define LED_build_in 2
  16. #define LED_Power 5
  17. char auth[] = "your auth key";/****秘钥****/

  18. char Port;
  19. bool Updata = false;
  20. long F_time = 0;
  21. int count=0;
  22. bool WIFI_Status = true;


  23. // 新建组件对象
  24. BlinkerButton Button1("btn-k1a");     //设置blinkerapp内数据键名
  25. BlinkerButton Button2("btn-k2a");
  26. BlinkerButton Button3("btn-k3a");
  27. BlinkerButton Button4("btn-k4a");
  28. BlinkerButton ButtonUSB("btn-u5a");
  29. // button trigged when pin input level is LOW
  30. OneButton button_key(User_key, true);

  31. void deviceWifiReset()
  32. {
  33.     // Reset device ,erase WiFi config.
  34.     Blinker.reset();
  35. }

  36. void Set_Butt(int num) //on反馈
  37. {
  38.     if (num == 1) {
  39.         Button1.print("on");      
  40.     } else if (num == 2) {
  41.         Button2.print("on");
  42.     } else if (num == 3) {
  43.         Button3.print("on");
  44.     } else if (num == 4) {
  45.         Button4.print("on");
  46.     } else if (num == 0) {
  47.         ButtonUSB.print("on");
  48.     }   
  49. }
  50. void Reset_Butt(int num) //off反馈
  51. {
  52.     if (num == 1) {
  53.         Button1.print("off");      
  54.     } else if (num == 2) {
  55.         Button2.print("off");
  56.     } else if (num == 3) {
  57.         Button3.print("off");
  58.     } else if (num == 4) {
  59.         Button4.print("off");
  60.     } else if (num == 0) {
  61.         ButtonUSB.print("off");
  62.     }  
  63. }

  64. bool Get_Power_On_State(void)
  65. {
  66.   bool Power_On = false;
  67.   if(digitalRead(Socket1))Power_On = true;  
  68.   if(digitalRead(Socket2))Power_On = true;
  69.   if(digitalRead(Socket3))Power_On = true;
  70.   if(digitalRead(Socket4))Power_On = true;
  71.   if(Power_On)digitalWrite(LED_Power, HIGH);  
  72.   else digitalWrite(LED_Power, LOW);   
  73.   return Power_On;
  74. }


  75. bool Get_Power_On_State_Charger(void)
  76. {
  77.   bool Power_On = false;
  78.   if(!digitalRead(SocketUSB))Power_On = true;
  79.   if(digitalRead(Socket3))Power_On = true;
  80.   if(digitalRead(Socket4))Power_On = true;
  81.   return Power_On;
  82. }


  83. void miotPowerState(const String & state, uint8_t num)     //小爱控制函数
  84. {
  85.   BLINKER_LOG("need set outlet: ", num, ", power state: ", state);
  86.   if (num == 1) {
  87.     Port = Socket1;        //指定每一路开关对应在开发板上的通道接口
  88.   } else if (num == 2) {
  89.     Port = Socket2;
  90.   } else if (num == 3) {
  91.     Port = Socket3;
  92.   } else if (num == 4) {
  93.     Port = Socket4;
  94.   }else if (num == 0) {
  95.     Port = SocketUSB;
  96.   }

  97.   if (state == BLINKER_CMD_ON) {
  98.     if (num == 0)digitalWrite(Port, LOW);
  99.     else digitalWrite(Port, HIGH);
  100.     BlinkerMIOT.powerState("on", num);
  101.     BlinkerMIOT.print();
  102.   }
  103.   else if (state == BLINKER_CMD_OFF) {
  104.     if (num == 0)digitalWrite(Port, HIGH);
  105.     else digitalWrite(Port, LOW);
  106.     BlinkerMIOT.powerState("off", num);
  107.     BlinkerMIOT.print();
  108.   }
  109.   Get_Power_On_State();
  110.   Updata = true;
  111. }

  112. //小爱设备查询的回调函数,查询设备状态,例如:“插座插孔一状态”
  113. void miotQuery(int32_t queryCode,uint8_t num)
  114. {
  115.     BLINKER_LOG("插孔",num,"状态",",codes:", queryCode);

  116.     switch (num)
  117.     {
  118.          case 0 :
  119.             BLINKER_LOG("USB状态:");
  120.             BlinkerMIOT.powerState(digitalRead(SocketUSB) ? "off" : "on");
  121.             BlinkerMIOT.print();
  122.             break;
  123.          case 1 :
  124.             BLINKER_LOG("插孔1状态:");
  125.             BlinkerMIOT.powerState(digitalRead(Socket1) ? "on" : "off");
  126.             BlinkerMIOT.print();
  127.             break;
  128.          case 2 :
  129.             BLINKER_LOG("插孔2状态:");
  130.             BlinkerMIOT.powerState(digitalRead(Socket2) ? "on" : "off");
  131.             BlinkerMIOT.print();
  132.             break;
  133.          case 3 :
  134.             BLINKER_LOG("插孔3状态:");
  135.             BlinkerMIOT.powerState(digitalRead(Socket3) ? "on" : "off");
  136.             BlinkerMIOT.print();
  137.             break;
  138.          case 4 :
  139.             BLINKER_LOG("插孔4状态:");
  140.             BlinkerMIOT.powerState(digitalRead(Socket4) ? "on" : "off");
  141.             BlinkerMIOT.print();
  142.             break;
  143.          default :
  144.             BlinkerMIOT.powerState(digitalRead(Socket1) ? "on" : "off");
  145.             BlinkerMIOT.powerState(digitalRead(Socket2) ? "on" : "off");
  146.             BlinkerMIOT.powerState(digitalRead(Socket3) ? "on" : "off");
  147.             BlinkerMIOT.powerState(digitalRead(Socket4) ? "on" : "off");
  148.             BlinkerMIOT.powerState(digitalRead(SocketUSB) ? "off" : "on");
  149.             BlinkerMIOT.print();
  150.             break;
  151.     }
  152.     Updata = true;
  153. }


  154. void button1_callback(const String & state)     //点灯app内控制按键触发
  155. {
  156.   BLINKER_LOG("get button 1 state: ", state);
  157.   if (state == "on")
  158.   {
  159.     digitalWrite(Socket1, HIGH);
  160.     Button1.print("on");
  161.   }
  162.   if (state == "off")
  163.   {
  164.     digitalWrite(Socket1, LOW);
  165.     Button1.print("off");
  166.   }
  167.   Get_Power_On_State();
  168. }
  169. void button2_callback(const String & state)     //点灯app内控制按键触发
  170. {
  171.   BLINKER_LOG("get button 2 state: ", state);
  172.   if (state == "on")
  173.   {
  174.     digitalWrite(Socket2, HIGH);
  175.     Button2.print("on");
  176.   }
  177.   if (state == "off")
  178.   {
  179.     digitalWrite(Socket2, LOW);
  180.     Button2.print("off");
  181.   }
  182.   Get_Power_On_State();
  183. }
  184. void button3_callback(const String & state)     //点灯app内控制按键触发
  185. {
  186.   BLINKER_LOG("get button 3 state: ", state);
  187.   if (state == "on")
  188.   {
  189.     digitalWrite(Socket3, HIGH);
  190.     Button3.print("on");
  191.   }
  192.   if (state == "off")
  193.   {
  194.     digitalWrite(Socket3, LOW);
  195.     Button3.print("off");
  196.   }
  197.   Get_Power_On_State();
  198. }
  199. void button4_callback(const String & state)     //点灯app内控制按键触发
  200. {
  201.   BLINKER_LOG("get button 4 state: ", state);
  202.   if (state == "on")
  203.   {
  204.     digitalWrite(Socket4, HIGH);
  205.     Button4.print("on");
  206.   }
  207.   if (state == "off")
  208.   {
  209.     digitalWrite(Socket4, LOW);
  210.     Button4.print("off");
  211.   }
  212.   Get_Power_On_State();
  213. }
  214. void buttonusb_callback(const String & state)     //点灯app内控制按键触发
  215. {
  216.   BLINKER_LOG("get button usb state: ", state);
  217.   if (state == "on")
  218.   {
  219.     digitalWrite(SocketUSB, LOW);
  220.     ButtonUSB.print("on");
  221.   }
  222.   if (state == "off")
  223.   {
  224.     digitalWrite(SocketUSB, HIGH);
  225.     ButtonUSB.print("off");
  226.   }
  227. }

  228. void dataRead_callback(const String & data)
  229. {
  230.     BLINKER_LOG("Blinker readString: ", data);

  231.     Blinker.vibrate();
  232.    
  233.     uint32_t BlinkerTime = millis();
  234.    
  235.     Blinker.print("millis", BlinkerTime);
  236. }

  237. //心跳包刷新状态
  238. void heartbeat(void)
  239. {
  240.   Button1.print(digitalRead(Socket1) ? "on" : "off");
  241.   Button2.print(digitalRead(Socket2) ? "on" : "off");
  242.   Button3.print(digitalRead(Socket3) ? "on" : "off");
  243.   Button4.print(digitalRead(Socket4) ? "on" : "off");
  244.   ButtonUSB.print(digitalRead(SocketUSB) ? "off" : "on");
  245. }

  246. void UserKey_Onoff()
  247. {
  248.   if(Get_Power_On_State())
  249.   {
  250.     digitalWrite(Socket1, LOW);
  251.     digitalWrite(Socket2, LOW);
  252.     digitalWrite(Socket3, LOW);
  253.     digitalWrite(Socket4, LOW);
  254.     digitalWrite(SocketUSB, HIGH);
  255.   }
  256.   else
  257.   {
  258.     digitalWrite(Socket1, HIGH);
  259.     digitalWrite(Socket2, HIGH);
  260.     digitalWrite(Socket3, HIGH);
  261.     digitalWrite(Socket4, HIGH);
  262.     digitalWrite(SocketUSB, LOW);
  263.   }
  264.   Get_Power_On_State();  
  265.   Updata = true;  
  266. }

  267. void UserKey_DoubleClick_Onoff(void)
  268. {
  269.   if(Get_Power_On_State_Charger())  
  270.   {
  271.     digitalWrite(Socket3, LOW);
  272.     digitalWrite(Socket4, LOW);
  273.     digitalWrite(SocketUSB, HIGH);
  274.   }
  275.   else
  276.   {
  277.     digitalWrite(Socket3, HIGH);
  278.     digitalWrite(Socket4, HIGH);
  279.     digitalWrite(SocketUSB, LOW);
  280.   }  
  281.   Get_Power_On_State();  
  282.   Updata = true;
  283. }



  284. bool Update_Last = false;
  285. unsigned long Update_startTime;

  286. void Update_Service(void)
  287. {
  288.   if(Updata)
  289.   {
  290.     if(Update_Last == false)
  291.     {
  292.       Update_startTime = millis();
  293.       Update_Last = true;
  294.     }
  295.     if(Update_startTime>millis())Update_startTime = millis();//溢出
  296.     if((millis()-Update_startTime)>1000)
  297.     {
  298.       heartbeat();
  299.       Updata = false;   
  300.       Update_Last = false;                 
  301.     }
  302.   }  
  303. }

  304. unsigned long                previousMillis1,previousMillis2;
  305. void LED_Blink_Build_in(uint32_t period)
  306. {
  307.   unsigned long currentMillis = millis();         /* 记录当前时间 */
  308.   int        ledState;
  309.   if(previousMillis1>millis())previousMillis1 = millis();//溢出
  310.   if ( currentMillis - previousMillis1 >= period ) /* 检查 "period"  ms是否通过 */
  311.   {
  312.     ledState        = digitalRead( LED_build_in );
  313.     previousMillis1        = currentMillis;        /* 保存上次闪烁LED时 */
  314.     if ( ledState == LOW )                  /* 如果LED关闭,则打开,反之亦然 */
  315.     {
  316.       ledState = HIGH;
  317.     } else {
  318.       ledState = LOW;
  319.     }
  320.     digitalWrite( LED_build_in, ledState );       /* LED为ledState状态 */
  321.   }
  322. }
  323. void LED_Blink_Wifi(uint32_t period)
  324. {
  325.   unsigned long currentMillis = millis();         /* 记录当前时间 */
  326.   int        ledState;
  327.   if(previousMillis2>millis())previousMillis2 = millis();//溢出
  328.   if ( currentMillis - previousMillis2 >= period ) /* 检查 "period"  ms是否通过 */
  329.   {
  330.     ledState        = digitalRead( LED_wifi );
  331.     previousMillis2        = currentMillis;        /* 保存上次闪烁LED时 */
  332.     if ( ledState == LOW )                  /* 如果LED关闭,则打开,反之亦然 */
  333.     {
  334.       ledState = HIGH;
  335.     } else {
  336.       ledState = LOW;
  337.     }
  338.     digitalWrite( LED_wifi, ledState );       /* LED为ledState状态 */
  339.   }
  340. }

  341. BlinkerWLANStatus_t last_state = PRO_DEV_DISCONNECTED;
  342. void LED_Blink_Service(void)
  343. {
  344.   BlinkerWLANStatus_t  BlinkerStatus = Blinker.wlan_status();
  345.   if(last_state!=BlinkerStatus)
  346.   {
  347.     printf("wlan status: %d \r\n", BlinkerStatus);
  348.     last_state = BlinkerStatus;
  349.     if(BlinkerStatus == PRO_DEV_CONNECTED)
  350.     {
  351.       digitalWrite(Socket3, HIGH);
  352.       digitalWrite(Socket4, HIGH);
  353.       digitalWrite(SocketUSB, LOW);
  354.       digitalWrite(LED_Power, HIGH);
  355.       Updata = true;
  356.     }
  357.   }
  358.   if(BlinkerStatus == PRO_WLAN_CONNECTING)   
  359.   {
  360.       LED_Blink_Wifi(300);
  361.       digitalWrite( LED_build_in, HIGH);
  362.   }
  363.   else if((BlinkerStatus == PRO_WLAN_CONNECTED)||(BlinkerStatus == PRO_DEV_CONNECTING))  
  364.   {
  365.       LED_Blink_Wifi(600);
  366.       digitalWrite( LED_build_in, LOW);
  367.   }
  368.   else if(BlinkerStatus == PRO_WLAN_SMARTCONFIG_BEGIN)  
  369.   {
  370.       LED_Blink_Wifi(150);
  371.       digitalWrite( LED_build_in, HIGH);   
  372.   }  
  373.   else if(BlinkerStatus == PRO_DEV_CONNECTED)  
  374.   {
  375.       digitalWrite( LED_wifi, LOW);
  376.       LED_Blink_Build_in(800);
  377.   }
  378.   else
  379.   {
  380.     LED_Blink_Wifi(50);
  381.     LED_Blink_Build_in(300);
  382.   }
  383. }


  384. void setup() {
  385.   // 初始化串口
  386.   Serial.begin(921600);

  387. #if defined(BLINKER_PRINT)
  388.   BLINKER_DEBUG.stream(BLINKER_PRINT);
  389. #endif
  390.   // 初始化有LED的IO
  391.   pinMode(Socket1, OUTPUT);
  392.   digitalWrite(Socket1, LOW);
  393.   pinMode(Socket2, OUTPUT);
  394.   digitalWrite(Socket2, LOW);
  395.   pinMode(Socket3, OUTPUT);
  396.   digitalWrite(Socket3, LOW);
  397.   pinMode(Socket4, OUTPUT);
  398.   digitalWrite(Socket4, LOW);//初始化输出低电平
  399.   pinMode(SocketUSB, OUTPUT);
  400.   digitalWrite(SocketUSB, HIGH);//USB初始化输出低电平 WIFI连接后高电平
  401.   pinMode(LED_wifi, OUTPUT);
  402.   pinMode(LED_Power, OUTPUT);
  403.   digitalWrite(LED_Power, LOW);
  404.   pinMode(LED_build_in, OUTPUT);
  405.   digitalWrite(LED_build_in, HIGH);
  406.   //WIFI_Set();
  407.   // 初始化blinker
  408.   //Blinker.begin(auth, WiFi.SSID().c_str(), WiFi.psk().c_str());
  409.   Blinker.begin(auth);
  410.   Blinker.attachData(dataRead_callback);
  411.   Blinker.attachHeartbeat(heartbeat);           //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态
  412.   
  413.   Button1.attach(button1_callback);//注册按键回调函数
  414.   Button2.attach(button2_callback);
  415.   Button3.attach(button3_callback);
  416.   Button4.attach(button4_callback);
  417.   ButtonUSB.attach(buttonusb_callback);

  418.   BlinkerMIOT.attachPowerState(miotPowerState);
  419.   BlinkerMIOT.attachQuery(miotQuery);
  420.   digitalWrite(LED_wifi, HIGH);
  421.   button_key.attachLongPressStart(deviceWifiReset);
  422.   button_key.attachClick(UserKey_Onoff);
  423.   button_key.attachDoubleClick(UserKey_DoubleClick_Onoff);
  424.   button_key.setPressTicks(3500);

  425.   // Port defaults to 8266
  426.   ArduinoOTA.setPort(8266);
  427.   // Hostname defaults to esp8266-[ChipID]
  428.   //ArduinoOTA.setHostname("myesp8266");
  429.   // No authentication by default
  430.   ArduinoOTA.setPassword("posystorage");
  431.   ArduinoOTA.onStart([]() {
  432.       String type;
  433.       if (ArduinoOTA.getCommand() == U_FLASH) {
  434.         type = "sketch";
  435.       } else { // U_FS
  436.         type = "filesystem";
  437.       }

  438.       // NOTE: if updating FS this would be the place to unmount FS using FS.end()
  439.       Serial.println("Start updating " + type);
  440.     });
  441.     ArduinoOTA.onEnd([]() {
  442.       Serial.println("\nEnd");
  443.     });
  444.     ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
  445.       Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
  446.     });
  447.     ArduinoOTA.onError([](ota_error_t error) {
  448.       Serial.printf("Error[%u]: ", error);
  449.       if (error == OTA_AUTH_ERROR) {
  450.         Serial.println("Auth Failed");
  451.       } else if (error == OTA_BEGIN_ERROR) {
  452.         Serial.println("Begin Failed");
  453.       } else if (error == OTA_CONNECT_ERROR) {
  454.         Serial.println("Connect Failed");
  455.       } else if (error == OTA_RECEIVE_ERROR) {
  456.         Serial.println("Receive Failed");
  457.       } else if (error == OTA_END_ERROR) {
  458.         Serial.println("End Failed");
  459.       }
  460.     });
  461.     ArduinoOTA.begin();
  462.   
  463. }
  464. void loop() {
  465.   Blinker.run();
  466.   ArduinoOTA.handle();
  467.   button_key.tick();
  468.   Update_Service();
  469.   LED_Blink_Service();
  470. }
复制代码

有钱人也可以下载附件

4key 代码.zip (63.38 KB, 下载次数: 0)


没钱的可以打个赏或者回个帖 平民通道在这里
链接: https://pan.baidu.com/s/1aYv-b40PGoXc6kcDTDqK7Q?pwd=7s7e 提取码: 7s7e




打赏

参与人数 7家元 +240 收起 理由
家睦 + 120
moontree + 20 謝謝分享
kkdkj + 20 謝謝分享
玛德陛下 + 20 謝謝分享
stdzlqz + 20 謝謝分享
jf201006 + 20 優秀文章
hongo + 20 原創內容

查看全部打赏

发表于 2022-10-20 12:27:51 | 显示全部楼层
能写代码的都很厉害
回复 支持 反对

使用道具 举报

发表于 2022-10-20 12:40:22 | 显示全部楼层
这就厉害了!大材大用。
回复 支持 反对

使用道具 举报

发表于 2022-10-20 15:14:11 | 显示全部楼层
挺厉害,过程详细
回复 支持 反对

使用道具 举报

发表于 2022-10-20 19:56:32 | 显示全部楼层
学习大佬,膜拜大佬
回复 支持 反对

使用道具 举报

发表于 2022-10-21 14:56:03 | 显示全部楼层
当初买这个排插多少钱?
对了,8266的flash都可以在命令行里备份出来,也可以刷回去的。
回复 支持 反对

使用道具 举报

发表于 2022-10-24 08:35:18 | 显示全部楼层
万能的esp8266
回复 支持 反对

使用道具 举报

发表于 2022-10-24 17:30:24 | 显示全部楼层
kindzhon 发表于 2022-10-21 14:56
当初买这个排插多少钱?
对了,8266的flash都可以在命令行里备份出来,也可以刷回去的。 ...

请问怎么备份的呀
回复 支持 反对

使用道具 举报

发表于 2022-10-25 10:50:01 | 显示全部楼层
本帖最后由 kindzhon 于 2022-10-25 10:54 编辑
barve 发表于 2022-10-24 17:30
请问怎么备份的呀

python esptool.py --port /dev/ttyUSB4 --baud 115200 read_flash 0x00000 0x400000 backup.img
python esptool.py --port /dev/ttyUSB4 write_flash -fm qio 0x00000 backup.img

https://steve.fi/hardware/backup-and-restore/

回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-25 11:22:48 | 显示全部楼层
kindzhon 发表于 2022-10-25 10:50
python esptool.py --port /dev/ttyUSB4 --baud 115200 read_flash 0x00000 0x400000 backup.img
python e ...

好东西 感谢
回复 支持 反对

使用道具 举报

发表于 2022-10-25 13:01:18 | 显示全部楼层
我家里的涂鸦是连到bemfa,然后通过小爱同学控制的
回复 支持 反对

使用道具 举报

发表于 2022-10-25 15:20:45 | 显示全部楼层

客气了
回复 支持 反对

使用道具 举报

发表于 2022-10-25 16:02:19 | 显示全部楼层
kindzhon 发表于 2022-10-25 10:50
python esptool.py --port /dev/ttyUSB4 --baud 115200 read_flash 0x00000 0x400000 backup.img
python e ...

谢谢解答
回复 支持 反对

使用道具 举报

发表于 2022-10-25 16:17:16 来自手机浏览器 | 显示全部楼层
玩的智能应用啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-26 10:57:33 | 显示全部楼层
myseil 发表于 2022-10-25 13:01
我家里的涂鸦是连到bemfa,然后通过小爱同学控制的

这个是怎么弄的 有教程吗
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2022-10-26 13:48:21 | 显示全部楼层
包邮RMB1.9 的STC8H8K64U-45MHz-TSSOP20, 能用自带的硬件USB下载,硬件USB仿真,没有理由再外挂 包邮RMB2元以上的 CH340了,还不能仿真。
回复 支持 反对

使用道具 举报

发表于 2022-10-27 09:12:57 | 显示全部楼层
很羡慕你们玩单片机的
回复 支持 反对

使用道具 举报

发表于 2022-10-27 10:07:17 | 显示全部楼层
这个不错。可以diy一些特殊功能。
回复 支持 反对

使用道具 举报

发表于 2022-11-28 10:51:36 | 显示全部楼层

客气客气
回复 支持 反对

使用道具 举报

发表于 2022-11-29 22:05:40 来自手机浏览器 | 显示全部楼层
这个可以天猫精灵控制吗
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-19 14:44 , Processed in 0.312000 second(s), 14 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表