สลับค่า max ด้วยเลยครับ
วิธีที่ 1
garbage = map(garbage, Max, 0, 100, 0);
วิธีที่ 2
garbage = map(garbage, Max, 0, 0, 100);
สลับค่า max ด้วยเลยครับ
วิธีที่ 1
garbage = map(garbage, Max, 0, 100, 0);
วิธีที่ 2
garbage = map(garbage, Max, 0, 0, 100);
สรุปทำอะไรไปครับถึงได้ แล้วผลลัพธ์เป็นอย่างไร ถูกต้องไหม กรณีนี้มันมีหลายปัญหาต้องแก้ทีละจุด
ผมทำวิธีนี้ตามที่พี่แนะนำ มันก็อ่านค่าได้ตามที่ต้องการ แต่ว่ามันไม่แจ้งเตือนในไลน์ครับ
ตอนนี้เริ่มรันแล้วมันยังส่ง 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 มา แคปมาให้ดูหน่อยครับ
ทำไมค่าเริ่มต้นถึงได้ 100% ครับ มีอะไรไปบังรึป่าว
ไม่มีอะไรบังครับ
แล้วตอนแรกที่บอกว่าได้นี้คือไม่ขึ้น 100% ตอนไม่บังอะไรแล้วไม่ไช่หรือครับ ค่ามันต้องได้แบบนี้สิ หรือว่าผมเข้าใจอะไรผิด
ตอนไฟเข้าครั้งแรกมันจะ 100% ตลอดเลยอะครับ ผมต้อหาอะไรไปบังมัน มันถึงจะขยับตามค่านั้น แต่ตอนนี้ผมขยับให้มันได้ 5% แบบนี้มันถูกไหมครับ
ขอภาพดูหน่อยว่าขยับยังไง วิธีไหน
เหมือนตัว free_space มันอ่านค่าไม่สเถียรอะครับ สัญญาณอะไรรบกวนเกี่ยวมั้ยครับ เพราะผมใช้ เซนเซอร์รุ่นเดียวกัน 2 ตัว
อันนี้ได้ 5% หรอครับ แล้วขยับไปที่ เลย 4 ของไม้บรรทัดได้กี่% แล้วถ้าไม่มีอะไรบังเลยได้กี่ %
เลข 4 ได้ 48%
ไม่มีอะไรบังเลยได้ -700+ % ครับ
ยิ่งใกล้ถังค่ายิ่งมากใช่ไหม