ลองเปลี่ยนแล้วค่ะ ไม่ได้เหมือนเดิมค่ะ
สาเหตุที่ไม่แจ้งเตือน
1.อ่านค่าจาก Sensor ไม่ได้
2.โค๊ดที่ผมส่งให้ใน loop มีสองส่วนคือ ให้อ่านค่า Sensor กับ ตั้งเวลาในการส่งไลน์
ที่ไม่ส่งอะไรออกเลยเพราะอ่านค่าไม่ได้กับไม่ได้ตั้งเวลาในการส่งไลน์ใหม่ครับ เมื่อสักครู่ผมทดสอบตั้งไว้ที่ 14.30
ส่วนเรื่องโค๊ดของ PMS3003 ให้ลองทดสอบจากลิงค์ข้างล่างนี้ครับว่าสามารถอ่านค่าได้หรือไม่
บรรทัดที่ 92 ครับ
//ส่วนนี้เป้นการตั้งเวลาสำหรับการส่งไลน์ ซึ่งจำเป็นต้องระบุเป็นวินาทีด้วยเพื่อให้ส่งเพียงครั้งเดียว ไม่เช่นนั้นจะส่งจนครบนาที
if( (p_tm->tm_hour == 14) && (p_tm->tm_min == 30) && (p_tm->tm_sec == 00) ){ // tm_hour ใช้รูปแบบเวลา 24 ชม.
มันแจ้งเตือนนะคะ แต่ค่าฝุ่นที่ได้ มันไม่ใช่ค่าจริงค่ะ ขอบคุณค่ะ
ลองเปลี่ยนใช้โค๊ดตามลิงค์ที่ให้ไปทดสอบดููนะครับว่าได้ค่าที่ถูกต้องมั้ย
ลองหมดแล้วคะทุกอย่างปกติ ยกเว้นคำสั่งไลน์อย่างเดียวค่ะ
ไลน์แนะนำให้เปลี่ยนไปใช้ library แทนครับ
ลองดูนะครับ ของผมใช้โมดูล 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 ทีนะคะ อย่างอื่นได้แล้วค่ะ
ขออนุญาตแสดงความคิดเห็นนะครับ ผิดถูก อย่าว่ากัน
ปล.ตอนแรกแจ้งเตือนไปประมาณ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);
}
เมื่อกี้ตก code ไปครับผมเพิ่มให้แล้ว copy ทดสอบใหม่ครับ
คอมพายไม่ผ่านค่ะ
วาง error ให้ดูด้วยครับ
ที่ให้ Code ไป ผมยังไม่ Complie เลยครับ เดี๋ยว Copy Code ใหม่ครับ ที่ Post เดิมของผม