久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4476|回復: 0
收起左側

帶無線更新的基于esp8266和blinker的小愛語音控制智能燈

[復制鏈接]
ID:47972 發表于 2021-2-8 13:52 | 顯示全部樓層 |閱讀模式
  前段時間看了ESP8266點燈的視頻,想著自己也DIY一個。
上網搜了資料,買來ESP-8266-12F和繼電器模塊,開始動手制作。
制作過程省略,要是有不太明白的地方可以找度娘,一搜一大把,我這就偷個懶。
……制作的過程中遇到的問題與大家分享一下。
     1.最先遇到的就是每次下載程序都得插在電腦上下載,因為我用的免費版的,blinker一旦更新庫文件或者與小愛的接口,咱們的燈就控制不了。 這就很麻煩了,不可能每次更新都去拆裝一下燈吧。于是又找度娘商量了一下,度娘給了我一個http_update的例程,把這個例程加入進去,程序更新是解決了,可是電腦得開web服務器,不過總算是不用拆裝燈具了。
     2.第二個問題就是設備ID是固化在程序里的,如果我做好2個或5個設備(blinker免費版最多5個獨立設備),更新的時候豈不是得生成5個更新包,萬一更新的時候弄錯了,后續使用就很麻煩。這個問題得解決掉,查看8266 庫的時候發現8266是可以將FLASH當作EEPROM來操作的,于是把設備ID在下載程序后第一次運行就存在EEPROM里,后面就只要讀出來就可以了。這樣不管幾個設備,更新程序都可以通用了。
    3.第三個問題就是WIFI配置。與設備ID一樣,網上例程都是將WIFI SSID和PASSWORD固化在程序里的。如果只是測試用是沒問題的,只要不改WIFI密碼,或者改WIFI密碼的時候先給燈的程序更新一下.......咱這個不是得裝燈里面嗎?這就又是個麻煩。好在blinker app里面就帶有WIFI配網
  操作路徑:打開blinker app => 點左上角的幾條橫線 => 點開發者 => 點開發工具 =>ApConfig,輸入你的WIFI名稱和密碼,然后打開你要配置的設備,就可以愉快的點開始配置了。
代碼我和電路圖我放附件里了,需要的朋友可以下載參考一下。
51hei.png
  1. #define BLINKER_PRINT Serial
  2. #define BLINKER_MIOT_LIGHT
  3. #define BLINKER_WIFI
  4. #define BLINKER_APCONFIG
  5. #include <Blinker.h>
  6. #include <Arduino.h>   
  7. #include <ESP8266WiFi.h>
  8. #include <ESP8266WiFiMulti.h>
  9. #include <ESP8266HTTPClient.h>
  10. #include <ESP8266httpUpdate.h>
  11. #include <EEPROM.h>         ";
  12.   char eep1=0;
  13.   char eep2=5;
  14. int addr = 3900;//避開blinker使用的eeprom地址
  15. char  tmp = 0;
  16. bool oState = false;
  17. bool switch_state = true;
  18. int counter = 0;
  19. float pai =0;
  20. bool UpDate = false;  //系統升級標志
  21. char auth[] = "xxxxxxxxxx";//上一步中在blinker app中獲取到的Secret Key
  22. char up_date_path["http://xxxxxxxxxxxx/file.bin"];//更新固件的具體http地址,只試過http,沒試過https不知道可不可行
  23. // 新建組件對象
  24. BlinkerButton Button1("btn-put");//燈開關組件
  25. BlinkerButton Button2("btn-upd");//升級用的開關組件
  26. BlinkerNumber Number1("num-abc");
  27. ESP8266WiFiMulti WiFiMulti;
  28. void read_skey()
  29.    {
  30.      EEPROM.begin(4096);
  31.      for(tmp=0;tmp<12;tmp++)
  32.       {
  33.        auth[tmp]=EEPROM.read(addr+tmp);
  34.       }  
  35.      EEPROM.end();
  36.      Serial.println("EEPROM_read OK:");
  37.      Serial.println(auth);
  38.    }
  39. void write_skey()
  40.      {
  41.       EEPROM.begin(4096);
  42.       EEPROM.write(addr+14,0x42);//auth碼存儲標志
  43.       EEPROM.write(addr+15,0xbd);//auth碼存儲標志反碼
  44.       for(tmp=0;tmp<12;tmp++)
  45.       {
  46.        EEPROM.write(addr+tmp,auth[tmp]);
  47.       
  48.        }  
  49.       if (EEPROM.commit())
  50.        {
  51.            Serial.println(auth);
  52.            Serial.println("EEPROM successfully committed");   
  53.         }
  54.       else
  55.        {
  56.       Serial.println("ERROR! EEPROM commit failed");
  57.        }
  58.        EEPROM.end();
  59.    }
  60. /* 小米設備狀態查詢回調函數 */
  61. void miotQuery(int32_t queryCode)
  62. {
  63.     BLINKER_LOG("MIOT Query codes: ", queryCode);

  64.     switch (queryCode)
  65.     {
  66.         case BLINKER_CMD_QUERY_ALL_NUMBER :
  67.             BLINKER_LOG("MIOT Query All");
  68.             BlinkerMIOT.powerState(oState ? "on" : "off");
  69.             BlinkerMIOT.print();
  70.             break;
  71.         case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
  72.             BLINKER_LOG("MIOT Query Power State");
  73.             BlinkerMIOT.powerState(oState ? "on" : "off");
  74.             BlinkerMIOT.print();
  75.             break;
  76.         default :
  77.             BlinkerMIOT.powerState(oState ? "on" : "off");
  78.             BlinkerMIOT.print();
  79.             break;
  80.     }
  81. }
  82. // 按下按鍵即會執行該函數
  83. void button1_callback(const String & state)
  84. {
  85.      if (state=="on")
  86.      {
  87.        BLINKER_LOG("get button state: ", state);
  88.        digitalWrite(LED_BUILTIN, LOW);
  89.        Button1.print("on");
  90.        switch_state = true;
  91.      }else if (state=="off")
  92.      {
  93.        BLINKER_LOG("get button state: ", state);
  94.        digitalWrite(LED_BUILTIN, HIGH);
  95.        Button1.print("off");
  96.        switch_state = false;   
  97.      }
  98. }
  99. void heartbeat()//自定義心跳包的返回
  100. {

  101.     if (switch_state)
  102.       {
  103.         //BUILTIN_SWITCH.print("on");
  104.         Button1.print("on");
  105.       }
  106.     else
  107.     {
  108.       //BUILTIN_SWITCH.print("off");
  109.       Button1.print("off");
  110.     }

  111. }
  112. //按下此鍵改變升級狀態,進行http升級
  113. void button2_callback(const String & stage)
  114.      {
  115.       UpDate = true;
  116.       }
  117. // 如果未綁定的組件被觸發,則會執行其中內容
  118. void dataRead(const String & data)
  119. {
  120.     BLINKER_LOG("Blinker readString: ", data);
  121.     counter++;
  122.     Number1.print(counter);
  123.     if (counter>0xfff0)counter=0;
  124. }
  125. void miotPowerState(const String & state) //小愛語音控制函數
  126. {
  127.    
  128.     if (state == BLINKER_CMD_ON) {
  129.         digitalWrite(LED_BUILTIN, LOW);
  130.         BlinkerMIOT.powerState("on");
  131.         BlinkerMIOT.print();
  132.         Button1.print("on");
  133.         switch_state = true;
  134.     }
  135.     else if (state == BLINKER_CMD_OFF) {
  136.         digitalWrite(LED_BUILTIN, HIGH);
  137.         BlinkerMIOT.powerState("off");
  138.         BlinkerMIOT.print();
  139.         Button1.print("off");
  140.         switch_state = false;
  141.     }
  142.     BLINKER_LOG("need set power state: ", state);
  143. }

  144. void setup() {

  145.   Serial.begin(115200);
  146.   Serial.println();
  147.   Serial.println();
  148.   Serial.println();
  149.     #if defined(BLINKER_PRINT)
  150.         BLINKER_DEBUG.stream(BLINKER_PRINT);
  151.     #endif
  152. EEPROM.begin(4096);
  153.    eep1=EEPROM.read(addr+14);  //ID存儲標志
  154.    eep2=255-EEPROM.read(addr+15);//ID存儲標志反碼
  155.    EEPROM.end();
  156.    if (eep1==eep2)
  157.      {
  158.       read_skey();
  159.       Serial.println("EEPROM read OK.");
  160.       }
  161.     else
  162.      {
  163.       write_skey();
  164.       }
  165.   Serial.print("WiFi Connected!");
  166.     // 初始化有LED的IO
  167.     pinMode(LED_BUILTIN, OUTPUT);
  168.     digitalWrite(LED_BUILTIN, LOW);
  169.     //   Blinker.begin(auth, ssid, pswd);  //初始化blinker
  170.     Blinker.begin(auth);  //使用blinker app配網,這里只需要ID就行,如果預置WIFI配置就用上面一行代碼
  171.     //注冊回調函數
  172.     Blinker.attachHeartbeat(heartbeat);
  173.     Blinker.attachData(dataRead);
  174.     BlinkerMIOT.attachPowerState(miotPowerState);
  175.     Button1.attach(button1_callback);
  176.     Button2.attach(button2_callback);
  177.     BlinkerMIOT.attachQuery(miotQuery);
  178.     ESPhttpUpdate.onStart(update_started);
  179.     ESPhttpUpdate.onEnd(update_finished);
  180.     ESPhttpUpdate.onProgress(update_progress);
  181.     ESPhttpUpdate.onError(update_error);
  182. }

  183. void update_started() {
  184.   Serial.println("CALLBACK:  HTTP update process started");
  185. }

  186. void update_finished() {
  187.   Serial.println("CALLBACK:  HTTP update process finished");
  188.   UpDate = false;
  189.   digitalWrite(LED_BUILTIN, HIGH);
  190. }

  191. void update_progress(int cur, int total) {
  192.   Serial.printf("CALLBACK:  HTTP update process at %d bytes of %3.1f %%total\n", cur, (float)cur/(float)total*100.0);
  193. }

  194. void update_error(int err) {
  195.   Serial.printf("CALLBACK:  HTTP update fatal error code %d\n", err);
  196.   UpDate = false;
  197.       if (switch_state)   //更新失敗則恢復燈的開關狀態。
  198.       {
  199.         digitalWrite(LED_BUILTIN, LOW);
  200.         Button1.print("on");
  201.       }
  202.     else
  203.     {
  204.       digitalWrite(LED_BUILTIN, HIGH);
  205.       Button1.print("off");
  206.     }
  207.   Button2.print("update error");
  208. }

  209. void loop() {
  210.   // wait for WiFi connection
  211.   Blinker.run();
  212.   if (UpDate) {  //接收到更新指令,進入更新程序
  213.      if (switch_state){
  214.        digitalWrite(LED_BUILTIN, HIGH);
  215.      }
  216.     else{
  217.       digitalWrite(LED_BUILTIN, LOW); //燈狀態取反表示進入更新模式
  218.     }
  219.     WiFiClient client;
  220.     t_httpUpdate_return ret = ESPhttpUpdate.update(client, up_date_path);//更新固件
  221.     switch (ret) {
  222.       case HTTP_UPDATE_FAILED:
  223.         Serial.printf("HTTP_UPDATE_FAILD Error (%d): %s\n", ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str());
  224.         break;

  225.       case HTTP_UPDATE_NO_UPDATES:
  226.         Serial.println("HTTP_UPDATE_NO_UPDATES");
  227.         break;

  228.       case HTTP_UPDATE_OK:
  229.         Serial.println("HTTP_UPDATE_OK");
  230.         break;
  231.     }
  232.   }
  233. }

復制代碼

blinker_esp_8266_httpUpdate.rar (735.03 KB, 下載次數: 28)

2個文件一起解壓才能成功:
8266_標準庫.part1.rar (18 MB, 下載次數: 17)
8266_標準庫.part2.rar (14.39 MB, 下載次數: 26)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品国产精品 | 精品视频一区二区在线观看 | 久久精品一区二区 | 国产精品中文字幕一区二区三区 | 日韩精品免费在线观看 | 午夜私人影院在线观看 | 在线成人一区 | 欧美性视频在线播放 | 欧美激情精品久久久久久 | 亚洲成人福利在线观看 | 久草免费在线视频 | 色婷婷九月 | 婷婷毛片| 91精品国产91综合久久蜜臀 | 韩日在线观看视频 | 第一av| 999精品视频 | 97精品超碰一区二区三区 | 免费三级网 | 亚洲风情在线观看 | 亚洲欧美日韩国产 | 狠狠插狠狠操 | 欧美日日 | www.亚洲视频.com | 老司机免费视频 | 亚洲视频在线播放 | 日韩欧美一区二区三区 | 一级黄色片一级黄色片 | 精品三级在线观看 | 欧美日韩国产中文字幕 | 欧美激情一区 | 秋霞电影一区二区三区 | 在线观看黄色电影 | 美女国内精品自产拍在线播放 | 天天操夜夜操 | 欧美美女爱爱 | 亚洲精品国产成人 | 国产三级 | 五十女人一级毛片 | 久久久国产一区 | 成人久久久久 |