การเช็คปริมาตรน้ำ ในถังเก็บน้ำแบบ 3 ระดับ ผ่านแอพพลิเคชั่น blynk

มันเซนเซอวัดความดันป่ะครับ ถ้าเราได้ค่าความดันมาเราก็อาจจะต้องเอาค่ามาคำนวณในสูตรอยู่ดีรึป่าว

อ่อประเด็นคือ ต้องการค่าปริมาตรน้ำจากการคำนวณที่เรียล มากๆ ก็อาจจะใช้ได้ ต้องมาเทสกันว่ามันจับความละเอียดได้ระดับไหนความดันน้ำน้อยๆ มันจับได้ไหม

image

รายละเอียดจากรูปบอกว่า วัดได้ ตั้งแต่ 0- (1.2Mpa) ถือว่าเยอะมากครับ แรงดันแค่ 3 bar ที่อัดอยู่ในท่อ ผมก็ถือว่าเยอะ แล้วครับ นี่ตั้ง 12 bar น่าสนใจครับ

ได้ไอเดียร์เพิ่มมาอีกหนึ่ง :grin:

ขอบคุณโครงงานดีๆ ที่มาแบ่งปันครับ

ขอเก็บงานไว้ก่อนครับ Project : เชคระดับน้ำ ผ่าน Blynk

.



จุดประสงค์
1.เช็คระดับน้ำ 3 ระดับ ผ่าน Application Blynk ได้ โดยจะบอกปริมาตรน้ำในระดับต่างๆ ที่มาจากการป้อนค่าขนาดของถัง เก็บน้ำที่ใช้อยู่ภายในบ้าน
2. มี panel Monitor โดยมีรายละเอียดดังนี้ ในกรณีที่ไม่ได้ดูจาก Application blynk
2.1 มีหลอดไฟ LED แสดงสถานะของระดับน้ำ และแสดงสถานะของการทำงานของปั๊ม
2.2 มีหลอดไฟแสดงแอลอีดี สีเขียวคือ Normal สีแดงกระพริบคือ abnormal


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

อยากได้ประมาณนี้ ข้อสำคัญ Tesl Level Switch ให้ผ่านก่อน ว่ามันเซคระดับน้ำกับถังแบบนี้ได้หรือไม่

1 Likes

เริ่มทดสอบระบบเพื่อใช้งานจริง

112/1/2562 ติดตั้งระบบควบคุมที่บ้าน

ตอนนี้ ทดสอบระบบแล้วใช้งานได้ ยังไม่เจอปัญหา ใดๆ ในการทำงานครับ

Code ใช้งานจริง

//I2C device found at address 0x38  ! pcf8574_1(0x38)

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


#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 ..มาใช้งาน

#include "PCF8574.h"
PCF8574 pcf8574_1(0x38);
unsigned long timeElapsed;

#include <Scheduler.h>
//------------------------------------------------------------------------------------------------

#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 ได้ตามความต้องการของผู้ใช้

WidgetLED led_L1(V1); //LOW
WidgetLED led_L2(V2);//Meduim
WidgetLED led_L3(V3);//HIGH
WidgetLED led_pump(V4);
#define D7 13 //Pump Run


int blynkIsDownCount = 0;                                     //Integer Variable ตัวแปรชื่อ blynkIsDownCount ใช้เก็บเลขจำนวนเต็ม โดยเริ่มต้นให้มีค่า = 0
char blynk_token[34] = "E9mCvt31UyVVlNF_RA8P0uXuRCgpQerq";    //ใส่ 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;
//***************************************************************
float stepValue1;
float stepValue2;
float areatank;
float r;
float volumetank;




float stepValue3;
float volumetank3;
float stepValue4;
float volumetank4;
float stepValue5;
float volumetank5;



#define D4 2   //LOW
#define D5 14  //Meduim
#define D6 12  // HIGH










//คำนวณพื้นที่ก้นถัง จากเส้นรอบวงถัง
//------------------------------------------------------------------------------------------------------------------------//
BLYNK_WRITE(V10) {
  //  param.asInt()   param.asFloat()
  switch (param.asInt()) {
    case 0:
      Blynk.virtualWrite(V20, param.asFloat() );
      stepValue1 = param.asFloat();
      r = stepValue1 / 6.2857;
      areatank = 3.1428 * r * r;
      Blynk.virtualWrite(V22, areatank );


      break;
    case 1:
      Blynk.virtualWrite(V20, param.asFloat() );
      stepValue1 = param.asFloat();
      r = stepValue1 / 6.2857;
      areatank = 3.1428 * r * r;
      Blynk.virtualWrite(V22, areatank );

      break;
    case 2:
      Blynk.virtualWrite(V20, param.asFloat() );
      stepValue1 = param.asFloat();
      r = stepValue1 / 6.2857;
      areatank = 3.1428 * r * r;
      Blynk.virtualWrite(V22, areatank );

      break;
    case 3:
      Blynk.virtualWrite(V20, param.asFloat() );
      stepValue1 = param.asFloat();
      r = stepValue1 / 6.2857;
      areatank = 3.1428 * r * r;
      Blynk.virtualWrite(V22, areatank );

      break;
    case 4:
      Blynk.virtualWrite(V20, param.asFloat() );
      stepValue1 = param.asFloat();
      r = stepValue1 / 6.2857;
      areatank = 3.1428 * r * r;
      Blynk.virtualWrite(V22, areatank );

      break;
    case 5:
      Blynk.virtualWrite(V20, param.asFloat() );
      stepValue1 = param.asFloat();
      r = stepValue1 / 6.2857;
      areatank = 3.1428 * r * r;
      Blynk.virtualWrite(V22, areatank );

      break;
    case 6:
      Blynk.virtualWrite(V20, param.asFloat() );
      stepValue1 = param.asFloat();
      r = stepValue1 / 6.2857;
      areatank = 3.1428 * r * r;
      Blynk.virtualWrite(V22, areatank );

      break;
    case 7:
      Blynk.virtualWrite(V20, param.asFloat() );
      stepValue1 = param.asFloat();
      r = stepValue1 / 6.2857;
      areatank = 3.1428 * r * r;
      Blynk.virtualWrite(V22, areatank );

      break;
    case 8:
      Blynk.virtualWrite(V20, param.asFloat() );
      stepValue1 = param.asFloat();
      r = stepValue1 / 6.2857;
      areatank = 3.1428 * r * r;
      Blynk.virtualWrite(V22, areatank );

      break;
    case 9:
      Blynk.virtualWrite(V20, param.asFloat() );
      stepValue1 = param.asFloat();
      r = stepValue1 / 6.2857;
      areatank = 3.1428 * r * r;
      Blynk.virtualWrite(V22, areatank );

      break;
    case 10:
      Blynk.virtualWrite(V20, param.asFloat() );
      stepValue1 = param.asFloat();
      r = stepValue1 / 6.2857;
      areatank = 3.1428 * r * r;
      Blynk.virtualWrite(V22, areatank );

      break;
  }
}
//คำนวณปริมาตรน้ำทั้งหมดของถัง
BLYNK_WRITE(V11) {
  // receive the step value as param.asInt() and then use switch to run different code
  switch (param.asInt()) {
    case 0:
      Blynk.virtualWrite(V21, param.asFloat() );
      stepValue2 = param.asFloat();
      volumetank = areatank * stepValue2;
      Blynk.virtualWrite(V16, volumetank );
      break;
    case 1:
      Blynk.virtualWrite(V21, param.asFloat() );
      stepValue2 = param.asFloat();
      volumetank = areatank * stepValue2;
      Blynk.virtualWrite(V16, volumetank );
      break;
    case 2:
      Blynk.virtualWrite(V21, param.asFloat() );
      stepValue2 = param.asFloat();
      volumetank = areatank * stepValue2;
      Blynk.virtualWrite(V16, volumetank );
      break;
    case 3:
      Blynk.virtualWrite(V21, param.asFloat() );
      stepValue2 = param.asFloat();
      volumetank = areatank * stepValue2;
      Blynk.virtualWrite(V16, volumetank );
      break;
    case 4:
      Blynk.virtualWrite(V21, param.asFloat() );
      stepValue2 = param.asFloat();
      volumetank = areatank * stepValue2;
      Blynk.virtualWrite(V16, volumetank );
      break;
    case 5:
      Blynk.virtualWrite(V21, param.asFloat() );
      stepValue2 = param.asFloat();
      volumetank = areatank * stepValue2;
      Blynk.virtualWrite(V16, volumetank );
      break;
    case 6:
      Blynk.virtualWrite(V21, param.asFloat() );
      stepValue2 = param.asFloat();
      volumetank = areatank * stepValue2;
      Blynk.virtualWrite(V16, volumetank );
      break;
    case 7:
      Blynk.virtualWrite(V21, param.asFloat() );
      stepValue2 = param.asFloat();
      volumetank = areatank * stepValue2;
      Blynk.virtualWrite(V16, volumetank );
      break;
    case 8:
      Blynk.virtualWrite(V21, param.asFloat() );
      stepValue2 = param.asFloat();
      volumetank = areatank * stepValue2;
      Blynk.virtualWrite(V16, volumetank );
      break;
    case 9:
      Blynk.virtualWrite(V21, param.asFloat() );
      stepValue2 = param.asFloat();
      volumetank = areatank * stepValue2;
      Blynk.virtualWrite(V16, volumetank );
      break;
    case 10:
      Blynk.virtualWrite(V21, param.asFloat() );
      stepValue2 = param.asFloat();
      volumetank = areatank * stepValue2;
      Blynk.virtualWrite(V16, volumetank );
      break;
  }
}

//คำนวณปริมาตรน้ำในระดับ LOW
BLYNK_WRITE(V12) {
  // receive the step value as param.asInt() and then use switch to run different code
  switch (param.asInt()) {
    case 0:
      Blynk.virtualWrite(V30, param.asFloat() );
      stepValue3 = param.asFloat();
      volumetank3 = areatank * stepValue3;

      break;
    case 1:
      Blynk.virtualWrite(V30, param.asFloat() );
      stepValue3 = param.asFloat();
      volumetank3 = areatank * stepValue3;

      break;
    case 2:
      Blynk.virtualWrite(V30, param.asFloat() );
      stepValue3 = param.asFloat();
      volumetank3 = areatank * stepValue3;

      break;
    case 3:
      Blynk.virtualWrite(V30, param.asFloat() );
      stepValue3 = param.asFloat();
      volumetank3 = areatank * stepValue3;

      break;
    case 4:
      Blynk.virtualWrite(V30, param.asFloat() );
      stepValue3 = param.asFloat();
      volumetank3 = areatank * stepValue3;

      break;
    case 5:
      Blynk.virtualWrite(V30, param.asFloat() );
      stepValue3 = param.asFloat();
      volumetank3 = areatank * stepValue3;

      break;

  }
}

//คำนวณปริมาตรน้ำในระดับ Medium
BLYNK_WRITE(V13) {
  // receive the step value as param.asInt() and then use switch to run different code
  switch (param.asInt()) {
    case 0:
      Blynk.virtualWrite(V31, param.asFloat() );
      stepValue4 = param.asFloat();
      volumetank4 = areatank * (stepValue3 + stepValue4) ;

      break;
    case 1:
      Blynk.virtualWrite(V31, param.asFloat() );
      stepValue4 = param.asFloat();
      volumetank4 = areatank * (stepValue3 + stepValue4) ;

      break;
    case 2:
      Blynk.virtualWrite(V31, param.asFloat() );
      stepValue4 = param.asFloat();
      volumetank4 = areatank * (stepValue3 + stepValue4) ;

      break;
    case 3:
      Blynk.virtualWrite(V31, param.asFloat() );
      stepValue4 = param.asFloat();
      volumetank4 = areatank * (stepValue3 + stepValue4) ;

      break;
    case 4:
      Blynk.virtualWrite(V31, param.asFloat() );
      stepValue4 = param.asFloat();
      volumetank4 = areatank * (stepValue3 + stepValue4) ;

      break;
    case 5:
      Blynk.virtualWrite(V31, param.asFloat() );
      stepValue4 = param.asFloat();
      volumetank4 = areatank * (stepValue3 + stepValue4) ;

      break;

  }
}


//คำนวณปริมาตรน้ำในระดับ High

BLYNK_WRITE(V14) {
  // receive the step value as param.asInt() and then use switch to run different code
  switch (param.asInt()) {
    case 0:
      Blynk.virtualWrite(V32, param.asFloat() );
      stepValue5 = param.asFloat();
      volumetank5 = areatank * (stepValue3 + stepValue4 + stepValue5);


      break;
    case 1:
      Blynk.virtualWrite(V32, param.asFloat() );
      stepValue5 = param.asFloat();
      volumetank5 = areatank * (stepValue3 + stepValue4 + stepValue5);

      break;
    case 2:
      Blynk.virtualWrite(V32, param.asFloat() );
      stepValue5 = param.asFloat();
      volumetank5 = areatank * (stepValue3 + stepValue4 + stepValue5);

      break;
    case 3:
      Blynk.virtualWrite(V32, param.asFloat() );
      stepValue5 = param.asFloat();
      volumetank5 = areatank * (stepValue3 + stepValue4 + stepValue5);

      break;
    case 4:
      Blynk.virtualWrite(V32, param.asFloat() );
      stepValue5 = param.asFloat();
      volumetank5 = areatank * (stepValue3 + stepValue4 + stepValue5);

      break;
    case 5:
      Blynk.virtualWrite(V32, param.asFloat() );
      stepValue5 = param.asFloat();
      volumetank5 = areatank * (stepValue3 + stepValue4 + stepValue5);

      break;

  }
}


//Generate Value หลังการกำหนดขนาด ถังเก็บน้ำ
BLYNK_WRITE(V19)
{
  int pinValue = param.asInt();
  if (pinValue == 1) {
    volumetank = areatank * stepValue2;
    Blynk.virtualWrite(V16, volumetank );
    volumetank3 = areatank * stepValue3 ;
    volumetank4 = areatank * (stepValue3 + stepValue4) ;
    volumetank5 = areatank * (stepValue3 + stepValue4 + stepValue5);
  }


  if (pinValue == 0) {

  }
}






class ctrlTask : public Task {
  protected:
    void setup() {

    }

    void loop() {

      int L1 = digitalRead(D4);
      int L2 = digitalRead(D5);
      int L3 = digitalRead(D6);

      //ระดับน้ำต่ำ  แจ้งเตือน
      if (L1 == 0 && L2 == 0 && L3 == 0) {
        Blynk.virtualWrite(V15, ((volumetank3 * 100) / volumetank5) / 2 );
        Blynk.virtualWrite(V24, "ระดับน้ำต่ำมาก!", "  \xF0\x9F\x98\xB1" );
        Blynk.virtualWrite(V23, "<", volumetank3 );
        led_L1.off();
        led_L2.off();
        led_L3.off();
        pcf8574_1.digitalWrite(P4, 1);
        pcf8574_1.digitalWrite(P3, 1);
        pcf8574_1.digitalWrite(P2, 1);


        pcf8574_1.digitalWrite(P0, 1);//normal
        pcf8574_1.digitalWrite(P1, 0);//Abnormal


        digitalWrite(D0, LOW);
        pcf8574_1.digitalWrite(P5, 0);//LL   on
        delay(1000);

        pcf8574_1.digitalWrite(P5, 1);//LL  off
        digitalWrite(D0, HIGH);


      }

      //ระดับน้ำต่ำ LOW
      if (L1 == 1 && L2 == 0 && L3 == 0) {
        Blynk.virtualWrite(V15, ((volumetank3 * 100) / volumetank5) );
        Blynk.virtualWrite(V24, "ระดับน้ำต่ำ", " \xF0\x9F\x98\x85" );
        Blynk.virtualWrite(V23, volumetank3 );
        led_L1.on();
        led_L2.off();
        led_L3.off();

        pcf8574_1.digitalWrite(P0, 1);//normal
        pcf8574_1.digitalWrite(P1, 0);//Abnormal

        pcf8574_1.digitalWrite(P4, 0);
        pcf8574_1.digitalWrite(P3, 1);
        pcf8574_1.digitalWrite(P2, 1);
        pcf8574_1.digitalWrite(P5, 1);//LL

      }


      //ระดับน้ำปานกลาง  Medium
      if (L1 == 1 && L2 == 1 && L3 == 0) {
        Blynk.virtualWrite(V15, ((volumetank4 * 100) / volumetank5) );
        Blynk.virtualWrite(V24, "ระดับน้ำครึ่งถัง!", " \xF0\x9F\x98\x8F" );
        Blynk.virtualWrite(V23, volumetank4 );
        led_L1.on();
        led_L2.on();
        led_L3.off();

        pcf8574_1.digitalWrite(P0, 0);//normal
        pcf8574_1.digitalWrite(P1, 1);//Abnormal
        pcf8574_1.digitalWrite(P4, 0);
        pcf8574_1.digitalWrite(P3, 0);
        pcf8574_1.digitalWrite(P2, 1);
        pcf8574_1.digitalWrite(P5, 1);//LL

      }




      //ระดับน้ำสูง  HIGH
      if (L1 == 1 && L2 == 1 && L3 == 1) {
        Blynk.virtualWrite(V15, ((volumetank5 * 100) / volumetank5) );
        Blynk.virtualWrite(V24, "ระดับน้ำเต็มถัง!", " \xF0\x9F\x98\x81" );
        Blynk.virtualWrite(V23, volumetank5 );
        led_L1.on();
        led_L2.on();
        led_L3.on();

        pcf8574_1.digitalWrite(P0, 0);//normal
        pcf8574_1.digitalWrite(P1, 1);//Abnormal
        pcf8574_1.digitalWrite(P4, 0);
        pcf8574_1.digitalWrite(P3, 0);
        pcf8574_1.digitalWrite(P2, 0);
        pcf8574_1.digitalWrite(P5, 1);//LL



      }



    }//Loop end

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


} ctrl_task;




class BlynkTask : public Task {
  protected:
    void setup() {

    }

    void loop() {

      int pumprun = digitalRead(D7);

      if (pumprun == 1 ) {

        led_pump.off();
        pcf8574_1.digitalWrite(P6, 1);

      }

      if (pumprun == 0) {


        led_pump.on();
        pcf8574_1.digitalWrite(P6, 0);

      }


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

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

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




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

      } else {

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

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



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

      delay(10);

    }//Loop end

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


} blynk_task;






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

void setup() {



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

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


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

  pinMode(D4, INPUT_PULLUP);//LOW Level
  pinMode(D5, INPUT_PULLUP);//MEDIUM Level
  pinMode(D6, INPUT_PULLUP);//HIGH  Level
  pinMode(D7, INPUT_PULLUP);//Pump run
  //pinMode(D8, OUTPUT);
  //***************************************************************************************************



  pcf8574_1.pinMode(P0, OUTPUT);
  pcf8574_1.pinMode(P1, OUTPUT);
  pcf8574_1.pinMode(P2, OUTPUT);
  pcf8574_1.pinMode(P3, OUTPUT);
  pcf8574_1.pinMode(P4, OUTPUT);
  pcf8574_1.pinMode(P5, OUTPUT);
  pcf8574_1.pinMode(P6, OUTPUT);



  Serial.begin(115200);
  pcf8574_1.begin();
  timeElapsed = millis();
  //ให้ OUTPUT ทุกตัวดับก่อนตอนเริ่มทำงาน
  pcf8574_1.digitalWrite(P0, 1);
  pcf8574_1.digitalWrite(P1, 1);
  pcf8574_1.digitalWrite(P2, 1);
  pcf8574_1.digitalWrite(P3, 1);

  pcf8574_1.digitalWrite(P4, 1);
  pcf8574_1.digitalWrite(P5, 1);
  pcf8574_1.digitalWrite(P6, 1);



  //*************************    การ อ่าน  เขียนค่า 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("ตั้งค่า SSID ถังน้ำ PUYIOT")) {
      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 วินาที)


  Scheduler.start(&blynk_task);
  Scheduler.start(&ctrl_task);
  Scheduler.begin();


}


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


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

void loop() {


}

//*******************************   จบ  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
}

Wiring Diagram

2 Likes