Penjadwalan pembacaan sensor berbasis RTC DS3231

Pembacaan sensor dengan arduino dapat dilakukan kapan saja dan dimana saja dalam sketch arduino sesuai kebutuhan. Penjadwalan diperlukan untuk mendapatkan nilai dari sensor dalam rentang tertentu atau pada waktu-waktu khusus misalnya baca sensor saat gerhana matahari. Jika menginginkan sensor dibaca hanya pada waktu-waktu tertentu saja berdasarkan RTC dapat menggunakan metode berikut:

  1. Metode pergantian waktu, yaitu aksi pembacaan sensor dilakukan ketika satuan waktu berubah, contohnya setiap detik, setiap menit dan seterusnya. contoh :
      if (detikSebelumnya != now.second() )
      {
        detikSebelumnya = now.second();
        bacaSensor();
      }
    
  2. Metode modulus waktu, yaitu pembacaan sensor dilakukan pada setiap kelipatan satuan waktu, seperti pembacaan sensor setiap 2 detik, setiap 30 detik dan seterusnya. Contohnya :
      if (!(now.second() % periodaBacaSensor) )
      {
        bacaSensor();
      }
    
  3. Metode rentang waktu, yaitu pembacaan sensor dilakukan selama waktu pada rentang waktu tertentu. Contohnya :
      if ((now.hour() >= 20) || (now.hour() < 3))
      {
        bacaSensor();
      }
    
  4. Metode Tabel, yaitu pembacaan sensor sesuai waktu yang ditetapkan berdasarkan tanggal dan waktu tertentu, (pembacaan hanya dilakukan 1 kali). Contohnya:
      if (now.getEpoch() == databaseJadwal[i].getEpoch())
      {
        bacaSensor();
      }
    

Rangkaian yang digunakan pada pembacaan sensor sesuai jadwal tertentu berbasis rtc:

berikut kode/sketch penjadwalan pembacaan sensor menggunakan rtc pada arduino:


#define pinSensor     A0

#include <Wire.h>
#include "Sodaq_DS3231.h"

DateTime set = {2020, 2, 22, 7, 0, 0, 1};
DateTime now;
DateTime databaseJadwal[] = {
  {2020, 2, 22, 7, 0, 3, 1},
  {2020, 2, 23, 7, 0, 0, 1},
  {2020, 2, 24, 7, 0, 0, 1},
  {2020, 2, 25, 7, 0, 0, 1},
  {2020, 2, 26, 7, 0, 0, 1},
  {2020, 2, 27, 7, 0, 0, 1},
};
byte detikSebelumnya;
byte menitSebelumnya;

#define periodaBacaSensor   5//detik

void bacaSensor()
{
  analogRead(pinSensor);
}

void setup() {
  Serial.begin(9600);
  Serial.println("Penjadwalan pembacaan sensor berbasis RTC");
  Serial.println("https://www.project.semesin.com");
  Serial.println();

  Wire.begin();
  rtc.begin();
  now = rtc.now();
  //  if (now.year() == 2000)
  {
    rtc.setDateTime(set);
  }
}

void loop() {
  now = rtc.now();

  if (detikSebelumnya != now.second() )
  {

    char bufWaktu[32];
    sprintf(bufWaktu, "%02d:%02d:%02d %02d-%02d-%04d", now.hour(), now.minute(), now.second(), now.date(), now.month(), now.year());
    Serial.println(bufWaktu);

    //pembacaan setiap detik
    detikSebelumnya = now.second();
    Serial.println("setiap detik");
    bacaSensor();


    //pembacaan setiap 2 detik
    if (now.second() % 2)
    {
      Serial.println("setiap 2 detik");
      bacaSensor();
    }

    //pembacaan setiap detik ke-5
    if (now.second() == 5)
    {
      Serial.println("setiap detik ke-5");
      bacaSensor();
    }

    //pembacaan setiap n detik (n 1..60)
    if (!(now.second() % periodaBacaSensor) )
    {
      Serial.println("setiap n detik");
      bacaSensor();
    }

    //pembacaan setiap 937 detik (berlaku untuk x detik 1..~)
    if (!(now.getEpoch() % 937) )
    {
      Serial.println("setiap 937 detik");
      bacaSensor();
    }

    //pembacaan setiap menit
    if (menitSebelumnya != now.minute() )
    {
      Serial.println("setiap menit");
      menitSebelumnya = now.minute();
      bacaSensor();
    }

    //pembacaan setiap 3 jam = 00:00, 03:00, 06:00, 09:00, 12:00, 15:00, 18:00, 21:00
    if (!(now.hour() % 3) && !now.minute() && !now.second())
    {
      Serial.println("setiap 3 jam");
      bacaSensor();
    }

    //pembacaan dalam rentang waktu
    if ((now.hour() >= 7) && (now.hour() < 10))//jam 07:00 - jam 09:59
    {
      Serial.println("pembacaan dalam rentang waktu 1");
      bacaSensor();
    }
    else if ((now.hour() >= 11) && (now.hour() < 15))//jam 11:00 - jam 14:59
    {
      Serial.println("pembacaan dalam rentang waktu 2");
      bacaSensor();
    }
    else if ((now.hour() >= 20) || (now.hour() < 3))//jam 20:00 - jam 02:59
    {
      Serial.println("pembacaan dalam rentang waktu 3");
      bacaSensor();
    }

    //pembacaan berdasarkan tabel waktu
    for (byte i = 0; i < sizeof(databaseJadwal) / sizeof(DateTime); i++)
    {
      if (now.getEpoch() == databaseJadwal[i].getEpoch())
      {
        Serial.print("tabel waktu = ");
        Serial.println(i);
        bacaSensor();
      }
    }
  }

}

library :

4 thoughts on “Penjadwalan pembacaan sensor berbasis RTC DS3231

  1. Mas pada coding diatas, bagian “databaseJadwal” itu urutan bacanya gimana ya ?
    DateTime databaseJadwal[] = {
    {2020, 2, 22, 7, 0, 3, 1},
    {2020, 2, 23, 7, 0, 0, 1},
    {2020, 2, 24, 7, 0, 0, 1},
    {2020, 2, 25, 7, 0, 0, 1},
    {2020, 2, 26, 7, 0, 0, 1},
    {2020, 2, 27, 7, 0, 0, 1},
    Tahun, ?, ??,?,?,?

Leave a Reply

Your email address will not be published. Required fields are marked *