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


พี่ครับ ได้แล้วครับ ขอบคุณมากๆครับพี่ แล้วถ้าเกิดผมอยากจะเพิ่มหลอดไฟ LED ผมต้องเขียนโค้ดใน นี้ได้ไหมครับหรือต้องสร้าง if เพิ่ม

ใส่ตรงนั้นได้เลยครับ

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

#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" 

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

void setup()
{
  Serial.begin(9600);     //กำหนด Board rate
  WiFiManager wifiManager;   
  if(!wifiManager.autoConnect("Auto Trash Bin")) 
   {
     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()); 

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

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

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) + "%");        //แสดง %
      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 >= 80) && level[2] == 0)        //ถ้าเกิน 80% และตัวแปรตัว level ตัวที่ 2 ยังไม่แจ้งเตือน
        {
          LINE.notify("ถังขยะใกล้เต็มแล้ว"); //ให้ส่งข้อความนี้ออกไปที่ไลน์
          level[2] = 1;                   //กำหนดให้ตัวแปรตัว level ตัวที่ 3 แจ้งเตือนแล้ว
        }
        else if((garbage >= 60) && level[1] == 0)   //ถ้าเกิน 60% และตัวแปรตัว level ตัวที่ 1 ยังไม่แจ้งเตือน
        {
          LINE.notify("มีขยะประมาณ 60%"); //ให้ส่งข้อความนี้ออกไปที่ไลน
          level[1] = 1;                   //กำหนดให้ตัวแปรตัว level ตัวที่ 1 แจ้งเตือนแล้ว
        }
        else if(garbage <= 10)//ถ้าไม่มีขยะ หรือขยะถูกนำออกแล้ว
        {
          for(int i = 1;i<=2;i++) level[i] = 0; //กำหนดให้ตัวแปรตัว level ตัวที่ 1-3 ยังไม่แจ้งเตือน
        }
      }
    }
        if (millis() - t_tms500 >= 500) //ลูปนี้ จะทำงานทุก 500 ms
        {
            t_tms500 = millis();
      
          if(garbage >= 80)
          {
            digitalWrite(LEDD0, HIGH);
            digitalWrite(LEDD4, LOW);
          }
          else
          {
            digitalWrite(LEDD4, HIGH);
            digitalWrite(LEDD0, LOW);
          }
        }
    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(30);   //ให้ servo หมุนไปที่ 30 องศา
  }
  if (cmd == "CLOSE")//ถ้ามีคำสั่ง CLOSE
  {
    myservo.write(0);   //ให้ servo หมุนไปที่ 0 องศา
  }
}

ผมต้องการใช้ 2 ระบบอะครับคือ

  1. ไม่เชื่อมไวไฟสามารถ เปิด-ปิดฝาถังได้ปกติ
  2. เชื่อมไวไฟเมื่อไหร่ก็ได้
    ประมาณนี้ครับผมแก้แล้ว ลองทุกทางที่คิดว่าได้แต่มันก้ยังไม่ได้ครับ

ตั้งกระทู้ใหม่เลยครับ ผมปิดประเด็นนี้ไปแล้ว