Pengontrolan waktu hidup dan mati peralatan sebagai otomasi yang mengurangi ketergantungan dari kontrol operator, bisa dilakukan dengan penjadwalan beban/peralatan. Contohnya dalam pengaturan beban dalam rumah tangga, misalkan terdapat beban yang akan dikontrol seperti berikut :
- lampu teras
- lampu taman
- pompa pengisi air tandon
- kran/solenoid Penyiram tanaman
- electric water heater
adalah beban-beban listrik yang biasanya hidup dan mati-nya terjadwal.
Untuk mengatur jadwalnya, pada contoh ini menggunakan 3 tombol yaitu set, up dan down. adapun komponen yang digunakan adalah :
- Arduino uno
- rtc ds3231
- lcd 16×02 i2c
- relay 8 channel
Skema penjadwalan relay menggunakan arduino :
koding arduino penjadwalan relay :
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 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 | #define pinTombolSet A0 #define pinTombolUp A1 #define pinTombolDown A2 #define pinRelay1 2 #define pinRelay2 3 #define pinRelay3 4 #define pinRelay4 5 #define pinRelay5 6 #define pinRelay6 7 #define pinRelay7 8 #define pinRelay8 9 #define relayOn LOW #define jumlahRelay 8 #include <Wire.h> #include <LiquidCrystal_I2C.h> #include "Sodaq_DS3231.h" #include "EEPROM.h" LiquidCrystal_I2C lcd(0x3F, 16, 2); //coba juga 0x27 byte setting[jumlahRelay * 4]; byte menu = 0; char buf[32]; DateTime now; byte detikSebelumnya = 60; byte pinRelay[] = {pinRelay1, pinRelay2, pinRelay3, pinRelay4, pinRelay5, pinRelay6, pinRelay7, pinRelay8}; void setup() { pinMode(pinTombolSet, INPUT_PULLUP); pinMode(pinTombolUp, INPUT_PULLUP); pinMode(pinTombolDown, INPUT_PULLUP); for (byte i = 0; i < jumlahRelay; i++) { digitalWrite(pinRelay[i], !relayOn); pinMode(pinRelay[i], OUTPUT); } Serial.begin(9600); Serial.println(F( "Penjadwalan dan durasi aktif relay dengan setting melalui tombol berbasis arduino" )); Serial.println(); Wire.begin(); rtc.begin(); DateTime dt(2011, 11, 10, 15, 18, 0, 5); // set tanggal dan waktu (format): tahun, bulan tanggal, jam, menit, detik, hari (1=minggu, 7=sabtu) rtc.setDateTime(dt); Wire.beginTransmission(0x3F); if (Wire.endTransmission()) { lcd = LiquidCrystal_I2C(0x27, 16, 2); } lcd.begin(); lcd.backlight(); lcd.print( "Jadwal relay" ); lcd.setCursor(0, 1); lcd.print( "www.Semesin.com" ); delay(3000); lcd.clear(); if (EEPROM.read(0) != 12) { EEPROM.update(0, 12); for (byte i = 0; i < jumlahRelay * 4; i++) { setting[i] = 0; } EEPROM.put(1, setting); } EEPROM.get(1, setting); Serial.println( "Sistem mulai" ); } void loop() { now = rtc.now(); if (detikSebelumnya != now.second()) { detikSebelumnya = now.second(); if (now.second() == 0) { for (byte i = 0; i < jumlahRelay; i++) { uint16_t unixNow = (now.hour() * 60) + now.minute(); uint16_t unixWaktu = ((setting[(i * 4) + 0] * 60) + setting[(i * 4) + 1]); uint16_t unixDurasi = ((setting[(i * 4) + 2] * 60) + setting[(i * 4) + 3]); if (unixNow == unixWaktu) { digitalWrite(pinRelay[i], LOW); Serial.print( "Relay " ); Serial.print(i + 1); Serial.println( " aktif" ); } if (unixNow == unixWaktu + unixDurasi) { digitalWrite(pinRelay[i], HIGH); Serial.print( "Relay " ); Serial.print(i + 1); Serial.println( " tidak aktif" ); } } } if (!menu) { sprintf (buf, "%02d/%02d/%04d" , now.date(), now.month(), now.year()); lcd.setCursor(3, 0); lcd.print(buf); sprintf (buf, "%02d:%02d:%02d" , now.hour(), now.minute(), now.second()); lcd.setCursor(4, 1); lcd.print(buf); } } if (menu) { if (!digitalRead(pinTombolUp)) { delay(50); while (!digitalRead(pinTombolUp)) { setting[menu - 1]++; if ((menu - 1) % 2) { if (setting[menu - 1] >= 60) { setting[menu - 1] = 0; } } else { if (setting[menu - 1] >= 24) { setting[menu - 1] = 0; } } tampilanMenu(); delay(100); } } if (!digitalRead(pinTombolDown)) { delay(50); while (!digitalRead(pinTombolDown)) { if ((menu - 1) % 2) { if (setting[menu - 1] == 0) { setting[menu - 1] = 59; } else { setting[menu - 1]--; } } else { if (setting[menu - 1] == 0) { setting[menu - 1] = 23; } else { setting[menu - 1]--; } } tampilanMenu(); delay(100); } } } if (!digitalRead(pinTombolSet)) { delay(50); if (!digitalRead(pinTombolSet)) { menu++; if (menu == jumlahRelay * 4 + 1) { menu = 0; lcd.clear(); lcd.noCursor(); EEPROM.put(1, setting); } else { lcd.clear(); lcd.setCursor(2, 0); lcd.print( "Set Relay " ); lcd.print(((menu - 1) / 4) + 1); tampilanMenu(); } long miliisTekanPanjang = millis() + 3000; while (!digitalRead(pinTombolSet)) { if (miliisTekanPanjang < millis()) { menu = 0; lcd.clear(); lcd.noCursor(); EEPROM.put(1, setting); } } } } } void tampilanMenu() { sprintf (buf, "%s : %02d:%02d" , ((menu - 1) % 4) / 2 ? "Durasi" : "Waktu " , setting[(menu - 1) & 0xFE], setting[((menu - 1) & 0xFE) + 1]); lcd.setCursor(0, 1); lcd.print(buf); lcd.setCursor(((menu - 1) % 2) ? 12 : 9, 1); lcd.cursor(); } |
@Admin,I have followed your instructions, and how to fix this problem. Clock is inaccurate.chek this https: //youtu.be/tACWCoelwgU
thank’s for share..
Sketch diupdate pada baris 50: untuk pengaturan waktu
DateTime dt(2011, 11, 10, 15, 18, 0, 5); // set tanggal dan waktu (format): tahun, bulan tanggal, jam, menit, detik, hari (1=minggu, 7=sabtu)
rtc.setDateTime(dt);
Assalamualaikum
Mas gimana cara buat aplikasi di mit app invertor menyalakan led via bloetooth dengan fungsi delay 1 detik..
Di apk saat di klik led nyala dalam waktu 1 detik kemudian mati.
Hnya nyala 1 detik saat di klik
Sebelumnya saya ucapkan terimah kasih
jika delay dijalankan di app inventor bisa menggunakan fungsi seperti :

jika delay dijalankan di arduino
if(perintah == ledOn)
{
digitalWrite(pinLED, HIGH);
delay(1000);
digitalWrite(pinLED, LOW);
}
Mas..admin,saya sudah buat,sudah berjalan hampir 2 hari.Tapi kemaren pas listrik pln mati,kok nggak tersimpan..ya.Ada solusinya mas..?
Sketch/koding ini bersifat trigger pada waktu sesuai setting,
jadi tidak melakukan pengecekan jadwal saat mulai/reset (sama seperti kondisi mati lampu => mulai ulang/reboot).
makasih bang tutorialnya. saya mau bikin yg begini persis 8 channel, dan terhubung ke solenoid valve tapi tanpa lcd dan tombol setting bisa ga bang? jadi settingnya di coding nya langsung. Soalnya waktu nyala dan mati nya tiap valve tiap hari sudah fix jadi gak perlu tombol untuk setting. Saya awam sama dunia arduino, beberapa hari ini nyari2 di internet dan youtube, yg paling mirip tutorial abang ini. Mohon pencerahannya ya bang
set variabel setting.
contoh :
setting = {
08,00,00,15, //waktu 1 = jam, menit, durasi menit, durasi detik
09,00,00,30, //waktu 2 = jam, menit, durasi menit, durasi detik
…
};
bang mau tanya untuk bagian
sprintf(buf, “%s : %02d:%02d”, ((menu – 1) % 4) / 2 ? “Durasi” : “Waktu “, setting[(menu – 1) & 0xFE], setting[((menu – 1) & 0xFE) + 1]);
yang 0xFE itu buat apa yah? alamat eeprom yang digunakan untuk menyimpan data yang disetting atau yang lain?
coba memahami masih gantung aja nih
Terimakasih
0xFE = 1111 1110
(menu – 1) & 0xFE :: hanya mengambil 7 bit msb (bit ke-8 diabaikan)
setting[(menu – 1) & 0xFE] :: merujuk ke variabel setting di alamat : (menu – 1) & 0xFE = menit, (menu – 1) & 0xFE = detik
Bang Asep bisa minta tolong ditambahkan sketch untuk setting Durasinya sampai detik ya, itu kan cuman jam dan menit, sedangkan jika mau menghidupkan relay selama kurang dari 1 menit kesulitan kalau tidak ada setting detiknya,,, makasih banyak bang atas ilmunya semoga barokah dunia akherat amiin.
Sesuaikan dengan kebutuhan masing-masing, sketch ini masih bisa dikembangkan untuk berbagai keperluan.
pagi om Asep
itu untuk durasinya jarak watu yaaa. bukan diisi jam lagi yaaa….
thanks o,
durasi = jarak waktu (dalam menit)
Bang mau nanya, kalau nggak mau pakai lcd bisa kan? Gimana dengan programnya apa aja yang di ubah?
Terima kasih sebelumnya
harusnya bisa saja tanpa lcd, programnya tetap sama.
assalamu’alaikum….
bang asep saya sudah coba program diatas dan masih error
‘A1’ was not declare in this scope
library diatas sudah saya masukkan semua…
dan menghapus library sebelumnya tapi masih jg error..kira2 kesalahannya di mana ya…
Set board (menu tools – board) sebagai ‘Arduino/Genuino Uno’
numpang tanya bos…kalau mengatur timer otomatic dalam satu alat selama 24 jam semisalnya setting awalp adalah 15 menit on 10 menit off bekerja dari jam 6 pagi sampai jam 6 sore…sesudah itu 15 menit on dan 30 menit off sampai jam 6 pagi berikutnya bagaimana caranya?
metodenya perulangan dengan penyekat waktu.
kalo di contoh sketch ini pewaktunya berfungsi hanya sebagai trigger (sekali).
assalamualaikum …
bang mw nanya jika saya mengkombinasikan antara sketh jadwal sholat dgn relay;
sy ingin membuat relay aktif 30 menit sebelum dan sesudah azan ,yg berlaku utk 5 waktu azan dalam sehari .
gmana ,apa kodingan yg harus sy tambah bang .? mohon pencerahan ny
tentukan waktu aktif relay tersebut dengan formula
waktuRelayAktif1 = SebelumShalat – 30;
waktuRelayAktif2 = SesudahShalat + 30;
contoh program penambahan/pengurangan waktu:
uint16_t waktuShalat = waktuShalat_jam * 60 + waktuShalat_menit;
uint16_t waktuRelay = waktuShalat - 30;
byte waktuRelay_jam = waktuRelay / 60;
byte waktuRelay_menit = waktuRelay % 60;
kemudian lakukan pengecekan waktu dalam loop
if ((now.hour() == waktuRelay_jam ) && (now.minute() == waktuRelay_menit ))
{
...
}
bg izin tanya .. kalau mau buat lama durasi aktif relay on tanpa menggunakan delay .. namun make RTC .. kira kira programnya gimana ya ? saya masih baru banget megang RTC.. ke
untuk penjadwalan menggunakan rtc bisa melihat contoh https://www.project.semesin.com/2020/02/22/penjadwalan-pembacaan-sensor-berbasis-rtc-ds3231/
kalo penjadwalannya lebih dari 1 kali dalam sehari, misalnya mau nyiram tanaman 7 kali dalam sehari bisa mas?
bisa saja dibuat seperti itu (mesti di kembangkan khusus programnya)
kalo biar waktunya bisa nyimpen pas mati listrik gmn om?
bisa dengan menambahkan kode pada block setup yaitu pengecekan apakah waktu rtc dalam durasi aktif
untuk waktu hitung gmna gan,
dimana waktu itung saya atur pke push button yang di tampilkan di lcd, ktika waktu mundur hbis di tmpilan lcd, makan relay otomatis akan menyala,, gimnna gan?
hitung mundur selesai, ==> nyalakan relay
atau
cek hitung mundur == 0 ==> nyalakan relay
tolong di jawab kak, ini kenapa relay nya aktif tapi pompa nya ga aktif juga
beberapa permasalahan berkaitan relay:
kesalahan yang sering ditemui adalah penggukaan power supply yang tidak sesuai seperti pemaiakan power supply 3.3v pada relay 5v