wzgto2020
(วสุ เอี่ยมละออ)
25
สาเหตุที่ไม่แจ้งเตือน
1.อ่านค่าจาก Sensor ไม่ได้
2.โค๊ดที่ผมส่งให้ใน loop มีสองส่วนคือ ให้อ่านค่า Sensor กับ ตั้งเวลาในการส่งไลน์
ที่ไม่ส่งอะไรออกเลยเพราะอ่านค่าไม่ได้กับไม่ได้ตั้งเวลาในการส่งไลน์ใหม่ครับ เมื่อสักครู่ผมทดสอบตั้งไว้ที่ 14.30
ส่วนเรื่องโค๊ดของ PMS3003 ให้ลองทดสอบจากลิงค์ข้างล่างนี้ครับว่าสามารถอ่านค่าได้หรือไม่
สอนการใช้งาน PMS3003
wzgto2020
(วสุ เอี่ยมละออ)
27
บรรทัดที่ 92 ครับ
//ส่วนนี้เป้นการตั้งเวลาสำหรับการส่งไลน์ ซึ่งจำเป็นต้องระบุเป็นวินาทีด้วยเพื่อให้ส่งเพียงครั้งเดียว ไม่เช่นนั้นจะส่งจนครบนาที
if( (p_tm->tm_hour == 14) && (p_tm->tm_min == 30) && (p_tm->tm_sec == 00) ){ // tm_hour ใช้รูปแบบเวลา 24 ชม.
1 Likes
Vgjf_Es
(Vgjf Es)
28
มันแจ้งเตือนนะคะ แต่ค่าฝุ่นที่ได้ มันไม่ใช่ค่าจริงค่ะ ขอบคุณค่ะ
2 Likes
wzgto2020
(วสุ เอี่ยมละออ)
29
ลองเปลี่ยนใช้โค๊ดตามลิงค์ที่ให้ไปทดสอบดููนะครับว่าได้ค่าที่ถูกต้องมั้ย
1 Likes
Vgjf_Es
(Vgjf Es)
30
ลองหมดแล้วคะทุกอย่างปกติ ยกเว้นคำสั่งไลน์อย่างเดียวค่ะ
Remy_Martin
(Permpol Thanapunnamas)
31
ไลน์แนะนำให้เปลี่ยนไปใช้ library แทนครับ
1 Likes
wzgto2020
(วสุ เอี่ยมละออ)
32
ลองดูนะครับ ของผมใช้โมดูล 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");
}
Vgjf_Es
(Vgjf Es)
33
ก็ใช้ไลบารีนะคะ แต่ไม่ได้
#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);
}
}
Vgjf_Es
(Vgjf Es)
34
ในส่วนของการตั้งเวลาอ่ะคะ สามารถตั้งให้ส่งมากกว่า1ครั้งได้ไหมคะ หรือที่เขียนว่าจะส่งครบนาทีนี้ต้องปรับยังไงคะ
wzgto2020
(วสุ เอี่ยมละออ)
35
ส่วนของการตั้งเวลาสามารถทำแบบนี้ได้เลยครับ หรือจะเอาไปดัดแปลงก็แล้วแต่ชอบครับ
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("ส่งไลน์สำเร็จ");
}
Vgjf_Es
(Vgjf Es)
36
มันแจ้งเตือนนะคะ แต่ค่ามันเป็น0 อ่ะคะ ช่วยแก้ไม่ให้เป็น0 ทีนะคะ อย่างอื่นได้แล้วค่ะ
PUYIOT
(อิทธิรงค์ ทองย้อย (ปุ๋ย))
37
ขออนุญาตแสดงความคิดเห็นนะครับ ผิดถูก อย่าว่ากัน
ปล.ตอนแรกแจ้งเตือนไปประมาณ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
PUYIOT
(อิทธิรงค์ ทองย้อย (ปุ๋ย))
38
เมื่อกี้ตก code ไปครับผมเพิ่มให้แล้ว copy ทดสอบใหม่ครับ
PUYIOT
(อิทธิรงค์ ทองย้อย (ปุ๋ย))
41
ที่ให้ Code ไป ผมยังไม่ Complie เลยครับ เดี๋ยว Copy Code ใหม่ครับ ที่ Post เดิมของผม
wzgto2020
(วสุ เอี่ยมละออ)
42
ตัวอย่างของโรงเรียนที่ผมเป็นที่ปรึกษาให้ครับ เอาไว้ให้จบโครงการก่อนถึงจะนำโค๊ดแจกจ่ายได้น่ะครับ
1 Likes
Remy_Martin
(Permpol Thanapunnamas)
43
น่าสนใจมากครับ คอยติดตามชมครับ
1 Likes