สำหรับโปรเจคนี้ผมเคยคิดมานานว่าผมอยากจะทำมัน เคยอ่านหลายกระทู้ ก็มีคนพยายามจะดัดแปลงสวิทช์ปิดเปิดไปบ้านให้สามารถทำงานสอดคล้องกับ blynk Application โดยปกติแล้วตามท้องตลาดก็จะมีอยู่หลายยี่ห้อด้วยกันเช่น SONOFF เขาก็จะมีเทคโนโลยีการผลิตที่ดีอยู่แล้ว ซึ่งมีการใช้งานได้ง่ายราคาตอนนี้ก็ไม่แพงมาก เราก็สามารถที่จะซื้อเอามาใช้งานได้เลย แต่ในที่นี้สำหรับคนที่จะ DIY ถ้ายังนึกภาพไม่ออกว่าจะเอาของที่มีอยู่ทั่วไปมาใส่ลงใน Box ลอย แล้วมันจะอยู่ยังไง มันสามารถนำอุปกรณ์ต่างๆเข้าไปไว้ใน Box ได้หรือเปล่า ถ้าใครสงสัยในจุดนี้ก็ลองดูตัวอย่างที่ผมทำไว้ให้ดูนะครับ โปรเจคนี้ไม่ได้มุ่งหวังว่า ทุกคนที่อ่านของผมจะต้องทำตามเพราะงาน DIY นี้ ผมทำเพื่อทดสอบว่าแนวคิดของผมสามารถที่จะทำให้เป็นจริงได้หรือไม่ อีกอย่างหนึ่งสำหรับคนที่คิดจะทำตามโปรเจคนี้ ควรระมัดระวังเรื่องแรงดันไฟฟ้าด้วยนะครับ ต้องมีพื้นฐานมาบ้างแต่ถ้าจะไม่ใช้ไฟ 220 โวลท์ ก็ทำเพียงแค่ให้ รีเลย์ ทำงานก็พอ เพราะการนำไปใช้จริงจะต้องเซฟตี้ จุดของแรงดันไฟฟ้า 220 โวลท์เอาไว้ด้วย พูดง่ายๆถ้าไฟช็อตผมไม่รับผิดชอบนะครับ อิ…อิ…
ส่วนอันนี้เป็นภาพตัวอย่าง
แนวคิดผมคือผมจะทำทีเดียวทั้ง 3 ปุ่ม เลยเพราะฉะนั้นถ้ามีปุ่ม 2 ปุ่มหรือ 1 ปุ่มก็สามารถลดตัวรีเลย์ หรือ สายไฟลง ได้ทำให้มีพื้นที่ว่างลง สำหรับท่านผู้อ่านทุกท่านที่เข้ามาอ่านแล้วมี “วิธีในลักษณะนี้” ที่ดีกว่า เล็กกว่า ก็สามารถแนะนำได้นะครับ DIY เป็นงาน จินนาการ ผสมผสานกับ ความจริง ที่ลงตัวนะครับ
Code : 22/07/2563 23:20
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
#include <FS.h>
#include <DNSServer.h>
#include <ArduinoJson.h>
#include <ESP8266HTTPClient.h>
//----------------------------------------------------------
//Blynk------------
#include <BlynkSimpleEsp8266.h>
#define BLYNK_DEBUG
#define BLYNK_PRINT Serial
int blynkIsDownCount = 0;
char blynk_token[34] = "l9JJngz0CfzRvO3rTbMB9-_Mmn-I0jdK";
BlynkTimer timer;
//***********สำหรับ Server local ที่แจกให้ เพิ่ม **** แค่ 2 บรรทัดนี้
char server[] = "oasiskit.com";
int port = 8080;
//------------------------------------------------------------------------------------------------------------------------//
#define D0 16 // ใช้ไฟ LED สีฟ้า ของบอร์ด MCU ESP8266 ให้มีสัญญาณไฟกระพริบ ตาม Code ที่เขียน
#define D4 2 // ใช้เป็นปุ่มกด เพื่อเข้า AP Config ได้ตามความต้องการของผู้ใช้
#define D5 14 //Relay No.1
#define D6 12 //Relay No.1
#define D7 13 //Relay No.1
//------------------------------------------------------------------------------------------------------------------------//
bool shouldSaveConfig1 = false;
void saveConfigCallback1 () {
shouldSaveConfig1 = true;
Serial.println("Should save All Data config");
}
//-----------------------------------------------------------------------------------------------------------------------//
String IP;
//กำหนดสถานะ เพื่อให้สามารถแยกระหว่างการติดหรือดับของ ของ Relays
int Device_1sent;
int Device_2sent;
int Device_3sent;
int Device_4sent;
int Device_5sent;
int Device_6sent;
int Device_7sent;
int Device_8sent;
//Power state ONOFF
int powerstate_sent1;
int powerstate_sent2;
int powerstate_sent3;
int powerstate_sent4;
int powerstate_sent5;
int powerstate_sent6;
int powerstate_sent7;
int powerstate_sent8;
//-----------------------------------------------------------------------------------//
#include <EEPROM.h>
#include <Bounce2.h> //ใช้ library เพื่อป้องกันการแกว่งตัวของหน้าสัมผัส PB ระหว่างการปิดเปิด
#define D1 5 //PB No.1
Bounce debouncer1 = Bounce(); //กำหนดให้ตัวแปรชื่อ debouncer1 เป็นของปุ่มที่ 1
int a1 = 0;//กำหนดสถานะให้กับปุ่มต่างๆ เพื่อให้สามารถแยกระหว่างการ ON หรือ OFF ของ PB
#define D2 4 //PB No.2
Bounce debouncer2 = Bounce(); //กำหนดให้ตัวแปรชื่อ debouncer2 เป็นของปุ่มที่ 2
#define D3 0 //PB No.3
int a2 = 0;//กำหนดสถานะให้กับปุ่มต่างๆ เพื่อให้สามารถแยกระหว่างการ ON หรือ OFF ของ PB
Bounce debouncer3 = Bounce(); //กำหนดให้ตัวแปรชื่อ debouncer3 เป็นของปุ่มที่ 3
int a3 = 0;//กำหนดสถานะให้กับปุ่มต่างๆ เพื่อให้สามารถแยกระหว่างการ ON หรือ OFF ของ PB
//--------Blynk Control---------
BLYNK_WRITE(V1) //V1 ใน Blynk สลับ จาก 0-> 1 เป็น 1->0
{
int pinValue = param.asInt();
if (pinValue == 1 ) {
Device_1_On();
}
if (pinValue == 0) {
Device_1_Off();
}
}
void Device_1_On() {
Device_1sent = 10;
Blynk.virtualWrite(V1, 1);
//--เก็บค่าสถานะไว้ใน EEPROM --------
EEPROM.put(10, Device_1sent ); //เขียนค่า Device_1sent ลงใน Address 10
EEPROM.commit(); //จบการเขียน
delay(50);
}
//--------------------------------//
void Device_1_Off() {
Device_1sent = 11;
Blynk.virtualWrite(V1, 0);
//--เก็บค่าสถานะไว้ใน EEPROM --------
EEPROM.put(10, Device_1sent ); //เขียนค่า Device_1sent ลงใน Address 10
EEPROM.commit(); //จบการเขียน
delay(50);
}
//--------Blynk <Timer> Control---------
BLYNK_WRITE(V11) //V11 ใน Code สลับ จาก 1->off เป็น 0-> on
{
int pinValue = param.asInt();
if (pinValue == 1 ) {
Blynk.setProperty(V1, "onBackColor", "#f6119d");
delay(10);
Blynk.setProperty(V1, "onLabel", "Ctrl By Timer");
delay(10);
Device_1_Off();
}
if (pinValue == 0) {
Blynk.setProperty(V1, "offBackColor", "#181916");
delay(10);
Blynk.setProperty(V1, "onLabel", "ON");
Blynk.setProperty(V1, "onBackColor", "#c6e613");
Device_1_On();
}
}
//--------Blynk Control---------
BLYNK_WRITE(V2) //V2 ใน Blynk สลับ จาก 0-> 1 เป็น 1->0
{
int pinValue = param.asInt();
if (pinValue == 1 ) {
Device_2_On();
}
if (pinValue == 0) {
Device_2_Off();
}
}
void Device_2_On() {
Device_2sent = 20;
Blynk.virtualWrite(V2, 1);
//--เก็บค่าสถานะไว้ใน EEPROM --------
EEPROM.put(20, Device_2sent );
EEPROM.commit(); //จบการเขียน
delay(50);
}
//--------------------------------//
void Device_2_Off() {
Device_2sent = 21;
Blynk.virtualWrite(V2, 0);
//--เก็บค่าสถานะไว้ใน EEPROM --------
EEPROM.put(20, Device_2sent );
EEPROM.commit(); //จบการเขียน
delay(50);
}
//--------Blynk <Timer> Control---------
BLYNK_WRITE(V12) //V12 ใน Code สลับ จาก 1->off เป็น 0-> on
{
int pinValue = param.asInt();
if (pinValue == 1 ) {
Blynk.setProperty(V2, "onBackColor", "#f6119d");
delay(10);
Blynk.setProperty(V2, "onLabel", "Ctrl By Timer");
delay(10);
Device_2_Off();
}
if (pinValue == 0) {
Blynk.setProperty(V2, "offBackColor", "#181916");
delay(10);
Blynk.setProperty(V2, "onLabel", "ON");
Blynk.setProperty(V2, "onBackColor", "#c6e613");
Device_2_On();
}
}
//--------Blynk Control---------
BLYNK_WRITE(V3) //V3 ใน Blynk สลับ จาก 0-> 1 เป็น 1->0
{
int pinValue = param.asInt();
if (pinValue == 1 ) {
Device_3_On();
}
if (pinValue == 0) {
Device_3_Off();
}
}
void Device_3_On() {
Device_3sent = 30;
Blynk.virtualWrite(V3, 1);
//--เก็บค่าสถานะไว้ใน EEPROM --------
EEPROM.put(30, Device_3sent );
EEPROM.commit(); //จบการเขียน
delay(50);
}
//--------------------------------//
void Device_3_Off() {
Device_3sent = 31;
Blynk.virtualWrite(V3, 0);
//--เก็บค่าสถานะไว้ใน EEPROM --------
EEPROM.put(30, Device_3sent );
EEPROM.commit(); //จบการเขียน
delay(50);
}
//--------Blynk <Timer> Control---------
BLYNK_WRITE(V13) //V13 ใน Code สลับ จาก 1->off เป็น 0-> on
{
int pinValue = param.asInt();
if (pinValue == 1 ) {
Blynk.setProperty(V3, "onBackColor", "#f6119d");
delay(10);
Blynk.setProperty(V3, "onLabel", "Ctrl By Timer");
delay(10);
Device_3_Off();
}
if (pinValue == 0) {
Blynk.setProperty(V3, "offBackColor", "#181916");
delay(10);
Blynk.setProperty(V3, "onLabel", "ON");
Blynk.setProperty(V3, "onBackColor", "#c6e613");
Device_3_On();
}
}
//Power state ON/OFF
BLYNK_WRITE(V31)
{
int pinValue = param.asInt();
if (pinValue == 1 ) {
powerstate_sent1 = 211;
EEPROM.put(211 , powerstate_sent1 );
EEPROM.commit(); //จบการเขียน
delay(50);
}
if (pinValue == 0) {
powerstate_sent1 = 210;
EEPROM.put(211, powerstate_sent1 );
EEPROM.commit(); //จบการเขียน
delay(50);
}
}
BLYNK_WRITE(V32)
{
int pinValue = param.asInt();
if (pinValue == 1 ) {
powerstate_sent2 = 221;
EEPROM.put(221 , powerstate_sent2 );
EEPROM.commit(); //จบการเขียน
delay(50);
}
if (pinValue == 0) {
powerstate_sent2 = 220;
EEPROM.put(221, powerstate_sent2 );
EEPROM.commit(); //จบการเขียน
delay(50);
}
}
BLYNK_WRITE(V33)
{
int pinValue = param.asInt();
if (pinValue == 1 ) {
powerstate_sent3 = 231;
EEPROM.put(231 , powerstate_sent3 );
EEPROM.commit(); //จบการเขียน
delay(50);
}
if (pinValue == 0) {
powerstate_sent3 = 230;
EEPROM.put(231, powerstate_sent3 );
EEPROM.commit(); //จบการเขียน
delay(50);
}
}
//------------------------------------------------------//
BLYNK_CONNECTED()
{
powerstate_sent1 = EEPROM.get(211, powerstate_sent1);
Serial.print("powerstate_sent1 :");
Serial.println(powerstate_sent1);
delay(50);
if (powerstate_sent1 == 211) {//กรณีที่ Power state ON จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
//-----------------------------
Device_1sent = EEPROM.get(10, Device_1sent);
if (Device_1sent == 10) {
Blynk.virtualWrite(V1, 1);
}
if (Device_1sent == 11) {
Blynk.virtualWrite(V1, 0);
}
Serial.print("Device_1sent :");
Serial.println(Device_1sent);
//-----------------------------
delay(50);
//-----------------------------
}
else if (powerstate_sent1 == 210) {
Device_1_Off();
}
powerstate_sent2 = EEPROM.get(221, powerstate_sent2);
Serial.print("powerstate_sent2 :");
Serial.println(powerstate_sent2);
delay(50);
if (powerstate_sent2 == 221) {//กรณีที่ Power state ON จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
Device_2sent = EEPROM.get(20, Device_2sent);
if (Device_2sent == 20) {
Blynk.virtualWrite(V2, 1);
}
if (Device_2sent == 21) {
Blynk.virtualWrite(V2, 0);
}
Serial.print("Device_2sent :");
Serial.println(Device_2sent);
//-----------------------------
delay(50);
//-----------------------------
}
else if (powerstate_sent2 == 220) {
Device_2_Off();
}
powerstate_sent3 = EEPROM.get(231, powerstate_sent3);
Serial.print("powerstate_sent3 :");
Serial.println(powerstate_sent3);
delay(50);
if (powerstate_sent3 == 231) {//กรณีที่ Power state ON จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
Device_3sent = EEPROM.get(30, Device_3sent);
if (Device_3sent == 30) {
Blynk.virtualWrite(V3, 1);
}
if (Device_3sent == 31) {
Blynk.virtualWrite(V3, 0);
}
Serial.print("Device_3sent :");
Serial.println(Device_3sent);
//-----------------------------
delay(50);
//-----------------------------
}
else if (powerstate_sent3 == 230) {
Device_3_Off();
}
}//end Blynk connect
//------------------------------------------------------------------------------------------------------------------------//
//********************************************* void setup **************************************************//
//------------------------------------------------------------------------------------------------------------------------//
void setup() {
//-------IO NODE MCU Esp8266-------//
pinMode(D0, OUTPUT); //กำหนดโหมดใช้งานให้กับขา D0 เป็นขา สัญญาณไฟ ในสภาวะต่างๆ
pinMode(D4, INPUT_PULLUP);//กำหนดโหมดใช้งานให้กับขา D4 เป็นขา กดปุ่ม ค้าง เพื่อตั้งค่า AP config
pinMode(D1, INPUT_PULLUP);//PB No.1
debouncer1.attach(D1);
debouncer1.interval(25);
pinMode(D2, INPUT_PULLUP);//PB No.2
debouncer2.attach(D2);
debouncer2.interval(25);
pinMode(D3, INPUT_PULLUP);//PB No.3
debouncer3.attach(D3);
debouncer3.interval(25);
pinMode(D5, OUTPUT); //Relay No.1
pinMode(D6, OUTPUT); //Relay No.2
pinMode(D7, OUTPUT); //Relay No.3
Serial.begin(115200);
//ให้ OUTPUT ทุกตัวดับก่อนตอนเริ่มทำงาน
digitalWrite(D5, 0);
digitalWrite(D6, 0);
digitalWrite(D7, 0);
EEPROM.begin(512);
//-----------------------------------------------------------------------------------------------------------------------//
//read configuration from FS json
Serial.println("mounting FS...");
if (SPIFFS.begin()) {
//---------------------------------------------------------------------------------//
Serial.println("mounted Data file system");
if (SPIFFS.exists("/config1.json")) {
//file exists, reading and loading
Serial.println("reading Data config file");
File configFile1 = SPIFFS.open("/config1.json", "r");
if (configFile1) {
Serial.println("opened Data config file");
size_t size = configFile1.size();
// Allocate a buffer to store contents of the file.
std::unique_ptr<char[]> buf1(new char[size]);
configFile1.readBytes(buf1.get(), size);
DynamicJsonBuffer jsonBuffer;
JsonObject& json = jsonBuffer.parseObject(buf1.get());
json.printTo(Serial);
if (json.success()) {
Serial.println("\nparsed json");
strcpy(blynk_token, json["blynk_token"]);
} else {
Serial.println("failed to load Data file json config");
}
}
}
//---------------------------------------------------------------------------------//
} else {
Serial.println("failed to mount FS");
}
//end read
delay(1000);
//-----------------------------------------------------------------------------------------------------------------------//
WiFiManagerParameter custom_text0("<p> </p>");
WiFiManagerParameter custom_textA("<label>ป้อน Blynk Token</label>");
WiFiManagerParameter custom_blynk_token("blynk_token", "blynk_token", blynk_token, 34);
//WiFiManager
//Local intialization. Once its business is done, there is no need to keep it around
WiFiManager wifiManager;
//set config save notify callback
wifiManager.setSaveConfigCallback(saveConfigCallback1);
wifiManager.addParameter(&custom_text0);
wifiManager.addParameter(&custom_textA);
wifiManager.addParameter(&custom_blynk_token);
delay(1000);
for (int i = 5; i > -1; i--) { // นับเวลาถอยหลัง 5 วินาทีก่อนกดปุ่ม AP Config
digitalWrite(D0, LOW);
delay(500);
digitalWrite(D0, HIGH);
delay(500);
Serial.print (String(i) + " ");
}
if (digitalRead(D4) == LOW) {
digitalWrite(D0, LOW);
Serial.println("Button Pressed");
wifiManager.resetSettings();//ให้ล้างค่า SSID และ Password ที่เคยบันทึกไว้
// wifiManager.autoConnect(); ใช้สร้างชื่อแอคเซสพอยต์อันโนมัติจาก ESP + ChipID
if (!wifiManager.autoConnect("Lighting IOT")) {
Serial.println("failed to connect and hit timeout");
delay(3000);
//reset and try again, or maybe put it to deep sleep
ESP.reset();
delay(5000);
}
}
Serial.println(": เชื่อมต่อ WiFi สำเร็จ!)");
strcpy(blynk_token, custom_blynk_token.getValue());
delay(1000);
if (shouldSaveConfig1) {
//Serial.println("saving config");//แสดงข้อความใน Serial Monitor
//------------------------------------------------------------------
DynamicJsonBuffer jsonBuffer;
JsonObject& json = jsonBuffer.createObject();
//------------------------------------------------------------------
Serial.println("saving blynk_token_ config");
json["blynk_token"] = blynk_token;
File configFile1 = SPIFFS.open("/config1.json", "w");
//------------------------------------------------------------------
if (!configFile1) {
Serial.println("failed to open config file for writing");
}
json.printTo(Serial);
//-------------------------------------
//--Write Close blynk_token
json.printTo(configFile1);
configFile1.close();
//-------------------------------------
}
delay(1000);
//-----------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------//
Serial.println("-----------------------------------");
Serial.println();
Serial.print("local ip : ");
delay(100);
Serial.println(WiFi.localIP());
delay(100);
Serial.print("gateway :");
delay(100);
Serial.println(WiFi.gatewayIP());
Serial.print("subnetMask :");
delay(100);
Serial.println(WiFi.subnetMask());
Serial.print("SSID :");
delay(100);
Serial.println(WiFi.SSID());
Serial.print("Password :");
delay(100);
Serial.println(WiFi.psk());
//-----------------------------------------------------------------------------------------------------------------------//
//Print เพื่อเชคว่าค่าที่บันทึกไว้ยังอยู่หรือไม่
Serial.println("-----------------------------------");
Serial.println("เชคว่าค่าที่บันทึกไว้ยังอยู่หรือไม่");
Serial.println();
IP = WiFi.localIP().toString();
Serial.print("IP to String = ");
Serial.println(IP);
// Blynk.config(blynk_token);//เริ่มการเชื่อมต่อ Blynk Server แบบปกติ
Blynk.config(blynk_token, server, port);
//เริ่มการเชื่อมต่อ Blynk Server*********สำหรับ Server local
//ที่แจกให้ เพิ่ม, server, port แค่นี้จบ
timer.setInterval(30000L, reconnecting);
//-----------------------------------------------------------------------------------------------------------------------//
}
//------------------------------------------------------------------------------------------------------------------------//
//********************************************* จบ void setup **************************************************//
//------------------------------------------------------------------------------------------------------------------------//
//------------------------------------------------------------------------------------------------------------------------//
//********************************************* void Loop ***************************************************//
//------------------------------------------------------------------------------------------------------------------------//
void loop(void) {
debouncer1.update();
//--Toggle SW PB 1 -----------------------------------------------------------------------------------
if ( debouncer1.fell() ) {
a1 = !a1;
if ( a1 == 1 ) {
Device_1_Off();
}
if ( a1 == 0 ) {
Device_1_On();
}
delay(50);
}
//-------------------------------------------------------------------------------------------------
debouncer2.update();
//--Toggle SW PB 2 -----------------------------------------------------------------------------------
if ( debouncer2.fell() ) {
a2 = !a2;
if ( a2 == 1 ) {
Device_2_Off();
}
if ( a2 == 0 ) {
Device_2_On();
}
delay(50);
}
//-------------------------------------------------------------------------------------------------
debouncer3.update();
//--Toggle SW PB 3 -----------------------------------------------------------------------------------
if ( debouncer3.fell() ) {
a3 = !a3;
if ( a3 == 1 ) {
Device_3_Off();
}
if ( a3 == 0 ) {
Device_3_On();
}
delay(50);
}
//-------------------------------------------------------------------------------------------------
//------Relay No.1 -----------------//
if (Device_1sent == 11) {//off
digitalWrite(D5, 1);
a1 = 1;
}
if (Device_1sent == 10) {//on
digitalWrite(D5, 0);
a1 = 0;
}
//---------------------------//
//------Relay No.2 -----------------//
if (Device_2sent == 21) {//off
digitalWrite(D6, 1);
a2 = 1;
}
if (Device_2sent == 20) {//on
digitalWrite(D6, 0);
a2 = 0;
}
//---------------------------//
//------Relay No.3 -----------------//
if (Device_3sent == 31) {//off
digitalWrite(D7, 1);
a3 = 1;
}
if (Device_3sent == 30) {//on
digitalWrite(D7, 0);
a3 = 0;
}
//---------------------------//
//------------- Blynk Connect ---------------//
if (Blynk.connected())
{
Blynk.run();
digitalWrite(D0, LOW);
//Serial.println("loop Blynk run");
} else {
digitalWrite(D0, LOW);
delay(50);
digitalWrite(D0, HIGH);
delay(50);
//Serial.println("loop Blynk connecting");
}
timer.run();//ให้เวลาของ Blynk ทำงาน
// delay(200); // ตัดการหน่วงเวลาออก เพราะทำให้การกดปุ่มช้า
}//Loop
//--------------------------------------------------------------------------------------------------------
void reconnecting()
{
if (!Blynk.connected())
{
blynkIsDownCount++;
BLYNK_LOG("blynk server is down! %d times", blynkIsDownCount);
Blynk.connect(5000);
}
}
//--------------------------------------------------------------------------------------------------------