สอบถามแนวทางในการทำโปรเจค PIR sensor กับ Notify หน่อยครับ

สวัสดีครับพอดีผมกำลังทำโปรเจคเกี่ยวกับการแจ้งเตือยของ 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(); 
}

ผมแค่ไม่เข้าใจว่าทำไมเวลามันนับตั้งแต่ยังไม่กดปุ่มเปิด ทั้ง ๆ ที่โค้ดอยู่ในเงื่อนไขแล้ว

โปรแกรมวิ่งเข้า loop นี้ป่าวครับ

ส่วน x ผมนังไม่เห็นมีบรรทัดไหน กำหนดชนิดของตัวแปรให้กับ x เลยครับ

#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