พี่ครับ ได้แล้วครับ ขอบคุณมากๆครับพี่ แล้วถ้าเกิดผมอยากจะเพิ่มหลอดไฟ 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 ระบบอะครับคือ
- ไม่เชื่อมไวไฟสามารถ เปิด-ปิดฝาถังได้ปกติ
- เชื่อมไวไฟเมื่อไหร่ก็ได้
ประมาณนี้ครับผมแก้แล้ว ลองทุกทางที่คิดว่าได้แต่มันก้ยังไม่ได้ครับ
ตั้งกระทู้ใหม่เลยครับ ผมปิดประเด็นนี้ไปแล้ว