設定SSID:選取espAP連線後 開啟瀏覽器192.168.4.1 設定完成REST ESP
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <ESP8266HTTPUpdateServer.h>
#include <EEPROM.h>
#include "mqtt_secrets_pub.h"
#include "HTML.h"
#include "DHTesp.h"
#define DHT11PIN 2 // DHT11資料接腳 esp01s
DHTesp dht;
float t=0;
float h=0;
const char* mqttServer = "mqtt3.thingspeak.com";
const char* topic = "channels/1882331/publish";
String msgStr = "";
unsigned int flag;
const char* host = "mydns";//mDNS使用OTA時: mydns.local/update
String sssid = "";
String spass = "";
String Essid = ""; //EEPROM Network SSID
String Epass = "";
String sEssid = ""; //EEPROM Network SSID
String sEpass = "";
uint8_t ifAP=1;
ESP8266WebServer server(80);
ESP8266HTTPUpdateServer httpUpdater;
void f_newNet();
void f_regSSID();
WiFiClient espClient;
PubSubClient client(espClient);
void reconnect() {
while (!client.connected()) {
if (client.connect(SECRET_MQTT_CLIENT_ID, SECRET_MQTT_USERNAME, SECRET_MQTT_PASSWORD)) {
Serial.println("MQTT connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000); // 等5秒之後再重試
}
}
}
void ap(){
for (int i = 0; i < 64; ++i) { EEPROM.write(i, 0); }
EEPROM.commit();
WiFi.softAP("espAP");//192.168.4.1
server.on("/", f_newNet);
server.on("/regSSID", f_regSSID);//form action
server.begin();
}
void st(){
readSSID();
if ( Essid.length() > 1 ) {
WiFi.begin(Essid, Epass);
while (WiFi.status() != WL_CONNECTED) { delay(500); }
WiFi.softAP(String("IPGGx-"+String((WiFi.localIP().toString()))),"");
MDNS.begin(host);
MDNS.addService("http", "tcp", 80);
httpUpdater.setup(&server);
server.begin();
client.setServer(mqttServer, 1883);
}
}
void setup(){
dht.setup(DHT11PIN, DHTesp::DHT11);
EEPROM.begin(64);
readSSID();
WiFi.mode(WIFI_AP_STA);
flag=0;
while (WiFi.waitForConnectResult() != WL_CONNECTED) {
WiFi.begin(Essid, Epass);
delay(500);
flag++;
if (flag >=5) break;
}
if (flag>=4) ap();
else {st(); ifAP=0;}
}
void loop(void) {
if(ifAP==0){
if (!client.connected()) {
reconnect();
}
client.loop();
}
//delay(dht.getMinimumSamplingPeriod());
t=dht.getTemperature();
h=dht.getHumidity();
// 組合MQTT訊息;field1填入溫度、field2填入濕度
msgStr=msgStr+"field1="+t+"&field2="+h;
Serial.println(msgStr);
client.publish(topic, msgStr.c_str());
msgStr = "";
delay(20000);
server.handleClient();
MDNS.update();
}
void f_newNet() {
server.send(200, "text/html", sNewNet);
}
void readSSID(){
for (int i = 0; i < 32; ++i)
{ Essid += char(EEPROM.read(i)); }
for (int i = 32; i < 64; ++i) //Reading Password
{ Epass += char(EEPROM.read(i)); }
}
void f_regSSID() {
if (server.hasArg("SSID") && server.hasArg("PASSWORD")){
sssid=server.arg("SSID");//Get SSID
spass=server.arg("PASSWORD");//Get Password
}
for (int i = 0; i < sssid.length(); ++i)
{EEPROM.write(i, sssid[i]);}
for (int i = 0; i < spass.length(); ++i)
{EEPROM.write(32+i, spass[i]);}
EEPROM.commit();
for (int i = 0; i < 32; ++i) //Reading SSID
{
sEssid += char(EEPROM.read(i));
}
for (int i = 32; i < 64; ++i) //Reading Password
{
sEpass += char(EEPROM.read(i));
}
String sSSID="<p>SSID:"+sEssid+"</p>";
String sPASS="<p>Pass:"+sEpass+"</p>";
server.send(200,"text/html",sFinishedhead+sSSID+sPASS+sFinishedend);
ifAP=0;
}
String sNewNet = R"=====(
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta name='viewport' content='width=device-width, initial-scale=1.0'/>
<title>設定ROUTER連線</title>
<style>
body {text-align: center;}
input[type=submit] {background-color: #50FF50;font-size: 24px;}
input[type=text]{font-size: 24px;max-width: 200px;}
p {font-size: 22px;}
</style>
</head>
<body >
<h1>
網路設定
</h1>
<h1>
<form action="/regSSID">
<input type="text" placeholder="請輸入SSID" name="SSID" value="" size="8">
<p>
<input type="text" placeholder="請輸入PASSWORD" name="PASSWORD" value="" size="20">
</p>
<p>
<input type="submit" value="Submit">
</p>
</form>
</h1>
</body>
</html>
)=====";
String sFinishedhead = R"=====(
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta name='viewport' content='width=device-width, initial-scale=1.0'/>
<title>設定ROUTER連線</title>
<style>
body {text-align: center;}
input[type=submit] {background-color: #50FF50;font-size: 24px;}
input[type=text]{font-size: 24px;max-width: 200px;}
p {font-size: 22px;}
</style>
</head>
<body >
)=====";
String sFinishedend = R"=====(
<p>
請確認SSID與PASS是否正確
</p>
<p>
若不正確,請REST ESP再重新操作
</p>
<p>
若正確,請REST ESP即可自動連網
</p>
</body>
</html>
)=====";