16. Pembelajaran tentang cara Pemrograman Waktu
Materi:
Pembelajaran pada Bab ini menjelaskan beberapa fungsi yang terkait dengan waktu, yang mencakup delay (), delayMIcrosecond(), millis(), dan pulseIn(). Selain itu bab ini mengupas Pustaka Time, yang berhubungan dengan pemerolehan waktu di Arduino serta penggunaan modul Real Time Clock
16.1 Kegunaan delay()
Fungsi delay O biasa digunakan di sketch untuk menunda eksekusi perintah berikutnya dalam hitungan milidetik. Sebagai contoh :
delay (500) ;
berarti menunda eksekusi selama 500 milidetik atau 1/2 detik. Beberapa aplikasi delay() telah diperkenalkan di bab-bab sebelum ini, misalnya untuk menangani hal-hal berikut.
- Menghidupkan LED dalam waktu tertentu. Contoh:
digitalWrite (PIN 12, HIGH) ;
delay (1000) ; // Tunda 1 detik
digital Write (PIN 12, LOW) ;
- Memberi kesempatan suatu komponen menyelesaikan tugasnya dengan sempurna. Contoh dapat dilihat di sketch gy_30, yang dibahas di Bab 9.
16.2 Perbedaan delay() dan delayMicrosecond()
Jika penundaan eksekusi yang diperlukan kurang dari 1/1000 detik, fungsi delay ( ) tidak dapat digunakan. Untuk keperluan ini, fungsi delayMicrosecond ( ) yang diperlukan. Contoh:
delayMicrosecond (10) ;
berarti menunda eksekusi selama 10 mikrodetik. Perlu diketahui, 1 mikrodetik = 1/106 detik.
Contoh berikut menggambarkan penggunaan fungsi delayMicrosecond ( ) :
digitalWrite (PIN_TRIG, HIGH) ;
delayMicroseconds (10) ;
digitalWrite (PIN_TRIG, LOW) ;
Perintah di atas memberikan isyarat ke pin Trig pada sensor ultrasonik selama 10 mikrodetik. Hal ini dibahas di Bab 7.
16.3 Mengapa Kadang millis() Diperlukan?
Anda ingin melakukan suatu proses selama waktu tertentu, penggunaan delay ( ) ataupun dimungkinkan. Jika salah satu fungsi tersebut digunakan„ eksekusi perintah lain tidak dimungkinkan. Sebagai contoh, dikehendaki untuk menghidupkan LEO dalam tiga detik setiap kali tombol ditekan. Sekiranya delay ( ) digunakan, tombol menjadi tidak berfungsi lama tiga detik saat delay (3000) ; dieksekusi. Nah, solusi untuk permasalahan ini adalah dengan enggunakan fungsi bernama millis ( ) .
Kata millis sebenarnya berasal dari millisecond. Fungsi millis ( ) memberikan nilai balik bertipe long dan ærupa lama semenjak Arduino dijalankan hingga sekarang dalam satuan milidetik. Karena bertipe n signed long, nilainya kira-kira akan ter-overflow (menjadi nol kembali) setelah Arduino dieksekusi elama sekitar 55 hari. Oleh karena itu, penggunaan millis ( ) terkadang dikombinasikan dengan fungsi Lbs ( ) , untuk memperoleh nilai mutlak. Contoh:
if (abs (millis ( ) – waktuAwa1) > INTERVAL)
{
…
}
Namun, penggunaan kode seperti di atas mungkin tidak tepat untuk kasus tertentu. Sebagai contoh, ketika millis ( ) mencapai nilai tertinggi, yaitu 4.294.967.295, nilai berikutnya adalah O. Dengan demikian, nilai absolut kedua nilai tersebut sebesar 4.294.967.295, padahal seharusnya adalah 1. Oleh karena itu, penulisan seperti
if (abs (millis ( ) – waktuAwa1) > INTERVAL)
lebih baik kalau ditulis menjadi
16.3 Mengapa Kadang millis() Diperlukan?
Anda ingin melakukan suatu proses selama waktu tertentu, penggunaan delay ( ) ataupun dimungkinkan. Jika salah satu fungsi tersebut digunakan„ eksekusi perintah lain tidak dimungkinkan. Sebagai contoh, dikehendaki untuk menghidupkan LEO dalam tiga detik setiap kali tombol ditekan. Sekiranya delay ( ) digunakan, tombol menjadi tidak berfungsi lama tiga detik saat delay (3000) ; dieksekusi. Nah, solusi untuk permasalahan ini adalah dengan enggunakan fungsi bernama millis ( ) .
Kata millis sebenarnya berasal dari millisecond. Fungsi millis ( ) memberikan nilai balik bertipe long dan ærupa lama semenjak Arduino dijalankan hingga sekarang dalam satuan milidetik. Karena bertipe n signed long, nilainya kira-kira akan ter-overflow (menjadi nol kembali) setelah Arduino dieksekusi elama sekitar 55 hari. Oleh karena itu, penggunaan millis ( ) terkadang dikombinasikan dengan fungsi Lbs ( ) , untuk memperoleh nilai mutlak. Contoh:
if (abs (millis ( ) – waktuAwa1) > INTERVAL)
{
…
}
Namun, penggunaan kode seperti di atas mungkin tidak tepat untuk kasus tertentu. Sebagai contoh, ketika millis ( ) mencapai nilai tertinggi, yaitu 4.294.967.295, nilai berikutnya adalah O. Dengan demikian, nilai absolut kedua nilai tersebut sebesar 4.294.967.295, padahal seharusnya adalah 1. Oleh karena itu, penulisan seperti
if (abs (millis ( ) – waktuAwa1) > INTERVAL)
{
..
}
lebih baik kalau ditulis menjadi
if (millis ( )- waktuAwa1 < 0)
waktuAwal = millis() + 4294967295 – waktuAwaI;
if (millis ( )- waktuAwal > INTERVAL)
{
…
}
16.4 Penggunaan Fungsi pulseln()
Fungsi pulse In ( ) adalah fungsi yang dapat dipakai untuk memperoleh lama nilai di pin dalam keadaan HIGH atau LOW di suatu pin. Nilai terukur dalam mikrodetik. Contoh:
pulseln (pin, HIGH) ; // Lama pulsa dalarn keadaan HIGH
pulse In (pin, LOW) ; // Lama pulsa dalarn keadaan LOW
Contoh penggunaan fungsi pulseln ( ) ada di sketch sr04, yang dibahas di Bab 7. Kodenya:
d0uble selang = pulseln (PIN_ECHO, HIGH) ;
Berdasarkan perintah di atas, waktu yang digunakan saat pengiriman sinyal ultrasonik ke objek yang dideteksi hingga kembali ke sensor ultrasonik diperoleh.
16.5 Pemrosesan Waktu di Arduino
Ingin mendapatkan waktu di Arduino? Ya, hal itu bisa dilakukan. Hal itu dipermudah dengan adanya pustaka bernama Time. Pustaka inilah yang akan dibahas di subbab ini.
Pustaka Time
Pustaka Time bisa diperoleh di www.pjrc.com/teensy/td_libs_Time.html. Nama filenya adalah Time. zip. Untuk memudahkan Anda, file tersebut disediakan di CD yang disertakan bersama buku ini.
Pertama-tama, ekstraklah file tersebut sehingga terbentuk subfolder Time. Lalu, ikuti ped0man berikut:
- Pindahkan subfolder Time ke C:\Program Files (x86)\Arduino\libraries (dengan asumsi, program Arduino IDE terinstal di C:\Program Files (x86)\Arduino).
- Tutuplah Arduino IDE jika dalam keadaan sedang dibuka.
- Panggil kembali Arduino IDE supaya pustaka yang baru saja Anda tambahkan dikenali.
Pemakaian Pustaka Time
Informasi waktu (tanggal, bulan, tahun, jam, menit, dan detik) dapat diperoleh dengan mudah sekiranya pustaka Time dilibatkan. Setelah pustaka tersebut disertakan melalui
# include < Time.h>
Maka informasi waktu dapat diperoleh dengan menggunakan fungsi-fungsi yang dicantumkan di tabel 16.1
Tabel 16.1 Sejumlah fungsi di pustaka Time
Fungsi | Keterangan |
hour() | Jam sekarang(0-23) |
minute() | Menit sekarang (0-59) |
second() | Detik sekarang(0-29) |
day() | Tangga sekarang (0-31) |
weekday() | Kode hari (1 = Minggu, 2 = Senin, dst.) |
month() | Bulan sekarang (1-12) |
year() | Tahun sekarang dalam empat digit |
now() | Memberikan nilai balik berupa waktu sekarang
dihitung sejak 1 Januari 1970 |
isAM() | Memberikan nilai balik berupa true kalau waktu
sekarang adalah AM (pagi) |
isPM() | Memberikan nilai balik berupa true kalau waktu
sekarang adalah PM (setelah jam 12 siang) |
pustaka Time juga menyediakan waktu sebagai yang menggunakan tipe time t yang merupakan standar di C. Sebagai contoh:
time_t waktu = now() ;
Dengan cara seperti itu, waktu yang bertipe time t berisi waktu sekarang. Selanjutnya, pemanggilan seperti berikut diperkenankan:
hour (waktu)
Pemanggilan fungsi tersebut akan memberikan nilai balik berupa jam yang terdapat di waktu. Perlu diketahui, semua fungsi di Tabel 6.1 bisa menerima argumen bertipe time t.
Jntuk mengatur waktu, fungsi setTime ( ) perlu digunakan. Bentuk penggunaannya seperti berikut:
set Time ( waktu) ;
setTime (jam, menit, detik, tanggal, bulan, tahun) ;
bentuk pertama digunakan untuk tipe time t. Pada bentuk kedua, penyebutan jam, menit, detik, tanggal, ulan, dan tahun dilakukan secara langsung.
Contoh berikut menunjukkan penggunaan sejumlah fungsi yang berhubungan dengan waktu :
// ——————————————–
//Contoh untuk menampilkan waktu
// ——————————————–
#include <Time.h>
void setup()
{
Serial.begin(9600);
}
void loop()
{
time_t waktu = now();
tampilkanWaktu(waktu);
delay(1000);
}
void tampilkanWaktu(time_t waktu)
{
int tg= day(waktu);
int bl=month(waktu);
int th= year(waktu);
int jam= hour(waktu);
int menit = minute(waktu);
int detik= second(waktu);
Serial.print(tg);
Serial.print(“/”);
Serial.print(b1);
Serial.print(“/”);
Serial.print(th);
Serial.print(“”);
tampil2digit(jam);
Serial.print(‘:’);
tampi12digit(menit);
Serial.print(‘:’);
tampil2digit(detik);
Serial.println();
}
void tampil2digit(int bil)
{
if (bil < 10 && bil>=0)
Serial.print(‘0’);
Serial.print(bil);
}
Sketch di depan mengirimkan informasi waktu ke port serial dan dapat dipantau dengan menggunakan serial Monitor. ltulah sebabnya, terdapat perintah berikut di setup ( ) :
Serial.begin (9600) ;
pernyataan di atas digunakan untuk mengawali komunikasi serial.
Di loop ( ) , pernyataan berikut digunakan untuk memperoleh data waktu sekarang yang disimpan ke variabel waktu, yang bertipe time t:
time_t waktu — now ( ) ;
selanjutnya, nilai waktu dikirimkan ke fungsi tampilkanWaktu ( ) . Fungsi inilah yang menangani
penampilan waktu. Dai-am hal ini, informasi tanggal, bulan, tahun, jam, menit, dan detik diperoleh melalui sederetan pernyataan berikut:
int tg = day (waktu) ;
int bl = month (waktu) ;
int th — year (waktu) ;
int jam = hour (waktu) ;
int men it = minute (waktu) ;
int detik = second (waktu) ;
Sketch waktu memiliki fungsi bernama tampi12digit ( ) . Definisinya seperti berikut•.
void tampi12digit (int bil)
{
if (bil < 10 bil > 0)
Serial.print (‘0’) ;
Serial . print (bil) ;
}
Fungsi tersebut digunakan untuk menampilkan bilangan yang hanya mengandung satu digit menjadi dua digit dengan diawali nol. Hal ini diterapkan untuk jam, menit, dan detik.
Gambar 16.1 memperlihatkan contoh hasil pemantauan waktu menggunakan sketch waktu. Perhatikan
bahwa waktu yang ditampilkan adalah waktu pada tahun 1970. Perlu diketahui, tahun 1970 menjadi acuan tanggal di Arduino.
Gambar 16.1 Hasil pemantauan waktu di Arduino
Waktu yang dihasilkan di sketch di atas berupa waktu semenjak Arduino dihidupkan. Terlihat bahwa hasil di depan tidak bisa mencerminkan jam yang sebenarnya. Namun, sebagaimana telah dijelaskan di depan, terdapat fungsi set Time ( ) yang dapat digunakan untuk menyetel waktu. Dengan menggunakan fungsi tersebut, waktu di Arduino bisa diselaraskan dengan waktu yang tepat.
Contoh pengaturan waktu melalui keyboard yang dikirimkan ke port serial diperlihatkan di sketch berikut:
// ——————————————–
// Contoh untuk menampilkan waktu
// dan memungkinkan pengaturan
// waktu
// Format tanggal:tt/bb/thth
// Format jam: jj:mm:dd
// ——————————————–
#include <Time.h>
void setup()
{
Serial.begin(9600);
}
void loop()
{
time_t waktu = now();
tampilkanWaktu(waktu);
delay(1000);
void tampilkanWaktu(time_t waktu)
{
// Atur waktu kalau ada data dari port Serial String txt;
while (Serial.available())
{
char ch = Serial.read();
txt=txt + ch;
}
if(txt.length()==10)
{
// Apakah format tanggal valid?
if ((txt[2] == ‘/’) and(txt[5]==’/’))
{
int tg = txt.substring(0, 2).toInt();
int bl = txt.substring(3,5).toInt();
int th = txt.substring(6, 10).toInt();
Serial.print(“Tanggal diubah menjadi:”);
Serial.println(txt);
int jam = hour();
int menit=minute();
int detik= second();
//Atur waktu
setTime(jam, menit, detik, tg, bl, th);
else
if (txt.length() ==8)
{
// Apakah format waktu valid?
if ((txt[2] == ‘:’) and (txt[5]==’:’))
{
int jam = txt.substring(0, 2).toInt();
int menit= txt.substring(3, 5).toInt();
int detik = txt.substring(6, 8).toInt();
Serial.print(“Jam diubah menjadi:”);
Serial.println(txt);
int tg= day();
int b1= month();
int th = year();
// Atur waktu
setTime(jam, menit, detik, tg, bl, th);
{
// Tampilkan waktu
int tg = day(waktu);
int bl= month(waktu);
int th = year(waktu);
int jam = hour(waktu);
int menit = minute(waktu);
int detik = second(waktu);
Serial.print(tg);
Serial.print(“/”);
Serial.print(bl);
Serial.print(“/”);
Serial.print(th);
Serial.print(” “);
tampi12digit(jam);
Serial.print(‘:’);
tampi12digit(menit);
Serial.print(‘:’);
tampi12digit(detik);
Serial.println();
}
void tampil2digit(int bil)
{
if (bil<10&&bi1>=0)
Serial.print(‘0’);
Serial.print(bil);
}
Sketch di atas mengasumsikan bahwa perintah yang diberikan akan memiliki format seperti berikut:
tt/bb/thth
j j : mm: dd
Format pertama digunakan untuk menangani penggantian tanggal dan format kedua digunakan untuk mengubah jam. Pada format pertama, tanggal harus berupa dua digit, diikuti dengan /, dan dua digit bulan, tanda /, serta empat digit tahun. Pada format kedua, masing-masing angka untuk jam, menit, dan detik harus berupa dua angka dan dipisahkan oleh tanda :. Untuk menyederhanakan, diasumsikan bahwa di antara tanda / ataupun : pasti berupa angka. Selain itu, data waktu juga valid.
Untuk mendapatkan string yang berisi data jam atau tanggal yang dimasukkan melalui keyboard, perintah yang digunakan adalah:
String txt; while (Serial. available ( ) )
{
char ch = Serial. read() ;
txt = txt + ch;
}
Pada saat dideklarasikan melalui String txt;, txt akan berisi string kosong. Selanjutnya, selama di port serial terdapat data, data akan dibaca oleh Serial . read ( ) per karakter dan dirangkaikan ke isi txt semua melalui :
txt = txt + ch;
Dengan cara seperti itu, txt akan menampung string yang dimasukkan dari keyboard.
Kode
if (txt. length()==10)
{
…
}
digunakan untuk memeriksa isi txt adalah perintah untuk mengatur tanggal atau tidak. Jika panjangnya adalah 10 (berdasarkan format tt/bb/thth), perintah adalah untuk mengganti tanggal. Oleh karena iłu. yang berada di dałam { } akan dijalankan.
Validasi terhadap data tanggal yang dilakukan hanyalah memeriksa keabsahan tanda /. Hal iłu dilakukan melalui:
If (( txt[2]== ‘/’)) and (txt[5] == ‘/’))
Tiga pernyataan berikut digunakan untuk memperoleh data tanggal, bulan, dan tahun:
int tg — txt. substring (0, 2) .tolnt () ;
int bl — txt. substring (3, 5) .tolnt ( ) ;
int th = txt. substring (6, 10) .tolnt () ;
Ekspresi seperti txt. substring (0, 2) berarti untuk mendapatkan substring di txt dimulai dari indeks O dan berakhir di indeks 2. Artinya, karakter dengan indeks 0 dan 1 saja yang akan digunakan untuk membentuk substring (lihat Gambar 16.2). Selanjutnya, tolnt ( ) digunakan untuk mengonversi substring ke tipe i nt. Hasil konversi ke int inilah yang disimpan di tg.
Pengubahan tanggal dilakukan melalui setTime ( ) . Perintah yang digunakan:
set Time (jam, menit, detik, tg, bl, th) ;
Dałam hal ini, jam tidak diubah. Oleh karena iłu, data jam, menit, dan detik dibaca dari Arduino melalui:
int jam = hour () ;
int menit = minute () ; int detik = second ( );
Kode
if (txt. length ()==8 )
{
…
}
digunakan untuk memeriksa isi txt adalah perintah untuk mengatur jam atau tidak. Jika panjangnya adalah 8 (berdasarkan format jj /mrn/dd), perintah adalah untuk mengganti jam. Oleh karena iłu, yang berada di dałam { } akan dijalankan.
Validasi terhadap data jam yang dilakukan hanyalah memeriksa keabsahan tanda :. Hal iłu dilakukan melalui:
if ( (txt [2] ==’ : ‘) and (txt [5) ==’:’))
Tiga pernyataan berikut digunakan untuk memperoleh data tanggal, bulan, dan tahun:
int jam = txt. substring (0, 2) . tolnt () ;
int men ił = txt. substring (3, 5) . tolnt () ;
int detik = txt. substring (6, 8) . tolnt () ;
Ekspresi seperti txt . substring (0, 2) berarti untuk mendapatkan substring di txt dimulai dari indeks 0 dan berakhir di indeks 2. Artinya, karakter dengan indeks 0 dan 1 saja yang akan digunakan untuk membentuk substring. Selanjutnya, tolnt ( ) digunakan untuk mengonversi substring ke tipe int. Hasil konversi ke int inilah yang disimpan di j am.
Pengubahan jam dilakukan melalui set Time ( ) . Perintah yang digunakan:
set Time (jam, men ił, detik, tg, b l, th) ;
Dałam hal ini, tanggal tidak diubah. Oleh karena iłu, data tanggal, bulan, dan jam dibaca dari Arduino melalui:
int tg = day();
int bl = month() ;
int th = year () ;
Kode selanjutnya adalah serupa pada contoh sebelum ini. Contoh hasil sketch diperlihatkan di Gambar 16.3 dan 16.4. Gambar 16.3 dan 16.4 menunjukkan keadaan sebelum dan sesudah data 09/10/2014 dikirim ke port serial.
Untuk mendapatkan waktu yang sebenarnya, Anda perlu menyelaraskan waktu di Arduino dengan perangkat eksternal. Salah satu cara yang bisa ditempuh adalah dengan menggunakan Real-Time Clock (RTC).
16.6 Penggunaan Real-Time Clock
Real-Time Clock (RTC) adalah perangkat yang memungkinkan untuk menghasilkan waktu yang tepat karena dilengkapi pembangkit waktu dan baterai. Contoh modul RTC diperlihatkan di Gambar 16.5.
Gambar 16.5 Modul RTC DS1307
Modul RTC di Gambar 16.5 memiliki lima pin. Kelima pin tersebut adalah:
- GND: dihubungkan ke ground;
- VCC : dihubungkan dengan sumber tegangan BV;
- SDA: pin untuk data;
- SCL : pin untuk clock.
Koneksi ke Arduino dilakukan dengan menggunakan 12C. Oleh karena itu, pin SDA dihubungkan ke pin 4 dan SCL ke pin 5. Contoh penyusunan rangkaian yang menghubungkan Arduino dan modul RTC diperlihatkan di Gambar 16.6 dan 16.7.
Gambar 16.6 Contoh penyusunan rangkaian modul RTC dan Arduino
Gambar 16.7 Rangkaian untuk menguji Real Time Clock
Pustaka DS1307RTC
Untuk RTC yang menggunakan IC DS1307, pemrograman RTC menjadi sangat mudah jika melibatkan pustaka DS1307RTC. Pustaka ini dapat diunduh di:
www.pjrc.com/teensy/td_libs DS1307RTC.html
Untuk memudahkan Anda, file pustaka bernama DS1307RTZ.zip disediakan di CD yang disertakan bersama buku ini.
Pertama-tama, ekstraklah file tersebut sehingga terbentuk subfolder DS1307RTC. Lalu, ikuti ped0man berikut:
- Pindahkan subfolder DS1307RTC ke C:\Program Files (x86)\Arduino\libraries (dengan asumsi, program Arduino IDE terinstal di C:\Program Files (x86)\Arduino).
- Tutuplah Arduino IDE jika dalam keadaan sedang dibuka.
- Panggil kembali Arduino IDE supaya pustaka yang baru saja Anda tambahkan dikenali.
Catatan |
Pustaka DS1307RTC dapat digunakan untuk keping-keping berikut•sDS1307DS3237DS3231 |
Sinkronisasi Waktu di RTC dengan Waktu di PC
Untuk membuat waktu di RTC disesuaikan dengan waktu di PC, Anda perlu menyetelnya sekali. Hal ini dapat dilakukan dengan mengunggah contoh yang disertakan di pustaka DS1307RTC. Langkah yang perlu Anda lakukan adalah:
- Pilih menu File di Arduino IDE.
- Sorot Examples.
- Sorot pada DS1307RTC.
- Klik pada SetTime.
Anda akan menjumpai sketch seperti berikut:
// ——————————————–
// Contoh untuk menampilkan waktu
// dan memungkinkan pengaturan
// waktu
// Format tanggal:tt/bb/thth
// Format jam: jj:mm:dd
// ——————————————–
#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>
const char *monthName[12]={
“Jan”, “Feb”, “Mar”, “Apr”, “May”, “Jun” ,
“Jul”, “Aug”, “Sep”, “Oct”, “Nov”, “Dec”
};
tmElements_t tm;
void setup(){
bool parse=false;
bool config=false;
// get the date and time the compiler was run
if (getDate(_DATE_) && getTime(_TIME_)){
parse=true;
// and configure the RTC with this info
if (RTC.write(tm)){
config= true;
}
}
Serial.begin(9600);
while (!Serial) ; // wait for Arduino Serial Monitor delay(200);
if (parse && config){
Serial.print(“DS1307 configured Time=”) ;
Serial.print(_TIME );
Serial.print(“, Date=”);
Serial.println(_DATE_);
} else if (parse) {
Serial.println(“DS1307 Communication Error :-{“);
Serial.println(“Please check your circuitry”);
} else{
Serial.print(“Could not parse info from the compiler, Time=\””);
Serial.print(_TIME_);
Serial.print(“\”, Date=\””);
Serial.print(_DATE_);
Serial.println (“\””) ;
}
}
void loop(){
}
bool getTime(const char *str)
{
int Hour, Min, Sec;
if (sscanf(str, “%d:응d:응d”, &Hour, &Min, &Sec) != 3) return false;
tm.Hour =Hour;
tm.Minute =Min;
tm.Second=Sec;
return true;
}
bool getDate(const char *str)
{
char Month[12];
int Day, Year;
uint8_t monthIndex;
if (sscanf(str, “응s 응d %d”, Month, &Day, &Year) !=3) return false; for (monthIndex = 0; monthIndex <12; monthIndex++){
if (strcmp(Month, monthName[monthIndex]) == 0) break;
{
if (monthIndex >= 12) return false;
tm.Day=Day;
tm.Month = monthIndex+1;
tm.Year = CalendarYrToTm(Year);
return true;
}
Gambar 16.8 Sinkronisasi waktu di modul RTC dengan waktu di PC
Pertama-tama yang perlu dilakukan kalau menggunakan modul RTC, Anda perlu mencantumkan tiga baris berikut:
#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>
pustaka Wire diperlukan karena komunikasi antara Arduino dan modul RTC dilakukan melalui 12C. Pustaka Time diperlukan karena akses ke fungsi atau tipe data yang berkaitan dengan waktu akan digunakan. pustaka DS1307RTC menangani akses waktu di modul RTC.
tmElements_t tm ;
Definisi tmEIements ada di pustaka Time. Struktur ini mempunyai anggota bernama:
- Day (tanggal);
- Month (bulan);
- Year (tahun);
- Hour (jam);
- Minute (menit);
- Second (detik).
Khusus untuk tahun, nilai yang terkandung di Year bersifat relatif terhadap tahun 1970. Untuk tahun yang sesungguhnya, Anda perlu menambahkannya dengan 1970, atau dengan meletakkan year sebagai argumen fungsi tmYearToCa1endar ( ) .
Pemanggilan fungsi RTC . read ™ dimaksudkan untuk membaca data waktu dari modul RTC dan hasilnya diberikan ke argumen tm, yang bertipe tmE1ements. Setelah itu, Anda bisa menggunakan tm untuk mengakses data waktu, misalnya:
- tm.Month untuk menyatakan bulan;
- tm.Hour untuk menyatakan jam.
Contoh hasil sketch bacartc diperlihatkan di Gambar 16.9. Perhatikan terdapat perbedaan waktu antara modul RTC dan Arduino.
Sinkronisasi waktu di Arduino dan RTC
Untuk membuat waktu di Arduino sama dengan waktu di modul RTC, sinkronisasi perlu dilakukan di setup ( ) . Dalam hal ini, waktu di Arduino diatur mengikuti waktu di modul RTC. Caranya sederhana. Kode seperti berikut diperlukan:
setSync?rovider (RTC. get) ;
Setelah pernyataan tersebut dieksekusi, keberhasilan atau kegagalan sinkronisasi dapat diinformasikan dengan cara menuliskan kode berikut:
if (timeStatus ( ) ! = timeSet)
Serial.print In (“Sinkronisasi waktu gaga I! ” );
else
Serial . printin (“Sinkronisasi waktu berhasil dilakukan!”) ;
Sketch: sinkron
// ——————————————–
// Sinkronisasi waktu Arduino dengan RTC
// ——————————————–
#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>
void setup()
{
Serial.begin(9600);
// Lakukan sinkronisasi waktu
setSyncProvider(RTC.get);
if (timeStatus() != timeSet)
Serial.println(“Sinkronisasi waktu gagal!”); else
Serial.println(“Sinkronisasi waktu berhasil dilakukan!”);
void loop()
{
// Baca dari Arduino
time_t waktu = now();
int tg=day(waktu);
int bl= month(waktu);
int th = year(waktu);
int th = hour (waktu);
void loop()
{
// Baca dari Arduino time_t waktu = now();
int tg= day(waktu);
int b1 = month(waktu);
int th = year(waktu);
int jam = hour(waktu);
int menit = minute(waktu);
int detik= second(waktu);
Serial.print(“Waktu di Arduino: “);
Serial.print(tg);
Serial.print(“/”);
Serial.print(b1);
Serial.print(“/”);
Serial.print(th);
Serial.print(“”);
tampi12digit(jam);
Serial.print(‘:’);
tampil2digit(menit);
Serial.print(‘:’);
tampi12digit(detik);
Serial.println();
delay(1000);
void tampil2digit(int bil)
{
if (bil < 10 &&bil >=0)
Serial.print(‘0’);
Serial.print(bil);
}
Contoh hasil di Serial Monitor diperlihatkan di Gambar 16.10. Tampak b waktu yang sesuai dengan waktu di modul RTC.
Gambar 16.10 Hasil pengaksesan waktu di Arduino setelah sinkronisasi dilakukan
16.7 Pustaka TimeAlarms
TimeAlarms merupakan pustaka buatan Michael Margolis yang ditujukan untuk menjalankan fungsi-fungsi pada waktu tertentu. Tak ada perangkat keras yang diperlukan untuk menggunakannya.
Pustaka ini memanfaatkan fungsi-fungsi yang tersedia di Pustaka Time. Oleh karena itu, jika menggunakan TimeA1arms, dua baris berikut perlu disertakan di sketch:
# include <Time.h>
# include <TimeAlarms>
Sebelum menggunakan pustaka ini, Anda perlu menginstalnya. Pertama-tama, unduhlah pustaka ini di:
https : //www.pjrc.com/teensy/td Jibs TimeAIarrns . html
Untuk memudahkan Anda, file pustaka bernama TimeAlarms . zip disediakan di CD yang disertakan bersama buku ini.
pertama-tama, ekstraklah file tersebut sehingga terbentuk subfolder TimeA1arms. Lalu, ikuti ped0man berikut.
- Pindahkan subfolder TimeAIarms ke C:\Program Files (x86)\Arduino\libraries (dengan asumsi, program Arduino IDE terinstal di C:\Program Files (x86)\Arduino).
- Tutuplah Arduino IDE jika dalam keadaan sedang dibuka.
- panggil kembali Arduino IDE supaya pustaka yang baru saja Anda tambahkan dikenali.
Beberapa fungsi yang tersedia di pustaka TimeA1arms dapat dilihat di Tabel 16.2. Argumen terakhir untuk semua fungsi yang terdapat di tabel tersebut berupa nama fungsi yang akan diproses.
Tabel 16.2 Fungsi-fungsi di TimeAlarms
Fungsi | Keterangan |
Alarm.alarmRepeat(jam, menit, detik, namaFungsi); | Menjalankan fungsi namaFungsi setiap hari pada waktu jam:menit:detik |
Alarm.alarmRepeat(kodeHari, jam, menit, detik, namaFungsi); | Menjalankan fungsi namaFungsi seminggu sekali pada hari yang sesuai dengan kodeHari pada waktu jam:menit:detik |
Alarm.alarmOnce(jam, menit, detik, namaFungsi); | Menjalankan fungsi namaFungsi sekali saja pada waktu jam:menit:detik |
Alarm.alarmOnce(kodeHari, jam, menit, detik, namaFungsi); | Menjalankan fungsi namaFungsi sekali saja pada waktu jam:menit:detik di hari yang sesuai dengan kodeHari |
Alarm.timerRepeat(detik, namaFungsi); | Menjalankan fungsi namaFungsi per satuan detik |
Alarm.timerOnce(detik, namaFungsi); | Menjalankan fungsi namaFungsi sekali saja setelah satuan detik terlampaui |
Catatan | Nilai untuk kodeHari yang terdapat di alarmOnce ( ) ataupun alarmRepeat ( ) dapat diisi dengan konstanta:
|
Contoh penggunaan sejumlah fungsi di Pustaka TimeAlarms dapat dilihat di sketch alarms. untuk mencoba sketch tersebut, modul RTC tidak diperlukan. Untuk melihat hasil yang segera, mungkin Anda perlu mengubah nilai waktu, misalnya pada:
Alarm.alarmRepeat (18, 0, 0, HidupkanLampu)
Sketch: sinkron
// ——————————————–
// Contoh penggunaan fungsi-fungsi
// di TimeAlarms
//
//Modul RTC tidak diperlukan
// ——————————————–
#include <Time.h>
#include <TimeAlarms.h>
void setup()
{
Serial.begin(9600);
// Atur waktu
setTime(5, 59, 20, 11, 10, 2014);
// Tentukan alarm
// 05:59:25 setiap hari
Alarm.alarmRepeat(5, 59, 25, MatikanLampu);
// 18:00:00 setiap hari
Alarm.alarmRepeat (18, 0, 0, HidupkanLampu);
// 05:59:30 setiap sabtu
Alarm.alarmRepeat (d0wSaturday, 5, 59, 30, Olahraga);
Alarm.timerRepeat(8, Istirahat); // Setiap 8 detik
Alarm.timeronce(10, CekSekali); Sekali setelah 10 detik
}
void loop()
tampilkanJam();
Alarm.delay(1000); // Tunggu satu detik
)
// Fungsi untuk mematikan Lampu
void MatikanLampu()
{
Serial.println(“Lampu dimatikan”);
}
void HidupkanLampu()
{
Serial.println(“Lampu dihidupkan”) ;
// Untuk menguji timerOnce() pada hari sabtu void 0lahraga()
Serial.println(“Siap-siap olahraga”);
}
// Fungsi yang dijalankan per 20 detik void Istirahat()
Serial.println(“Sudahkah istirahat sebentar?”);
}
// Dijalankan sekali
void CekSekali()
{
Serial.println(“Hanya dijalankan sekali”);
void tampilkanJam()
{
tampi12digit (hour());
Serial.print(‘:’);
tampi12digit(minute());
Serial.print(‘:’);
tampi12digit(second());
Serial.println();
}
void tampil2digit(int bil)
{
if (bil <10 && bil >= 0)
Serial.print(‘0’);
Serial.print(bil);
}
Pada contoh di atas,
- fungsi MatikanLampu ( ) dijalankan pada setiap jam 5:59:25;
- fungsi HidupkanLampu ( ) dijalankan pada setiap jam 18:00:00;
- fungsi Olahraga ( ) dijalankan pada setiap jam 5:59:30 di hari Sabtu;
- fungsi T stirahat ( ) dijalankan pada setiap 8 detik;
- fungsi CekSekali ( ) dijalankan sekali, yaitu 10 detik setelah sketch dieksekusi.
Contoh hasil sketch di Serial Monitor ditunjukkan pada gambar berikut:
Gambar 6.11 Hasil pengujian fungsi-fungsi di pustaka TimeAlarms