{"id":150,"date":"2022-05-02T09:33:12","date_gmt":"2022-05-02T01:33:12","guid":{"rendered":"http:\/\/usei.cn\/?p=150"},"modified":"2022-05-02T09:41:42","modified_gmt":"2022-05-02T01:41:42","slug":"esp8266-%e8%87%aa%e5%8a%a8%e9%85%8d%e7%bd%91mqtt","status":"publish","type":"post","link":"https:\/\/usei.cn\/index.php\/2022\/05\/02\/esp8266-%e8%87%aa%e5%8a%a8%e9%85%8d%e7%bd%91mqtt\/","title":{"rendered":"ESP8266 \u81ea\u52a8\u914d\u7f51+MQTT\u94fe\u63a5"},"content":{"rendered":"\n<p>\u4f7f\u7528WiFiManager \u8fdb\u884c\u53ef\u89c6\u5316\u7f51\u7edc\u914d\u7f6e\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\r\n * ESP8266 \u81ea\u52a8\u914d\u7f51 MQTT\r\n *\/\r\n\/\/ https:\/\/github.com\/tzapu\/WiFiManager\/\r\n#include &lt;WiFiManager.h>\r\n\/**\r\n * MQTT\r\n *\/\r\n\/\/PubSubClient by Nick O`Leary\r\n#include &lt;PubSubClient.h>\r\n#include &lt;ArduinoJson.h>\r\n\/**\r\n * ws2812 led\r\n *\/\r\n#include &lt;Adafruit_NeoPixel.h>\r\n\r\n\/\/ mqtt \u53c2\u6570\r\nchar* mqtt_server =\"192.168.0.200\";\r\nchar* mqtt_port = \"1883\";\r\nWiFiClient espClient;\r\nPubSubClient mqtt_client(espClient);\r\n\r\n#define RING_LED_PIN    2\r\n#define NUMPIXELS 24\r\n#define BRIGHTNESS 50\r\nAdafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, RING_LED_PIN, NEO_GRB + NEO_KHZ800);\r\n\r\nStaticJsonDocument&lt;256> jsonState;                      \/\/\u8bbe\u5907\u72b6\u6001\r\n\/*============================================== web \u914d\u7f51 \u4e0b===========================================================*\/\r\n\/**\r\n * \u521d\u59cb\u5316wifimanager\r\n *\/\r\nvoid initWifi()\r\n{\r\n  WiFiManager wifiManager;                               \/\/ \u521b\u5efa wifimanager \u5bf9\u8c61\r\n\/\/  wifiManager.resetSettings();                           \/\/ \u91cd\u7f6e\u4fdd\u5b58\u7684\u4fee\u6539\r\n  wifiManager.setConnectTimeout(10);                     \/\/ \u914d\u7f6e\u8fde\u63a5\u8d85\u65f6\r\n  wifiManager.setDebugOutput(true);                      \/\/ \u6253\u5370\u8c03\u8bd5\u5185\u5bb9\r\n  wifiManager.setMinimumSignalQuality(30);               \/\/ \u8bbe\u7f6e\u6700\u5c0f\u4fe1\u53f7\u5f3a\u5ea6\r\n  \/\/\u8bbe\u7f6eAP\r\n  IPAddress _ip = IPAddress(192, 168, 4, 1);             \/\/ \u8bbe\u7f6e\u56fa\u5b9aAP\u4fe1\u606f\r\n  IPAddress _gw = IPAddress(192, 168, 4, 1);             \/\/ \u8bbe\u7f6e\u56fa\u5b9aAP\u4fe1\u606f\r\n  IPAddress _sn = IPAddress(255, 255, 255, 0);           \/\/ \u8bbe\u7f6e\u56fa\u5b9aAP\u4fe1\u606f\r\n  wifiManager.setAPStaticIPConfig(_ip, _gw, _sn);        \/\/ \u8bbe\u7f6e\u56fa\u5b9aAP\u4fe1\u606f\r\n  \/\/ \u56de\u8c03\r\n  wifiManager.setAPCallback(configModeCallback);         \/\/ \u8bbe\u7f6e\u8fdb\u5165AP\u6a21\u5f0f\u7684\u56de\u8c03\r\n  wifiManager.setSaveConfigCallback(saveConfigCallback); \/\/ \u8bbe\u7f6e\u70b9\u51fb\u4fdd\u5b58\u7684\u56de\u8c03\r\n  wifiManager.setBreakAfterConfig(true);                 \/\/ \u8bbe\u7f6e \u5982\u679c\u914d\u7f6e\u9519\u8bef\u7684ssid\u6216\u8005\u5bc6\u7801 \u9000\u51fa\u914d\u7f6e\u6a21\u5f0f\r\n  \/\/ \u81ea\u5b9a\u4e49\u53c2\u6570\r\n  WiFiManagerParameter custom_mqtt_server(\"server\", \"mqtt server\", mqtt_server, 40);\r\n  WiFiManagerParameter custom_mqtt_port(\"port\", \"mqtt port\", mqtt_port, 6);\r\n  wifiManager.addParameter(&amp;custom_mqtt_server);\r\n  wifiManager.addParameter(&amp;custom_mqtt_port);\r\n  \/\/ \u5c1d\u8bd5\u8fde\u63a5\u7f51\u7edc\uff0c\u5931\u8d25\u53bb\u5230\u914d\u7f6e\u9875\u9762\r\n  if (!wifiManager.autoConnect(\"ESP8266_AP\", \"\"))    \r\n  {\r\n    Serial.println(\"failed to connect and hit timeout\");\r\n    ESP.reset();                                          \/\/ \u91cd\u7f6e\u5e76\u91cd\u8bd5\r\n    delay(1000);\r\n  }\r\n  \/\/ WiFi\u8fde\u63a5\u6210\u529f\u540e\u5c06\u901a\u8fc7\u4e32\u53e3\u76d1\u89c6\u5668\u8f93\u51fa\u8fde\u63a5\u6210\u529f\u4fe1\u606f\r\n  Serial.println(\"== WIFI CONNECT SUCCESS ! ==\");\r\n  Serial.print(\"IP Address : \");\r\n  Serial.println(WiFi.localIP());\r\n  \/\/ \u8bfb\u53d6\u914d\u7f6e\u9875\u9762\u914d\u7f6e\u597d\u7684\u4fe1\u606f\r\n  strcpy(mqtt_server, custom_mqtt_server.getValue());\r\n  strcpy(mqtt_port, custom_mqtt_port.getValue());\r\n}\r\n\/\/ \u914d\u7f6e\u8fdb\u5165AP\u6a21\u5f0f\u901a\u77e5\u56de\u8c03\r\nvoid configModeCallback(WiFiManager *myWiFiManager)\r\n{\r\n  Serial.println(\"Entered config mode\"); \/\/\u8fdb\u5165\u914d\u7f6e\u6a21\u5f0f\r\n  Serial.print(\"Wifi Name : \");\r\n  Serial.println(\"Wifi Name : \" + myWiFiManager->getConfigPortalSSID());\r\n  Serial.print(\"Wifi IP : \");\r\n  Serial.println(WiFi.softAPIP());\r\n  \/\/ \u9644\u52a0\u53c2\u6570\r\n  Serial.print(\"MQTT Server : \");\r\n  Serial.println(mqtt_server);\r\n  Serial.print(\"MQTT Port : \");\r\n  Serial.println(mqtt_port);\r\n}\r\n\/\/ \u8bbe\u7f6e\u70b9\u51fb\u4fdd\u5b58\u7684\u56de\u8c03\r\nvoid saveConfigCallback()\r\n{\r\n  Serial.println(\"Should save config\");\r\n}\r\n\/*============================================== MQTT \u4e0b===========================================================*\/\r\n\/* \u521d\u59cb\u5316\u8bbe\u5907\u5c5e\u6027\u72b6\u6001*\/\r\nvoid initState()\r\n{\r\n  jsonState&#91;\"name\"] = \"ESP8266\";\r\n  jsonState&#91;\"led\"] = \"OFF\";\r\n  jsonState&#91;\"mode\"] = \"0\";\r\n  jsonState&#91;\"update_time\"] = random(100);\r\n}\r\nvoid initMQTT(){\r\n  mqtt_client.setServer(mqtt_server, atoi(mqtt_port));\r\n  mqtt_client.setCallback(mqtt_callback);\r\n}\r\nvoid mqtt_reconnect() {\r\n    String clientId = \"ESP-01A-\" + String(random(0xffff), HEX);\r\n    if (mqtt_client.connect(clientId.c_str())) {         \/\/\u8fde\u63a5\u6210\u529f\r\n      Serial.println(\"=== MQTT CONNECT SUCCESS ! ===\");\r\n      String msg;\r\n      serializeJson(jsonState,msg);\r\n      Serial.println(msg);\r\n      mqtt_client.publish(\"hass\/sensor\/esp8266_1\/led\/state\",msg.c_str());     \/\/ \u8fde\u63a5\u6210\u529f\u53d1\u9001\u521d\u59cb\u72b6\u6001\u4fe1\u606f\r\n      mqtt_client.subscribe(\"hass\/sensor\/esp8266_1\/led\/set\");\r\n    } else {\r\n      delay(5000);                                  \/\/ Wait 5 seconds before retrying\r\n    }\r\n}\r\n\/**\r\n * MQTT \u63a5\u6536\u6570\u636e\r\n *\/\r\nvoid mqtt_callback(char* topic, byte* payload, unsigned int length) {\r\n  Serial.print(\"\u63a5\u6536\u6d88\u606f\uff1a\");\r\n  DynamicJsonDocument doc(200);\r\n  deserializeJson(doc, payload);\r\n  serializeJson(doc,Serial);\r\n  Serial.println(\"\");\r\n  \/\/ \u4e1a\u52a1\u5904\u7406\r\n  String key = doc&#91;\"key\"];\r\n  String value = doc&#91;\"value\"];\r\n  \/\/ \u66f4\u65b0\u72b6\u6001\r\n  jsonState&#91;key] = value;\r\n  jsonState&#91;\"update_time\"] = random(100);\r\n  String msg;\r\n  serializeJson(jsonState,msg);\r\n  Serial.print(\"\u66f4\u65b0\u72b6\u6001\uff1a\");\r\n  Serial.println(msg);\r\n  mqtt_client.publish(\"hass\/sensor\/esp8266_1\/led\/state\",msg.c_str());     \/\/ \u72b6\u6001\u4fe1\u606f\r\n}\r\n\/*============================================== \u73af\u5f62\u706f===========================================================*\/\r\nvoid initRingLED(){\r\n  strip.setBrightness(BRIGHTNESS);\r\n  \/\/ \u521d\u59cb\u5316Adafruit_NeoPixel\u5e93\r\n  strip.begin();\r\n  \/\/ \u521d\u59cb\u5316\u65f6\u5173\u95ed\u6240\u6709LED      \r\n  strip.show();\r\n}\r\n\/**\r\n * \u6a21\u5f0f: \u989c\u8272\u64e6\u9664\r\n *\/\r\nvoid colorWipe(uint32_t c, uint8_t wait) {\r\n  strip.clear();\r\n  for (uint16_t i = 0; i &lt; strip.numPixels(); i++) {\r\n    strip.setPixelColor(i, c);\r\n    strip.show();\r\n    delay(wait);\r\n  }\r\n}\r\n\r\n\/**\r\n * \u5f69\u8679\u547c\u5438\r\n *\/\r\nvoid rainbow(uint8_t wait) {\r\n  uint16_t i, j;\r\n  for (j = 0; j &lt; 256; j++) {\r\n    for (i = 0; i &lt; strip.numPixels(); i++) {\r\n      strip.setPixelColor(i, Wheel((i + j) &amp; 255 ));\r\n    }\r\n    strip.show();\r\n    delay(wait);\r\n  }\r\n}\r\n\r\n\/**\r\n * \u5f69\u8679\u547c\u5438-\u65cb\u8f6c\r\n *\/\r\nvoid rainbowCycle(uint8_t wait) {\r\n  uint16_t i, j;\r\n  for (j = 0; j &lt; 256 * 5; j++) { \/\/ 5 cycles of all colors on wheel\r\n    for (i = 0; i &lt; strip.numPixels(); i++) {\r\n      strip.setPixelColor(i, Wheel(((i * 256 \/ strip.numPixels()) + j) &amp; 255));\r\n    }\r\n    strip.show();\r\n    delay(wait);\r\n  }\r\n}\r\n\/**\r\n * \u8d70\u9a6c\u706f\r\n *\/\r\nvoid theaterChase(uint32_t c, uint8_t wait) {\r\n  for (int j=0; j&lt;10; j++) {  \/\/do 10 cycles of chasing\r\n    for (int q=0; q &lt; 3; q++) {\r\n      for (uint16_t i=0; i &lt; strip.numPixels(); i=i+3) {\r\n        strip.setPixelColor(i+q, c);    \/\/turn every third pixel on\r\n      }\r\n      strip.show();\r\n\r\n      delay(wait);\r\n\r\n      for (uint16_t i=0; i &lt; strip.numPixels(); i=i+3) {\r\n        strip.setPixelColor(i+q, 0);        \/\/turn every third pixel off\r\n      }\r\n    }\r\n  }\r\n}\r\n\/**\r\n * \u8d70\u9a6c\u706f-\u5f69\u8679\r\n *\/\r\nvoid theaterChaseRainbow(uint8_t wait) {\r\n  for (int j=0; j &lt; 256; j++) {     \/\/ cycle all 256 colors in the wheel\r\n    for (int q=0; q &lt; 3; q++) {\r\n      for (uint16_t i=0; i &lt; strip.numPixels(); i=i+3) {\r\n        strip.setPixelColor(i+q, Wheel( (i+j) % 255));    \/\/turn every third pixel on\r\n      }\r\n      strip.show();\r\n\r\n      delay(wait);\r\n\r\n      for (uint16_t i=0; i &lt; strip.numPixels(); i=i+3) {\r\n        strip.setPixelColor(i+q, 0);        \/\/turn every third pixel off\r\n      }\r\n    }\r\n  }\r\n}\r\nuint32_t Wheel(byte WheelPos) {\r\n  if (WheelPos &lt; 85) {\r\n    return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);\r\n  } else if (WheelPos &lt; 170) {\r\n    WheelPos -= 85;\r\n    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);\r\n  } else {\r\n    WheelPos -= 170;\r\n    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);\r\n  }\r\n}\r\n\r\n\/\/----------------------------------------------- \u7a0b\u5e8f\u5165\u53e3 ---------------------------------------------------\r\nvoid setup()\r\n{\r\n  Serial.begin(9600);                             \/\/ \u521d\u59cb\u5316\u4e32\u53e3\u8bbe\u7f6e\r\n  pinMode(LED_BUILTIN, OUTPUT);                   \/\/ \u8bbe\u7f6e LED_BUILTIN\uff08GPIO-16\uff09 \u4e3a\u8f93\u51fa\u529f\u80fd\r\n  digitalWrite(LED_BUILTIN, HIGH);                \/\/ \u9ed8\u8ba4\u5173\u95ed\r\n  \/\/ \u914d\u7f6e\u72b6\u6001\u4fe1\u606f\r\n  initState();\r\n  \/\/ \u81ea\u52a8\u914d\u7f51\r\n  initWifi();\r\n  \/\/ \u914d\u7f6eMQTT\r\n  initMQTT();\r\n  \/\/ \u914d\u7f6e\u73af\u5f62\u706f\r\n  initRingLED();\r\n}\r\nvoid loop()\r\n{\r\n  \/\/ mqtt\r\n  if (!mqtt_client.connected()) {\r\n    mqtt_reconnect();\r\n  }\r\n   mqtt_client.loop();\r\n   \/\/ LED\r\n   if (jsonState&#91;\"led\"] == \"OFF\") {          \/\/ \u901a\u8fc7\u63a5\u6536\u7684\u4fe1\u606f '1' \u6765\u63a7\u5236\u5f00\u6216\u5173\r\n     digitalWrite(LED_BUILTIN, HIGH); \r\n   } else {\r\n     digitalWrite(LED_BUILTIN, LOW); \r\n   }\r\n  \/\/ ring led\r\n   if(jsonState&#91;\"mode\"]== \"0\"){ strip.clear(); }\r\n   else if(jsonState&#91;\"mode\"]== \"1\"){ colorWipe(strip.Color(150, 150, 150), 20); }\/\/ BlueWite\r\n   else if(jsonState&#91;\"mode\"]== \"2\"){ rainbow(5);}\r\n   else if(jsonState&#91;\"mode\"]== \"3\"){ rainbowCycle(1);}\r\n   else if(jsonState&#91;\"mode\"]== \"4\"){ theaterChase(strip.Color(127, 127, 127), 50);}\r\n   else if(jsonState&#91;\"mode\"]== \"5\"){ theaterChaseRainbow(5);}\r\n\r\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u4f7f\u7528WiFiManager \u8fdb\u884c\u53ef\u89c6\u5316\u7f51\u7edc\u914d\u7f6e\u3002<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15,5],"tags":[],"class_list":["post-150","post","type-post","status-publish","format-standard","hentry","category-esp8266","category-lot"],"_links":{"self":[{"href":"https:\/\/usei.cn\/index.php\/wp-json\/wp\/v2\/posts\/150","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/usei.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/usei.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/usei.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/usei.cn\/index.php\/wp-json\/wp\/v2\/comments?post=150"}],"version-history":[{"count":2,"href":"https:\/\/usei.cn\/index.php\/wp-json\/wp\/v2\/posts\/150\/revisions"}],"predecessor-version":[{"id":152,"href":"https:\/\/usei.cn\/index.php\/wp-json\/wp\/v2\/posts\/150\/revisions\/152"}],"wp:attachment":[{"href":"https:\/\/usei.cn\/index.php\/wp-json\/wp\/v2\/media?parent=150"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/usei.cn\/index.php\/wp-json\/wp\/v2\/categories?post=150"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/usei.cn\/index.php\/wp-json\/wp\/v2\/tags?post=150"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}