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

สลับค่า max ด้วยเลยครับ

วิธีที่ 1
garbage = map(garbage, Max, 0, 100, 0);

วิธีที่ 2

garbage = map(garbage, Max, 0, 0, 100);


ดูโอเคครับ แต่ไลน์ไม่เข้าเลยครับไม่ว่าจะขยับให้ถึงตาม if แล้ว :sob:

สรุปทำอะไรไปครับถึงได้ แล้วผลลัพธ์เป็นอย่างไร ถูกต้องไหม กรณีนี้มันมีหลายปัญหาต้องแก้ทีละจุด

ผมทำวิธีนี้ตามที่พี่แนะนำ มันก็อ่านค่าได้ตามที่ต้องการ แต่ว่ามันไม่แจ้งเตือนในไลน์ครับ

ตอนนี้เริ่มรันแล้วมันยังส่ง line มาสามอันเหมือนเดิมรึป่าว

ส่งมาเหมือนเดิมครับ

ขอโค้ตล่าสุดหน่อยครับ

#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 = 20;    //กำหนดความลึกของถัง โดยวัดจากขณะไม่มีขยะ
int detect = 30; //กำหนดระยะที่คนเดินผ่านแล้วเปิด
int pos = 0;
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 = 20;
int garbage = 20;

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, Max, 0, 100, 0); //นำความสูงของขยะมาแปลงเป็น 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 <= 74)//ถ้าไม่มีขยะ หรือขยะถูกนำออกแล้ว
        {
          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(28);   //ให้ servo หมุนไปที่ 0 องศา
  }
  if (cmd == "CLOSE")//ถ้ามีคำสั่ง CLOSE
  {
    myservo.write(0);   //ให้ servo หมุนไปที่ 0 องศา
  }
}

ใช้โค้ตนี้

#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 = 20;    //กำหนดความลึกของถัง โดยวัดจากขณะไม่มีขยะ
int detect = 30; //กำหนดระยะที่คนเดินผ่านแล้วเปิด
int pos = 0;
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 = 20;
int garbage = 20;

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, Max, 0, 100, 0); //นำความสูงของขยะมาแปลงเป็น 0 - 100%
      delay(5000);
      Serial.println("====================================="); 
      Serial.println(String(garbage) + "%");        //แสดง %
      Serial.println(String("level[3] == ") + level[3]); 
      Serial.println(String("level[2] == ") + level[2]); 
      Serial.println(String("level[1] == ") + level[1]); 
      Serial.println("====================================="); 
      

      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 <= 74)//ถ้าไม่มีขยะ หรือขยะถูกนำออกแล้ว
        {
          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(28);   //ให้ servo หมุนไปที่ 0 องศา
  }
  if (cmd == "CLOSE")//ถ้ามีคำสั่ง CLOSE
  {
    myservo.write(0);   //ให้ servo หมุนไปที่ 0 องศา
  }
}

ผมอยากเห็นข้อมูลชุดนี้ครั้งแรกที่รัน ก่อนที่มันจะส่ง line มา แคปมาให้ดูหน่อยครับ

image


ได้ค่าตามนี้ครับ

ทำไมค่าเริ่มต้นถึงได้ 100% ครับ มีอะไรไปบังรึป่าว

image

ไม่มีอะไรบังครับ

แล้วตอนแรกที่บอกว่าได้นี้คือไม่ขึ้น 100% ตอนไม่บังอะไรแล้วไม่ไช่หรือครับ ค่ามันต้องได้แบบนี้สิ หรือว่าผมเข้าใจอะไรผิด

ตอนไฟเข้าครั้งแรกมันจะ 100% ตลอดเลยอะครับ ผมต้อหาอะไรไปบังมัน มันถึงจะขยับตามค่านั้น แต่ตอนนี้ผมขยับให้มันได้ 5% แบบนี้มันถูกไหมครับ

ขอภาพดูหน่อยว่าขยับยังไง วิธีไหน

เหมือนตัว free_space มันอ่านค่าไม่สเถียรอะครับ สัญญาณอะไรรบกวนเกี่ยวมั้ยครับ เพราะผมใช้ เซนเซอร์รุ่นเดียวกัน 2 ตัว

1 Likes

อันนี้ได้ 5% หรอครับ แล้วขยับไปที่ เลย 4 ของไม้บรรทัดได้กี่% แล้วถ้าไม่มีอะไรบังเลยได้กี่ %

เลข 4 ได้ 48%
ไม่มีอะไรบังเลยได้ -700+ % ครับ

ยิ่งใกล้ถังค่ายิ่งมากใช่ไหม