NodeMCU(ESP8266) WIFI配网及保存WiFi密码信息
背景
在我们使用智能设备时经常会看到很多设备是接入WiFi的,刚买来的时候是需要连接WiFi的,配WiFi的方式有很多种,我遇到的比较多的是smartConfig 或 声纹配网 ,如果是有触摸屏的话很多都是屏幕上直接输入WiFi密码即可。配置完网络后我们后续的使用时都是无需再次配WiFi信息。
WiFi配网原理
关于配网的原理我也是看别人的文章的,所以就不做搬运,如需了解请阅读下面这篇文章。
IoT】物联网之 WIFI 一键配网 smartConfig 浅析(ESP32)
demo视频
原本想这么一个简单的东西就没必要拍视频来展示,但是代码和文字都是很枯燥的,我这种学渣看到完全提不起兴趣,驱动个人去做的更多的可能还是看到别人的创意视频吧,所以我便想着用视频的方式来展示,希望也能驱动和我一样的小白玩家不断前行。
NodeMcu(ESP8266)一键配网及记住密码功能demo
功能讲解
- 先从EEPROM中获取WiFi的SSID和密码
- 如果已经有了SSID和密码,则直接使用SSID密码连接WIFI
- 如果是没有SSID和密码,则进入到配网模式
- 配网完成后将WiFi的SSID和密码存储到EEPROM存储器中
- 最后进入主程序,判断清除EEPROM存储器的功能键是否按下
- 如果按下则清空WiFi的SSID和密码信息,重置后回到步骤1
大致流程如下
代码
这里代码推荐使用多文件的方式来写,第一复用性会比较高(拿到其他项目也能用),第二不会被很长的代码看迷糊。
这个主要就是将WiFi的SSID和密码存储起来
#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
主程序,说明注释里面都有
#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账号密码已经清除");
}
}
|