สวัสดีครับพอดีผมกำลังทำโปรเจคเกี่ยวกับการแจ้งเตือยของ PIR sensor อยู๋ครับ ผมอยากทราบว่าถ้าจะทำการแจ้งเตือนเมื่อไม่มีคนเดินผ่าน PIR เป็นระยะเวลานาน แบ่งเวลาเป็นกลางวันกับกลางคืน เช่น กลางวันไม่มีคนผ่าน 5 ชม. ให้แจ้งเตือน กลางคืนไม่มีคนเดินผ่าน 5 ชม. ให้แจ้งเตือน แต่ถ้ามีคนเดินผ่าน sensor ให้เริ่มนับเวลาใหม่ แบบนี้ทำได้มั้ยครับ ถ้าทำได้ต้องใช้ตัว Notify กับ widget timer หรือ input timer ถูกมั้ยครับ ขอบคุณครับ
ต้องถามว่า การแบ่งเวลา กลางวันกับกลางคืน นี้ตัองเปะรึป่าวครับ อย่างเช่น กลางวันต้องเริ่มตั้งแต่กี่โมง ถึงจะนับ ไป 5 ชม กลางคืนเริ่มกี่โมง ถึงจะนับไปอีก 5 ชม ซึ่ง เราสามารถใช้ฟังก์ชันนับเวลาได้ว่าทุกๆ กี่ ชม ให้ทำอะไร โดยที่เราไม่จำเป็นต้องไปใช้ widget ประเภท timer หรือ timer input เพราะเป็นการใช้งานคนละแบบกันครับ
unsigned long start;
unsigned long now;
int movement = 0;
long warning = 60000; // Warning...60second test
BLYNK_CONNECTED() {
Blynk.syncVirtual(V0);
}
BLYNK_WRITE(V0){
x = param.asInt();
}
void pir() //Func PIR sensor
{
if (x == 1)
{
movement = digitalRead(pirPin);
if(movement)
{
Serial.print("Movement!!\n");
//Blynk.notify("Movement!!");
start = millis();
}
now = millis();
if(now - start > warning)
{
Serial.print("WARNING!!\n");
Blynk.notify("WARNING!!");
}
}
}
อันนี้เป็นโค้ดที่เขียนคร่าว ๆ ครับ ใช้งานได้เลยครับแต่ไม่ได้แบ่งเวลา ในฟังก์ชั่นผมกำหนดไว้ว่าให้เริ่มการทำงานเมื่อกดปุ่ม แต่ทำไมเวลามันเริ่มนับตั้งแต่ผมยังไม่กดปุ่มให้มันทำงานเลยอะครับ ประมาณว่าในโค้ดผมให้แจ้งเตือนเมื่อไม่มีคนผ่าน 60 วินาที หลังกดปุ่มเปิดแต่มันดันนับก่อนที่ผมจะกดเปิดปุ่มพอผมกดปุ่มเปิดใช้มันก็แจ้งเตือนเลย
ส่วนในคำถามผมต้องการจะ ฟิกซ์เวลาครับเช่นตอนเช้าเริ่มตั้งแต่ 8 โมง - 5 โมงเย็น ตอนกลางคืนเริ่มตั้งแต่ เที่ยงคืน - 6 โมงเช้า
หลักการเขียนรับส่งค่าจากปุ่ม blynk ศึกษาได้จากกระทู้นี้ครับ
ส่วนตัวโค้ตหลักที่แนบมาผมไม่แน่ใจว่าเอามาทั้งหมดหรือไม่เพราะ void setup กับ void loop ไม่มีครับ
อ๋อไม่ได้เอามาทั้งหมดครับเอามาเฉพาะฟังก์ชั่นของ PIR ครับ
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>
#define pirPin D8
unsigned long start;
unsigned long now;
int movement = 0;
long warning = 60000; // Warning...60second test
BLYNK_CONNECTED() {
Blynk.syncVirtual(V0);
}
BLYNK_WRITE(V0){
x = param.asInt();
}
void pir() //Func PIR sensor
{
if (x == 1)
{
movement = digitalRead(pirPin);
if(movement)
{
Serial.print("Movement!!\n");
//Blynk.notify("Movement!!");
start = millis();
}
now = millis();
if(now - start > warning)
{
Serial.print("WARNING!!\n");
Blynk.notify("WARNING!!");
}
}
}
void setup()
{
Serial.begin(9600);
Blynk.begin(auth, ssid, pass,);
pinMode(pirPin, INPUT);
timer.setInterval(1000L, pir);
}
void loop()
{
Blynk.run();
timer.run();
}
ผมแค่ไม่เข้าใจว่าทำไมเวลามันนับตั้งแต่ยังไม่กดปุ่มเปิด ทั้ง ๆ ที่โค้ดอยู่ในเงื่อนไขแล้ว
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>
#define pirPin D8
char auth[] = "";
char ssid[] = "";
char pass[] = "";
int x;
unsigned long start;
unsigned long now;
int movement = 0;
long warning = 60000; // Warning...60second test
BLYNK_CONNECTED() {
Blynk.syncVirtual(V0);
}
BLYNK_WRITE(V0){
x = param.asInt();
}
void pir() //Func PIR sensor
{
if (x == 1)
{
movement = digitalRead(pirPin);
if(movement)
{
Serial.print("Movement!!\n");
//Blynk.notify("Movement!!");
start = millis();
}
now = millis();
if(now - start > warning)
{
Serial.print("WARNING!!\n");
Blynk.notify("WARNING!!");
}
}
}
void setup()
{
Serial.begin(9600);
Blynk.begin(auth, ssid, pass,);
pinMode(pirPin, INPUT);
timer.setInterval(1000L, pir);
}
void loop()
{
Blynk.run();
timer.run();
}
-ขอโทษครับผมก็อปมาไม่หมดพอดีจะลบพวก auth เผลอลบ x ไปด้วย
ลักษณะโครงสร้างของการรับค่าจากปุ่มควรจะเป็นแบบนี้ครับ
BLYNK_WRITE(V1)
{
if (param.asInt()==1) {
}else{
}
}
หรือแบบนี้
BLYNK_WRITE(V1) {
if (param.asInt()== 1) {
work = true;
}else{
work = false;
}
}
void loop()
{
Blynk.run();
if(work == true) {
// คำสั่งทำงาน
}else{
}
}
อย่างที่บอกครับ ผมวิเคราะห์ได้ตามข้อมูลที่มี ข้อมูลผิด ผมก็วิเคราะห์ผิดตามไปด้วยครับ
เอาไว้เดี๋ยวลองแก้ดูนะครับ ถ้าติดอะไรเดี๋ยวมาถามใหม่นะครับ ขอบคุณครับ
จัดไปครับ ช่วงนี้อาจตอบช้านะครับ ติดเล่นสงกรานต์ 555
เพิ่งเลิกมาเที่ยงคืนเหมือนกันครับ 555555