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:
- Metode pergantian waktu, yaitu aksi pembacaan sensor dilakukan ketika satuan waktu berubah, contohnya setiap detik, setiap menit dan seterusnya. contoh :
12345
if (detikSebelumnya != now.second() )
{
detikSebelumnya = now.second();
bacaSensor();
}
- Metode modulus waktu, yaitu pembacaan sensor dilakukan pada setiap kelipatan satuan waktu, seperti pembacaan sensor setiap 2 detik, setiap 30 detik dan seterusnya. Contohnya :
1234
if (!(now.second() % periodaBacaSensor) )
{
bacaSensor();
}
- Metode rentang waktu, yaitu pembacaan sensor dilakukan selama waktu pada rentang waktu tertentu. Contohnya :
1234
if ((now.hour() >= 20) || (now.hour() < 3))
{
bacaSensor();
}
- Metode Tabel, yaitu pembacaan sensor sesuai waktu yang ditetapkan berdasarkan tanggal dan waktu tertentu, (pembacaan hanya dilakukan 1 kali). Contohnya:
1234
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | #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(); 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 :
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, ?, ??,?,?,?
tahun, bulan, tanggal, jam, menit, detik, hari
(hari minggu = 1, sabtu = 7)
Bang kok yang tiap 3 jam nya gak jalan,kenapa ya?
contoh diatas hanya pada jam 00:00, 03:00, 06:00, 09:00, 12:00, 15:00, 18:00, 21:00