ช่วยหน่อยครับ แจ้งเตือนไลน์ครั้งเดียว แล้วไม่แจ้งอีกเลย

ผมใช้บอร์ด esp8266 ผมได้ทำถังขยะเปิดปิดด้วยเซนเซอร์และแจ้งเตือนเมื่อถังขยะเต็ม ได้เจอปัญหาการแจ้งเตือนไลน์เข้ามาครั้งเดียวแล้วก็ไม่เข้ามาเลยทั้งๆที่ค่า Senser อ่านปกติ พอจะมีใครช่วยแนะนำผมได้บ้างครับ

#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
#include <TridentTD_LineNotify.h>
#include <Servo.h>

Servo myservo;

#define LINE_TOKEN "nYczuXng44ykxZObO1TcjLUZmIqQ0q6WTLeYSnTBmxo" //Token line


int Max = 28; //กำหนดความลึกของถัง โดยวัดจากขณะไม่มีขยะ
int detect = 30; //กำหนดระยะที่คนเดินผ่านแล้วเปิด
int LEDD0 = D0; // ขา D0
int LEDD7 = D7;

void setup()
{
Serial.begin(9600); //กำหนด Board rate
Serial.begin(9600); //กำหนด Board rate
WiFiManager wifiManager;
wifiManager.setTimeout(180); 
if(!wifiManager.autoConnect("AutoConnectAP")) 
{
Serial.println("Failed to connect and hit timeout");
delay(3000);
ESP.reset();
delay(5000);
}
WiFi.printDiag(Serial);
Serial.println();
Serial.println("connected...OK"); 
LINE.setToken(LINE_TOKEN); //กำหนด Token ของไลน์

ESP.wdtDisable(); //ปิดการใช้งาน wdt
ESP.wdtEnable(WDTO_8S); //เปิดการใช้งาน wdt ที่ 8 วินาที
Serial.println(LINE.getVersion()); //แสดงเวอร์ชั่นของไลน์

pinMode(LEDD0, OUTPUT);
pinMode(LEDD7, OUTPUT);
myservo.attach(D1); //ประกาศขาสัญญาณของ servo
servo("CLOSE"); //ให้ servo ปิด
}

bool level[3];
int Dis = 50 ;
int free_space = 28;
int garbage = 28;

void loop()
{
while (1)
{
static uint32_t t_tms15, t_tms500;
if (millis() - t_tms15 >= 15) //ลูปนี้ จะทำงานทุก 15 ms
{
t_tms15 = millis();
if (Dis < detect) //ถ้าระยะที่อ่านได้ น้อยกว่าที่ตั้ง 
{
servo("OPEN"); //ให้ servo เปิด
}
else //ถ้าไม่ใช่
{
servo("CLOSE"); //ให้ servo ปิด
}
}
if (millis() - t_tms500 >= 500) //ลูปนี้ จะทำงานทุก 500 ms
{
t_tms500 = millis();
Dis = sonic(D2, D3); //อ่านค่าจะ ultrasonic ที่ตรวจจับคน ดึงเข้าตัวแปรชื่อ Dis
Serial.println("Distance" + String(Dis));
free_space = sonic(D5, D6); //อ่านค่าจะ ultrasonic ที่ตรวจจับปริมาณขยะ ดึงเข้าตัวแปรชื่อ free_space
Serial.println("free_space" + String(free_space));
garbage = Max - free_space; //นำความลึกจากเซ็นเซอร์ถึงก้นถังขยะ(ที่ตั้งไว้) ลบกับ ความลึกจากเซ็นเซอร์ถึงบนขยะ จะได้ความสูงของขยะ
garbage = map(garbage, 0, Max, 0, 100); //นำความสูงของขยะมาแปลงเป็น 0 - 100%
Serial.println(String(garbage) + "%"); //แสดง %
if (Dis > detect) //ถ้าไม่มีคนแสดงว่าฝาปิดอยู่
{
if((garbage = 100) && level[3] == 0) //ถ้าเกิน 90% และตัวแปรตัว level ตัวที่ 4 ยังไม่แจ้งเตือน
{
LINE.notify("ถังขยะเต็มแล้ว"); //ให้ส่งข้อความนี้ออกไปที่ไลน์
level[3] = 1; //กำหนดให้ตัวแปรตัว level ตัวที่ 4 แจ้งเตือนแล้ว
}
else if((garbage >= 90) && level[2] == 0) //ถ้าเกิน 75% และตัวแปรตัว level ตัวที่ 3 ยังไม่แจ้งเตือน
{
LINE.notify("มีขยะประมาณ 90%"); //ให้ส่งข้อความนี้ออกไปที่ไลน์
level[2] = 1; //กำหนดให้ตัวแปรตัว level ตัวที่ 3 แจ้งเตือนแล้ว
}
else if((garbage >= 75) && level[1] == 0) //ถ้าเกิน 50% และตัวแปรตัว level ตัวที่ 2 ยังไม่แจ้งเตือน
{
LINE.notify("มีขยะประมาณ 75%"); //ให้ส่งข้อความนี้ออกไปที่ไลน์
level[1] = 1; //กำหนดให้ตัวแปรตัว level ตัวที่ 2 แจ้งเตือนแล้ว
}
else if(garbage <= 10)//ถ้าไม่มีขยะ หรือขยะถูกนำออกแล้ว
{
for(int i = 1;i<=3;i++) level[i] = 0; //กำหนดให้ตัวแปรตัว level ตัวที่ 1-4 ยังไม่แจ้งเตือน
}
}
}
ESP.wdtFeed(); //รีเซ็ทค่า wdt
}
}
int sonic(int Trig, int Echo) //ฟังชั่นอ่านค่า Ultrasonic โดยระบุขา Trig และ Echo ลงในวงเล็บตามลำดับ
{
long duration;
int cm;
pinMode(Trig, OUTPUT);
digitalWrite(Trig, LOW);
delayMicroseconds(2);
digitalWrite(Trig, HIGH);
delayMicroseconds(5);
digitalWrite(Trig, LOW);
pinMode(Echo, INPUT);
duration = pulseIn(Echo, HIGH);

cm = microsecondsToCentimeters(duration);

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

return cm;
}
long microsecondsToCentimeters(long microseconds)
{
return microseconds / 29 / 2;
}
void servo(String cmd) //ฟังชั่น servo
{
if (cmd == "OPEN") //ถ้ามีคำสั่ง OPEN
{
myservo.write(170); //ให้ servo หมุนไปที่ 170 องศา
}
if (cmd == "CLOSE")//ถ้ามีคำสั่ง CLOSE
{
myservo.write(0); //ให้ servo หมุนไปที่ 0 องศา
}

1 Like

ผมทำไฮไลท์โค้ดให้แล้วครับ

ข้อความที่มันส่งครั้งเดียวคือข้อความไหนครับ

ของผมมี 3 การแจ้งเตือนใช่ไหมครัย แต่ว่ามันจะส่งการแจ้งเตือนตอนใช้งานแค่ครั้งแรก มันจะส่งไล่มาจาก
1 ถังขยะเต็มแล้ว
2 ขยะมีปริมาณ 90%
3 ขยะมีปริมาณ 75%
มันส่งเข้ามาแบบนี้ครั้งแรกครั้งเดียว แล้วก็ไม่ส่งเข้ามาอีกเลย แต่ sensor ผมดูจาก serial monitor แล้วยังอ่านค่าปกติ

ถ้าดูจาก serial monitor แล้ว มันวิ่งผ่านคำสั่งส่ง line รึป่าวครับ มันวิ่งผ่านแต่ไม่ส่ง หรือว่ามันวิ่งผ่านแค่ครั้งเดียวแล้วไม่ผ่านคำสั่ง line อีกเลย เช็คหน่อยครับ

ผมเช็คตรงนี้ครับก่อนเข้าเงื่อนไขไลน์ แต่ไลนืในมือถือมันเด้ง 3 ข้อความขึ้นมาเฉยๆทั้งๆที่ไม่มีอะไรอยู่หน้าเซนเซอร์เลยครับ

ค่านี้อ่านได้เท่าไหร่ก่อนที่มันจะแจ้งเตือนครับ

ค่านี้จะอ่านเป็น CM แล้วแปลงเป้น %

ตรงนี้ซึ่งแปลงเป็น % แล้ว แต่เมื่อผมเสียบไฟเข้าบอร์ดปุ้ป มันจะเด้งข้อความทั้ง 3 Level มาทั้งหมดเลยทั้งๆที่ไม่ได้มีอะไรเข้าใกล้เซนเซอร์เลย แล้วเมื้อลองเทสเอาขยะทิ้งลงถัง ในตัวนี้มันขยับตามปริมาณจริงๆ แต่มันไม่ส่งการแจ้งเตือนเข้าไลน์ ตามที่เขียน if else ไว้ครับ

ถ้าวิเคราะห์จากโปรแกรมเบื้องต้นมันก็ควรจะส่งไลน์นั้นแหละครับ เนื่องจากค่า level ไม่ได้กำหนดค่าเบื้องต้นเอาไว้ว่าเป็น 0/1 ทำให้มันอาจจะเป็น 0 เริ่มต้น และค่า garbage ซึ้งต้องอ่านดูว่ามันได้ค่าเท่าไหร่ขณะที่ไม่มีอะไรบังอยู่ในระยะเซ็นเซอร์ ผมเดาว่าอ่านได้ 100% แน่ๆ ทำให้เข้าเงื่อนไข && ครบทั้งคู่ จากนั้นพออ่านส่งไลน์ไปแล้ว 1 รอบ ค่า level ทุกตัวเป็น 1 ทั้งหมดทำให้ไม่เข้าไปส่งการแจ้งเตื่อนซ้ำอีกรอบ

ใช่ครับ ถ้าไม่มีอะไรบังมันอ่านเป้น 100% ผมหาวิธีแก้ไม่ได้เลยครับคิดไม่ตกจริงๆ พอจะบอกวิธีได้ไหมครับ

ถ้าเอามือไปบังค่ามันจะลดป่าวครับ

ถ้ามีอะไรบังมันจะลดครับตามปริมาณที่เซนเซอร์วัดได้จริง

ลองสลับค่านี้ดูครับ

สลับเป็น ค่าต่ำสุด 100 ค่าสูงสุด เป็น 0 ใช่มั้ยครับ

ครับแล้วลองทดสอบดู

เดี๋ยวผมลองดูได้ผลยังไงจะมาแจ้งครับ ขอบคุณครับ

ยังไม่ได้เลยครับ ทีนี้ Sensor มันไม่อ่านค่าเลยครับ

ได้ค่าเท่าไหร่ครับขณะปกติ กับเอามือบัง


ได้ 0% ถ้าเอามือบังครับ ถ้าไม่มีอะไรบัง 100% ขึ้นไปครับ