改写光合未来N1模块过程中网上找的N多Airkiss 配网程序,遇到各种坑,现把可以正常使用的代码分享出来。目前实现功能
1.使用乐鑫官方公众号AIRKISS或第三方网页AIRKISS配网(有时会不稳定)
2.使用乐鑫ESPTOUCH软件配网(成功率很高,推荐)
3.自动保存已配网AP信息,开机自动连接,超过20次连接失败则自动进入配网模式
4.单LED指示灯指示网络状态,慢闪:WIFI连接中 快闪:配网模式 10秒闪0.1秒:待机指示
代码如下:
#include <ESP8266WiFi.h>
#include <Ticker.h> Ticker flipper;//定义定时器
#define PIN_LED 12 //指示灯位于GPIO12
int wifi_flg = 0;//WIFI状态标志 0 未连接 1 连接中 2 配网中 3 MQTT已连接
bool autoConfig()
{
WiFi.begin();
for (int i = 0; i < 20; i++)
{
int wstatus = WiFi.status();
if (wstatus == WL_CONNECTED)
{
Serial.println("AutoConfig Success");
Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
WiFi.printDiag(Serial);
//每隔5s 翻转一下led状态,开始连网模式,慢闪
// flipper.attach(5, flip2);
flipper.detach();//定时器停止
digitalWrite(PIN_LED,LOW);//初始LED灯置为低电平,HIGH表示点亮,LOW表示点不亮
return true;
//break;
}
else
{
Serial.print("AutoConfig Waiting......");
// Serial.printf("PSW:%s\r\n", i);
Serial.println(wstatus);
delay(1000);
}
}
Serial.println("AutoConfig Faild!" );
return false;
//WiFi.printDiag(Serial);
}
void smartConfig()
{
WiFi.mode(WIFI_STA);
Serial.println("\r\nWait for Smartconfig");
WiFi.beginSmartConfig();
while (1)
{
Serial.print(".");
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); // 设置自动连接
//每隔0.5s 翻转一下led状态,开始连网模式,慢闪
flipper.attach(0.5, flip);
break;
}
delay(1000); // 这个地方一定要加延时,否则极易崩溃重启
}
}
void setup()
{
pinMode(PIN_LED, OUTPUT); //初始化PIN_LED引脚模式为输出
digitalWrite(PIN_LED,HIGH);//初始LED灯置为低电平,HIGH表示点亮,LOW表示点不亮
Serial.begin(115200);
//每隔0.5s 翻转一下led状态,开始连网模式,慢闪
flipper.attach(0.5, flip);
if (!autoConfig())
{
Serial.println("Start module");
//每隔0.1s 翻转一下led状态,开始连网模式,慢闪
flipper.attach(0.1, flip);
smartConfig();
}
//连接成功,打印WIFI信息
Serial.println("");
Serial.println("WIFI SmartConfig Success");
Serial.printf("SSID:%s", WiFi.SSID().c_str());
Serial.printf(", PSW:%s\r\n", WiFi.psk().c_str());
Serial.print("LocalIP:");
Serial.print(WiFi.localIP());
Serial.print(" ,GateIP:");
Serial.println(WiFi.gatewayIP());
}
void flip() {
//定时器函数 灯亮灭 一半时间
int state = digitalRead(PIN_LED); // get the current state of GPIO1 pin
digitalWrite(PIN_LED, !state); // set pin to the opposite state
}
void led_ms(int i) {
//LED亮i MS
digitalWrite(PIN_LED,HIGH);//初始LED灯置为低电平,HIGH表示点亮,LOW表示点不亮
delay(i);
digitalWrite(PIN_LED,LOW);//初始LED灯置为低电平,HIGH表示点亮,LOW表示点不亮
}
void loop() {
Serial.println(WiFi.SSID());
Serial.println(WiFi.localIP());
delay(10000);// 延时10秒
led_ms(100);//亮灯100MS,做在线指示
}