เรื่องการตั้งเวลาแจ้งเตือนไลน์

สวัสดีครับพี่ๆพอจะมีวิธีไหนบ้างครับที่เราจะส่งการแจ้งเตือนไปในไลน์ทุกๆ 1 ชม ครับพี่ ผมไม่รู้จะหยิบฟังชั่นไหนมาใช้ดีครับพี่

กระทู้นี้เลยครับ

พี่ครับแล้วถ้าผมต้องการให้มันส่งค่า ทุกๆ ชม. ชั่วโมงละ 15 ครั้ง แบบถี่ๆเลยครับพี่ พอครบ 15 ครั้ง ให้มันรออีก 1 ชม เช็คเงื่อนไขว่าพร้อมที่จะส่งไหมถ้าพร้อมให้มันส่งใหม่ครับ ทำเป็น ลูป แบบนี้ไปเรื่อยๆครับพี่ พอดีผมลองเขียนโค๊ดดูแล้วแต่ ไม่รู้จะไปต่อยังไงครับพี่ ตอนนี้คือติดตรงที่ พอมันนับถึง 15 แล้วมันรีเซ็ทแล้วนับต่อเลยครับ ไม่รอเวลา 1 ชม. ที่ผมต้องการครับพี่ (ในโค๊ดค่า 60000 คือไว้สำหรับเทสครับพี่)


#include <SimpleTimer.h>


#include <TridentTD_LineNotify.h>

#define SSID "xxx" // แก้ ชื่อ ssid ของ wifi 
#define PASSWORD "xxx" // แก้ รหัสผ่าน wifi
#define LINE_TOKEN "xxx" // แก้ Line Token


const int analogInPin = A0;
int sensorValue = 0;
int t1 = sensorValue ;


SimpleTimer timer;

 int i = 0; 


void easyTime() 
{
    Serial.print("Uptime (s): ");
    Serial.println((millis() / 1000) / 60); 
    Serial.print("ครั้ง : ");
    Serial.println(i); 
          if (i < 15){
          i++;
          LINE.notify("เกิน ");
          Serial.print("อุณหภูมิเกิน - ");
          Serial.print("ส่งไปแล้ว : ");
          Serial.println(i);
          delay(100); 
              if  (i >= 10){  
                i = 0;                           
              }        
                     }        
  timer.setInterval(60000, easyTime);         
}
void setup() {
    Serial.begin(9600);
    Serial.println();
        
  Serial.println(LINE.getVersion());
  WiFi.begin(SSID, PASSWORD);
  Serial.printf("WiFi connecting to %s\n", SSID);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(400);
  }
  Serial.printf("\nWiFi connected\nIP : ");
  Serial.println(WiFi.localIP());
  LINE.setToken(LINE_TOKEN);
  LINE.notify("เซนเซอร์วัดความชื้นและอุณหภูมิ เริ่มทำงานแล้ว");
}

void loop() {
    timer.run();
      sensorValue = analogRead(analogInPin);
      Serial.print("sensor = ");
      Serial.println(sensorValue);
      delay(1000);

       if(sensorValue  > 100)
        {          
            easyTime();            
            Serial.println("อุณหภูมิเกิน");       
        }
}



วางผิดต่ำแหน่งครับ

image

แบบนี้ไหมครับพี่


#include <SimpleTimer.h>


#include <TridentTD_LineNotify.h>

#define SSID "xxx" // แก้ ชื่อ ssid ของ wifi 
#define PASSWORD "xxx" // แก้ รหัสผ่าน wifi
#define LINE_TOKEN "xxx" // แก้ Line Token


const int analogInPin = A0;
int sensorValue = 0;
int t1 = sensorValue ;


SimpleTimer timer;

 int i = 0; 


void easyTime() 
{
    Serial.print("Uptime (s): ");
    Serial.println((millis() / 1000) / 60); 
    Serial.print("ครั้ง : ");
    Serial.println(i); 
          if (i < 15){
          i++;
          LINE.notify("เกิน ");
          Serial.print("อุณหภูมิเกิน - ");
          Serial.print("ส่งไปแล้ว : ");
          Serial.println(i);
          delay(100); 
              if  (i >= 10){  
                i = 0;                           
              }        
                     }        
         
}
void setup() {
    Serial.begin(9600);
    Serial.println();
        
  Serial.println(LINE.getVersion());
  WiFi.begin(SSID, PASSWORD);
  Serial.printf("WiFi connecting to %s\n", SSID);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(400);
  }
  Serial.printf("\nWiFi connected\nIP : ");
  Serial.println(WiFi.localIP());
  LINE.setToken(LINE_TOKEN);
  LINE.notify("เซนเซอร์วัดความชื้นและอุณหภูมิ เริ่มทำงานแล้ว");
  timer.setInterval(60000, easyTime); 
}

void loop() {
    timer.run();
      sensorValue = analogRead(analogInPin);
      Serial.print("sensor = ");
      Serial.println(sensorValue);
      delay(1000);

       if(sensorValue  > 100)
        {          
            easyTime();            
            Serial.println("อุณหภูมิเกิน");       
        }
}



1 Likes

ใช่ครับ คำสั่ง setup จะสั่งครั้งเดียวที่ void setup เท่านั้น หลังจากนั้นก็จะทำงานตลอด

พี่ครับขอถามอีกเรื่องครับ พอเข้าลูปให้ มันส่งค่าถี่ๆแค่ 15 ครั้ง จากนั้น รอ 1 ชม ถ้าค่ายังเกิดอยู่ ตามเงื่อนไขใน Void loop ที่กำหนดไว้ ให้มันส่งอีก 15 ครั้ง ถี่ๆเหมือนเดิมนี่ผมต้องแก้ตรงไหนครับพี่ ผมอาจจะอธิบายไม่เข้าใจ ผมขอโทษด้วยครับพี่

ค่ายังเกินรึป่าวครับ

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

ตอนนี้มันทำงานได้แล้วครับพี่ แต่พอ มันนับการส่งถึง 15 ครั้งปุ๊บ มันไม่ยอมออกจาก Loop มันเริ่มนับการส่งที่ 1 ใหม่ครับ ซึ่งผมต้องการให้มันรอ 1 ชม. แล้วค่าวนเข้าลูปใหม่ครับพี่

คีย์เวิคย์เคสนี้คือ เมื่อครบ 1 ชม ส่ง 15 รอบ แล้วรออีก 1 ชม ถึงส่งอีกครั้งช้ะ

ใช่เลยครับพี่

ตรงนี้เราใช้ for loop วนไปเลย 15 ครั้ง ไม่ได้หรอ

image

มีเหตุผลอันใดถึงมีการวางฟังก์ชันนี้ใน void loop อีก

image

มันเหมือนเป็นการทำงานซ้ำซ้อน

เดี๋ยวผมจะลองแก้ดูครับพี่ ขอบคุณมากครับพี่

คำแนะนำคือย้ายชุดนี้เข้าไปไว้ที่ easyTime(); ตัด easyTime(); ในนั้นออก ภายใน if(sensorValue > 100) {} ถ้าเป็นจริงให้ใช้ for วนการแจ้งแจ้งไปเลย 15 ครั้ง พอหลุดจากนั้น มันก็จะรออีก 1 ชม เพื่อจะเช็คเงื่อนไขอีกครั้ง

ส่วนการอ่านค่าเราก็เลือกได้ทั้ง 2 แบบคือ ให้อ่าน ทุกๆ 1 ชม เว้นเสียแต่ว่า เราต้องการอ่านค่าแล้วเอาไปใช้อย่างอื่นด้วย

พี่ผมคิดออกเลย 55555