Bismillah... Dari beberapa postingan sebelumnya, dapat kita kembangkan pemrograman arduino yaitu membuat jam digital dengan OLED display.
Tentunya dalam membuat jam digital arduino ini kita menggunakan module RTC sebagai refensi waktu, dalam hal ini adalah RTC DS3231 yang mempunyai tingkat presisi yang tinggi.
Bagaimana cara setting RTC DS3231? silahkan lihat (DISINI).
Selain menampilkan waktu & tanggal, kita juga dapat menampilkan nilai temperatur dari modul RTC tersebut.
Secara sederhana, cara kerja dari jam digital Arduino ini dapat kita pahami bahwa "Arduino membaca data (Waktu & Temperatur) dari modul RTC dan menampilkannya pada OLED display".
Apa saja modul yang digunakan? berikut modul-modul yang kita gunakan :
- Arduino Board (UNO/NANO)
- RTC DS3231
- OLED 0.96"
- Breadboard
- Kabel Jumper
Jam digital Arduino yang kita buat ini sangatlah sederhana, tanpa menggunakan push button untuk setting waktu hanya mengandalkan keakuratan modul RTC saja. Jadi, selama modul RTC bekerja normal (Baterai RTC tidak Low / disconnect) maka tampilan waktu akan tetap akurat.
Jika ditemukan waktu yang tidak sesuai, salah satu kemungkinan yang terjadi adalah baterai RTC sudah low, tentunya kita harus melakukan penggantian baterai RTC dan melakukan seting kembali RTC serta upload kembali program Jam Digital Arduino.
Berikut skema rangkaian untuk Jam Digital Arduino.
Dalam pemrograman Jam Digital Arduino ini ada beberapa library yang digunakan, yaitu:
Wire.h
Jika telah melakukan proses instalasi library tersebut kita dapat menggunakan sketch program dibawah ini:
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET -1
Adafruit_SSD1306 display(OLED_RESET);
void setup(void) {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.display();
display.setTextColor(WHITE, BLACK);
display.drawRect(117, 25, 3, 3, WHITE);
draw_text(0, 25, "TEMPERATURE =", 1);
draw_text(122, 25, "C", 1);
}
char Time[] = " : : ";
char Calendar[] = " / /20 ";
char temperature[] = " 00.00";
char temperature_msb;
byte i, second, minute, hour, day, date, month, year, temperature_lsb;
void display_day(){
switch(day){
case 1: draw_text(13, 0, " SUN ", 1); break;
case 2: draw_text(13, 0, " MON ", 1); break;
case 3: draw_text(13, 0, " TUE ", 1); break;
case 4: draw_text(13, 0, " WED ", 1); break;
case 5: draw_text(13, 0, " THU ", 1); break;
case 6: draw_text(13, 0, " FRI ", 1); break;
default: draw_text(13, 0, " SAT ", 1);
}
}
void DS3231_display(){
// Convert BCD to decimal
second = (second >> 4) * 10 + (second & 0x0F);
minute = (minute >> 4) * 10 + (minute & 0x0F);
hour = (hour >> 4) * 10 + (hour & 0x0F);
date = (date >> 4) * 10 + (date & 0x0F);
month = (month >> 4) * 10 + (month & 0x0F);
year = (year >> 4) * 10 + (year & 0x0F);
// End conversion
Time[7] = second % 10 + 48;
Time[6] = second / 10 + 48;
Time[4] = minute % 10 + 48;
Time[3] = minute / 10 + 48;
Time[1] = hour % 10 + 48;
Time[0] = hour / 10 + 48;
Calendar[9] = year % 10 + 48;
Calendar[8] = year / 10 + 48;
Calendar[4] = month % 10 + 48;
Calendar[3] = month / 10 + 48;
Calendar[1] = date % 10 + 48;
Calendar[0] = date / 10 + 48;
if(temperature_msb < 0){
temperature_msb = abs(temperature_msb);
temperature[0] = '-';
}
else
temperature[0] = ' ';
temperature_lsb >>= 6;
temperature[2] = temperature_msb % 10 + 48;
temperature[1] = temperature_msb / 10 + 48;
if(temperature_lsb == 0 || temperature_lsb == 2){
temperature[5] = '0';
if(temperature_lsb == 0) temperature[4] = '0';
else temperature[4] = '5';
}
if(temperature_lsb == 1 || temperature_lsb == 3){
temperature[5] = '5';
if(temperature_lsb == 1) temperature[4] = '2';
else temperature[4] = '7';
}
draw_text(50, 0, Calendar, 1); // MENAMPILKAN KALENDER (format: dd/mm/yyyy)
draw_text(18, 8, Time, 2); // MENAMPILKAN WAKTU
draw_text(80, 25, temperature, 1); // MENAMPILKAN TEMPERATUR
}
void draw_text(byte x_pos, byte y_pos, char *text, byte text_size) {
display.setCursor(x_pos, y_pos);
display.setTextSize(text_size);
display.print(text);
display.display();
}
void loop() {
Wire.beginTransmission(0x68); // Start I2C protocol with DS3231 address
Wire.write(0); // Send register address
Wire.endTransmission(false); // I2C restart
Wire.requestFrom(0x68, 7); // Request 7 bytes from DS3231 and release I2C bus at end of reading
second = Wire.read(); // Read seconds from register 0
minute = Wire.read(); // Read minuts from register 1
hour = Wire.read(); // Read hour from register 2
day = Wire.read(); // Read day from register 3
date = Wire.read(); // Read date from register 4
month = Wire.read(); // Read month from register 5
year = Wire.read(); // Read year from register 6
Wire.beginTransmission(0x68); // Start I2C protocol with DS3231 address
Wire.write(0x11); // Send register address
Wire.endTransmission(false); // I2C restart
Wire.requestFrom(0x68, 2); // Request 2 bytes from DS3231 and release I2C bus at end of reading
temperature_msb = Wire.read(); // Read temperature MSB
temperature_lsb = Wire.read(); // Read temperature LSB
display_day();
DS3231_display(); // Diaplay time & calendar
delay(50); // Tunggu 50ms
}
Sekian....Semoga bermanfaat...
Keep sharing...!!!