ตรวจสอบสภาพอากาศที่บ้าน ผ่าน Blynk

555 กล้อง DSLR ตัวแปลง DSLR to HDMI โต้ะ live ของครบแล้วนะครับ ทำขำๆ อาจจะมีแบบว่าสุดสัปห์ดา มา live รีวิว กระทู้ไหนน่าสดใจบ้าง สำหรับบางคนขี้เกียจอ่านนะครับ

ทำตามแล้ว ติดตรงนี้ แก้อย่างไรครับ

@yothin ใช้ NODE MCU ESP 8266 ใช่มั๊ยครับ
ผมใช้ Library ArduinoJson-5.13.3 นะครับ ให้ลองโหลด Version ลดลงมาที่ Version นี้นะครับ

ส่วนตัว Code ผมปรับปรุงใหม่ล่าสุด แก้ให้แล้วนะครับ Code ที่ Post เดิม ผมแก้ใหม่แล้วครับ

1

@PUYIOT ทำเป็น QRclone ไว้ก็ดีนะครับพี่

งานทุกอย่างในบ้านผมรวมอยู่ใน​ โปรเจคเดียวครับ​แยกแทป ใช้งานเอา​ ตอนนี้​1โปเจคผมใช้ esp8266.ไป​ ​5 ตัวแล้วครับ​ ถ้า​cloneไป​ จะได้รับทั้งหมดเลย ก็เลย capture แล้วอธิบายเอาครับ

1 Likes

อ่อ แสดงว่ามีหลาย Tab งั้นแสดง UI แบบนี้ก็เยี่ยมละครับพี่

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

//ใส่ Blynk token ของเราที่ Blynk ส่งมาทาง Email ตอนที่เรา Create Project ฺBlynk ใหม่กับทาง https://eleceasy.com ครับ

ถ้าใช้ code เดียวกับผม ลอง Copy ไปใส่ใหม่ดูครับ

class Task_5 : public Task {
  protected:
    void setup() { }


    void loop()  {


      h = dht.readHumidity();
      t = dht.readTemperature();
      if (isnan(h) || isnan(t)) {
        //Serial.println("Failed to read from DHT sensor!");
        return;
      }

      //      Serial.print("Humidity is: ");
      //      Serial.println(h);
      //
      Serial.print("Temperature is: ");
      Serial.println(t);


      Blynk.virtualWrite(V18, h);
      Blynk.virtualWrite(V17, t);


      if (tempMenu == 1) {


        if ( t > v6 && t <= v7 ) {
          Blynk.virtualWrite(V17, t);
          //Blynk.virtualWrite(V10, 1);
          digitalWrite(D8, HIGH);
          led_3.on();

        }
        else
        {
          Blynk.virtualWrite(V17, t);
          //Blynk.virtualWrite(V10, 0);
          digitalWrite(D8, LOW);
          led_3.off();
        }

      }



      if (humidMenu == 1) {


        if ( h > v4 && h <= v5 ) {
          Blynk.virtualWrite(V18, h);
          //Blynk.virtualWrite(V10, 1);
          digitalWrite(D8, HIGH);
          led_2.on();

        }

        else
        {
          Blynk.virtualWrite(V18, h);
          //Blynk.virtualWrite(V10, 0);
          digitalWrite(D8, LOW);
          led_2.off();
        }

      }
      delay(2000);



    }
} Task_5_task;

รายงานผลการทดสอบครับ ผ่านไปได้ประมาณ 3 เดือน ระบบยังทำงานปกติครับ

1 Likes

หน้าตาแอพหน้าใช้งานมากครับพี่

Update ฝากเก็บ ครับ Environment + thingspeak.com


#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 <Wire.h>
#include <ClosedCube_OPT3001.h>

ClosedCube_OPT3001 opt3001;

#define OPT3001_ADDRESS 0x44


#include <DHT.h>
#define DHTTYPE DHT21
#define DHTPIN  D6
DHT dht(DHTPIN, DHTTYPE);





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

#define BLYNK_DEBUG
#define BLYNK_PRINT Serial        // Comment this out to disable prints and save space
WidgetLED led_1(V52);  //แสดงสถานะ ติด 3 วินาที แล้วดับ ใช้ในการแสดง เมื่อกดปุ่มจาก App Blynk เพื่อมา Reset Node MCU ESP8266
WidgetLED led_2(V42);  //แสดงสถานะพัดลม  on/off
WidgetLED led_3(V43);  //แสดงสถานะพัดลม  on/off


#define D0 16                     // ใช้ไฟ LED สีฟ้า ของบอร์ด MCU ESP8266 ให้มีสัญญาณไฟกระพริบ ตาม Code ที่เขียน
#define D3 0                      // ใช้เป็นปุ่มกด เพื่อเข้า AP Config ได้ตามความต้องการของผู้ใช้
#define D8 15                     //พัดลมทำงาน เมื่อเกิดความชื้นเกิน 95%
#define D7 13                     //เชคสัญญาณจาก Microphone Soensor
//#define D5 14

//const int capteur_D = D5;





float h ;
float t ;
//--Humid Fan
int v4;
int v5;
//--Temp Fan
int v6;
int v7;
int tempMenu = 0;
int humidMenu = 0;

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


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

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

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

BlynkTimer timer;
//-------------------------------------------------------------------------------------------------------------------------------------------


//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;
//***************************************************************



//------------------------ ตั้งค่าการรีเซ็ตบอร์ดแบบอัตโนมัติ  โดยกำหนดค่าเป็นวินาที นาที ชั่วโมง 24 ชั่วโมง วันได้ ---------------------//

const long oneSecond  = 1000;               // 1000 มิลลิวินาที = 1 วินาทีเท่ากับ
const long oneMinute  = oneSecond * 60;     //    1 นาที     = 1 วินาที  x 60 วินาที
const long oneHour    = oneMinute * 60;     //    1 ชั่วโมง   = 1 นาที   x 60 นาที
const long oneDay     = oneHour * 24;       //    1 วัน      = 1 ชั่วโมง x 24 ชั่วโมง
const long twoDay     = oneDay * 2;         //    2 วัน      = 1 วัน    x 2 วัน
const long threeDay   = oneDay * 3;         //    3 วัน      = 1 วัน    x 3 วัน
const long fourDay    = oneDay * 4;         //    4 วัน      = 1 วัน    x 4 วัน
const long fiveDay    = oneDay * 5;         //    5 วัน      = 1 วัน    x 5 วัน
const long sixDay     = oneDay * 6;         //    6 วัน      = 1 วัน    x 6 วัน
const long sevenDay   = oneDay * 7;         //    7 วัน      = 1 วัน    x 7 วัน

//------------------------------------------------------------------------------------------------------------------------//
int timereset;
int BlynkresetMCU;
int light;
int rain;





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

BLYNK_WRITE(V50)// ตั้งเวลา Reset board mcu esp8266 ตามการป้อนค่าตัวเลข

{
  timereset = param.asInt();
  //Serial.println(timereset);
}

//------------------------------------------------------------------------------------------------------------------------//
BLYNK_WRITE(V51)//Reset board mcu esp8266 ภายใน 5 วินาที
{

  int pinValue = param.asInt();
  if (pinValue == 1) {
    BlynkresetMCU = 1;
  }
  if (pinValue == 0) {

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


BLYNK_WRITE(V6)// ตั้งค่า ความชื้น ให้พัดลมทำงาน

{
  v6 = param.asInt();

}

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


BLYNK_WRITE(V7)// ตั้งค่า อุณหภูมิ ให้พัดลมทำงาน

{
  v7 = param.asInt();

}

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

BLYNK_WRITE(V4)// ตั้งค่า ความชื้น ให้พัดลมทำงาน

{
  v4 = param.asInt();

}

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


BLYNK_WRITE(V5)// ตั้งค่า อุณหภูมิ ให้พัดลมทำงาน

{
  v5 = param.asInt();

}

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

//Timer selection  temp control option
BLYNK_WRITE(V2)
{

  int pinValue = param.asInt();
  if (pinValue == 1) {
    Blynk.virtualWrite(V8, 1); //temp menu
    tempMenu = 1;
    humidMenu = 0;
    led_2.off();

  }
  if (pinValue == 0) {
    Blynk.virtualWrite(V8, 0);//humidmenu
    tempMenu = 0;
    humidMenu = 1;
    led_3.off();
  }
}
//------------------------------------------------------------------------------------------------------------------------//



//ปุ่มเลือกเมนู
BLYNK_WRITE(V8) {


  int pinValue = param.asInt();
  if (pinValue == 1) {//ถ้าเลือก Temp Menu LED Humid จะต้อง Off

    tempMenu = 1;
    humidMenu = 0;
    led_2.off();//LED Humid Off

  }


  if (pinValue == 0) {//ถ้าเลือก Humid Menu LED Temp จะต้อง Off

    tempMenu = 0;
    humidMenu = 1;
    led_3.off();//LED Temp Off
  }

}








//------------------------------------------------------------------------------------------------------------------------//
//BLYNK_WRITE(V10)//สั่งให้ Relay ON/OFF
//{
//
//  int pinValue = param.asInt();
//  if (pinValue == 1) {
//    digitalWrite(D8, HIGH);
//  }
//  if (pinValue == 0) {
//    digitalWrite(D8, LOW);
//
//  }
//}
////------------------------------------------------------------------------------------------------------------------------//








class Task_1 : public Task {
  protected:
    void setup() { }


    void loop()  {

      int sensorValue = analogRead(A0);
      //Blynk.virtualWrite(V1, sensorValue);

      if (sensorValue >= 0 && sensorValue <= 512 )
      {
        Blynk.virtualWrite(V1, "\xF0\x9F\x8C\x82");
        Blynk.virtualWrite(V3, 0);
        //Blynk.virtualWrite(V1, "ฝนไม่ตก");
        rain = 0;//ฝนไม่ตก
        delay(10);
      }
      else
      {
        Blynk.virtualWrite(V1, "\xE2\x98\x94");
        //Blynk.virtualWrite(V1, "ฝนตก");
        Blynk.virtualWrite(V3, 5);
        rain = 1;//ฝนตก
        delay(10);
      }

      delay(1000);

    }
} Task_1_task;








class Task_2 : public Task {
  protected:
    void setup() {
      configureSensor();
      printResult("High-Limit", opt3001.readHighLimit());
      printResult("Low-Limit", opt3001.readLowLimit());
    }

    void loop()  {
      OPT3001 result = opt3001.readResult();
      printResult("OPT3001", result);
      delay(500);//เดิม
      delay(1000);//ใหม่
    }
    void configureSensor() {
      OPT3001_Config newConfig;

      newConfig.RangeNumber = B1100;
      newConfig.ConvertionTime = B0;
      newConfig.Latch = B1;
      newConfig.ModeOfConversionOperation = B11;

      OPT3001_ErrorCode errorConfig = opt3001.writeConfig(newConfig);
      if (errorConfig != NO_ERROR)
        printError("OPT3001 configuration", errorConfig);
      else {
        OPT3001_Config sensorConfig = opt3001.readConfig();

      }

    }

    void printResult(String text, OPT3001 result) {
      if (result.error == NO_ERROR) {
        //        Serial.print(text);
        //        Serial.print(": ");
        //        Serial.print(result.lux);
        //        Serial.println(" lux");
        Blynk.virtualWrite(V0, result.lux);
        //Blynk.virtualWrite(V41, (((result.lux * 100) / 83865.60)));
        //int LightValue = result.lux;
         light = map(result.lux, 0.01, 27000, 0, 100);
        //int light = map(result.lux,0.01, 83865.60, 0, 100);
        Blynk.virtualWrite(V41, light);

        //https://apps.timwhitlock.info/emoji/tables/unicode
        //"\xE2\x9B\x85"Sun behind
        //"\xE2\x98\x80" :black sun with rays
        //"\xE2\x98\x81" cloud
        //"\xF0\x9F\x8C\x9C"  last quarter moon with face

      }
      else {
        printError(text, result.error);
      }
      if (result.lux < 50 ) {
        Blynk.virtualWrite(V40,  "\xF0\x9F\x8C\x9C");//ดวงจันทร์
      }
      //if (result.lux > 50 and result.lux <= 1000) {
      if (result.lux > 50 and result.lux <= 3500) {
        Blynk.virtualWrite(V40,  "\xE2\x98\x81");//มีเมฆ
      }
      //if (result.lux > 1000 and result.lux <= 10000 ) {
      if (result.lux > 3500 and result.lux <= 9000 ) {
        Blynk.virtualWrite(V40,  "\xE2\x9B\x85");//ดวงอาทิตย์ซ่อนหลังเมฆ
      }

      if (result.lux > 9000 and result.lux <= 13000 ) {
        Blynk.virtualWrite(V40,  "\xE2\x98\x80");//ดวงอาทิตย์ส่องเต็ม

      }


      if (result.lux > 13000 and result.lux <= 27000 ) {
        Blynk.virtualWrite(V40,  "\xE2\x98\x80", "  \xF0\x9F\x98\xAC");//ดวงอาทิตย์ส่องเต็มเริ่มร้อนมาก

      }

      if (result.lux > 27000 ) {
        Blynk.virtualWrite(V40,  "\xE2\x98\x80", "  \xF0\x9F\x98\xB1");//ดวงอาทิตย์ส่องเต็มร้อนมาก
      }

    }

    void printError(String text, OPT3001_ErrorCode error) {
      //      Serial.print(text);
      //      Serial.print(": [ERROR] Code #");
      //      Serial.println(error);
      Blynk.virtualWrite(V0, error);
    }
  private:
    uint8_t state;
} Task_2_task;
















class Task_3 : public Task {
  public:
    void setup() {


    }
    void loop()  {
      //--------------------------------------------------------------------------------------------------------

      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);









      //---------Reset Board Node MCU ESP 8266------------//
      if (BlynkresetMCU == 1) {
        led_1.on();
        delay(3000);
        led_1.off();
        delay(1500);
        ESP.restart();
      }
      //-------------------------------------------------//


    }
} Task_3_task;






class Task_4 : public Task {
  protected:
    void setup() { }
    void loop()  {

      //ถ้ามีค่าเป็น 0 แล้ว reset 1 ครั้ง จะไม่มีการ Reset อีกต่อไป

      if (timereset == 1) {
        Blynk.virtualWrite(V53, "1 Day Reset" );
        //delay(oneMinute1);
        delay(oneDay);
        ESP.restart();
        //digitalWrite(D7, LOW);//ให้ D7 เป็น 1 ตอนทำงาน  LOW = 0

      }

      if (timereset == 2) {
        Blynk.virtualWrite(V53, "2 Days Reset" );
        //delay(oneMinute2);
        delay(twoDay );
        ESP.restart();
        //digitalWrite(D7, LOW);//ให้ D7 เป็น 1 ตอนทำงาน  LOW = 0
      }


      if (timereset == 3) {
        Blynk.virtualWrite(V53, "3 Days Reset" );
        //delay(oneMinute3);
        delay(threeDay);
        ESP.restart();
        //digitalWrite(D7, LOW);//ให้ D7 เป็น 1 ตอนทำงาน  LOW = 0
      }

      if (timereset == 4) {
        Blynk.virtualWrite(V53, "4 ays. Reset" );
        delay(fourDay);
        ESP.restart();
        //digitalWrite(D7, LOW);//ให้ D7 เป็น 1 ตอนทำงาน  LOW = 0
      }

      if (timereset == 5) {
        Blynk.virtualWrite(V53, "5 Days Reset" );
        delay(fiveDay);
        ESP.restart();
        //digitalWrite(D7, LOW);//ให้ D7 เป็น 1 ตอนทำงาน  LOW = 0
      }


      if (timereset == 6) {
        Blynk.virtualWrite(V53, "6 Days Reset" );
        delay(sixDay);
        ESP.restart();
        //digitalWrite(D7, LOW);//ให้ D7 เป็น 1 ตอนทำงาน  LOW = 0
      }


      if (timereset == 7) {
        Blynk.virtualWrite(V53, "7 Days Reset" );
        delay(sevenDay);
        ESP.restart();
        //digitalWrite(D7, LOW);//ให้ D7 เป็น 1 ตอนทำงาน  LOW = 0
      }









    }
} Task_4_task;



class Task_5 : public Task {
  protected:
    void setup() { }


    void loop()  {


      h = dht.readHumidity();
      t = dht.readTemperature();
      if (isnan(h) || isnan(t)) {
        //Serial.println("Failed to read from DHT sensor!");
        return;
      }

      //      Serial.print("Humidity is: ");
      //      Serial.println(h);
      //
      Serial.print("Temperature is: ");
      Serial.println(t);


      Blynk.virtualWrite(V18, h);
      Blynk.virtualWrite(V17, t);


      if (tempMenu == 1) {


        if ( t > v6 && t <= v7 ) {
          Blynk.virtualWrite(V17, t);
          //Blynk.virtualWrite(V10, 1);
          digitalWrite(D8, HIGH);
          led_3.on();

        }
        else
        {
          Blynk.virtualWrite(V17, t);
          //Blynk.virtualWrite(V10, 0);
          digitalWrite(D8, LOW);
          led_3.off();
        }

      }



      if (humidMenu == 1) {


        if ( h > v4 && h <= v5 ) {
          Blynk.virtualWrite(V18, h);
          //Blynk.virtualWrite(V10, 1);
          digitalWrite(D8, HIGH);
          led_2.on();

        }

        else
        {
          Blynk.virtualWrite(V18, h);
          //Blynk.virtualWrite(V10, 0);
          digitalWrite(D8, LOW);
          led_2.off();
        }

      }

      ThingSpeak();

      delay(2000);



    }
} Task_5_task;






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

void setup() {

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

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

  pinMode(D8, OUTPUT);
  pinMode(D7, INPUT);
  //pinMode(capteur_D, INPUT);



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

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

  Serial.begin(115200);
  opt3001.begin(OPT3001_ADDRESS);
  dht.begin();
  // timer.setInterval(1500L, Sensor);
  //*************************    การ อ่าน  เขียนค่า 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





  Scheduler.start(&Task_1_task);
  Scheduler.start(&Task_2_task);
  Scheduler.start(&Task_3_task);
  Scheduler.start(&Task_4_task);
  Scheduler.start(&Task_5_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);
  }
}
//--------------------------------------------------------------------------------------------------------



void ThingSpeak()
{


  // ThingSpeak Settings //
  char thingSpeakAddress[] = "api.thingspeak.com";
  String writeAPIKey = "XXXXXXXXXXXX"; // คีย์จากเมนู key Api แบบ Write API Key
  WiFiClient client;



  String temp = (String) t; // แปลงเป็น string 
  String hum = (String) h; // แปลงเป็น string 
  String Light_ = (String) light; // แปลงเป็น string
  String Rainy = (String) rain; // แปลงเป็น string
  String data = "field1=" + temp + "&field2=" + hum + "&field3=" + Light_ + "&field4=" + Rainy;

  if (client.connect(thingSpeakAddress, 80)) {
    client.print("POST /update HTTP/1.1\n");
    client.print("Host: api.thingspeak.com\n");
    client.print("Connection: close\n");
    client.print("X-THINGSPEAKAPIKEY: " + writeAPIKey + "\n");
    client.print("Content-Type: application/x-www-form-urlencoded\n");
    client.print("Content-Length: ");
    client.print(data.length());
    client.print("\n\n");
    client.print(data); //
  }

  Serial.println("ThingSpeakloop");
  delay(6000);

}














BLYNK_CONNECTED()
{


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


}

ช่วงนี้อากาศข้างนอกร้อนมากๆ 09/03/2563

1

หวั่นๆ ว่า พัดลมระบายกาศในกล่องจะเอาอยู่มั๊ย

แค่ 9.00 โมง อุณหภูมิก็จะทะลุไป 40 องศาแล้ว

อากาศที่ผ่านมา วันที่ 7,8 /03/2563 ดึง Report จาก Blynk มา Plot graph ใน Excel
เปรียบอุณหูมิ นอกบ้าน กับในบ้าน

เริ่มเข้าหน้าร้อนแล้วสินะครับ


แก้ยังไงครับ

Copy error เต็มมาวางด้วยครับ

Downd load Libraries ตัวนี้ครับ
ESP8266Scheduler https://drive.google.com/file/d/1Rx-S8AXVycXHkHUely-kQKZ0nvagssS3/view?usp=sharing

1 Likes

หลังจากโหลด Libraries ESP8266Scheduler ยังไม่ผ่านครับ

Arduino: 1.8.10 (Windows 10), Board: "NodeMCU 1.0 (ESP-12E Module), 80 MHz, Flash, Legacy (new can return nullptr), All SSL ciphers (most compatible), 4MB (FS:2MB OTA:~1019KB), 2, v2 Lower Memory, Disabled, None, Only Sketch, 115200"

WARNING: library Scheduler claims to run on sam, samd architecture(s) and may be incompatible with your current board which runs on esp8266 architecture(s).
In file included from C:\Users\xxx\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.3/tools/sdk/libc/xtensa-lx106-elf/include/sys/stdio.h:6:0,

                 from C:\Users\xxx\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.3/tools/sdk/libc/xtensa-lx106-elf/include/stdio.h:63,

                 from C:\Users\xxx\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.3\cores\esp8266/Arduino.h:32,

                 from sketch\esp8266blynkDHT22Smart.ino.cpp:1:

C:\Users\xxx\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.3/tools/sdk/libc/xtensa-lx106-elf/include/sys/pgmspace.h:25:130: error: 'const char HTTP_HEAD []' redeclared as different kind of symbol

   #define PROGMEM __attribute__((section( "\".irom.text." __FILE__ "." __STRINGIZE(__LINE__) "."  __STRINGIZE(__COUNTER__) "\"")))

                                                                                                                                  ^

C:\Users\xxx\Documents\Arduino\libraries\WiFiManager/WiFiManager.h:25:24: note: in expansion of macro 'PROGMEM'

 const char HTTP_HEAD[] PROGMEM            = "<!DOCTYPE html><html lang=\"en\"><head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\"/><title>{v}</title>";

                        ^

In file included from D:\Arduino\esp8266blynkDHT22Smart\esp8266blynkDHT22Smart.ino:6:0:

C:\Users\xxx\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.3\libraries\ESP8266WebServer\src/ESP8266WebServer.h:33:39: error: previous declaration of 'HTTPMethod HTTP_HEAD'

 enum HTTPMethod { HTTP_ANY, HTTP_GET, HTTP_HEAD, HTTP_POST, HTTP_PUT, HTTP_PATCH, HTTP_DELETE, HTTP_OPTIONS };

                                       ^

D:\Arduino\esp8266blynkDHT22Smart\esp8266blynkDHT22Smart.ino: In function 'void setup()':

esp8266blynkDHT22Smart:782:31: error: no matching function for call to 'SchedulerClass::start(Task_1*)'

   Scheduler.start(&Task_1_task);

                               ^

D:\Arduino\esp8266blynkDHT22Smart\esp8266blynkDHT22Smart.ino:782:31: note: candidates are:

In file included from D:\Arduino\esp8266blynkDHT22Smart\esp8266blynkDHT22Smart.ino:1:0:

C:\Users\xxx\Documents\Arduino\libraries\Scheduler\src/Scheduler.h:31:14: note: static void SchedulerClass::start(SchedulerTask, uint32_t)

  static void start(SchedulerTask task, uint32_t stackSize = 1024);

              ^

C:\Users\xxx\Documents\Arduino\libraries\Scheduler\src/Scheduler.h:31:14: note:   no known conversion for argument 1 from 'Task_1*' to 'SchedulerTask {aka void (*)()}'

C:\Users\xxx\Documents\Arduino\libraries\Scheduler\src/Scheduler.h:32:14: note: static void SchedulerClass::start(SchedulerParametricTask, void*, uint32_t)

  static void start(SchedulerParametricTask task, void *data, uint32_t stackSize = 1024);

              ^

C:\Users\xxx\Documents\Arduino\libraries\Scheduler\src/Scheduler.h:32:14: note:   candidate expects 3 arguments, 1 provided

esp8266blynkDHT22Smart:783:31: error: no matching function for call to 'SchedulerClass::start(Task_2*)'

   Scheduler.start(&Task_2_task);

                               ^

D:\Arduino\esp8266blynkDHT22Smart\esp8266blynkDHT22Smart.ino:783:31: note: candidates are:

In file included from D:\Arduino\esp8266blynkDHT22Smart\esp8266blynkDHT22Smart.ino:1:0:

C:\Users\xxx\Documents\Arduino\libraries\Scheduler\src/Scheduler.h:31:14: note: static void SchedulerClass::start(SchedulerTask, uint32_t)

  static void start(SchedulerTask task, uint32_t stackSize = 1024);

              ^

C:\Users\xxx\Documents\Arduino\libraries\Scheduler\src/Scheduler.h:31:14: note:   no known conversion for argument 1 from 'Task_2*' to 'SchedulerTask {aka void (*)()}'

C:\Users\xxx\Documents\Arduino\libraries\Scheduler\src/Scheduler.h:32:14: note: static void SchedulerClass::start(SchedulerParametricTask, void*, uint32_t)

  static void start(SchedulerParametricTask task, void *data, uint32_t stackSize = 1024);

              ^

C:\Users\xxx\Documents\Arduino\libraries\Scheduler\src/Scheduler.h:32:14: note:   candidate expects 3 arguments, 1 provided

esp8266blynkDHT22Smart:784:31: error: no matching function for call to 'SchedulerClass::start(Task_3*)'

   Scheduler.start(&Task_3_task);

                               ^

D:\Arduino\esp8266blynkDHT22Smart\esp8266blynkDHT22Smart.ino:784:31: note: candidates are:

In file included from D:\Arduino\esp8266blynkDHT22Smart\esp8266blynkDHT22Smart.ino:1:0:

C:\Users\xxx\Documents\Arduino\libraries\Scheduler\src/Scheduler.h:31:14: note: static void SchedulerClass::start(SchedulerTask, uint32_t)

  static void start(SchedulerTask task, uint32_t stackSize = 1024);

              ^

C:\Users\xxx\Documents\Arduino\libraries\Scheduler\src/Scheduler.h:31:14: note:   no known conversion for argument 1 from 'Task_3*' to 'SchedulerTask {aka void (*)()}'

C:\Users\xxx\Documents\Arduino\libraries\Scheduler\src/Scheduler.h:32:14: note: static void SchedulerClass::start(SchedulerParametricTask, void*, uint32_t)

  static void start(SchedulerParametricTask task, void *data, uint32_t stackSize = 1024);

              ^

C:\Users\xxx\Documents\Arduino\libraries\Scheduler\src/Scheduler.h:32:14: note:   candidate expects 3 arguments, 1 provided

esp8266blynkDHT22Smart:785:31: error: no matching function for call to 'SchedulerClass::start(Task_4*)'

   Scheduler.start(&Task_4_task);

                               ^

D:\Arduino\esp8266blynkDHT22Smart\esp8266blynkDHT22Smart.ino:785:31: note: candidates are:

In file included from D:\Arduino\esp8266blynkDHT22Smart\esp8266blynkDHT22Smart.ino:1:0:

C:\Users\xxx\Documents\Arduino\libraries\Scheduler\src/Scheduler.h:31:14: note: static void SchedulerClass::start(SchedulerTask, uint32_t)

  static void start(SchedulerTask task, uint32_t stackSize = 1024);

              ^

C:\Users\xxx\Documents\Arduino\libraries\Scheduler\src/Scheduler.h:31:14: note:   no known conversion for argument 1 from 'Task_4*' to 'SchedulerTask {aka void (*)()}'

C:\Users\xxx\Documents\Arduino\libraries\Scheduler\src/Scheduler.h:32:14: note: static void SchedulerClass::start(SchedulerParametricTask, void*, uint32_t)

  static void start(SchedulerParametricTask task, void *data, uint32_t stackSize = 1024);

              ^

C:\Users\xxx\Documents\Arduino\libraries\Scheduler\src/Scheduler.h:32:14: note:   candidate expects 3 arguments, 1 provided

esp8266blynkDHT22Smart:786:31: error: no matching function for call to 'SchedulerClass::start(Task_5*)'

   Scheduler.start(&Task_5_task);

                               ^

D:\Arduino\esp8266blynkDHT22Smart\esp8266blynkDHT22Smart.ino:786:31: note: candidates are:

In file included from D:\Arduino\esp8266blynkDHT22Smart\esp8266blynkDHT22Smart.ino:1:0:

C:\Users\xxx\Documents\Arduino\libraries\Scheduler\src/Scheduler.h:31:14: note: static void SchedulerClass::start(SchedulerTask, uint32_t)

  static void start(SchedulerTask task, uint32_t stackSize = 1024);

              ^

C:\Users\xxx\Documents\Arduino\libraries\Scheduler\src/Scheduler.h:31:14: note:   no known conversion for argument 1 from 'Task_5*' to 'SchedulerTask {aka void (*)()}'

C:\Users\xxx\Documents\Arduino\libraries\Scheduler\src/Scheduler.h:32:14: note: static void SchedulerClass::start(SchedulerParametricTask, void*, uint32_t)

  static void start(SchedulerParametricTask task, void *data, uint32_t stackSize = 1024);

              ^

C:\Users\xxx\Documents\Arduino\libraries\Scheduler\src/Scheduler.h:32:14: note:   candidate expects 3 arguments, 1 provided

esp8266blynkDHT22Smart:787:13: error: 'class SchedulerClass' has no member named 'begin'

   Scheduler.begin();

             ^

Multiple libraries were found for "DHT.h"
 Used: C:\Users\xxx\Documents\Arduino\libraries\DHT-sensor-library-master
Multiple libraries were found for "Adafruit_Sensor.h"
 Used: C:\Users\xxx\Documents\Arduino\libraries\Adafruit_Sensor-master
 Not used: C:\Users\xxx\Documents\Arduino\libraries\Adafruit_Unified_Sensor
Multiple libraries were found for "WiFiManager.h"
 Used: C:\Users\xxx\Documents\Arduino\libraries\WiFiManager
Multiple libraries were found for "ClosedCube_OPT3001.h"
 Used: C:\Users\xxx\Documents\Arduino\libraries\ClosedCube_OPT3001
Multiple libraries were found for "ESP8266WiFi.h"
 Used: C:\Users\xxx\Documents\Arduino\libraries\ESP8266WiFi
 Not used: C:\Users\xxx\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.3\libraries\ESP8266WiFi
Multiple libraries were found for "ESP8266WebServer.h"
 Used: C:\Users\xxx\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.3\libraries\ESP8266WebServer
Multiple libraries were found for "DNSServer.h"
 Used: C:\Users\xxx\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.3\libraries\DNSServer
Multiple libraries were found for "ArduinoJson.h"
 Used: C:\Users\xxx\Documents\Arduino\libraries\ArduinoJson
 Not used: C:\Users\xxx\Documents\Arduino\libraries\ArduinoJson-5.13.3
Multiple libraries were found for "BlynkSimpleEsp8266.h"
 Used: C:\Users\xxx\Documents\Arduino\libraries\Blynk
Multiple libraries were found for "Wire.h"
 Used: C:\Users\xxx\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.6.3\libraries\Wire
Multiple libraries were found for "Scheduler.h"
 Used: C:\Users\xxx\Documents\Arduino\libraries\Scheduler
 Not used: C:\Users\xxx\Documents\Arduino\libraries\ESP8266Scheduler
Multiple libraries were found for "Task.h"
 Used: C:\Users\xxx\Documents\Arduino\libraries\ESP8266Scheduler
exit status 1
no matching function for call to 'SchedulerClass::start(Task_1*)'

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

ความต้องการของ Project (เพื่อป้องกันความผิดพลาดเรื่องของ Version และตรวจสอบย้อนหลังได้)

  1. Arduino IDE Version 1.8.7
  2. WiFiManager Version 0.14.0
  3. ArduinoJson Version 5.13.3
  4. New-LiquidCrystal-master Version 6.2.4 :crazy_face:
    เอาเป็นว่า ข้อ 1 - 4 มีให้ Download 18 ครับ https://drive.google.com/file/d/1DjlDHdEqHgtwpsiRiaLtD4jR4bji4i-6/view
  5. ESP8266Scheduler https://drive.google.com/file/d/1Rx-S8AXVycXHkHUely-kQKZ0nvagssS3/view?usp=sharing 10
1 Likes

@PUYIOT การกลับไป confirm basic ก็สำคัญเป็นอย่างยิ่ง ขอบคุณครับ