Alarm berfungsi sebagai pengingat atau pemberitahu baik melalui visual dan suara. Biasanya alarm diaktifkan pada waktu-waktu tertentu sesuai kebutuhan, adakalanya dalam satu hari ada beberapa waktu alarm diaktifkan.
Dalam desain ini saya hanya menggunakan satu entri waktu alarm yang bisa diatur dengan 4 (empat) tombol, fungsi masing-masing tombol adalah:
- tombol kiri (M) untuk menu, tekan pertama untuk pengaturan jam, kedua untuk menit, ketiga untuk detik dan ke-empat untuk kembali.
- tombol kanan (E) untuk exit/langsung kembali jika sudah dalam menu.
- tombol atas untuk tambah
- tombol bawah untuk kurang
breadboard:
komponen yang digunakan:
- Arduino Uno
- LCD matrik 16×2
- I2C to LCD PCF8574
- RTC DS1307
- Buzzer
- Tombol 4bh
sketch/program:
#include <Wire.h> #include <LiquidCrystal_I2C.h> #include <TimeLib.h> #include <DS1307RTC.h> #include <EEPROM.h> //pin byte tombolUp = 9; byte tombolDn = 10; byte tombolMinus = 11; byte tombolPlus = 8; byte buzzer = 13; LiquidCrystal_I2C lcd(0x3F, 16, 2); byte detikTerakhir = 60; int alarmJamAddr = 0; int alarmMenitAddr = 1; int alarmDetikAddr = 2; byte alarmJam; byte alarmMenit; byte alarmDetik; bool alarmStatus = false; unsigned long millisMulai; unsigned long millisAlarmMulai; bool buzzStatus; uint16_t jedaBuzzer = 1000; uint16_t waktuAlarm = 10000;//Alarm 10 detik byte menu = 0; byte menuLCDPos = 8; byte temp; void setup() { Serial.begin(9600); Serial.println("Setting alarm menggunakan Arduino dan RTC1307 melalui 4 push button"); Serial.println("https://www.project.semesin.com"); pinMode(buzzer, OUTPUT); pinMode(tombolUp, INPUT_PULLUP); pinMode(tombolDn, INPUT_PULLUP); pinMode(tombolMinus, INPUT_PULLUP); pinMode(tombolPlus, INPUT_PULLUP); Wire.begin(); Wire.beginTransmission(0x3F); if (Wire.endTransmission()) { lcd = LiquidCrystal_I2C(0x27, 16, 2); } lcd.begin(); lcd.backlight(); lcd.setBacklight(HIGH); lcd.setCursor (0, 0); lcd.print("Waktu: : : "); lcd.setCursor(0, 1); lcd.print("Alarm: : : "); readEEPROMDataWaktu(); lcd.setCursor(8, 1); if (alarmJam < 10)lcd.print('0'); lcd.print(alarmJam); lcd.setCursor(11, 1); if (alarmMenit < 10)lcd.print('0'); lcd.print(alarmMenit); lcd.setCursor(14, 1); if (alarmDetik < 10)lcd.print('0'); lcd.print(alarmDetik); } void loop() { tmElements_t tm; do { lcd.setCursor(menuLCDPos, 1); switch (bacaTombol()) { case '+': temp = EEPROM.read(menu - 1); if (((temp >= 23) && (menu == 1)) || ((temp >= 59) && (menu > 1))) temp = 0; else temp++; EEPROM.write(menu - 1, temp); if (temp < 10)lcd.print('0'); lcd.print(temp); break; case '-': temp = EEPROM.read(menu - 1); if ((temp == 0) && (menu == 1)) temp = 23; else if ((temp == 0) && (menu > 1)) temp = 59; else temp--; EEPROM.write(menu - 1, temp); if (temp < 10)lcd.print('0'); lcd.print(temp); break; case 'M': menu++; if (menu == 1) { menuLCDPos = 8; temp = alarmJam; lcd.blink(); } else if (menu == 2) { menuLCDPos = 11; } else if (menu == 3) { menuLCDPos = 14; } if (menu == 4) { menu = 0; lcd.noBlink(); readEEPROMDataWaktu(); } break; case 'E': menu = 0; lcd.noBlink(); readEEPROMDataWaktu(); break; } } while (menu); if (alarmStatus) { if (millisMulai + jedaBuzzer < millis()) { buzzStatus = !buzzStatus; digitalWrite(buzzer, buzzStatus); millisMulai = millis(); } if (millisAlarmMulai + waktuAlarm < millis()) { alarmStatus = false; digitalWrite(buzzer, LOW); } } if (RTC.read(tm)) { if (tm.Second != detikTerakhir) { lcd.setCursor(8, 0); if (tm.Hour < 10)lcd.print('0'); lcd.print(tm.Hour); lcd.setCursor(11, 0); if (tm.Minute < 10)lcd.print('0'); lcd.print(tm.Minute); lcd.setCursor(14, 0); if (tm.Second < 10)lcd.print('0'); lcd.print(tm.Second); if ((alarmJam == tm.Hour) && (alarmMenit == tm.Minute) && (alarmDetik == tm.Second)) { alarmStatus = true; millisMulai = millis(); millisAlarmMulai = millisMulai; } detikTerakhir = tm.Second; } } } char bacaTombol() { char tombol = ' '; if (!digitalRead(tombolUp)) { tombol = '+'; } else if (!digitalRead(tombolDn)) { tombol = '-'; } else if (!digitalRead(tombolMinus)) { tombol = 'M'; } else if (!digitalRead(tombolPlus)) { tombol = 'E';//exit } while (!digitalRead(tombolUp)); while (!digitalRead(tombolDn)); while (!digitalRead(tombolMinus)); while (!digitalRead(tombolPlus)); delay(200); return tombol; } void readEEPROMDataWaktu() { alarmJam = EEPROM.read(alarmJamAddr); alarmMenit = EEPROM.read(alarmMenitAddr); alarmDetik = EEPROM.read(alarmDetikAddr); }
I2C scanner
apabila ditemui kesulitan dalam mencari alamat I2C dari PCF8574 (modul I2C ke LCD 16×2) gunakan I2C scanner berikut:
#include <Wire.h> void setup() { Wire.begin(); Serial.begin(9600); Serial.println("\nI2C Scanner"); } void loop() { byte error, address; int nDevices; Serial.println("Scanning..."); nDevices = 0; for(address = 1; address < 127; address++ ) { Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { Serial.print("I2C device found at address 0x"); if (address<16) Serial.print("0"); Serial.print(address,HEX); byte addressFull = address << 1; Serial.print("("); if (addressFull<16) Serial.print("0"); Serial.print(addressFull,HEX); Serial.println(")"); nDevices++; } else if (error==4) { Serial.print("Unknown error at address 0x"); if (address<16) Serial.print("0"); Serial.println(address,HEX); } } if (nDevices == 0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); delay(5000); }
alamat tulis I2C yang umum:
- DS1307 = 0xD0
- AT24C32 = 0xA0 – oxAE
Library:
Min kalau jadwal alarm nya lebih dari 1 penambahan koding nya gmna ya?
Koding ini prinsipnya mengatur melalui menu nilai variabel berikut:
byte alarmJam;
byte alarmMenit;
byte alarmDetik;
jika diinginkan lebih dari 1 variabel salah satu jalannya adalah variabel tersebut di buat lebih dari 1 (boleh array) dan diatur dalam menu (submenu) tersendiri
Kalau untuk penambahan menu codingnya di bagian mana min?
dalam block
switch(bacaTombol())
min klo mau ganti suara melodi buzzer gmna ya?
Bisa
*gunakan modul suara, atau
*gunakan buzzer tipe pasif, dan bunyikan dengan perintah tone() sesuai nada-nya
Kalo alarm nya lebih dari 1 variable.. gimana dg eeprom addr nya min? Ditambah juga ?
satu set data menggunakan 3 alamat memory EEPROM
untuk set data selanjutnya mesti di alamat yang berbeda
Kak, numpang tanya dong. Bisa kasih contoh sederhana gak terkait kontrol sensor suhu lm35, dan kontrol matikan lampu menggunakan rtc ds1307.
Thanks
kontrol lm35
if(analogRead(pinLM35) > 50)
{
matikanlampu();
}
else
{
hidupkanlampu();
}
untuk kontrol lampu dengan rtc ds1307 bisa mengambil contoh dari artikel ini
Error compiling for board arduino /genuino uno
Itu cara mengatasi nya gimana y?
pesan seperti itu muncul untuk error secara umum
coba lihat detail error-nya di jendela error (bagian bawah)
kok alarm nya eror, jadinya 255255255
muncul 255255255 kemungkinan pembacaan rtc (DS1307) gagal
::cek wiring rtc
Kalo diganti DS3231 bisa ndak ya, apakah codingnya sama cuma diganti library?
Ganti library dan coding (ds3231 juga banyak model library-nya)
jadi pilih library yang cocok dan sesuaikan codingnya
Mas bikin simulasi di fritzing kan kok saya gk nemu lcd nya gak ada di bagian kirinya
library tambahan
bisa didownload disini: LCD1602-I2C.fzpz
mas programinnya pas saya cek error solusinya gimana ya mas ?
copy paste errornya disini…
Arduino: 1.6.9 (Windows 10), Board: “Arduino/Genuino Uno”
C:\Users\Rahdian\Music\numeroumino\Avoider\Avoider.ino:2:31: fatal error: LiquidCrystal_I2C.h: No such file or directory
kaya gini mas
Install dulu library nya (library LiquidCrystal_I2C, DS1307RTC-1.4.1, Time-1.5.0)
bisa didownload dari link di bawah artikel
oke mas makasih responnya mas <3
cara menggunakan i2c scanner yang mas tuliskan programnya di atas bagaimana cara gunainnya mas ?
pasang rtc (atau modul i2c lainnya) – upload sketch i2c scanner – lihat hasil di serial monitor
alarm muncul 255255255 mas. wiringnya udah bener
255 indikasi rtc tidak kebaca,
cek rtc, (cek kemungkinan kabel kebalik)
jenis tombolnya yang seperti apa ya min ?
tombol push on
MIn kalau mau jadwal alarmnya jadi dua itu penambahan kodingnya di mana ya? jadi untuk penekanan keempar, lima enamnya untuk jadwal kedua, thanks
sketch ini menggunakan metode langsung jadi lebih susah untuk dikembangkan,
kalo mau jadwal alarm fleksibel, bisa menggunakan contoh sketch ini : https://www.project.semesin.com/2018/12/04/bel-sekolah-dengan-pengaturan-melalui-tombol/
gan kalo mau ganti buzer nya pake servo apa aja yg di ubah code nya?
cari dan ganti
digitalWrite(buzzer, xxx);
dengan (tapi terlebih dahulu insialisasi servonya :: bisa mengikuti contoh2 di example)
servo.write(xx);