NodeMCU(ESP8266) WIFI配网及保存WiFi密码信息
背景
在我们使用智能设备时经常会看到很多设备是接入WiFi的,刚买来的时候是需要连接WiFi的,配WiFi的方式有很多种,我遇到的比较多的是smartConfig
或 声纹配网
,如果是有触摸屏的话很多都是屏幕上直接输入WiFi密码即可。配置完网络后我们后续的使用时都是无需再次配WiFi信息。
WiFi配网原理
关于配网的原理我也是看别人的文章的,所以就不做搬运,如需了解请阅读下面这篇文章。
IoT】物联网之 WIFI 一键配网 smartConfig 浅析(ESP32)
demo视频
原本想这么一个简单的东西就没必要拍视频来展示,但是代码和文字都是很枯燥的,我这种学渣看到完全提不起兴趣,驱动个人去做的更多的可能还是看到别人的创意视频吧,所以我便想着用视频的方式来展示,希望也能驱动和我一样的小白玩家不断前行。
功能讲解
- 先从EEPROM中获取WiFi的SSID和密码
- 如果已经有了SSID和密码,则直接使用SSID密码连接WIFI
- 如果是没有SSID和密码,则进入到配网模式
- 配网完成后将WiFi的SSID和密码存储到EEPROM存储器中
- 最后进入主程序,判断清除EEPROM存储器的功能键是否按下
- 如果按下则清空WiFi的SSID和密码信息,重置后回到步骤1
大致流程如下
代码
这里代码推荐使用多文件的方式来写,第一复用性会比较高(拿到其他项目也能用),第二不会被很长的代码看迷糊。
这个主要就是将WiFi的SSID和密码存储起来
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| #include <EEPROM.h>
#ifndef _SMART_CONFIG_
#define _SMART_CONFIG_
#define EEPROM_START 1024
struct WifiPwd { char ssid[32]; char pwd[64]; };
void saveConfig(WifiPwd *wifipwd) { EEPROM.begin(EEPROM_START); uint8_t *p = (uint8_t*)(wifipwd); for (int i = 0; i < sizeof(*wifipwd); i++) { EEPROM.write(i, *(p + i)); } EEPROM.commit(); delete wifipwd; }
WifiPwd* loadConfigs() { WifiPwd *pvalue = new WifiPwd; EEPROM.begin(EEPROM_START); uint8_t *p = (uint8_t*)(pvalue); for (int i = 0; i < sizeof(*pvalue); i++) { *(p + i) = EEPROM.read(i); } EEPROM.commit(); return pvalue; }
void clearConfig() { EEPROM.begin(EEPROM_START); for (int i = 0; i < 96; i++) { EEPROM.write(i, 0); } EEPROM.commit(); }
#endif
|
主程序,说明注释里面都有
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
| #include <ESP8266WiFi.h> #include <cstring> #include "smartconfig.h"
#define POWERKEY 5
void smartConfig() { WifiPwd* wifipwd = loadConfigs(); if (strlen(wifipwd->pwd) > 0 ) { Serial.println("\n\ruse password connect wifi"); WiFi.mode(WIFI_STA); WiFi.begin(wifipwd->ssid, wifipwd->pwd); while (WiFi.status() != WL_CONNECTED) { blinkled(); } delete wifipwd; WiFi.setAutoConnect(true); } else { Serial.println("\n\rwait smart config wifi"); WiFi.beginSmartConfig(); while (1) { blinkled(); if (WiFi.smartConfigDone()) { WifiPwd *wifipwd = new WifiPwd; strcpy(wifipwd->ssid, WiFi.SSID().c_str()); strcpy(wifipwd->pwd, WiFi.psk().c_str()); saveConfig(wifipwd); WiFi.setAutoConnect(true); break; } } } Serial.println("\n\rWiFi Connected IP address: "); Serial.println(WiFi.localIP()); }
void blinkled() { digitalWrite(LED_BUILTIN, LOW); delay(200); digitalWrite(LED_BUILTIN, HIGH); delay(200); }
int keywords() { int keyValue = digitalRead(POWERKEY); return keyValue; }
void setup() { Serial.begin(115200); pinMode(LED_BUILTIN, OUTPUT); pinMode(POWERKEY, OUTPUT); smartConfig(); digitalWrite(LED_BUILTIN, LOW); Serial.println("wifi connected"); }
void loop() { if (WiFi.status() != WL_CONNECTED) { WiFi.reconnect(); } if (keywords() == 1) { clearConfig(); Serial.println("wifi账号密码已经清除"); } }
|