ESP8266 + Blynk + Line จับ WIFI แต่ไม่แสดงผลใน Blynk

`#define BLYNK_PRINT Serial // สำหรับ print monitor
#include <ESP8266WiFi.h> //  ไลบรารี่ของชิป ESP8266 WiFi
#include <BlynkSimpleEsp8266.h> // ไลบรารี่ส่วนชเื่อมต่อแอพ Blynk
//#include <SimpleTimer.h> // หากพบว่า compile ไม่ได้ ให่ใสเครื่องหมาย่ // หน้าบรรทัดนี้
#include <TridentTD_LineNotify.h>


#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS D4 //กำหนดขาที่จะเชื่อมต่อ Sensor ใช้ขา D4
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

/* ตัวแปรส่วนควบคุมอุณหภูมิ */
int LED1 = D5; // ต่อกับ LED สีแดง แจ้งสถานะรีเลย์ 1 
int Relay1 = D1;
int sensorTempValue;
float TempValue;
float TempHighLimit;
float TempLowLimit;
#define Buttonpin1 D8
int button1;
int Automode1;
int Relaystatus1;
int Toggle1;


/* ตัวแปรส่วนควบคุมความชื้น */
int LED2 = D6; // ต่อกับ LED สีแดง แจ้งสถานะรีเลย์ 1 
int Relay2 = D2;
int sensorMoistureValue;
int MoistureValue;
int MoistureHighLimit;
int MoistureLowLimit;
#define Buttonpin2 D0
int button2;
int Automode2;
int Relaystatus2;
int Toggle2;

int sensorPin2;

int LineSendTempHigh;
int LineSendTempLow;
int LineSendHumidityHigh;
int LineSendHumidityLow;

char auth[] = "OWQWCw-7oox0iGhtR29fga-dB9XIiL-I"; // รหัสเฉพาะสำหรับ Thing (Authen Key) ได้จากแอพ Blynk
char ssid[] = "Na";  // ชื่อ WiFi ของบ้าน
char pass[] = "nnnnnnnn"; //พาสเวิร์ด WiFi

#define LINE_TOKEN "Wq9DRPa6aQt6aJ7BLZ6fQZLvfdBfDnu8xR5AtHIcxIM"




SimpleTimer timer; // ประกาศให้การนับเวลาใช้ไลบรารี่ SimpleTimer
WidgetLED Widgetled1(V11); // LED ที่หน่้าจอแสดงว่าอุณหภูมิสูงเกิน
WidgetLED Widgetled2(V12); // LED ที่หน่้าจอแสดว่าอุณหภูมิต่ำเกิน


void setup() {
 pinMode(Relay1, OUTPUT); // ต่อโหลดเป็น LED ตัวอย่างอุปกรณ์ลดอุณหภูมิ
 pinMode(Relay2, OUTPUT); // ต่อโหลดปั๊มน้ำ เพ่ิมเพิ่มอุณหภูมิ
 pinMode(LED1,OUTPUT); // ไฟเตือนแสดงความขื้นสูง
 pinMode(LED2,OUTPUT); // ไฟเตือนแสดงอุณหภูมิต่ำ
 pinMode(Buttonpin1,INPUT); // รับค่าปุ่มกดควบคุมรีเลย์1
 pinMode(Buttonpin2,INPUT); // รับค่าปุ่มกดควบคุมรีเลย์2
  delay(500);
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library");
  sensors.begin();
  Serial.println("\Starting");
  Blynk.begin(auth, ssid, pass); // ให้ใช้ค่า Authen Key และ WiFi ตามที่ประกาสตัวแปรไว้
  
  LINE.setToken(LINE_TOKEN);
  
  timer.setInterval(500L, TempDisplay); // คาบรอบเวลาให้ฟังชั่นทำงาน หน่วยมิลลิวินาที หากต้องการให้นานขึ้น แก้ไขได้
  timer.setInterval(500L, TempControl); 
  timer.setInterval(200L, PhysicalButton1); 
  timer.setInterval(200L, PhysicalButton2); 
  timer.setInterval(500L, MoistureDisplay); 
  timer.setInterval(500L, MoistureControl); 
//  timer.setInterval(5000L, LineAlert);
}


/* ฟังชั่นส่วนควบคุมความชื้น*/

void TempDisplay()
{
Serial.println("Requesting temperatures...");
sensors.requestTemperatures(); //อ่านข้อมูลจาก library
Serial.print("Temperature is: ");
Serial.print(sensors.getTempCByIndex(0)); // แสดงค่า อูณหภูมิ 
Serial.println(" *C");

TempValue = sensors.getTempCByIndex(0);
Blynk.virtualWrite(V5, TempValue);
}

void TempControl()
{
 Blynk.virtualWrite(V5, TempValue); // แสดวค่าความขื้นที่ Widget Guage
 if (Automode1 ==1) { // ต้องเป็นโหมดอัตโนมัติเท่านั้น ถึงจะควบคุมอุณหภูมิด้วยเซนเซอร์ได้

      if (TempValue > TempHighLimit) // ถ้าอุณหภูมิสูงกว่าหรือต่ำกว่าค่าที่กำหนด
      { 
      Relay1on();
        if (LineSendTempHigh == 0)
          {
          LINE.notify("อุณหภูมิสูงกว่าที่กำหนด เปิดปั๊มน้ำ"); 
          LineSendTempHigh = 1;
          LineSendTempLow = 0;
          }
      } 
      if (TempValue < TempLowLimit) 
      {
       Relay1off();
         if (LineSendTempLow == 0)
          {
          LINE.notify("อุณหภูมิต่ำกว่าที่กำหนด ปิดปั๊มน้ำ"); 
          LineSendTempLow = 1;
          LineSendTempHigh = 0;
          }
      }
   }
}
  
//////
////****  Manual Auto Button***////

void PhysicalButton1()
{
int  Val1 = digitalRead(Buttonpin1); 

 if ((Val1 == 1) && (Relaystatus1 == 0) && (Toggle1 == 0)) { // ถ้ารีเลยไ่ม่่์ทำงานแล้วมีการกดปุ่มที่หน้างาน
   Relay1on();
   Relaystatus1 = 1;
   Toggle1 = 1;
   Automode1 = 0; 
   Serial.println("มีการกดปุ่มเปิดที่หน้างาน เปิดไฟ"); // สั่งรีเลย์ทำงาน
   LINE.notify("มีการกดปุ่มเปิดรีเลย์ 1 ที่หน้างาน เปิดไฟ");
   Blynk.virtualWrite(V9, LOW); // ถ้ามีการกดปุ่ม โหมดอัตโนมัติจะปิดทันที เข้าสู่โหมดเมนวล   
    }
  

  if ((Val1 == 0) && (Relaystatus1 == 1) && (Toggle1 == 1)) { // ถ้ารีเลยไ่ม่่์ทำงานแล้วมีการกดปุ่มที่หน้างาน
   Relay1on();
   Relaystatus1 = 1;
   Toggle1 = 0;
   Automode1 = 0;
   Serial.println("มีการกดปุ่มเปิดที่หน้างาน เปิดไฟ"); // สั่งรีเลย์ทำงาน
 //  LINE.notify("มีการกดปุ่มเปิดรีเลย์ 1 ที่หน้างาน เปิดไฟ");
   Blynk.virtualWrite(V9, LOW); // ถ้ามีการกดปุ่ม โหมดอัตโนมัติจะปิดทันที เข้าสู่โหมดเมนวล  
    }
 


 if ((Val1 == 1) && (Relaystatus1 == 1) && (Toggle1 == 0))  { // ถ้ารีเลย์ทำงานแล้วมีการกดปุ่มที่หน้างาน
   Relay1off();
   Relaystatus1 = 0;
   Toggle1 = 1;
   Automode1 = 0; 
   Serial.println("มีการกดปุ่มเปิดรีเลย์ 1 ที่หน้างาน ปิดไฟ"); // สั่งรีเลย์ไม่ทำงาน
   LINE.notify("มีการกดปุ่มปิดรีเลย์ 1 ที่หน้างาน ปิดไฟ");
   Blynk.virtualWrite(V9, LOW); // ถ้ามีการกดปุ่ม โหมดอัตโนมัติจะปิดทันที เข้าสู่โหมดเมนวล  
   }

   
 if ((Val1 == 0) && (Relaystatus1 == 0) && (Toggle1 == 1))  { // ถ้ารีเลย์ทำงานแล้วมีการกดปุ่มที่หน้างาน
    Relay1off();
    Relaystatus1 = 0;
    Toggle1 = 0;
    Automode1 = 0;
    Serial.println("มีการกดปุ่มเปิดรีเลย์ 1 ที่หน้างาน ปิดไฟ"); // สั่งรีเลย์ไม่ทำงาน
    //LINE.notify("มีการกดปุ่มปิดรีเลย์ 1 ที่หน้างาน ปิดไฟ");
    Blynk.virtualWrite(V9, LOW); // ถ้ามีการกดปุ่ม โหมดอัตโนมัติจะปิดทันที เข้าสู่โหมดเมนวล  
   }
  
 }
//////////



void Relay1on()
{
   digitalWrite(Relay1, LOW); 
   digitalWrite(LED1, HIGH); // LED สีแดงแสดงอุณหภูมิสูง
   Widgetled1.on (); // Widget LED สีแดงที่แสดงบนแอพ
   Blynk.virtualWrite(V7, HIGH); // ให้การแสดงค่าปุ่มกดที่แอพมีผลตามสถานะของรีเลย์   
    Relaystatus1 = 1;
   LINE.notify("จ่ายไฟให้รีเลย์ทำงาน");
 } 

void Relay1off()
 {
   digitalWrite(Relay1, HIGH); // ถ้าไม่ใช่ให้ปิด
   digitalWrite(LED1, LOW);
   Widgetled1.off ();
   Blynk.virtualWrite(V7, LOW); // ให้การแสดงค่าปุ่มกดที่แอพมีผลตามสถานะของรีเลย์  
   Relaystatus1 = 0;
   LINE.notify("ไม่ได้จ่ายไฟให้รีเลย์ทำงาน");
 }


BLYNK_WRITE(V1) 
{
  TempHighLimit = param.asInt(); // รับค่าอุณหภูมิสูงสุดที่ต้องการควบคุมจาก Widget Step H
  Serial.println("ค่าควบคุมด้านสูง");
  Serial.println(TempHighLimit);  
  
}

BLYNK_WRITE(V3) 
{
  TempLowLimit = param.asInt(); // รับค่าอุณหภูมิสูงสุดที่ต้องการควบคุมจาก Widget Step H
  Serial.println("ค่าควบคุมด้านต่ำ");
  Serial.println(TempLowLimit);
}
 

BLYNK_WRITE(V7) // ปุ่มกดเปิดปิดแบบเมนวลบนแอพ
{
  if (param.asInt()==1)
  {
  Relay1on();
  Blynk.virtualWrite(V9, LOW); // ถ้ามีการกดปุ่ม โหมดอัตโนมัติจะปิดทันที เข้าสู่โหมดเมนวล
  Automode1 = 0;
  } else {
  Relay1off();
  Blynk.virtualWrite(V9, LOW); // ถ้ามีการกดปุ่ม โหมดอัตโนมัติจะปิดทันที เข้าสู่โหมดเมนวล
  Automode1 = 0;
  }
}

BLYNK_WRITE(V9) // ปุ่มกดเลือกโหมด Auto/Manual
{
  if (param.asInt()==1)
   {
    Automode1 = 1;
    Serial.println("AUTO MODE");
   } else {
    Automode1 = 0;
    Serial.println("MANUAL MODE");
   }
}


/* ฟังชั่นส่วนควบคุมความชื้น*/

void MoistureDisplay()
{
 sensorMoistureValue = analogRead(sensorPin2); // อ่านค่าจากเซนเซอร์วัดความชื้น
 MoistureValue = map(sensorMoistureValue, 1023, 0, 0, 100); // ให้เทียบค่า Analog ที่วัดได้ 0-1023 ออกมาเป็นย่านความชื้น 0-100%
 Blynk.virtualWrite(V6, MoistureValue); // แสดวค่าความขื้นที่ Widget Guage
 Serial.println("Moisture Value : "); // แสดง์ค่าความชื้นออกหน้าจอคอมพิวเตอร์ผ่านเมนู Serial Monitor 
 Serial.println(MoistureValue);

}


void MoistureControl()
{
 Blynk.virtualWrite(V6, MoistureValue); // แสดวค่าความขื้นที่ Widget Guage
 if (Automode2 == 1) { // ต้องเป็นโหมดอัตฌนมัติเท่านั้น ถึงจะควบคุมความชื้นด้วยเซนเซอร์ได้

      if (MoistureValue > MoistureHighLimit) // ถ้าความชื้นสูงกว่าหรือต่ำกว่าค่าที่กำหนด
      { 
      Relay2off();  // สั่งปิดรีเลย์
           if (LineSendHumidityHigh == 0)
          {
          LINE.notify("ความชื้นสูงกว่าที่กำหนด ปิดปั๊มน้ำ"); 
          LineSendHumidityHigh = 1;
          LineSendHumidityLow = 0;
          } 
      } 
      if (MoistureValue < MoistureLowLimit) 
      {
       Relay2on(); // สั่งเปิดรีเลย์
          if (LineSendHumidityLow == 0)
          {
          LINE.notify("ความชื้นต่ำกว่าที่กำหนด เปิดปั๊มน้ำ"); 
          LineSendHumidityLow = 1;
          LineSendHumidityHigh = 0;  
          }
      }
   }
}
  
/////////

void PhysicalButton2()
{
  int Val2 = digitalRead(Buttonpin2); 

 if ((Val2 == 1) && (Relaystatus2 == 0) && (Toggle2 == 0)) { // ถ้ารีเลยไ่ม่่์ทำงานแล้วมีการกดปุ่มที่หน้างาน
   Relay2on();
   Relaystatus2 = 1;
   Toggle2 = 1;
   Automode2 = 0; 
   Serial.println("มีการกดปุ่มเปิดที่หน้างาน เปิดไฟ"); // สั่งรีเลย์ทำงาน
   LINE.notify("มีการกดปุ่มเปิดรีเลย์ 1 ที่หน้างาน เปิดไฟ");
   Blynk.virtualWrite(V10, LOW); // ถ้ามีการกดปุ่ม โหมดอัตโนมัติจะปิดทันที เข้าสู่โหมดเมนวล   
    }
  

  if ((Val2 == 0) && (Relaystatus2 == 1) && (Toggle2 == 1)) { // ถ้ารีเลยไ่ม่่์ทำงานแล้วมีการกดปุ่มที่หน้างาน
   Relay2on();
   Relaystatus2 = 1;
   Toggle2 = 0;
   Automode2 = 0;
   Serial.println("มีการกดปุ่มเปิดที่หน้างาน เปิดไฟ"); // สั่งรีเลย์ทำงาน
 //  LINE.notify("มีการกดปุ่มเปิดรีเลย์ 1 ที่หน้างาน เปิดไฟ");
   Blynk.virtualWrite(V10, LOW); // ถ้ามีการกดปุ่ม โหมดอัตโนมัติจะปิดทันที เข้าสู่โหมดเมนวล  
    }
 

 if ((Val2 == 1) && (Relaystatus2 == 1) && (Toggle2 == 0))  { // ถ้ารีเลย์ทำงานแล้วมีการกดปุ่มที่หน้างาน
   Relay2off();
   Relaystatus2 = 0;
   Toggle2 = 1;
   Automode2 = 0; 
   Serial.println("มีการกดปุ่มเปิดรีเลย์ 1 ที่หน้างาน ปิดไฟ"); // สั่งรีเลย์ไม่ทำงาน
   LINE.notify("มีการกดปุ่มปิดรีเลย์ 1 ที่หน้างาน ปิดไฟ");
   Blynk.virtualWrite(V10, LOW); // ถ้ามีการกดปุ่ม โหมดอัตโนมัติจะปิดทันที เข้าสู่โหมดเมนวล  
   }

   
 if ((Val2 == 0) && (Relaystatus2 == 0) && (Toggle2 == 1))  { // ถ้ารีเลย์ทำงานแล้วมีการกดปุ่มที่หน้างาน
    Relay2off();
    Relaystatus2 = 0;
    Toggle2 = 0;
    Automode2 = 0;
    Serial.println("มีการกดปุ่มเปิดรีเลย์ 1 ที่หน้างาน ปิดไฟ"); // สั่งรีเลย์ไม่ทำงาน
    //LINE.notify("มีการกดปุ่มปิดรีเลย์ 1 ที่หน้างาน ปิดไฟ");
    Blynk.virtualWrite(V10, LOW); // ถ้ามีการกดปุ่ม โหมดอัตโนมัติจะปิดทันที เข้าสู่โหมดเมนวล  
   }
    
 }
 

void Relay2on()
{
   digitalWrite(Relay2, LOW); 
   digitalWrite(LED2, HIGH); // LED สีแดงแสดงความชื้นสูง
   Widgetled2.on (); // Widget LED สีแดงที่แสดงบนแอพ
   Blynk.virtualWrite(V8, HIGH); // ให้การแสดงค่าปุ่มกดที่แอพมีผลตามสถานะของรีเลย์   
   Relaystatus2 = 1;
 } 

void Relay2off()
 {
   digitalWrite(Relay2, HIGH); // ถ้าไม่ใช่ให้ปิด
   digitalWrite(LED2, LOW);
   Widgetled2.off ();
   Blynk.virtualWrite(V8, LOW); // ให้การแสดงค่าปุ่มกดที่แอพมีผลตามสถานะของรีเลย์  
   Relaystatus2 = 0;
 }



BLYNK_WRITE(V2) 
{
  MoistureHighLimit = param.asInt(); // รับค่าความชื้นิสูงสุดที่ต้องการควบคุมจาก Widget Step H
  Serial.println("ค่าควบคุมด้านสูง");
  Serial.println(MoistureHighLimit);  
  
}

BLYNK_WRITE(V4) 
{
  MoistureLowLimit = param.asInt(); // รับค่าความชื้นิสูงสุดที่ต้องการควบคุมจาก Widget Step H
  Serial.println("ค่าควบคุมด้านต่ำ");
  Serial.println(MoistureLowLimit);
}
 

BLYNK_WRITE(V8) // ปุ่มกดเปิดปิดแบบเมนวลบนแอพ
{
  if (param.asInt()==1)
  {
  Relay2on();
  Blynk.virtualWrite(V10, LOW); // ถ้ามีการกดปุ่ม โหมดอัตโนมัติจะปิดทันที เข้าสู่โหมดเมนวล
  Automode2 = 0;
  } else {
  Relay2off();
  Blynk.virtualWrite(V10, LOW); // ถ้ามีการกดปุ่ม โหมดอัตโนมัติจะปิดทันที เข้าสู่โหมดเมนวล
  Automode2 = 0;
  }
}

BLYNK_WRITE(V10) //ปุ่มกดเลือกโหมด Auto/Manual
{
  if (param.asInt()==1)
   {
    Automode2 = 1;
    Serial.println("AUTO MODE");
   } else {
    Automode2 = 0;
    Serial.println("MANUAL MODE");
   }
}
void loop() 
{
 Blynk.run(); 
 timer.run(); // เพิ่ม loop ตัวควบคุมเวลาการทำงานของฟังชั่น
}`

หรือเกิดจากที่ผมต่อผิดหรอครับ รบกวนพี่ๆด้วยนะครับ

มัน offline ครับ

ภาพ

แคปหน้า serial ตอนที่มันทำงานมาดูหน่อย

เป็นเพราะอะไรหรอค่ะพอดีขึ้นแต่แบบนี่นะคะ

Serial print มาดูหน่อย