Vgjf_Es
(Vgjf Es)
1
สวัสดีค่ะ พอดีเขียนเราเขียนโค้ดเกี่ยวกับการส่งค่าฝุ่น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);
}
}
Remy_Martin
(Permpol Thanapunnamas)
2
แคปหน้า Serial ตอนที่มันหยุดมาดูหน่อยครับ ปัญหามันน่าจะอยู่ตรงนี้แหละ
Vgjf_Es
(Vgjf Es)
5
อันนี้อัพโหลดได้แล้วค่ะ แต่ไม่มีแจ้งเตือนไปในไลน์เลยค่ะ
Remy_Martin
(Permpol Thanapunnamas)
6
กดตามที่บอกแล้วแคปมาดูครับ
Vgjf_Es
(Vgjf Es)
7
ช่วยหน่อยนะคะไม่รู้ว่าต้องทำยังไงต่อจริงๆค่ะ
Remy_Martin
(Permpol Thanapunnamas)
8
ตรงนี้คือมันทำงานอะไรบ้างครับ
Vgjf_Es
(Vgjf Es)
9
ไม่มีเลยค่ะ เพราะว่าโค้ดนี้ให้แจ้งผ่านไลน์อย่างเดียว
wzgto2020
(วสุ เอี่ยมละออ)
10
ลองดูตัวอย่างคร่าวๆตามนี้นะครับ ผมเปลี่ยนค่า 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
Vgjf_Es
(Vgjf Es)
12
Remy_Martin
(Permpol Thanapunnamas)
13
เอาหน่วงเวลาออกครับ ถ้าหน่วงแบบนี้ผมว่าจะจะเกิดการ Reset ก่อนแน่ๆ
1 Likes
Vgjf_Es
(Vgjf Es)
15
ช่วยแก้ในโค้ดได้ไหมคะ พอดีไม่มีความรู้เลย
wzgto2020
(วสุ เอี่ยมละออ)
16
ไม่ได้ถามก่อนว่าใช้ 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");
}
wzgto2020
(วสุ เอี่ยมละออ)
18
ลองเอาที่ให้ไปทดสอบดูก่อนนะครับ ลองดูผ่าน Serial Monitor ด้วยว่าแสดงผลถูกต้องหรือติดขัดมั้ยครับ เดี๋ยวถ้าว่างแล้วจะแก้ไขให้อีกทีครับ
1 Likes
Vgjf_Es
(Vgjf Es)
19
Serial Moniter ไม่แสดงค่าเลยค่ะ line ก็ไม่มีแจ้งเตือน (ลองใช้โค้ดทดสอบไน์แค่บอร์ดอย่างเดียวก็แจ้งเตือนนะคะ)
wzgto2020
(วสุ เอี่ยมละออ)
20
Serial Monitor เขียนโค๊ดใช้พอร์ต 9600 ไว้ไม่ใช่เหรอครับ ใช้พอร์ต 115200 ก็ไม่เจออะไรสิครับ ลองใหม่นะครับ