Esp8266 ไม่ส่งค่าฝุ่น PM ไปยังLine Notify

สวัสดีค่ะ พอดีเขียนเราเขียนโค้ดเกี่ยวกับการส่งค่าฝุ่นPM ให้ส่งค่าไปยัง Line Notify อัพโค้ดได้ปกติแต่ไม่มีการแจ้งเตือนไปยัง Line Notify ช่วยดูหน่อยนะคะ ปล.ตอนแรกแจ้งเตือนไปประมาณ3-4ค่า แล้วก็หยุดแจ้งเตือนไปเลยค่ะ

#include "PMS.h"
#include <TridentTD_LineNotify.h>

PMS::DATA data;
PMS pms(Serial);


void setup() {
  // put your setup code here, to run once:
#define SSID        "Suwimol_2.4G"      // บรรทัดที่ 11 ให้ใส่ ชื่อ Wifi ที่จะเชื่อมต่อ
#define PASSWORD    "0918306197"     // บรรทัดที่ 12 ใส่ รหัส Wifi
#define LINE_TOKEN  "sAunR4BaxR1Qa6uWTDn6MdSwCdNx0W6QOW4Vpi4o9fR"   // บรรทัดที่ 13 ใส่ รหัส TOKEN ที่ได้มาจากข้างบน
  Serial.begin(9600); Serial.println();
  Serial.println(LINE.getVersion());

  WiFi.begin(SSID, PASSWORD);
  Serial.printf("WiFi connecting to %s\n",  SSID);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(400);
  }
  Serial.printf("\nWiFi connected\nIP : ");
  Serial.println(WiFi.localIP());

  // กำหนด Line Token
  LINE.setToken(LINE_TOKEN);
}

void loop(){
  // put your main code here, to run repeatedlAz
  // if (pms.read(data)){
  //Serial.print("PM 1.0:  ");
    
   // Serial.print("PM 2.5="+String(data.PM_AE_UG_2_5)+"(ug/m3)");
    //Serial.println(data.PM_AE_UG_1_0); 
    //Serial.print("PM 2.5:  ");
   // Serial.println(data.PM_AE_UG_2_5);
   // Serial.print("PM 10.0:  ");   
   // Serial.println(data.PM_AE_UG_10_0);
 
  //  }
  if (pms.read(data)){
      LINE.notify("PM 1.0="+String(data.PM_AE_UG_1_0)+"(ug/m3)");
      LINE.notify("PM 2.5="+String(data.PM_AE_UG_2_5)+"(ug/m3)");
      LINE.notify("PM 10.0="+String(data.PM_AE_UG_10_0)+"(ug/m3)");
      delay(50000);
    }
    }

แคปหน้า Serial ตอนที่มันหยุดมาดูหน่อยครับ ปัญหามันน่าจะอยู่ตรงนี้แหละ

กดตรงนี้สิครับ

image

อันนี้อัพโหลดได้แล้วค่ะ แต่ไม่มีแจ้งเตือนไปในไลน์เลยค่ะ

กดตามที่บอกแล้วแคปมาดูครับ

ช่วยหน่อยนะคะไม่รู้ว่าต้องทำยังไงต่อจริงๆค่ะ

ตรงนี้คือมันทำงานอะไรบ้างครับ

ไม่มีเลยค่ะ เพราะว่าโค้ดนี้ให้แจ้งผ่านไลน์อย่างเดียว

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

String T_text = "";

....


dustVal=analogRead(dustPin);

...

float h = dht.readHumidity();

float t = dht.readTemperature();


String Ex_d = String(dustVal);
String Ex_t = String(t);
String Ex_h = String(h);

...

T_text = ("อุณหภูมิ : " + (Ex_t) + " องศาเซลเซียส" + "  PM 2.5 : " + (Ex_d) + " ไมโครกรัม");


...


  if( (p_tm->tm_hour == 12) && (p_tm->tm_min == 00) && (p_tm->tm_sec == 00) ){

    LINE_Notify(T_text);

    Serial.println("ส่งไลน์สำเร็จ");   
  }
1 Likes

ขอบคุณนะคะ

2 Likes

แก้ยังไม่ได้เลยค่ะ มีใครมีวิธีอีกไหมคะ ช่วยแนะนำหน่อยนะคะ :pray: :pray: :pray:

เอาหน่วงเวลาออกครับ ถ้าหน่วงแบบนี้ผมว่าจะจะเกิดการ Reset ก่อนแน่ๆ

1 Likes

ตรงดีเลย์ 5000ใช่ไหมคะ

ช่วยแก้ในโค้ดได้ไหมคะ พอดีไม่มีความรู้เลย

ไม่ได้ถามก่อนว่าใช้ sensor รุ่นไหน ลองเอาไปทดสอบใช้ดูนะครับ อย่าลืมแก้ไข Wifi กับ Line Token ด้วยนะครับ

#include <WiFiClientSecureAxTLS.h>
#include <ESP8266WiFi.h>
#include <time.h>

#include "PMS.h"

PMS::DATA data;
PMS pms(Serial);

int timezone = 7 * 3600; //ตั้งค่า TimeZone +7 ตามเวลาประเทศไทย
int dst = 0;

const char* ssid = "3bb";     // บรรทัดที่ 14 ให้ใส่ ชื่อ Wifi ที่จะเชื่อมต่อ
const char* password = "12345678";    // บรรทัดที่ 15 ใส่ รหัส Wifi
#define LINE_TOKEN  "sfdkjroisljlkncse4iwlksdlfkkhjxnckrilru"   // บรรทัดที่ 16 ใส่ รหัส TOKEN ที่ได้มาจากข้าง line.me

//กำหนดค่าการแปลงข้อความเป็น String สำหรับส่งไลน์
String T1_text = "";
String T2_text = "";
String T3_text = "";

void setup() {

// การตั้งค่า Serial Print เพื่อจะได้ตรวจสอบได้ว่าการทำงานถึงขั้นตอนไหน และประสบผลหรือไม่
  Serial.begin(9600); 

  Serial.println();
  Serial.print("Wifi connecting to ");
  Serial.println( ssid );

  WiFi.begin(ssid,password); //เริ่มการทำงานของ Wifi

  Serial.println();
  
  Serial.print("Connecting");

//ตรวจสอบการเชื่อมต่อ Wifi
  while( WiFi.status() != WL_CONNECTED ){
      delay(500);
      Serial.print(".");        
  }

  
  Serial.println();

  Serial.println("Wifi Connected Success!");
  Serial.print("NodeMCU IP Address : ");
  Serial.println(WiFi.localIP() );

  configTime(timezone, dst, "pool.ntp.org","time.nist.gov"); //ทำการปรับเวลากับ NTP server
  Serial.println("\nWaiting for Internet time");

  while(!time(nullptr)){
     Serial.print("*");
     delay(1000);
  }
  Serial.println("\nTime response....OK");   

//ส่วนของการแปลงค่าจาก sensor เป็น String สำหรับส่งไลน์
  T1_text = ("PM 1.0="+String(data.PM_AE_UG_1_0)+"(ug/m3)"); 
  T2_text = ("PM 1.0="+String(data.PM_AE_UG_1_0)+"(ug/m3)"); 
  T3_text = ("PM 10.0="+String(data.PM_AE_UG_10_0)+"(ug/m3)");
  
}

void loop(){

//ส่วนการกำหนดตัวแปรของเวลา
  time_t now = time(nullptr);
  struct tm* p_tm = localtime(&now);

//ให้ลองเปรียบเทียบและปรับใช้งานดูว่า จะใช้ฟังก์ชั่น if ส่วนไหนจึงจะเหมาะกับการนำไปใช้งาน
  
  if (pms.read(data)){
      Serial.print("PM 1.0:  ");
    
      Serial.print("PM 2.5="+String(data.PM_AE_UG_2_5)+"(ug/m3)");
      Serial.println(data.PM_AE_UG_1_0); 
      Serial.print("PM 2.5:  ");
      Serial.println(data.PM_AE_UG_2_5);
      Serial.print("PM 10.0:  ");   
      Serial.println(data.PM_AE_UG_10_0);
 
      LINE_Notify(T1_text);
      LINE_Notify(T2_text);
      LINE_Notify(T3_text);
      Serial.println("ส่งไลน์สำเร็จ"); //แสดงผลเมื่อส่งไลน์สำเร็จ
      //delay(50000); // 1 วินาที = 1000 ms ดังนั้น 50000 จึงเท่ากับ 50 วินาที ซึ่งมักจะทำให้ค้างบ่อยๆตัดออกเลย ตั้งเวลาดีกว่า
    }

//ส่วนนี้เป้นการตั้งเวลาสำหรับการส่งไลน์ ซึ่งจำเป็นต้องระบุเป็นวินาทีด้วยเพื่อให้ส่งเพียงครั้งเดียว ไม่เช่นนั้นจะส่งจนครบนาที
    if( (p_tm->tm_hour == 12) && (p_tm->tm_min == 00) && (p_tm->tm_sec == 00) ){ // tm_hour ใช้รูปแบบเวลา 24 ชม.
      LINE_Notify(T1_text);
      LINE_Notify(T2_text);
      LINE_Notify(T3_text);
      Serial.println("ส่งไลน์สำเร็จ"); //แสดงผลเมื่อส่งไลน์สำเร็จ
    }

    
    }

// ส่วนนี้เป็นฟัวก์ขั่นในการส่งไลน์ผ่าน port 433 ไม่ต้องแก้ไขใดๆทั้งสิ้น

void LINE_Notify(String Message) {
  axTLS::WiFiClientSecure client;

  if (!client.connect("notify-api.line.me", 443)) {
    Serial.println("connection failed");
    return;
  } else {}

  String req = "";
  req += "POST /api/notify HTTP/1.1\r\n";
  req += "Host: notify-api.line.me\r\n";
  req += "Authorization: Bearer " + String(LINE_TOKEN) + "\r\n";
  req += "Cache-Control: no-cache\r\n";
  req += "User-Agent: ESP8266\r\n";
  req += "Content-Type: application/x-www-form-urlencoded\r\n";
  req += "Content-Length: " + String(String("message=" + Message).length()) + "\r\n";
  req += "\r\n";
  req += "message=" + Message;

  client.print(req);
  delay(20);

  while (client.connected()) {
    String line = client.readStringUntil('\n');
    if (line == "\r") {
      break;
    }
  }
  Serial.println("Send Successfully");
}

ใช้ PMS3003ค่ะ

ลองเอาที่ให้ไปทดสอบดูก่อนนะครับ ลองดูผ่าน Serial Monitor ด้วยว่าแสดงผลถูกต้องหรือติดขัดมั้ยครับ เดี๋ยวถ้าว่างแล้วจะแก้ไขให้อีกทีครับ

1 Likes

Serial Moniter ไม่แสดงค่าเลยค่ะ line ก็ไม่มีแจ้งเตือน (ลองใช้โค้ดทดสอบไน์แค่บอร์ดอย่างเดียวก็แจ้งเตือนนะคะ)

Serial Monitor เขียนโค๊ดใช้พอร์ต 9600 ไว้ไม่ใช่เหรอครับ ใช้พอร์ต 115200 ก็ไม่เจออะไรสิครับ ลองใหม่นะครับ