NODE MCU ESP 8266 + AP CONFIG แบบกดปุ่มตั้งค่า + Blynk SERVER

NODE MCU ESP 8266 + AP CONFIG แบบกดปุ่มตั้งค่า + Blynk SERVER

ก่อนอื่นต้องขอขอบคุณในความมีน้ำใจของเว็บไซต์ https://eleceasy.com ด้วยครับที่แบ่งปัน Server และ Energy ให้ผมได้มีโอกาสใช้งาน
ขอเริ่มเรื่องเลยนะครับ
1 ให้เราออกแบบการใช้อุปกรณ์ด้วย Software ตัวใดตัวหนึ่งก็ได้ที่เราถนัดแล้วทำการสั่งของมานะครับ
ที่ผมออกแบบมาก็จะมีวัสดุอุปกรณ์ตามนี้ (คือตอนนี้แบบจริงที่ทำไว้ผมไม่มีแล้วนะครับแต่จะเขียนเป็น 3D ให้ทุกคนได้เห็นภาพว่าเป็นอย่างไร)


2 ต่อตาม Wiring Diagram ตามภาพข้างล่าง ในที่นี้ใครจะลองใช้ บอร์ดทดลอง ก่อนก็ได้ครับ
จาก Wiring Diagram เราจะเห็นว่า NODE MCU ESP 8266 พอร์ตinput /output ที่เราใช้ไปก็เกือบจะหมดแล้ว ดังนั้นวัตถุประสงค์ของผมที่จะใช้ ESP 8266 ตัวนี้ จะใช้เพื่อการ กดปุ่ม Reset board ESP 8266 ให้เริ่มทำงานใหม่ ,การกดปุ่ม AP Config เพื่อตั้งค่า SSID และ Password ของ WiFi ผ่าน ESP 8266 SERVER, หลอด LED ที่แสดงความแรงของสัญญาณ WiFi 3 ระดับ และหลอด LED ที่แสดงการเชื่อมต่อ blynk server ส่วนพอร์ตที่เหลือก็อาจจะใช้ต่อกับ temperature โมดุลได้ ก็แล้วแต่ความต้องการของเรา เพราะหลอด LED ที่แสดงสถานะเหล่านี้จะทำให้เราสามารถวิเคราะห์หาสาเหตุการทำงานผิดพลาดของ ESP 8266 ได้เช่นความแรงของสัญญาณ WiFi ถ้าหลอดไม่แสดงสถานะเลยหรือดับ ก็แสดงว่าสัญญาณ WiFi ไม่มาหรือไม่มี ซึ่งส่งผลทำให้สถานะของหลอด LED ที่เช็คการเชื่อมต่อไปยัง blynk Server ก็จะกระพริบด้วยหรือถ้าหลอดแสดงสถานะสัญญาณ WiFi ติดแต่หลอดแสดงสถานะของ blynk Server มีการกระพริบก็มีประเด็นการวิเคราะห์ได้ 2 แบบคือสัญญาณอินเทอร์เน็ตมีปัญหาหรือ การเชื่อมต่อระหว่าง ESP 8266กับ blynk Server ไม่สามารถเชื่อมต่อการทำงานได้ครับ ส่วนการควบคุมอุปกรณ์ต่างๆ ผมจะใช้วิธีการเชื่อมต่อผ่าน Serial Port เช่นถ้าผมต้องการจะควบคุมปิดเปิดการทำงานของอุปกรณ์ 4 ตัวหรือ 8 ตัวผมก็อาจจะต้องใช้ arduino uno R3 หรือ arduino Mega ซึ่งมีการรับส่งข้อมูลผ่าน Serial port นั่นเอง
ต่อไปก็จะเป็น code สำหรับ code ชุดนี้จะใช้ได้ทั้ง blynk Server ปกติและ blynk Server ของ oasiskit.com ครับ ในส่วน comment ที่อยู่ใน Code ผิดบ้างถูกบ้างอย่าว่ากันนะครับ ผมต้องบอกก่อนนะครับว่า code ชุดนี้ผมไม่ได้เขียนเอง มันอยู่ใน Git Hub อยู่แล้ว เพียงแต่เราเอาโค้ดมาทำความเข้าใจและปรับปรุงแก้ไขให้ได้ตามความต้องการของเราเท่านั้นเองครับ ในส่วนอื่นๆ ทุกๆท่าน สามารถที่จะแก้ไขโค้ดชุดนี้ได้และเพิ่มเติมเข้าไปเพื่อให้ตรงตามวัตถุประสงค์ของตัวเอง
Download code กันครับ

//*********************************************************************************************
//NodeMCU V2 จะมี LED อยู่ 2 ตัวคือบนชิพ ESP8266 (D4) และบนบอร์ด (D0)
//NodeMCU V3 จะมี LED อยู่ 1 ตัวคือบนชิพ ESP8266 (D4) ซึ่งไม่มีบนบอร์ดเหมือน V2
//เลือกบอร์ดเป็น NodeMCU 1.0 ความเร็วอัพโหลดจะเป็น 115200 และ LED_BUILTIN จะเป็น D0
//*********************************************************************************************


#include <ESP8266WiFi.h>                  //โหลดไลบารี่ ..มาใช้งาน                        //https://github.com/esp8266/Arduino
#include <ESP8266WebServer.h>             //โหลดไลบารี่ ..มาใช้งาน
#include <WiFiManager.h>                  //โหลดไลบารี่ ..มาใช้งาน                        //https://github.com/tzapu/WiFiManager
#include <FS.h>                           //โหลดไลบารี่ ..มาใช้งาน                        //this needs to be first, or it all crashes and burns...
#include <DNSServer.h>                    //โหลดไลบารี่ ..มาใช้งาน
#include <ArduinoJson.h>                  //โหลดไลบารี่ ..มาใช้งาน                        //https://github.com/bblanchon/ArduinoJson
#include <BlynkSimpleEsp8266.h>           //โหลดไลบรารี่ของ BLYNK ..มาใช้งาน


//**********************************************************************************************************

#define BLYNK_DEBUG
#define BLYNK_PRINT Serial        // Comment this out to disable prints and save space
#define D0 16                     // ใช้ไฟ LED สีฟ้า ของบอร์ด MCU ESP8266 ให้มีสัญญาณไฟกระพริบ ตาม Code ที่เขียน
#define D6 12                     // ใช้เป็นปุ่มกด เพื่อเข้า AP Config ได้ตามความต้องการของผู้ใช้
#define D1 5



long rssi;
int rssiled;


#define D4 2
#define D5 14
#define D7 13



//-------------------------------------------------------------------------------------------------------------------------------------------

int blynkIsDownCount = 0;                                     //Integer Variable ตัวแปรชื่อ blynkIsDownCount ใช้เก็บเลขจำนวนเต็ม โดยเริ่มต้นให้มีค่า = 0
char blynk_token[34] = "OUoATnGCbV229TqtcE6PVW6xxxp8feTr";    //ใส่ Blynk token ของเราที่ Blynk ส่งมาทาง Email ตอนที่เรา Create Project ใหม่
//Character Variable ตัวแปรที่ใช้เก็บอักขระ
bool shouldSaveConfig = false;

//-------------------------------------------------------------------------------------------------------------------------------------------

BlynkTimer timer;  //เรียกใช้การตั้งเวลาของ Blynk
//ฟังชั่นเปิดใช้งาน BlynkTimer ซึ่งทำหน้าที่คล้าย ๆ interrupt timer หมายถึงเมื่อครบเวลาตามที่กำหนดไว้โปรแกรมหลักจะกระโดด
//ไปทำงานในโปรแกรมตอบสนองที่กำหนดไว้
//กรณีนี้จะนำฟังชั่นที่เปิดใช้งาน BlynkTimer ไปใช้ในการ เชื่อมต่อซ้ำ (reconnecting)
//โดยรูปแบบคำสั่ง คือ timer.setInterval(30000L, reconnecting); อยู่ใน void setup

//-------------------------------------------------------------------------------------------------------------------------------------------


//callback notifying us of the need to save config
void saveConfigCallback () {
  Serial.println("Should save config");
  shouldSaveConfig = true;
}

//***********สำหรับ Blynk Server ของ https://eleceasy.com/   ที่แจกให้ เพิ่ม **** แค่ 2 บรรทัดนี้
char server[] = "oasiskit.com";
int port = 8080;   
//***************************************************************




//*****************************************************************************************************
//*******************************       void setup        *********************************************
//*****************************************************************************************************

void setup() {

  //****************************************************************************************************

  pinMode(D6, INPUT);//กำหนดโหมดใช้งานให้กับขา D6 เป็นขา กดปุ่ม ค้าง เพื่อตั้งค่า AP config
  pinMode(D0, OUTPUT);//กำหนดโหมดใช้งานให้กับขา D0 เป็นขา สัญญาณไฟ ในสภาวะต่างๆ
  digitalWrite(D0, LOW);//ให้หลอด LED สีฟ้าดับก่อน
  pinMode(D4, OUTPUT);
  pinMode(D5, OUTPUT);
  pinMode(D7, OUTPUT);
  pinMode(D1, OUTPUT);

  digitalWrite(D1, LOW);
  digitalWrite(D4, LOW);
  digitalWrite(D5, LOW);
  digitalWrite(D7, LOW);
  //***************************************************************************************************

  Serial.begin(115200);
  Serial.println();//แสดงข้อความใน Serial Monitor


  //read configuration from FS json
  Serial.println("mounting FS...");//แสดงข้อความใน Serial Monitor

  if (SPIFFS.begin()) {
    Serial.println("mounted file system");//แสดงข้อความใน Serial Monitor

    if (SPIFFS.exists("/config.json")) {
      //file exists, reading and loading
      Serial.println("reading config file");//แสดงข้อความใน Serial Monitor
      File configFile = SPIFFS.open("/config.json", "r");

      if (configFile) {
        Serial.println("opened config file");
        size_t size = configFile.size();
        // Allocate a buffer to store contents of the file.
        std::unique_ptr<char[]> buf(new char[size]);

        configFile.readBytes(buf.get(), size);
        DynamicJsonBuffer jsonBuffer;
        JsonObject& json = jsonBuffer.parseObject(buf.get());
        json.printTo(Serial);
        if (json.success()) {
          Serial.println("\nparsed json");//แสดงข้อความใน Serial Monitor
          strcpy(blynk_token, json["blynk_token"]);

        } else {
          Serial.println("failed to load json config");//แสดงข้อความใน Serial Monitor
        }
      }
    }
  } else {
    Serial.println("failed to mount FS");//แสดงข้อความใน Serial Monitor
  }
  //end read

  //*************************   จบการ อ่าน  เขียนค่า WiFi + Password ]ลงใน Node MCU ESP8266   ***************









  //**************************        AP AUTO CONNECT   **************************************************

  WiFiManagerParameter custom_blynk_token("blynk", "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(saveConfigCallback);
  wifiManager.addParameter(&custom_blynk_token);

  for (int i = 5; i > 0; i--) {
    digitalWrite(D0, HIGH);
    delay(500);
    digitalWrite(D0, LOW);
    delay(500);
    Serial.print (String(i) + " ");//แสดงข้อความใน Serial Monitor



  }


  if (digitalRead(D6) == LOW) {
    digitalWrite(D0, LOW);
    Serial.println("Button Pressed");//แสดงข้อความใน Serial Monitor
    wifiManager.resetSettings();//ให้ล้างค่า SSID และ Password ที่เคยบันทึกไว้


    // wifiManager.autoConnect(); ใช้สร้างชื่อแอคเซสพอยต์อันโนมัติจาก ESP + ChipID

    if (!wifiManager.autoConnect("ตั้งค่า WiFi")) {
      Serial.println("failed to connect and hit timeout");//แสดงข้อความใน Serial Monitor
      delay(3000);
      //reset and try again, or maybe put it to deep sleep
      ESP.reset();
      delay(5000);

    }
  }



  Serial.println("connected........:)");//แสดงข้อความใน Serial Monitor
  strcpy(blynk_token, custom_blynk_token.getValue());


  //save the custom parameters to FS
  if (shouldSaveConfig) {
    Serial.println("saving config");//แสดงข้อความใน Serial Monitor
    DynamicJsonBuffer jsonBuffer;
    JsonObject& json = jsonBuffer.createObject();
    json["blynk_token"] = blynk_token;
    File configFile = SPIFFS.open("/config.json", "w");

    if (!configFile) {
      Serial.println("failed to open config file for writing");//แสดงข้อความใน Serial Monitor
    }
    json.printTo(Serial);
    json.printTo(configFile);
    configFile.close();
    //end save
  }

  //**************************    จบ    AP AUTO CONNECT   **************************************************




  Serial.println("local ip"); //แสดงข้อความใน Serial Monitor
  delay(100);
  Serial.println(WiFi.localIP());//แสดงข้อความใน Serial Monitor
  // Blynk.config(blynk_token);////เริ่มการเชื่อมต่อ Blynk Server   *********สำหรับ Blynk Server ปกติ ใช้ตัวนี้ ไม่ต้องใส่  , server, port
  Blynk.config(blynk_token, server, port);////เริ่มการเชื่อมต่อ Blynk Server     *********สำหรับ Server local ที่แจกให้เราเพิ่ม      , server, port  เข้าไปแค่นี้จบ



  timer.setInterval(30000L, reconnecting);  //Function reconnect
  //ตั้งเวลาส่งข้อมูลให้ Blynk Server ทุกๆ 30 วินาที
  //มาจากฟังชั่นเปิดใช้งาน BlynkTimer ซึ่งทำหน้าที่คล้าย ๆ interrupt timer หมายถึงเมื่อครบเวลาตามที่กำหนดไว้โปรแกรมหลักจะกระโดดไปทำงานในโปรแกรมตอบสนองที่กำหนดไว้
  // (1) ชื่อออฟเจคไว้อ้างอิง (ผู้ใช้งานตั้งชื่อเองในที่นี้ตั้งคำว่า "timer")
  // (2) กำหนดค่าช่วงเวลาที่ให้บอร์ดกระโดดไปทำงานในโปรแกรมตอบสนอง ในที่นี้กำหนดเป็น 30000L หมายถึงให้บอร์ดมาทำงานในโปรแกรมตอบสนองทุก ๆ 30 วินาที
  // (3) ชื่อโปรแกรมตอบสนอง (ฟังก์ชั่นย่อย)  ในที่นี้ตั้งชื่อว่า reconnecting  ซึ่งบอร์ดจะวนมาทำงานฟังก์ชั่นชื่อนี้ทุก ๆ เวลาที่กำหนด (ทุกๆ 30 วินาที)



}


//*****************************************************************************************************
//*******************************     จบ  void setup        *********************************************
//*****************************************************************************************************









//*****************************************************************************************************
//*******************************     void loop       *************************************************

void loop() {


  //--------------------------------------------------------------------------------------------------------
  rssi = WiFi.RSSI();
  rssiled = ((((rssi * 100) / -127) - 100) * -1);
  //Blynk.virtualWrite(V5, ( ((rssi * 100) / -127) - 100) * -1);   // ทำให้เป็น % ความแรงของ WiFi จะดูง่ายกว่า


  //Serial.println(rssiled);
  if (rssiled >= 60  ) {
    digitalWrite(D7, HIGH);

  } else  {
    digitalWrite(D7, LOW);

  }

  if (rssiled >= 50  ) {
    digitalWrite(D5, HIGH);

  } else  {
    digitalWrite(D5, LOW);

  }

  if (rssiled >= 30  ) {
    digitalWrite(D4, HIGH);


  } else  {
    digitalWrite(D4, LOW);
  }


  //delay(50);
  yield();

  //--------------------------------------------------------------------------------------------------------



  //--------------------------------------------------------------------------------------------------------

  if (Blynk.connected())
  {
    Blynk.run();// ถ้าเชื่อมต่ Blynk Server ได้-----ไฟ LED สีน้ำเงินบนบอร์ด จะติดค้าง

    digitalWrite(D0, HIGH); //หลอด LED สีน้ำเงินที่ บอร์ด MCU esp8266 ติดค้างแสดงว่า WiFi ใช้งานได้



    //-----// ถ้าเชื่อมต่ Blynk Server ไม่ได้-----ไฟ LED สีน้ำเงินบนบอร์ด จะกระพริบ---------------------------------
    //----//หลอด LED สีแดงติดกระพริบแสดงว่ากำลังค้นหา WiFi ----------------------------------------------------

  } else {

    digitalWrite(D0, LOW);
    delay(200);
    digitalWrite(D0, HIGH);
    delay(100);

  }
  //--------------------------------------------------------------------------------------------------------

  timer.run();//ให้เวลาของ Blynk ทำงาน
  delay(100);

}

//*******************************   จบ  void loop     *************************************************
//*****************************************************************************************************




//--------------------------------------------------------------------------------------------------------
void reconnecting()
{
  if (!Blynk.connected())
  {
    blynkIsDownCount++;
    BLYNK_LOG("blynk server is down! %d  times", blynkIsDownCount);
    Blynk.connect(5000);
  }
}
//--------------------------------------------------------------------------------------------------------


BLYNK_CONNECTED()
{


  Blynk.syncAll();//ให้ซิงค์ข้อมูลทั้งหมดล่าสุดจาก Blynk Server
  Serial.println(".");//per debug  //แสดงข้อความใน Serial Monitor
}

และเมื่อเราอัพโหลด code เสร็จเรียบร้อยแล้วก็ทำการทดสอบได้เลย โดยใน code นี้ผมจะอธิบายเฉพาะจุดที่สำคัญนะครับ
1 char blynk_token[34] = “OUoATnGCbV229TqtcE6PVW6xxxp8feTr”; //ให้เรา Copy token มาใส่ใน Blynk token ของเราที่ Blynk หรือ ที่ทาง https://eleceasy.com/ ส่งมาทาง Email ตอนที่เรา Create Project ใหม่ใน App Blynk ใน Smart phone ของเรา
2 for (int i = 5; i > 0; i–) {
digitalWrite(D0, HIGH);
delay(500);
digitalWrite(D0, LOW);
delay(500);
Serial.print (String(i) + " ");//แสดงข้อความใน Serial Monitor
ค่า i ที่มีค่าเท่ากับ 5 ตรงนี้เมื่อมีไฟจ่ายเข้า ESP 8266 แล้วเมื่อมันทำงาน มันจะนับเวลาไป 5 วินาที ตัวเลขนี้ถ้าเราต้องการให้เร็วหรือช้าก็เปลี่ยนค่าได้เลย สำหรับเหตุผลที่มีตรงจุดนี้ก็เพื่อที่จะให้ผู้ใช้งานสามารถที่จะกดปุ่ม AP Config ค้างไว้ได้ภายในระยะเวลาที่เรากำหนดไว้เองแต่ถ้าเลยจากเวลาที่กำหนดไปแล้วมันจะเข้าไปเชื่อมต่อ SSID และ Password ของ WiFi ที่เราตั้งค่าเอาไว้ แต่ถ้าเรากดปุ่มนี้ไม่ทันก็ให้กดปุ่ม Reset 1 ครั้ง ESP 8266 จะทำงานใหม่โดยนับไปอีก 5 วินาทีช่วงนี้ให้เรากดปุ่ม AP Config ค้างไว้ได้เลย โดย LED ที่ต่อกับ D0 จะสว่างติดค้างเอาไว้ เพื่อทำให้เรารู้ว่าปุ่ม AP Config ที่เรากดค้างเอาไว้สามารถที่จะใช้งานได้แล้ว
จากนั้นถ้าคอมพิวเตอร์ของเราสามารถรับสัญญาณ WiFi ได้ก็ให้เปิดสัญญาณ WiFi ออกมาเราจะพบว่ามีชื่อของสัญญาณ WiFi ที่ออกมาจาก EP8226 เพื่อตั้งค่า SSID และ Password และ blynk_token ผ่าน IP Address 192.168.4.1 และในขั้นตอนนี้เราสามารถที่จะใช้สมาร์ทโฟนตั้งค่าได้เช่นกัน
11

3 if (!wifiManager.autoConnect(“ตั้งค่า WiFi”)) {
Serial.println(“failed to connect and hit timeout”);//แสดงข้อความใน Serial Monitor
delay(3000);
//reset and try again, or maybe put it to deep sleep
ESP.reset();
delay(5000);
เราสามารถที่จะเปลี่ยนชื่อ AP Config ที่โชว์ในรายชื่อของ WiFi ได้เดิมผมตั้งให้เป็น ตั้งค่า WiFi ชื่อนี้สามารถเปลี่ยนเป็นของเราได้ครับ

4 rssi = WiFi.RSSI();
rssiled = ((((rssi * 100) / -127) - 100) * -1);
//Blynk.virtualWrite(V5, ( ((rssi * 100) / -127) - 100) * -1); // ทำให้เป็น % ความแรงของ WiFi จะดูง่ายกว่า
ในส่วนเรื่องของ LED ที่แสดงสถานะของสัญญาณ WiFi 3 ระดับ ผมจะใช้คำสั่ง WiFi.RSSI ครับ จากนั้นก็ทำการแปลงค่าให้อยู่ในรูปแบบของเปอร์เซ็นต์เพื่อให้ดูง่ายขึ้นโดยระดับของสัญญาณนั้นถ้าหลอดที่ 1 ติดแสดงว่าระดับความแรงของสัญญาณ WiFi ที่ได้รับมาคือ 30% แต่ถ้าหลอดที่ 2 ติดหลอดที่ 1 ก็จะติดด้วยคือเราจะรู้ว่า ถ้าหลอด 2 หลอดติดแสดงว่าความแรงของสัญญาณ WiFi มา 50% และถ้าหลอดที่ 3 ติด หลอดที่ 1 และ 2 ก็จะติดด้วยสรุปก็คือติดทั้ง 3 หลอดหมายถึงความแรงของสัญญาณ WiFi อยู่ที่ 60% ครับ ส่วนตรงนี้ทุกท่านสามารถที่จะแก้ไขเปลี่ยนแปลงเพิ่มเติมได้นะครับ code ชุดนี้ สามารถใช้ในเชิงพาณิชย์ได้ครับ

1 Like

ถ้าบางส่วนเป็นโค้ตทำให้ดูง่ายแบบนี้ครับ

ขอบคุณที่แนะนำครับ แล้วถ้าเป็น ไฟล์ Video ละครับ

เนื่องจากไฟล์ วีดีโอ เป็นไฟล์ใหญ่ หากอัพโหลดเข้าไปไว้บนเว็บ อาจทำให้เว็บช้า เลยเลือกใช้เป็นการอัพเข้า youtube แล้วเอามาแปะครับแบบนี้

ไฟล์ 3D ก็สามารถนำมาใส่ได้เหมือนกันครับ เวลาเราคุยปัญหาเรื่อง ใดๆ จะทำให้เห็นภาพมากขึ้น

แม้แต่ ซิมวงจร ก็เอามาวางแล้วซิมดูค่าได้เลย ตอนนี้กำลังดีลอยู่ครับ

อธิบายการทำงาน
อธิบายการทำงาน 4 สถานะด้วยกันดังนี้

  1. Modem Router ทำงาน Node MCU esp 8266 ทำงาน
    image
    สำหรับกรณีนี้จะเป็นกรณีแรกสุดที่จะต้องเป็นไปได้เสมอคือ Modem Router ทำงาน และ Node MCU esp 8266 ทำงาน

  2. Modem Router ทำงาน Node MCU esp 8266 ไม่ทำงาน
    image
    ในกรณีนี้ Node MCU esp 8266 ไม่ทำงาน หมายถึง
    2.1 การถอดปลั๊กจ่ายไฟเลี้ยง Node MCU esp 8266 ออก และเสียบปลั๊กจ่ายไฟเข้าไปใหม่
    2.2 การถอดปลั๊กจ่ายไฟเลี้ยง Node MCU esp 8266 ออกจากที่เดิม และย้ายไปเสียบปลั๊กในที่ใหม่ แต่ยังอยู่ในรัศมีการจ่ายของ WiFi (Modem Router) ตัวเดิม
    การทำงาน เมื่อเสียบปลั๊กจ่ายไฟเลี้ยง เข้าไปใหม่ Node MCU esp 8266 ค้นหา WiFi และนำค่า ssid และ password ที่ได้รับจากการ Auto Config ครั้งแรก นำมาใช้ในการเชื่อมต่อ WiFi และถ้าเชื่อมต่อสำเร็จก็จะเข้าสู่สภาวะการทำงานปกติ แต่ถ้าเชื่อมต่อไม่สำเร็จ ก็จะทำการวนการเชื่อมต่อไปเรื่อยๆ จนกว่าจะสำเร็จ

  3. Modem Router ไม่ทำงาน Node MCU esp 8266 ทำงาน
    image

ในกรณีนี้ Modem Router ไม่ทำงาน หมายถึง

3.1 การถอดปลั๊กจ่ายไฟเลี้ยง Modem Router ออก และเสียบปลั๊กจ่ายไฟเข้าไปใหม่

3.2 การถอดปลั๊กจ่ายไฟเลี้ยง Modem Router ออกจากที่เดิม และย้ายไปเสียบปลั๊กในที่ใหม่ แต่ Node MCU esp 8266 ยังอยู่ในรัศมีการจ่ายของ WiFi (Modem Router) ตัวเดิม

การทำงาน เมื่อเสียบปลั๊กจ่ายไฟเลี้ยง เข้าไปใหม่ Modem Router จะเริ่มทำงานและจ่าย WiFi ออกมา ในขณะที่ Node MCU esp 8266 จะทำการวน การเชื่อมต่อ WiFi (Modem Router) ตัวเดิม ต่อไปเรื่อยๆ จนกว่าจะสำเร็จ

  1. Modem Router ไม่ทำงาน Node MCU esp 8266 ไม่ทำงาน

image
ในความหมายคือ
4.1 มีการถอดปลั๊กจ่ายไฟเลี้ยงออกทั้ง 2 อุปกรณ์ เพื่อย้ายตำแหน่งหรือถอดแล้วเสียบใหม่
4.2 ไฟดับและติดขึ้นมาใหม่
การทำงาน
สำหรับกรณีนี้ เมื่อไฟมา Modem Router จะทำงานก่อน โดยวินาทีที่ XX จะเริ่มปล่อยสัญญาณ WiFi ออกมา ในขณะเดียวกัน Node MCU esp 8266 จะหน่วงเวลาไว้ XX (ตามเวลาที่กำหนดใน code) วินาทีเช่นกัน เพื่อให้ Modem Router ทำงานและปล่อยสัญญาณ WiFi ออกมา และก่อนเมื่อครบ XX วินาที จึงเริ่มทำงานโดยการค้นหาตัว WiFi โดยดึงค่า ssid และ password ที่ได้รับจากการทำ Auto Config ครั้งแรก นำมาเชื่อมต่อวนซ้ำๆกัน จนกว่าจะเชื่อมต่อสำเร็จ ถ้าเชื่อมต่อไม่สำเร็จก็จะมีการวนซ้ำไปเรื่อยๆ จนกว่าจะมีการเชื่อมต่อสำเร็จ

1 Like

3D บอร์ด ในกระทู้นี้ใช้อะไรเขียนครับ

ผมใช้โปรแกรม sketchup ในการออกแบบครับ เหตุผลที่ใช้ก็คือเราสามารถที่จะรู้จำนวนอุปกรณ์ที่เราต้องใช้พร้อมทั้งขนาดในการที่จะนำไป หาขนาดของเคสที่จะมาใส่อุปกรณ์ใน Project เรา ได้อย่างถูกต้องมีความคลาดเคลื่อนน้อยที่สุด ผมจะทำในลักษณะที่คล้ายๆกับ กระทู้ การใช้ SketchUp ในการออกแบบอุปกรณ์ +ตู้Control +ดึงราคาอุปกรณ์ลง Excel เพื่อทำใบขอราคา เพียงแต่เปลี่ยนลักษณะรูปแบบงานเท่านั้นเอง อ้อ ลืมไปครับในส่วนโปรแกรม sketchup จะมี component ให้เราเก็บอุปกรณ์ที่เราต้องใช้งานบ่อยๆเอาไว้ และสามารถดึงเอามาใช้ได้เลย ซึ่งตอนนี้ผมเก็บรวบรวมเอาไว้ได้ในระดับนึงถ้าสนใจผมจะทำลิ้งโหลดให้นะครับ



สำหรับในความคิดผมเองก็คือการพัฒนาในเรื่องของ Product โดยเฉพาะงาน Micro Controller ที่ทำให้เป็นรูปธรรมจริงๆนั้นหาค่อนข้างที่จะยากเนื่องจากว่าเทคโนโลยีในการผลิตภายในประเทศของเรายังไม่หลากหลายจึงทำให้ต้นทุนในการผลิตค่อนข้างมีราคาสูง ดังนั้นทำให้โอกาสในการประกอบธุรกิจเองจึงเป็นไปด้วยความยุ่งยากและล่าช้า ทำให้บริษัทที่มีทุนมากกว่านำไอเดียที่ได้ไปผลิตและจำหน่ายในราคาทุนที่ต่ำกว่าเรา

1 Like

โอโห้ ช่วงนี้ผมกำลังจะจับ ซอฟแวร์สักตัวเพื่อทำโปรเจค แล้วก็เอาไว้ทำรีวิวในเว็บให้เห็นภาพมากขึ้น มีเวลาผมรออ่าน กระทู้แนะนำเกี่ยวกับการใช้งาน โปรแกรม sketchup นะครับ ขอบคุณครับ :smiley:

1 Like


เพราะโดยส่วนใหญ่ผมจะเขียนงาน Stage เป็นหลัก

1 Like

เอาตามที่พี่รู้เลยครับ เน้นไปทางการทำตู้ควบคุม และการจัดการ ไมโครคอนโทรลเลอร์อย่างที่พี่ได้เกรินไว้ข้างต้น อย่างเช่น ทริกในการบริหารจัดการอุปกรณ์ พอผมได้คอนเซบ ผมจะเอามาต่อยอด ออกเป็นเนื้อหาอื่นๆ ต่อไปครับ ผิด ถูก ไม่ได้ซีเรียสนะครับ เน้นลงมือทำ ช่วยๆ กันครับ 55

1 Like

ได้ครับ https://eleceasy.com นี่ OK จริงๆ ยังไงผิดถูกก็ช่วยกันแก้ไข นะครับ ในเรื่องของงาน มีแค่ รู้ กับไม่รู้ เท่านั้นครับ

UPDATE Wiring diagram NODE MCU ESP 8266 + AP CONFIG แบบกดปุ่มตั้งค่า + Blynk SERVER
ประกอบด้วย

  1. แสดงสถานะ ระดับสัญญาณ WiFi
  2. แสดงสถานะ inter net ว่า ON หรือ OFF แบบง่าย
  3. แสดงสถานะการเชื่อมต่อ Blynk Server
  4. ปุ่มกด AP Config ตั้งค่า การเชื่อมต่อ WiFi
  5. ปุ่มกด Reset MCU เพื่อเริ่มทำงานใหม่
1 Like
//*********************************************************************************************
//NodeMCU V2 จะมี LED อยู่ 2 ตัวคือบนชิพ ESP8266 (D4) และบนบอร์ด (D0)
//NodeMCU V3 จะมี LED อยู่ 1 ตัวคือบนชิพ ESP8266 (D4) ซึ่งไม่มีบนบอร์ดเหมือน V2
//เลือกบอร์ดเป็น NodeMCU 1.0 ความเร็วอัพโหลดจะเป็น 115200 และ LED_BUILTIN จะเป็น D0
//*********************************************************************************************


#include <ESP8266WiFi.h>                  //โหลดไลบารี่ ..มาใช้งาน                        //https://github.com/esp8266/Arduino
#include <ESP8266WebServer.h>             //โหลดไลบารี่ ..มาใช้งาน
#include <WiFiManager.h>                  //โหลดไลบารี่ ..มาใช้งาน                        //https://github.com/tzapu/WiFiManager
#include <FS.h>                           //โหลดไลบารี่ ..มาใช้งาน                        //this needs to be first, or it all crashes and burns...
#include <DNSServer.h>                    //โหลดไลบารี่ ..มาใช้งาน
#include <ArduinoJson.h>                  //โหลดไลบารี่ ..มาใช้งาน                        //https://github.com/bblanchon/ArduinoJson
#include <BlynkSimpleEsp8266.h>           //โหลดไลบรารี่ของ BLYNK ..มาใช้งาน



//------------------------------------------------------------------------------------------------

#define BLYNK_DEBUG
#define BLYNK_PRINT Serial        // Comment this out to disable prints and save space
#define D0 16                     // ใช้ไฟ LED สีฟ้า ของบอร์ด MCU ESP8266 ให้มีสัญญาณไฟกระพริบ ตาม Code ที่เขียน
#define D3 0                     // ใช้เป็นปุ่มกด เพื่อเข้า AP Config ได้ตามความต้องการของผู้ใช้

#define D7 13                     //เชคสัญญาณ Internet เชคระดับสัญญาณ WiFi

#define D4 2                     //เชคระดับสัญญาณ WiFi 0-30%
#define D5 14                    //เชคระดับสัญญาณ WiFi >=50%
#define D6 12                    //เชคระดับสัญญาณ WiFi >=60%


//------------------------------------------------------------------------------------------------
long rssi;
int rssiled;
//------------------------------------------------------------------------------------------------


//LED แสดงสถานะ Internet โดยแนวคิดคือ วนลูป loop ให้ ESP8266 ติดต่อ www.google.co.th ไปเรื่อยๆ LED ก็จะติด แสดงว่า Internet มา
const char* host = "www.google.co.th";    //ต้องการให้ส่งการติดต่อไปยัง Website นี้


//-------------------------------------------------------------------------------------------------------------------------------------------

int blynkIsDownCount = 0;                                     //Integer Variable ตัวแปรชื่อ blynkIsDownCount ใช้เก็บเลขจำนวนเต็ม โดยเริ่มต้นให้มีค่า = 0
char blynk_token[34] = "4562002066be4943xxx9f7exxx6d27a4";    //ใส่ Blynk token ของเราที่ Blynk ส่งมาทาง Email ตอนที่เรา Create Project ใหม่
//Character Variable ตัวแปรที่ใช้เก็บอักขระ
bool shouldSaveConfig = false;

//-------------------------------------------------------------------------------------------------------------------------------------------

BlynkTimer timer;  //เรียกใช้การตั้งเวลาของ Blynk
//ฟังชั่นเปิดใช้งาน BlynkTimer ซึ่งทำหน้าที่คล้าย ๆ interrupt timer หมายถึงเมื่อครบเวลาตามที่กำหนดไว้โปรแกรมหลักจะกระโดด
//ไปทำงานในโปรแกรมตอบสนองที่กำหนดไว้
//กรณีนี้จะนำฟังชั่นที่เปิดใช้งาน BlynkTimer ไปใช้ในการ เชื่อมต่อซ้ำ (reconnecting)
//โดยรูปแบบคำสั่ง คือ timer.setInterval(30000L, reconnecting); อยู่ใน void setup

//-------------------------------------------------------------------------------------------------------------------------------------------


//callback notifying us of the need to save config
void saveConfigCallback () {
  Serial.println("Should save config");
  shouldSaveConfig = true;
}
//-------------------------------------------------------------------------------------------------------------------------------------------


//***********สำหรับ Server local ที่แจกให้ เพิ่ม **** แค่ 2 บรรทัดนี้
char server[] = "oasiskit.com";
int port = 8080;
//***************************************************************



//*****************************************************************************************************
//*******************************       void setup        *********************************************
//*****************************************************************************************************

void setup() {

  //****************************************************************************************************

  pinMode(D0, OUTPUT);//กำหนดโหมดใช้งานให้กับขา D0 เป็นขา สัญญาณไฟ ในสภาวะต่างๆ
  pinMode(D3, INPUT_PULLUP);//กำหนดโหมดใช้งานให้กับขา D3 เป็นขา กดปุ่ม ค้าง เพื่อตั้งค่า AP config
  pinMode(D4, OUTPUT);
  pinMode(D5, OUTPUT);
  pinMode(D6, OUTPUT);
  pinMode(D7, OUTPUT);

  // ให้ LED ทั้งหมดดับก่อน
  digitalWrite(D0, LOW);//ให้หลอด LED สีฟ้าดับก่อน
  digitalWrite(D4, LOW);
  digitalWrite(D5, LOW);
  digitalWrite(D6, LOW);
  digitalWrite(D7, LOW);

  //***************************************************************************************************

  Serial.begin(115200);

  //*************************    การ อ่าน  เขียนค่า WiFi + Password ]ลงใน Node MCU ESP8266   ************

  //read configuration from FS json
  Serial.println("mounting FS...");//แสดงข้อความใน Serial Monitor

  if (SPIFFS.begin()) {
    Serial.println("mounted file system");//แสดงข้อความใน Serial Monitor

    if (SPIFFS.exists("/config.json")) {
      //file exists, reading and loading
      Serial.println("reading config file");//แสดงข้อความใน Serial Monitor
      File configFile = SPIFFS.open("/config.json", "r");

      if (configFile) {
        Serial.println("opened config file");
        size_t size = configFile.size();
        // Allocate a buffer to store contents of the file.
        std::unique_ptr<char[]> buf(new char[size]);

        configFile.readBytes(buf.get(), size);
        DynamicJsonBuffer jsonBuffer;
        JsonObject& json = jsonBuffer.parseObject(buf.get());
        json.printTo(Serial);
        if (json.success()) {
          Serial.println("\nparsed json");//แสดงข้อความใน Serial Monitor
          strcpy(blynk_token, json["blynk_token"]);

        } else {
          Serial.println("failed to load json config");//แสดงข้อความใน Serial Monitor
        }
      }
    }
  } else {
    Serial.println("failed to mount FS");//แสดงข้อความใน Serial Monitor
  }
  //end read

  //*************************   จบการ อ่าน  เขียนค่า WiFi + Password ]ลงใน Node MCU ESP8266   ***************









  //**************************        AP AUTO CONNECT   **************************************************

  WiFiManagerParameter custom_blynk_token("blynk", "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(saveConfigCallback);
  wifiManager.addParameter(&custom_blynk_token);

  for (int i = 5; i > 0; i--) {
    digitalWrite(D0, HIGH);
    delay(500);
    digitalWrite(D0, LOW);
    delay(500);
    Serial.print (String(i) + " ");//แสดงข้อความใน Serial Monitor



  }


  if (digitalRead(D3) == LOW) {
    digitalWrite(D0, LOW);
    Serial.println("Button Pressed");//แสดงข้อความใน Serial Monitor
    wifiManager.resetSettings();//ให้ล้างค่า SSID และ Password ที่เคยบันทึกไว้


    // wifiManager.autoConnect(); ใช้สร้างชื่อแอคเซสพอยต์อันโนมัติจาก ESP + ChipID

    if (!wifiManager.autoConnect("PUYIOT AP CONFIG")) {
      Serial.println("failed to connect and hit timeout");//แสดงข้อความใน Serial Monitor
      delay(3000);
      //reset and try again, or maybe put it to deep sleep
      ESP.reset();
      delay(5000);

    }
  }



  Serial.println("connected........:)");//แสดงข้อความใน Serial Monitor
  strcpy(blynk_token, custom_blynk_token.getValue());


  //save the custom parameters to FS
  if (shouldSaveConfig) {
    Serial.println("saving config");//แสดงข้อความใน Serial Monitor
    DynamicJsonBuffer jsonBuffer;
    JsonObject& json = jsonBuffer.createObject();
    json["blynk_token"] = blynk_token;
    File configFile = SPIFFS.open("/config.json", "w");

    if (!configFile) {
      Serial.println("failed to open config file for writing");//แสดงข้อความใน Serial Monitor
    }
    json.printTo(Serial);
    json.printTo(configFile);
    configFile.close();
    //end save
  }

  //**************************    จบ    AP AUTO CONNECT   **************************************************




  Serial.println("local ip"); //แสดงข้อความใน Serial Monitor
  delay(100);
  Serial.println(WiFi.localIP());//แสดงข้อความใน Serial Monitor
  // Blynk.config(blynk_token);////เริ่มการเชื่อมต่อ Blynk Server แบบปกติ
  Blynk.config(blynk_token, server, port);
  ////เริ่มการเชื่อมต่อ Blynk Server*********สำหรับ Server local ที่แจกให้ เพิ่ม, server, port  แค่นี้จบ



  timer.setInterval(30000L, reconnecting);  //Function reconnect
  //ตั้งเวลาส่งข้อมูลให้ Blynk Server ทุกๆ 30 วินาที
  //มาจากฟังชั่นเปิดใช้งาน BlynkTimer ซึ่งทำหน้าที่คล้าย ๆ interrupt timer หมายถึงเมื่อครบเวลาตามที่กำหนดไว้โปรแกรมหลักจะกระโดดไปทำงานในโปรแกรมตอบสนองที่กำหนดไว้
  // (1) ชื่อออฟเจคไว้อ้างอิง (ผู้ใช้งานตั้งชื่อเองในที่นี้ตั้งคำว่า "timer")
  // (2) กำหนดค่าช่วงเวลาที่ให้บอร์ดกระโดดไปทำงานในโปรแกรมตอบสนอง ในที่นี้กำหนดเป็น 30000L หมายถึงให้บอร์ดมาทำงานในโปรแกรมตอบสนองทุก ๆ 30 วินาที
  // (3) ชื่อโปรแกรมตอบสนอง (ฟังก์ชั่นย่อย)  ในที่นี้ตั้งชื่อว่า reconnecting  ซึ่งบอร์ดจะวนมาทำงานฟังก์ชั่นชื่อนี้ทุก ๆ เวลาที่กำหนด (ทุกๆ 30 วินาที)







}


//*****************************************************************************************************
//*******************************     จบ  void setup        *********************************************
//*****************************************************************************************************









//*****************************************************************************************************
//*******************************     void loop       *************************************************

void loop() {

for (int i = 20; i > 0; i--) {
  //--------------------------------------------------------------------------------------------------------

  rssi = WiFi.RSSI();
  rssiled = ((((rssi * 100) / -127) - 100) * -1);// ทำให้เป็น % ความแรงของ WiFi จะดูง่ายกว่า
  //Blynk.virtualWrite(V5, ( ((rssi * 100) / -127) - 100) * -1);   // ทำให้เป็น % ความแรงของ WiFi จะดูง่ายกว่า

  //เชคระดับสัญญาณ WiFi >= 60%
  if (rssiled >= 60  ) {
    digitalWrite(D6, HIGH);

  } else  {
    digitalWrite(D6, LOW);

  }
  //เชคระดับสัญญาณ WiFi >= 50%
  if (rssiled >= 50  ) {
    digitalWrite(D5, HIGH);

  } else  {
    digitalWrite(D5, LOW);

  }
  //เชคระดับสัญญาณ WiFi 0-30%
  if (rssiled >= 30  ) {
    digitalWrite(D4, HIGH);


  } else  {
    digitalWrite(D4, LOW);
  }


  //delay(50);
  yield();

  //--------------------------------------------------------------------------------------------------------

//--------------------------------------------------------------------------------------------------------

if (Blynk.connected())
{
  Blynk.run();// ถ้าเชื่อมต่ Blynk Server ได้-----ไฟ LED สีน้ำเงินบนบอร์ด จะติดค้าง

  digitalWrite(D0, HIGH); //หลอด LED สีน้ำเงินที่ บอร์ด MCU esp8266 ติดค้างแสดงว่า WiFi ใช้งานได้



  //-----// ถ้าเชื่อมต่ Blynk Server ไม่ได้-----ไฟ LED สีน้ำเงินบนบอร์ด จะกระพริบ---------------------------------
  //----//หลอด LED สีแดงติดกระพริบแสดงว่ากำลังค้นหา WiFi ----------------------------------------------------

} else {

  digitalWrite(D0, LOW);
  delay(200);
  digitalWrite(D0, HIGH);
  delay(100);

}
//--------------------------------------------------------------------------------------------------------







timer.run();//ให้เวลาของ Blynk ทำงาน

delay(100);
}



//----------------------------------------------------------------------------------------------------------------------------
//เพื่อป้องกันไม่ให้ มีการติดต่อ ถี่เกินไป จะกำหนดให้ วน loop ปกติเป็นจำนวน n ครั้ง ตัวอย่าง i=100 จะวน 100 รอบปกติก่อน แล้วจึงมาที่  WiFiClient client; 1 ครั้ง
//Client เป็นการกำหนดให้ ESP8266 ทำหน้าที่เป็นเครื่องลูกข่าย โดยเชื่อมต่อไปยังเครื่องแม่ข่ายด้วยไอพีแอดเดรสและพอร์ตที่กำหนดไว้เพื่อขอใช้บริการนั้นๆ
//WiFiClient(); คือ การประกาศสร้าง object ของ WifiClient
//เป็นฟังก์ชั่นสำหรับสั่งให้ ESP8266 เชื่อมต่อกับ Server ด้วย URL และ Port
//host = สำหรับกำหนด URL ของ Server ที่ต้องการเชื่อมต่อ host
//port = สำหรับกำหนด Port ที่ Server เปิดรับอยู่ 80

  WiFiClient client;
  if (client.connect(host, 80))
  {
    //Serial.println("connected");
    digitalWrite(D7, HIGH);
    client.stop();
    delay(100);

  }
  else {
    //Serial.println("connection failed!");
    digitalWrite(D7, LOW);
    client.stop();
  }
  
  delay(100);
}

//*******************************   จบ  void loop     *************************************************
//*****************************************************************************************************









//--------------------------------------------------------------------------------------------------------
void reconnecting()
{
  if (!Blynk.connected())
  {
    blynkIsDownCount++;
    BLYNK_LOG("blynk server is down! %d  times", blynkIsDownCount);
    Blynk.connect(5000);
  }
}
//--------------------------------------------------------------------------------------------------------


BLYNK_CONNECTED()
{


  Blynk.syncAll();//ให้ซิงค์ข้อมูลทั้งหมดล่าสุดจาก Blynk Server
  //Serial.println(".");//per debug  //แสดงข้อความใน Serial Monitor
}

Code เอาไว้ลองใช้งานดูครับ

ต่อไป ถ้าเราจะเอาอุปกรณ์อะไรมาต่อ ก็เพิ่มลงไปใน Code ได้เลย จะเห็นว่า port GPIO เราใช้ไปเกือบหมดแล้ว ดังนั้น เราต้องใช้ PCF8574 GPIO Extender มาต่อขยาย Port อีกที จากนั้น เอาอุปกรณ์ Module มาลงเพิ่ม เข้าไป

คลิป อธิบาย

1 Like

พี่ใช้ โปรแกรมอะไร ออกแบบ ภาพครับ ดูโปรดีนะครับ 555

Power Point ครับ อิ…อิ…

ดูไม่ออกว่าเป็น Power Point เลยนะครับ สวยงาม และดูโปร เลยทีเดียว

อย่างนั้นเลยเหรอครับ ผมอยากสื่อให้มันดูง่าย นะครับ โปรแกรมอื่น ดูแล้ววิชาการมาก ผมพอดูออกนะ แต่เวลาผมจะเอามาสื่อ ก็อยากให้มันง่ายๆ ครับ
:grin:

ดูแล้วเข้าใจง่ายดีครับพี่ ผมส่วนมากใช้ไปเรื่อย กำลังมองหาโปรแกรมประจำ อยู่เหมือนกัน เอาไว้ ทำภาพประกอบบทความไว้ลงในเว็บ ครับ

1 Like

ภาพตรงส่วนนี้ ผมแนะนำพี่นิดนึง พี่จะเห็นว่าภาพที่พี่ลงนั้นตกขอบทางด้านขวาอยู่
พี่สามารถใช้ peview ลดขนาดลง จาก 100% เป็นสัก 75% มันจะดึงภาพให้พอดี ลองดูครับ

free
hit counter