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

สาเหตุที่ไม่แจ้งเตือน
1.อ่านค่าจาก Sensor ไม่ได้
2.โค๊ดที่ผมส่งให้ใน loop มีสองส่วนคือ ให้อ่านค่า Sensor กับ ตั้งเวลาในการส่งไลน์

ที่ไม่ส่งอะไรออกเลยเพราะอ่านค่าไม่ได้กับไม่ได้ตั้งเวลาในการส่งไลน์ใหม่ครับ เมื่อสักครู่ผมทดสอบตั้งไว้ที่ 14.30

ส่วนเรื่องโค๊ดของ PMS3003 ให้ลองทดสอบจากลิงค์ข้างล่างนี้ครับว่าสามารถอ่านค่าได้หรือไม่

สอนการใช้งาน PMS3003

บรรทัดที่ 92 ครับ

//ส่วนนี้เป้นการตั้งเวลาสำหรับการส่งไลน์ ซึ่งจำเป็นต้องระบุเป็นวินาทีด้วยเพื่อให้ส่งเพียงครั้งเดียว ไม่เช่นนั้นจะส่งจนครบนาที
    if( (p_tm->tm_hour == 14) && (p_tm->tm_min == 30) && (p_tm->tm_sec == 00) ){ // tm_hour ใช้รูปแบบเวลา 24 ชม.
1 Likes

มันแจ้งเตือนนะคะ แต่ค่าฝุ่นที่ได้ มันไม่ใช่ค่าจริงค่ะ ขอบคุณค่ะ

2 Likes

ลองเปลี่ยนใช้โค๊ดตามลิงค์ที่ให้ไปทดสอบดููนะครับว่าได้ค่าที่ถูกต้องมั้ย

1 Likes

ลองหมดแล้วคะทุกอย่างปกติ ยกเว้นคำสั่งไลน์อย่างเดียวค่ะ

ไลน์แนะนำให้เปลี่ยนไปใช้ library แทนครับ

1 Likes

ลองดูนะครับ ของผมใช้โมดูล GP2y1010 เลยไม่สามารถทดสอบของ PMS ได้ แต่ลองคอมไพล์ดูว่าผ่านครับ ลองเอาไปใช้ดูนะครับ

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

#include <SoftwareSerial.h>
SoftwareSerial mySerial(4,5); // TX, RX //ต่อ D2 กับ TX และ D1 กับ RX
unsigned int pm1 = 0;
unsigned int pm2_5 = 0;
unsigned int pm10 = 0;

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

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

void setup() {

// การตั้งค่า Serial Print เพื่อจะได้ตรวจสอบได้ว่าการทำงานถึงขั้นตอนไหน และประสบผลหรือไม่
  Serial.begin(9600); 
  
  while (!Serial) { mySerial.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");   

}

void loop(){

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

int index = 0;
char value;
char previousValue;

  String Ex_pm1 = String(pm1);
  String Ex_pm2_5 = String(pm2_5);
  String Ex_pm10 = String(pm10);
  
  while (mySerial.available()) {
  value = mySerial.read();
  if ((index == 0 && value != 0x42) || (index == 1 && value != 0x4d)){
  Serial.println("Cannot find the data header.");
  break;
  }
 
  if (index == 4 || index == 6 || index == 8 || index == 10 || index == 12 || index == 14) {
  previousValue = value;
  }
  else if (index == 5) {
  pm1 = 256 * previousValue + value;
  Serial.print("{ ");
  Serial.print("\"pm1\": ");
  Serial.print(pm1);
  Serial.print(" ug/m3");
  Serial.print(", ");
  LINE_Notify("PM1 = " + (Ex_pm1) + " ug/m3");
  Serial.println("ส่งไลน์สำเร็จ"); //แสดงผลเมื่อส่งไลน์สำเร็จ
  }
  else if (index == 7) {
  pm2_5 = 256 * previousValue + value;
  Serial.print("\"pm2_5\": ");
  Serial.print(pm2_5);
  Serial.print(" ug/m3");
  Serial.print(", ");
  LINE_Notify("PM2.5 = " + (Ex_pm2_5) + " ug/m3");
  Serial.println("ส่งไลน์สำเร็จ"); //แสดงผลเมื่อส่งไลน์สำเร็จ
  }
  else if (index == 9) {
  pm10 = 256 * previousValue + value;
  Serial.print("\"pm10\": ");
  Serial.print(pm10);
  Serial.print(" ug/m3");
  LINE_Notify("PM10 = " + (Ex_pm10) + " ug/m3");
  Serial.println("ส่งไลน์สำเร็จ"); //แสดงผลเมื่อส่งไลน์สำเร็จ
  } else if (index > 15) {
  break;
  }
  index++;
}

  while(mySerial.available()) mySerial.read();
  Serial.println(" }");
  delay(1000);

//ส่วนนี้เป้นการตั้งเวลาสำหรับการส่งไลน์ ซึ่งจำเป็นต้องระบุเป็นวินาทีด้วยเพื่อให้ส่งเพียงครั้งเดียว ไม่เช่นนั้นจะส่งจนครบนาที
    if( (p_tm->tm_hour == 14) && (p_tm->tm_min == 30) && (p_tm->tm_sec == 00) ){ // tm_hour ใช้รูปแบบเวลา 24 ชม.
      LINE_Notify("PM1 = " + (Ex_pm1) + " ug/m3");
      LINE_Notify("PM2.5 = " + (Ex_pm2_5) + " ug/m3");
      LINE_Notify("PM10 = " + (Ex_pm10) + " ug/m3");
      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");
}

ก็ใช้ไลบารีนะคะ แต่ไม่ได้

#include “PMS.h”
#include <TridentTD_LineNotify.h>

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

#define SSID “Suwimol_2.4G” // บรรทัดที่ 11 ให้ใส่ ชื่อ Wifi ที่จะเชื่อมต่อ
#define PASSWORD “0918306197” // บรรทัดที่ 12 ใส่ รหัส Wifi
#define LINE_TOKEN “HJgDkh1iRZIjRO3WusiytxgyoaTiqTgs3l2bZ6KWpcW” // บรรทัดที่ 13 ใส่ รหัส TOKEN ที่ได้มาจากข้างบน
void setup() {
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(1000);
}
}

ในส่วนของการตั้งเวลาอ่ะคะ สามารถตั้งให้ส่งมากกว่า1ครั้งได้ไหมคะ หรือที่เขียนว่าจะส่งครบนาทีนี้ต้องปรับยังไงคะ

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

  if( (p_tm->tm_hour == 06) && (p_tm->tm_min == 00) && (p_tm->tm_sec == 00) ){
    LINE_Notify(T1_text);
    LINE_Notify(T2_text);
    LINE_Notify(T3_text);
    Serial.println("ส่งไลน์สำเร็จ");   
  }  


  if( (p_tm->tm_hour == 12) && (p_tm->tm_min == 00) && (p_tm->tm_sec == 00) ){
    LINE_Notify(T1_text);
    LINE_Notify(T2_text);
    LINE_Notify(T3_text);
    Serial.println("ส่งไลน์สำเร็จ");   
  }  


  if( (p_tm->tm_hour == 16) && (p_tm->tm_min == 00) && (p_tm->tm_sec == 00) ){
    LINE_Notify(T1_text);
    LINE_Notify(T2_text);
    LINE_Notify(T3_text);
    Serial.println("ส่งไลน์สำเร็จ");   
  }  

มันแจ้งเตือนนะคะ แต่ค่ามันเป็น0 อ่ะคะ ช่วยแก้ไม่ให้เป็น0 ทีนะคะ อย่างอื่นได้แล้วค่ะ

ขออนุญาตแสดงความคิดเห็นนะครับ ผิดถูก อย่าว่ากัน
1

ปล.ตอนแรกแจ้งเตือนไปประมาณ3-4ค่า แล้วก็หยุดแจ้งเตือนไปเลยค่ะ

แสดงว่ามันแจ้งใช่มั๊ยครับ แล้วก็หยุดไป

จากภาพ delay 5 นาที แล้วให้อ่านค่า 1 ครั้ง

ผมปรับ Code ให้เป็นแนวทางครับ
หมายเหตุ ผมจะ Update Code ที่เปลี่ยนแปลงไว้ที่นี่ที่เดียว แต่จะระบุเวลาการ Update ไว้ให้นะครับ

แก้ Code ใหม่ 22.18 น. 22/02/2565
แก้ Code ใหม่ 22.28 น. 22/02/2565

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

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

int count = 0;
int pms_read ;

String LineText;
String string0 = "--รายงานคุณภาพอากาศ --";
String string1 = "PM 1.0 = ";
String string2 = "PM 2.5 = ";
String string3 = "PM 10 = ";
String string4 = " (ug/m3)";


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

  //  }
  //ให้อ่านค่า  ไปเลย  พร้อมแสดงในหน้า monitor  ว่ามันอ่านค่า 3 ค่า นี้ได้จริง ถ้าอ่านได้จริงก็ ใส่เครื่องหมาย // เพื่อหยุดการแสดงผลในหน้า monitor
  pms_read = pms.read(data);
  Serial.println("PM 1.0 = " + String(data.PM_AE_UG_1_0) + " (ug/m3)");
  Serial.println("PM 2.5 = " + String(data.PM_AE_UG_2_5) + " (ug/m3)");
  Serial.println("PM 2.5 = " + String(data.PM_AE_UG_10_0) + " (ug/m3)");
  Serial.print("Count : ");
  Serial.print(count);
  Serial.println(" s");


  count = count + 1;

  if (count == 300) { //ถ้าอ่านครบ  5 นาที (300วินาที) ก็ให้ส่ง  Line

    LineText = "\n" + string0
               + "\n" + string1 + String(data.PM_AE_UG_1_0) + string4
               + "\n" + string2 + String(data.PM_AE_UG_2_5) + string4
               + "\n" + string3 + String(data.PM_AE_UG_10_0) + string4;

    LINE.notify(LineText);
    count = 0;
  }


  delay(1000);
}



เอาการส่ง Line ให้ผ่านก่อนครับ

ตัวอย่างต่อไป ไม่ต้องใช้ Library แล้วครับ

แก้ Code ใหม่ 07.32 น. 23/02/2565

#include <SoftwareSerial.h>
SoftwareSerial mySerial(D7, D6); // RX, TX
unsigned int pm1 = 0;
unsigned int pm2_5 = 0;
unsigned int pm10 = 0;

#include <TridentTD_LineNotify.h>

#define SSID        "Suwimol_2.4G"   // บรรทัดที่ 11 ให้ใส่ ชื่อ Wifi ที่จะเชื่อมต่อ
#define PASSWORD    "0918306197"     // บรรทัดที่ 12 ใส่ รหัส Wifi
#define LINE_TOKEN  "sAunR4BaxR1Qa6uWTDn6MdSwCdNx0W6QOW4Vpi4o9fR"   // บรรทัดที่ 13 ใส่ รหัส TOKEN ที่ได้มาจากข้างบน

int count = 0;

String LineText;
String string0 = "--รายงานคุณภาพอากาศ --";
String string1 = "PM 1.0 = ";
String string2 = "PM 2.5 = ";
String string3 = "PM 10 = ";
String string4 = " (ug/m3)";


void setup() {

  Serial.begin(115200); //ถ้าต้องการดูค่าใน Serial monitor ให้เลือก Bound Rate 115200
  while (!Serial) ;
  mySerial.begin(9600);



  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() {

  //เริ่มการอ่านค่า
  int index = 0;
  char value;
  char previousValue;

  while (mySerial.available()) {
    value = mySerial.read();
    if ((index == 0 && value != 0x42) || (index == 1 && value != 0x4d)) {
      Serial.println("Cannot find the data header.");
      break;
    }

    if (index == 4 || index == 6 || index == 8 || index == 10 || index == 12 || index == 14) {
      previousValue = value;
    }
    else if (index == 5) {
      pm1 = 256 * previousValue + value;
      Serial.print("{ ");
      Serial.print("\"pm1\": ");
      Serial.print(pm1);
      Serial.print(" ug/m3");
      Serial.print(", ");
    }
    else if (index == 7) {
      pm2_5 = 256 * previousValue + value;
      Serial.print("\"pm2_5\": ");
      Serial.print(pm2_5);
      Serial.print(" ug/m3");
      Serial.print(", ");
    }
    else if (index == 9) {
      pm10 = 256 * previousValue + value;
      Serial.print("\"pm10\": ");
      Serial.print(pm10);
      Serial.print(" ug/m3");
    } else if (index > 15) {
      break;
    }
    index++;
  }

  while (mySerial.available()) mySerial.read();
  Serial.println(" }");

  //จบการอ่านค่า


  // กำหนดเวลาในการส่ง  Line
  Serial.print("Count : ");
  Serial.print(count);
  Serial.println(" s");


  count = count + 1;

  if (count == 300) { //ถ้าอ่านครบ  5 นาที (300วินาที) ก็ให้ส่ง  Line  ถ้าต้องการให้ส่งเร็วหน่อยก็ แก้ตัวเลข 300 นี้ให้ลดลงมา

    LineText = "\n" + string0
               + "\n" + string1 + pm1 + string4
               + "\n" + string2 + pm2_5 + string4
               + "\n" + string3 + pm10 + string4;

    LINE.notify(LineText);
    count = 0;
  }


  delay(1000);
}



1 Likes

เมื่อกี้ตก​ code ไปครับผมเพิ่มให้แล้ว​ copy ทดสอบใหม่ครับ

คอมพายไม่ผ่านค่ะ :joy: :joy:

วาง error ให้ดูด้วยครับ

ที่ให้ Code ไป ผมยังไม่ Complie เลยครับ เดี๋ยว Copy Code ใหม่ครับ ที่ Post เดิมของผม

ตัวอย่างของโรงเรียนที่ผมเป็นที่ปรึกษาให้ครับ เอาไว้ให้จบโครงการก่อนถึงจะนำโค๊ดแจกจ่ายได้น่ะครับ :slight_smile:



1 Likes

น่าสนใจมากครับ คอยติดตามชมครับ

1 Likes

ผมขอรอชมด้วยอีกคนครับ

1 Likes

ขอบคุณนะคะ ใช้ได้แล้วค่ะ :pray: :pray:

1 Likes