code ชุดนี้ ใช้ Wifimanager สำหรับ ESP8266 นะครับ ESP32 จะใช้ไม่ได้ ลองดูครับ ใส่ค่าได้ 8 ค่า + ใส่ Blynk Token ได้ + ใส่ line token ได้
//ความต้องการของ Project (เพื่อป้องกันความผิดพลาดเรื่องของ Version และตรวจสอบย้อนหลังได้)
//Arduino IDE Version 1.8.7 -1.8.9
//Blynk Version 0.5.4 - 0.6.1
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>//WiFiManager Version 0.14.0
#include <FS.h>
#include <DNSServer.h>
#include <ArduinoJson.h>//ArduinoJson Version 5.13.3
#include <ESP8266HTTPClient.h>//ส่งค่าเข้า Server
//------------------------Blynk---------------------------------------------
//#define BLYNK_MAX_SENDBYTES 1200
//สำหรับระบุคัวอักษรสูงสุด(1200)ที่อยู่ในเนื้อหา ของ Email ที่ส่ง
//เซิร์ฟเวอร์คลาวด์ฟรี Blynk ให้อีเมลสูงสุด 100 ฉบับต่อวัน
//ความยาวสูงสุดของเนื้อหาการแจ้งเตือนสามารถมีได้ 120 สัญลักษณ์
//จำกัด เวลาระหว่างการแจ้งเตือนอย่างน้อย 15 วินาที
//Blynk API ร้องขอให้ส่ง EMAIL
//Blynk.email ("mysmarthomepuy@gmail.com", "แจ้งเตือนระบบ..", "อุณหภูมิมากกว่า 28C!");
// Blynk API ร้องขอให้ PUSH การแจ้งเตือน
//Blynk.notify ("การแจ้งเตือน ESP8266 - อุณหภูมิมากกว่า 28C!");
#include <BlynkSimpleEsp8266.h>
#define BLYNK_DEBUG
#define BLYNK_PRINT Serial
char Blynk_Token[34] = "x2_I-FkZ2YJN7JFGZq-xvLg9GvNxCzkE";
int blynkIsDownCount = 0;
BlynkTimer timer;//ใช้ Timer ของ library Blynk ในการตั้งค่าการวนซ้ำ Function ต่างๆได้
//--ถ้าใน Blynk cloud โดยตรงให้ตัดออก--
char server[] = "oasiskit.com";
int port = 8080;
//-----------------------------------
//----Line notify----------------------------------------------------------------
#include <TridentTD_LineNotify.h>
char line_token1[45] = "";
char line_token2[45] = "";
//QerWyEZdBShylI3iTTxKz1Pk8Zo1vLy2NQa7AXFgYLM
//8HBPx7WHUTjGoPWACom1i98WEHGeCr6jZIDFx9L7kry
//Line Notify แจ้งเตือน 1 ครั้ง
int blynk_Connect = 0;
int Notify_blynk_status1 = 0;
int Notify_blynk_status2 = 0;
//-------------------------------------------------------------------------------
#define D0 16// ไฟ onboardD016
#define D4 2 // ปุ่มกดตั้งค่า Aeecsspoint
char Data1[34] = "";
char Data2[34] = "";
char Data3[34] = "";
char Data4[34] = "";
char Data5[34] = "";
char Data6[34] = "";
char Data7[34] = "";
char Data8[34] = "";
bool shouldSaveConfig1 = false;
void saveConfigCallback1 () {
shouldSaveConfig1 = true;
Serial.println("Should save All Data config");
}
String IP;
void setup() {
pinMode(D0, OUTPUT); // สัญญาณไฟ ในสภาวะต่างๆ
pinMode(D4, INPUT_PULLUP); //กดปุ่ม ค้าง เพื่อตั้งค่า AP config
Serial.begin (115200);
Serial.println("");
Serial.println("");
Serial.println("ติดตั้ง FS...");
delay (1000);
Serial.println("");
if (SPIFFS.begin()) {
Serial.println("ติดตั้งระบบไฟล์ข้อมูล");
if (SPIFFS.exists("/config1.json")) {//ชื่อไฟล์และช่องว่าง ต้องไม่ผืด ""
//อ่านและโหลดไฟล์เดิมที่เคยบันทึกออกมา
Serial.println("");
Serial.println("กำลังอ่านไฟล์กำหนดค่าข้อมูล");
File configFile1 = SPIFFS.open("/config1.json", "r");
delay (1000);
Serial.println("");
if (configFile1) {
Serial.println("เปิดไฟลืเดิมที่เคยกำหนดค่าก่อนหน้า..พบข้อมูลดังนี้");
delay (1000);
Serial.println("");
size_t size = configFile1.size();
// จัดสรรบัฟเฟอร์เพื่อจัดเก็บเนื้อหาของไฟล์
std::unique_ptr<char[]> buf1(new char[size]);
configFile1.readBytes(buf1.get(), size);
DynamicJsonBuffer jsonBuffer;
JsonObject& json = jsonBuffer.parseObject(buf1.get());
json.printTo(Serial);
Serial.println("");
if (json.success()) {
delay(1000);
Serial.println("");
Serial.println("ทำการเพิ่ม ช่องการป้อนค่าใน Web portal");
Serial.println("");
strcpy(Blynk_Token, json["Blynk_Token"]);
strcpy(line_token1, json["line_token1"]);
strcpy(line_token2, json["line_token2"]);
strcpy(Data1, json["Data1"]);
strcpy(Data2, json["Data2"]);
strcpy(Data3, json["Data3"]);
strcpy(Data4, json["Data4"]);
strcpy(Data5, json["Data5"]);
strcpy(Data6, json["Data6"]);
strcpy(Data7, json["Data7"]);
strcpy(Data8, json["Data8"]);
} else {
Serial.println("ไม่สามารถโหลดไฟล์ข้อมูล json config ได้");
}
}
}
} else {
Serial.println("ติดตั้ง FS ไม่สำเร็จ");
}
// สิ้นสุดการอ่าน
delay( 1000);
//แสดงชื่อหัวข้อที่จะป้อนลงในช่องต่าง ใน WebPortal
WiFiManagerParameter custom_text0 ("<p> </p>"); //ขึ้นย่อหน้าใหม่
WiFiManagerParameter custom_Blynk_Tokentext ("<label>ป้อน Blynk_Token</label>");
WiFiManagerParameter custom_line_token1text ("<label>ป้อน line_token1</label>");
WiFiManagerParameter custom_line_token2text ("<label>ป้อน line_token2</label>");
WiFiManagerParameter custom_text1 ("<label>1: ป้อนค่า</label>");
WiFiManagerParameter custom_text2 ("<label>2: ป้อนค่า</label>");
WiFiManagerParameter custom_text3 ("<label>3: ป้อนค่า</label>");
WiFiManagerParameter custom_text4 ("<label>4: ป้อนค่า</label>");
WiFiManagerParameter custom_text5 ("<label>5: ป้อนค่า</label>");
WiFiManagerParameter custom_text6 ("<label>6: ป้อนค่า</label>");
WiFiManagerParameter custom_text7 ("<label>7: ป้อนค่า</label>");
WiFiManagerParameter custom_text8 ("<label>8: ป้อนค่า</label>");
WiFiManagerParameter custom_Blynk_Token("Blynk_Token", "Blynk_Token", Blynk_Token, 34 );
WiFiManagerParameter custom_line_token1("line_token1", "line_token1", line_token1, 45 );
WiFiManagerParameter custom_line_token2("line_token2", "line_token2", line_token2, 45 );
WiFiManagerParameter custom_Data1("Data1", "Data1", Data1, 34 );
WiFiManagerParameter custom_Data2("Data2", "Data2", Data2, 34 );
WiFiManagerParameter custom_Data3("Data3", "Data3", Data3, 34 );
WiFiManagerParameter custom_Data4("Data4", "Data4", Data4, 34 );
WiFiManagerParameter custom_Data5("Data5", "Data5", Data5, 34 );
WiFiManagerParameter custom_Data6("Data6", "Data6", Data6, 34 );
WiFiManagerParameter custom_Data7("Data7", "Data7", Data7, 34 );
WiFiManagerParameter custom_Data8("Data8", "Data8", Data8, 34 );
WiFiManager wifiManager;
wifiManager.setSaveConfigCallback(saveConfigCallback1);
wifiManager.addParameter(&custom_text0);
wifiManager.addParameter(&custom_Blynk_Tokentext);
wifiManager.addParameter(&custom_Blynk_Token);
wifiManager.addParameter(&custom_line_token1text);
wifiManager.addParameter(&custom_line_token1);
wifiManager.addParameter(&custom_line_token2text);
wifiManager.addParameter(&custom_line_token2);
wifiManager.addParameter(&custom_text1);
wifiManager.addParameter(&custom_Data1);
wifiManager.addParameter(&custom_text2);
wifiManager.addParameter(&custom_Data2);
wifiManager.addParameter(&custom_text3);
wifiManager.addParameter(&custom_Data3);
wifiManager.addParameter(&custom_text4);
wifiManager.addParameter(&custom_Data4);
wifiManager.addParameter(&custom_text5);
wifiManager.addParameter(&custom_Data5);
wifiManager.addParameter(&custom_text6);
wifiManager.addParameter(&custom_Data6);
wifiManager.addParameter(&custom_text7);
wifiManager.addParameter(&custom_Data7);
wifiManager.addParameter(&custom_text8);
wifiManager.addParameter(&custom_Data8);
delay( 2000);
Serial.println("");
for (int i = 5; i > -1; i--) {// นับเวลาถอยหลัง 5 วินาทีก่อนกดปุ่ม AP Config
digitalWrite(D0, 0);
delay( 500 );
digitalWrite(D0, 1);
delay( 500 );
Serial.print (String(i) + " ");
}
Serial.println("");
if (digitalRead(D4) == 0) {
digitalWrite(D0, 0);
Serial.println("");
Serial.println("ปุ่มถูกกดแล้ว");
wifiManager.resetSettings();//ให้ล้างค่า SSID และ Password ที่เคยบันทึกไว้
if (!wifiManager.autoConnect("PUYIOT ESP8266")) {
Serial.println("ไม่สามารถเชื่อมต่อและหมดเวลา");
delay( 3000);
//ESP8266 Reset เพื่อเข้าสู่การ Config ค่าอีกครั้ง
ESP.reset();
delay(5000);
}
}
Serial.println("");
IP = WiFi.localIP().toString();
Serial.print("หมายเลข IP ที่ได้ : ");
Serial.println(IP);
if (IP == "0.0.0.0") {
Serial.println("");
Serial.println(": เชื่อมต่อ WiFi ไม่ได้....ระบบจะ Resetภายใน 20 วินาที)");
delay( 20000);
ESP.reset();
}
if (IP != "0.0.0.0") {
Serial.println("");
Serial.println("::: เชื่อมต่อ WiFi สำเร็จ!:::");
Serial.println("");
//digitalWrite(D0, LOW); //ให้ไฟ onBoardด ติดค้าง ถ้าเชื่อมต่อ WiFi สำเร็จ
}
delay( 500 );
strcpy(Blynk_Token, custom_Blynk_Token.getValue());
strcpy(line_token1, custom_line_token1.getValue());
strcpy(line_token2, custom_line_token2.getValue());
strcpy(Data1, custom_Data1.getValue());
strcpy(Data2, custom_Data2.getValue());
strcpy(Data3, custom_Data3.getValue());
strcpy(Data4, custom_Data4.getValue());
strcpy(Data5, custom_Data5.getValue());
strcpy(Data6, custom_Data6.getValue());
strcpy(Data7, custom_Data7.getValue());
strcpy(Data8, custom_Data8.getValue());
delay( 2000);
if (shouldSaveConfig1) {
DynamicJsonBuffer jsonBuffer;
JsonObject& json = jsonBuffer.createObject();
Serial.println("saving Blynk_Token config");
json["Blynk_Token"] = Blynk_Token;
File configFile9 = SPIFFS.open("/config1.json", "w");
json["line_token1"] = line_token1;
File configFile10 = SPIFFS.open("/config1.json", "w");
json["line_token2"] = line_token2;
File configFile11 = SPIFFS.open("/config1.json", "w");
Serial.println("saving Data1 config");
json["Data1"] = Data1;
File configFile1 = SPIFFS.open("/config1.json", "w");
Serial.println("saving Data2 config");
json["Data2"] = Data2;
File configFile2 = SPIFFS.open("/config1.json", "w");
Serial.println("saving Data3 config");
json["Data3"] = Data3;
File configFile3 = SPIFFS.open("/config1.json", "w");
Serial.println("saving Data4 config");
json["Data4"] = Data4;
File configFile4 = SPIFFS.open("/config1.json", "w");
Serial.println("saving Data5 config");
json["Data5"] = Data5;
File configFile5 = SPIFFS.open("/config1.json", "w");
Serial.println("saving Data6 config");
json["Data6"] = Data6;
File configFile6 = SPIFFS.open("/config1.json", "w");
Serial.println("saving Data7 config");
json["Data7"] = Data7;
File configFile7 = SPIFFS.open("/config1.json", "w");
Serial.println("saving Data8 config");
json["Data8"] = Data8;
File configFile8 = SPIFFS.open("/config1.json", "w");
if (!configFile1) {
Serial.println("ไม่สามารถเปิดไฟล์กำหนดค่าสำหรับการเขียนได้");
}
json.printTo(Serial);
json.printTo(configFile9);
configFile9 .close();
json.printTo(configFile10);
configFile10 .close();
json.printTo(configFile11);
configFile11 .close();
json.printTo(configFile1);
configFile1.close();
json.printTo(configFile2);
configFile2.close();
json.printTo(configFile3);
configFile3.close();
json.printTo(configFile4);
configFile4.close();
json.printTo(configFile5);
configFile5.close();
json.printTo(configFile6);
configFile6.close();
json.printTo(configFile7);
configFile7.close();
json.printTo(configFile8);
configFile8.close();
}
delay(2000);
//Print เพื่อเชคว่าค่าที่บันทึกไว้ยังอยู่หรือไม่
Serial.println("");
Serial.println("รายงานสถานะเครือข่ายที่เชื่อมต่อได้");
Serial.println("-----------------------------------");
Serial.println("");
Serial.print("local ip : ");
delay(100);
Serial.println(WiFi.localIP());
delay(100);
Serial.print("subnetMask : ");
delay(100);
Serial.println(WiFi.subnetMask());
Serial.print("gateway : ");
delay(100);
Serial.println(WiFi.gatewayIP());
Serial.print("SSID : ");
delay(100);
Serial.println(WiFi.SSID());
Serial.print("Password : ");
delay(100);
Serial.println(WiFi.psk());
Serial.println("");
Serial.println("-----------------------------------");
Serial.print("Blynk_Token = ");
Serial.println(Blynk_Token);
Serial.print("line_token1 = ");
Serial.println(line_token1);
Serial.print("line_token2 = ");
Serial.println(line_token2);
Serial.print("Data1 = ");
Serial.println(Data1);
Serial.print("Data2 = ");
Serial.println(Data2);
Serial.print("Data3 = ");
Serial.println(Data3);
Serial.print("Data4 = ");
Serial.println(Data4);
Serial.print("Data5 = ");
Serial.println(Data5);
Serial.print("Data6 = ");
Serial.println(Data6);
Serial.print("Data7 = ");
Serial.println(Data7);
Serial.print("Data8 = ");
Serial.println(Data8);
Serial.println("");
Serial.println("บันทึกค่าทั้งหมดแล้ว");
Blynk.config(Blynk_Token, server, port);
//เริ่มการเชื่อมต่อ Blynk Server***สำหรับ Server ที่แจกให้ เพิ่ม, server, port แค่นี้จบ
// Blynk.config(blynk_token);//เริ่มการเชื่อมต่อ Blynk Clound แบบปกติ
timer.setInterval(30000L, reconnecting);
// ส่งข้อความเดียวกัน ให้ Line Notify 2 กลุ่ม
LINE.setToken(line_token1); LINE.notify("ระบบเริ่มทำงาน");
LINE.setToken(line_token2); LINE.notify("ระบบเริ่มทำงาน");
}//จบ void setup
void loop() {
//---------------------------------------------
if (Blynk.connected())
{
//เมื่อ Esp8266 เขื่อมต่อ Blynk Could ได้สำเร็จ
Blynk.run();
digitalWrite(D0, LOW);
blynk_Connect = 1;
}
else {
//เมื่อ Esp8266 เขื่อมต่อ Blynk Could ไม่ได้
digitalWrite(D0, LOW);
delay(200);
digitalWrite(D0, HIGH);
delay(100);
blynk_Connect = 0;
}
//---------------------------------------------
//แจ้งเตือน 1 ครั้ง กรณี Blynk เชื่อมต่อ Blynk Could ได้
if (blynk_Connect == 1 && Notify_blynk_status1 == 0) {
// LINE.notify("ชุดทดสอบ เชื่อมต่อ Blynk Server ได้แล้ว");
LINE.setToken(line_token1); LINE.notify("ระบบ เชื่อมต่อ Blynk Cloud ได้แล้ว");
LINE.setToken(line_token2); LINE.notify("ระบบ เชื่อมต่อ Blynk Cloud ได้แล้ว");
delay (200);
Notify_blynk_status1 = 1;
}
else if (blynk_Connect == 1 && Notify_blynk_status1 == 1) {
delay(10);
Notify_blynk_status2 = 0;
}
//แจ้งเตือน 1 ครั้ง กรณี Blynk เชื่อมต่อ Blynk Could ไม่ได้ หรือ กรณี Internet มา
if (blynk_Connect == 0 && Notify_blynk_status2 == 0) {
//LINE.notify("ชุดทดสอบ!!! เชื่อมต่อ Blynk Server ไม่ได้");
LINE.setToken(line_token1); LINE.notify("ระบบ!! เชื่อมต่อ Blynk Cloud ไม่ได้");
LINE.setToken(line_token2); LINE.notify("ระบบ!! เชื่อมต่อ Blynk Cloud ไม่ได้");
delay (200);
Notify_blynk_status2 = 1;
}
else if (blynk_Connect == 0 && Notify_blynk_status2 == 1) {
delay(10);
Notify_blynk_status1 = 0;
}
timer.run();//ต้องอยู่ใน void loop เสมอ
delay(500);
}//จบ void loop
void reconnecting()
{
if (!Blynk.connected())
{
blynkIsDownCount++;
BLYNK_LOG("blynk server is down! %d times", blynkIsDownCount);
Blynk.connect(5000);
}
}
BLYNK_CONNECTED()//sync สถานะอุปกรณ์ทั้งหมด เมื่อ Esp8266 เขื่อมต่อ Blynk Could ได้สำเร็จ
{
Blynk.syncAll();//ให้ sync อมูลทั้งหมด ล่าสุดจาก Blynk Server
}
Libraly ที่ใช้.rar (1.5 MB)
WM_ESP8266_keep_8_values_Blynk_Line_2_values.rar (4.5 KB)