สอบถามเกี่ยวกับการใช้ millis หรือ ควรใช้ timer

ตามหัวข้อครับ ต้องการกำหนดว่า ถ้า co2 ภายใน 1ชั่วโมงค่าไม่เกิน 2000ppm buzzer กับ led สีเเดงก็จะไม่ทำงาน line notify จะรายงานผล co2 ทุกๆ1ชม เเต่ถ้าใน1ชั่วโมงนั้น บังเอิญตรวจจับว่า มี Co2 เกินกำหนดมา 20นาที จะเเจ้งเตือนไปใน line notify ว่า ผิดปกติ buzzer กับ led สีเเดงก็จะทำงาน สามารถเขียนคำสั่ง millis ประมาณได้หรือเปล่าครับ

if(Co2 >= setvalue[2] && Co2<= setvalue[1]){
    digitalWrite(buzzer,HIGH);
    digitalWrite(Ledred,LOW);  
    alertsec = alertm = previousMillisAlert = 0;
    if(currentMillis - previousMillis >= 1000) {
      sec++;
      if(sec >= 60){
        m++;
        sec = 0;
      }
      if(m >= 15){
 
        m = 0;
        h++; //นับชั่วโมง 15 นาที 4 ครั้ง = 1 ชั่วโมง
        if(h == 4){ //ครบ 1 ชั่วโมง
          LINE.notify("Co2 ตอนนี้: "+String(Co2)+" ppm");
          h = 0;
        }
      }  
      previousMillis = currentMillis;
    } 
  }else{
    unsigned long currentMillisAlert = millis();
    if(currentMillisAlert - previousMillisAlert >= 1000){
      alertsec++;
      Serial.print("alertsec: ");
      Serial.println(alertsec);
      digitalWrite(Ledred,HIGH);
      if(alertsec >= 60){
        alertm++;
        alertsec = 0;
        Serial.print("alertm: ");
        Serial.println(alertm);
      }
      if(alertm >= setvalue[3]){
         digitalWrite(buzzer,LOW);
        digitalWrite(Ledred,HIGH);
        //ledcWriteTone(channel, 2000);
        LINE.notify("อันตราย!! Co2 ตอนนี้: "+String(Co2)+" ppm");
        alertm = 0;
      }
    }
    previousMillisAlert = currentMillisAlert;
   }

แล้วอันนี้ ทดสอบผลเป็นยังไงบ้างครับ มันทำงานตามโจทย์ที่เราต้องการหรือไม่


ตัว alert จริงๆจะนับวิไปเรื่อยๆ 1 2 3… แต่ขึ้นแค่ 11111อย่าฃเดียวครับ

ตรงนี้มันควรอยู่นอกลูปนี้หรือไม่ เพราะมันวนกลับมานับตรงนี้ มันก็จะเริ่มนับ 0 ใหม่ ทุกครั้งไป

ภาพ

ผมเอาไว้ใน void loop ครับ ไม่ได้มี ลูปอื่นมาครอบ if นี้เลยครับ

อธิบายหน่อยว่าทำไมต้องกำหนดแบบนี้

ครับคืออผมต้องการให้ส่งแจ้งเตือนค่า Value ค่างๆไปที่ไลน์โดยทุก1ชั่วโมงจะแจ้ง 1ครั้ง แต่ถ้าภายใน1ชั่วโมงนี้ มี Value ผิดปกติระบบจะเช็คว่า มันผิดปกตินานแค่ไหนถ้านานเกิน ที่กำหนดเช่น 5นาที จะเเจ้งเตือนไปที่ไลน์รัวๆเลย ว่า อันตรายเเล้ว ประมาณนี้ครับ โดยที่มี ตัวแปร m มาเก็บเป็นนาที h เก็บชั่วโมง เเล้วตัว alert เหมือนเอามานับจำนวนที่มันเกินมานานแค่ไหนอะครับ
ปล.ผมก็ไม่ค่อยแน่ใจว่าต้องใช้วิธีไหนผมเลยลองใช้ประมาณนี้ หรือ ควรใช้วิธีการออื่นแบบไหนดีครับพี่

ผมเห็นมันวนอยู่แค่นี้แหละครับ

ภาพ

ภาพ

ภาพ

เเล้วควรแก้ยังไงดีหรอครับ หรือควรใช้วิธีไหนดีครับ

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

ผมเองยังต้องมาไล่โฟว์ดูเลยว่าทำไมมันถึงเป็น 1 ตลอด เราเป็นคนเขียนก็ต้องหัดไล่ให้ได้ จับให้ทันครับ

โอเคครับ แล้ววิธีอื่นขอนุญาตสอบถามหน่อยครับใช้เป็น timer จะดีไหมครับเพราะผมลองมาแก้เป็น timer ส่งชมละ1ครั้งก็สามารถทำได้อยู่ครับ เเต่ส่วนของเช็ครอบที่ว่า ถ้าผิดปกติครบ X นาที ถึงจะเเจ้งเตือนเป็นอย่างอื่นไม่ค่อยแน่ใจว่าจะคงคอนเส็บ millis เหมือนเดิมหรือเปล่า :sweat_smile:

ก็คล้ายๆ กันครับ มันต้อง ลองเขียน ลองแก้ ลองเทส ดู ถึงจะเข้าใจและได้คอนเซบออกมา อธิบายเฉยๆ ก็งง อยู่ดีครับ

ที่นี้ผมอนุญาตให้ใช้พื้นที่ทำงานได้เต็มที่ครับ จะเขียนโค้ตแล้วมาคอมเมน + วิเคราะห์ + แปะผล ไว้ ว่าได้เทสอะไรไปบ้างแล้วได้ผลอย่างไร ก็ทำได้เต็มที่ ไม่ว่ากันครับ ใช้พื้นที่นี้ให้เกิดประโยชน์สูงสุด ว่างๆ ผมจะเข้ามาช่วยดู ถ้าตันตรงไหน

จะสังเกตุ เห็นว่ากระทู้ไหน Active ถามตอบสูงๆ ส่วนใหญ่จะปิดประเด็นได้เสมอ

ขอบคุณครับกำลังปรับเรื่อยๆครับถ้าตันจริงๆจะเอาผลและปัญหามาขอคำแนะนำอีกรอบครับพี่ ขอบคุณครับ👏

1 Like

ถามอีกรอบนะครับ timer.setInterval(สามารถเซ็ตถึง 6ล้านหรือเปล่าครับจะครบ1ชม.พอดี) เเต่ตัวเลขมันเยอะเกินไปจึงลองมาถามดูครับกลัวใช้ได้เเต่จะมีบัค

ลองกำหนดดูก็รู้แล้วครับว่าได้หรือไม่ ถ้าไม่ มันจะ verify ไม่ผ่าน

1 Like