รับค่าจาก Slider Blynk เมื่อถึงค่าที่ตั้งไว้ ให้แจ้งเตือนทาง Line

รบกวนตรวจสอบโค้ดให้หน่อยครับ ต้องการใช้ Slider ส่งค่าล่าสุดที่กำหนดไว้
เช่น กำหนดค่าฝุ่น ที่ 50 โดยใช้ Slider ส่งไลน์มาแจ้ง แต่ตอนนี้มันส่งไลน์ตลอด ไม่ว่าค่าฝุ่นจะเท่าไหร่
ขอบขอบคุณครับ

#include "BLINKER_PMSX003ST.h"
#include <ESP8266WiFi.h>
#include <TridentTD_LineNotify.h>
#include <BlynkSimpleEsp8266.h>
#include <SoftwareSerial.h>
SoftwareSerial pmsSerial(13,5);
BlynkTimer timer;

BLINKER_PMSX003ST pms;
#define ON LOW
#define OFF HIGH
char ssid[] = "wichutit2019";
char pass[] = "wct33450";
char auth[] = "3OeXDPlyLqpOenNClsZtU62xMZeUOi7W"; //Auth Token from Blynk   RamZqLD2uTNxqP2zN7Ktrm1YEGSU7B0p


#define LINE_TOKEN  "8esngelBMepyIBtP4E3OeJLJDpZbMQxxD5JtphGhQ3n"   //Line token
const long interval = 30000;          //เวลาหน่วงการแจ้งเตือนซ้ำ [millisecond]

int PM_Alert;                    //ค่า PM2.5 ที่ต้องการให้แจ้งเตือน

unsigned long previousMillis = PM_Alert;

//-----------------รับค่าจาก Slider ----------
BLYNK_WRITE(V1) 
{
PM_Alert = param.asInt();
}

//---------เซนเซอร์อ่านค่าฝุ่น------------
void sensor() {
    pms.request();
    if(!pms.read()){
        return;
    }
    Serial.print("PM2.5(ATO)\t");
    Serial.print(pms.getPmAto(2.5));
    Serial.println("ug/m3");
    Serial.print("PM10(ATO)\t");
    Serial.print(pms.getPmAto(10));
    Serial.println("ug/m3");
    Serial.println();
        //delay(1000);
   
}

//------sent data to blynk------
void data_update() {
Blynk.virtualWrite(V2,pms.getPmAto(2.5));
Blynk.virtualWrite(V3,pms.getPmAto(10));
Serial.println();
}

void setup() {
    Serial.begin(115200);
    Blynk.begin(auth, ssid, pass,"blynk.jpnet.co.th",8080);  //"blynk.jpnet.co.th",8080 "blynk-cloud.com",80
    Blynk.syncAll();
    Serial.println("\nStart");

    pmsSerial.begin(9600);
    pms.begin(pmsSerial);
    //  pms.wakeUp();
    //  pms.setMode(PASSIVE);
    pms.setMode(ACTIVE);
    timer.setInterval(1000L,sensor);
    timer.setInterval(2000L,data_update);
    //timer.setInterval(3000L,chackMP);
    LINE.setToken(LINE_TOKEN);

    if (Blynk.connect()) {
    bridge1.setAuthToken(auth1);
    //bridge2.setAuthToken(auth2);
  }
}

void loop() {
Blynk.run();
timer.run();

//--------ตรวจสอบค่า ถ้าถึงค่าที่กำหนดส่งไลน์แจ้งเตือน---------------------
if (pms.getPmAto(2.5) >= PM_Alert) {
      unsigned long currentMillis = millis(); 
      if (currentMillis - previousMillis >= interval) { //หน่วงเวลาแจ้งเตือนซ้ำ
        previousMillis = currentMillis;
        String msg = "ฝุ่น PM2.5เกินแล้วจ้า  : " + String(pms.getPmAto(2.5)) + " ug/m3";  //ข้อความที่จะส่ง LINE
        LINE.notify(msg);
      }
    }
}

ขอดู output ที่ส่งมาหน่อยครับ

เท่าที่ดูคือคือต้องแก้ส่วนนี้นี้ครับ ให้ Line แค่ 1 ครั้ง ผมว่าตาม Code นะครับ

ส่วนอันนี้เป็นตัวอย่างครับ
เป็นตัวอย่างอีกแบบหนึ่งที่ให้ส่งไลน์แค่ครั้งเดียว ในเคสนี้ผมใช้เกี่ยวกับ esp8266 เชื่อมต่อ Blynk Application โดยถ้า อินเทอร์เน็ต On ก็จะสามารถส่ง LINE ให้เราทราบว่า Blynk Application มีการเชื่อมต่อแล้ว และถ้าอินเทอร์เน็ต On แต่ Blynk Application เชื่อมต่อไม่ได้ ก็ให้ไลน์บอกสถานะเหมือนกัน แต่ถ้าไม่มี LINE ส่งมาในกรณีนี้ก็แสดงว่าอินเทอร์เน็ต off

 //------------- Blynk Connect ---------------//
  if (Blynk.connected())
  {
    Blynk.run();
    digitalWrite(D0, LOW);
    blynk_Connect = 1;


  } else {
    digitalWrite(D0, LOW);
    delay(100);
    digitalWrite(D0, HIGH);
    delay(300);
    blynk_Connect = 0;

    Serial.println(WiFi.localIP());
    delay(100);

  }


  //แจ้งเตือน กรณี Blynk เชื่อมต่อ OK  1 ครั้ง
  if (blynk_Connect == 1 && Line1_status == 0) {

    LINE.notify("ESP8266 เชื่อมต่อ Blynk Server ได้แล้ว");
   
    delay (200);
    Line1_status = 1;


  }

  else if (blynk_Connect == 1  && Line1_status == 1) {
    delay(10);

    Line2_status = 0;
  }




  //แจ้งเตือน กรณี Blynk หลุด  1 ครั้ง  กรณี Internet มา
  if (blynk_Connect == 0 && Line2_status == 0) {

    LINE.notify("ESP8266 เชื่อมต่อ Blynk Server ไม่ได้");

    delay (200);
    Line2_status = 1;


  }

  else if (blynk_Connect == 0  && Line2_status == 1) {
    delay(10);

    Line1_status = 0;
  }

โค้ดส่วนนนี้ใช้ได้แล้วครับ ตามต้องการคือ กำหนดค่าฝุ่นที่ให้แจ้งเตือน ด้วย Slider เช่น กำหนดไว้ 50
แล้วมี Line มาแจ้ง ขอบคุณมาก ๆ ครับ
ตอนนี้อยากให้พี่ช่วยแนะนำการทำปุ่มครับ คล้าย ๆ กับ Auto Manual คือ ปุ่ม GP5 ทำการกำหนดเปิด-ปิดเอง โดยผู้ใช้ และถ้าGP5 เปิดอยู่ ปุ่ม V4 จะไม่สามารถกดได้ กลับกันถ้ากดปุ่มV5 เปิดอยู่ GP5 กดไม่ได้ ถ้าต้องการให้ V5 ติดค้างอยู่ 5 นาที แล้วดับ จากนั้นเข้าสู่สถานะทุกปุ่มพร้อมใช้งาน ต้องเขียนหนวงเวลาแบบไหนครับ

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

#include "BLINKER_PMSX003ST.h"
#include <ESP8266WiFi.h>
#include <TridentTD_LineNotify.h>
#include <BlynkSimpleEsp8266.h>
#include <SoftwareSerial.h>
SoftwareSerial pmsSerial(13,5);
BlynkTimer timer;

BLINKER_PMSX003ST pms;
#define ON LOW
#define OFF HIGH
char ssid[] = "wichutit2019";
char pass[] = "wct33450";
char auth[] = "3OeXDPlyLqpOenNClsZtU62xMZeUOi7W"; //Auth Token from Blynk   RamZqLD2uTNxqP2zN7Ktrm1YEGSU7B0p


#define LINE_TOKEN  "8esngelBMepyIBtP4E3OeJLJDpZbMQxxD5JtphGhQ3n"   //Line token
const long interval = 30000;          //เวลาหน่วงการแจ้งเตือนซ้ำ [millisecond]

int PM_Alert;                    //ค่า PM2.5 ที่ต้องการให้แจ้งเตือน

unsigned long previousMillis = PM_Alert;

//-----------------รับค่าจาก Slider ----------
BLYNK_WRITE(V1) 
{
PM_Alert = param.asInt();
}

//---------เซนเซอร์อ่านค่าฝุ่น------------
void sensor() {
    pms.request();
    if(!pms.read()){
        return;
    }
    Serial.print("PM2.5(ATO)\t");
    Serial.print(pms.getPmAto(2.5));
    Serial.println("ug/m3");
    Serial.print("PM10(ATO)\t");
    Serial.print(pms.getPmAto(10));
    Serial.println("ug/m3");
    Serial.println();
        //delay(1000);
   
}

//------sent data to blynk------
void data_update() {
Blynk.virtualWrite(V2,pms.getPmAto(2.5));
Blynk.virtualWrite(V3,pms.getPmAto(10));
Serial.println();
}

void setup() {
    Serial.begin(115200);
    Blynk.begin(auth, ssid, pass,"blynk.jpnet.co.th",8080);  //"blynk.jpnet.co.th",8080 "blynk-cloud.com",80
    Blynk.syncAll();
    Serial.println("\nStart");

    pmsSerial.begin(9600);
    pms.begin(pmsSerial);
    //  pms.wakeUp();
    //  pms.setMode(PASSIVE);
    pms.setMode(ACTIVE);
    timer.setInterval(1000L,sensor);
    timer.setInterval(2000L,data_update);
    //timer.setInterval(3000L,chackMP);
    LINE.setToken(LINE_TOKEN);
    }

void loop() {
Blynk.run();
timer.run();

//--------ตรวจสอบค่า ถ้าถึงค่าที่กำหนดส่งไลน์แจ้งเตือน---------------------
if (pms.getPmAto(2.5) >= PM_Alert) {
      unsigned long currentMillis = millis(); 
      if (currentMillis - previousMillis >= interval) { //หน่วงเวลาแจ้งเตือนซ้ำ
        previousMillis = currentMillis;
        String msg = "ฝุ่น PM2.5เกินแล้วจ้า  : " + String(pms.getPmAto(2.5)) + " ug/m3";  //ข้อความที่จะส่ง LINE
        LINE.notify(msg);
      }
    }
}
1 Like