本文关注掉电丢失wifi数据和不丢失数据的异同点。
一、软硬件
所用硬件如下图,软件是arduino 1.8.9。
二、代码分析
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | void smartConfig() { WiFi.mode(WIFI_STA); Serial.println("\r\nWait for Smartconfig..."); WiFi.beginSmartConfig(); while (1) { Serial.print("."); digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second if (WiFi.smartConfigDone()) { Serial.println("SmartConfig Success"); Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str()); Serial.printf("PSW:%s\r\n", WiFi.psk().c_str()); WiFi.setAutoConnect(true); // 设置自动连接,这个语句是最重要的语句。 break; } } } |
WiFi.setAutoConnect(true); // 设置自动连接,这个语句是最重要的语句。如果设置了自动连接属性为true,那么就可以让wifi的数据自动保存在esp8266模块的flash内部。
当然,在smartconfig函数里面设置自动保存还是不够的,这只是一个函数,没有人调用它,它是不会自动工作的,调用它的代码在setup里面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | void setup() { Serial.begin(115200); delay(10); pinMode(LED_BUILTIN, OUTPUT); // Connect to WiFi network Serial.println(); Serial.println(); Serial.print("Connecting to "); //smartConfig();不再直接上来就配网一次,而是判断一下,以前是否联网了,如果联网,那么就不用再次配网。 if (!autoConfig()) { Serial.println("Start module"); smartConfig(); } delay(500); Serial.println(""); Serial.println("WiFi connected"); } |
看语句:也就是说,如果没有已经自动配网,那么就自动配网。就是这么简单。
1 | if (!autoConfig()) |
如果你在调试的时候,想断电重启就想寻找wifi开始配网(不要笑,有的时候调试时,是需要这样的)。
那么就将这个判断语句注释掉吧。每次都会让你配网。
三、深层分析
下面分析一下esp8266掉电不易失wifi数据的基本原理。
首先查看这个setAutoConnect函数在哪里,在arduino文件夹中搜索这个名字。找到在这个位置。
然后看函数原型,这个函数里面其实调用了esp8266 SDK内部的函数。
这个文件里面有wifi的参数。注意,这个文件是arduino编程环境下的库函数内容。ESP8266WiFiSTA.cpp文件。但是调用的函数wifi_station_set_config,却是在ESP8266 SDK一系列文件内部的。
SDK参考在哪里?官方手册上有SDK链接如下:
https://www.espressif.com/sites/default/files/documentation/2c-esp8266_non_os_sdk_api_reference_cn.pdf
可以通过搜索看到这个函数的说明。
还有其他的函数,都可以通过这里来找到说明。为了详细说明是怎么操作的,绘制一个图片如下:
初步分析到此,仅供参考。
进一步讨论