Pada halaman web arduinoecia, terdapat jam Arduino dengan layar grafik LCD 128x64, potensiometer untuk menyesuaikan kontras layar, modul RTC DS3231, dan tombol push. Modul RTC terhubung ke Arduino pada pin A4 (SDA) dan A5 (SCL). Tombol terhubung ke pin digital 3, dengan resistor pull-up internal Arduino diaktifkan melalui perangkat lunak. Program menggunakan beberapa library yang harus Anda instal sebelum mengkompilasi. Ekstrak library dan letakkan di dalam folder LIBRARIES Arduino IDE.
Program memiliki dua layar: layar pertama (screen_1) menampilkan jam analog, jam digital, serta tanggal dan suhu saat ini.
Layar kedua (screen_2) menampilkan jam digital, hari dalam seminggu, tanggal dan informasi suhu saat ini, suhu minimum dan suhu maksimum. Layar dipilih dengan menekan tombol push yang terhubung ke pin digital 3.
Untuk mengatur tanggal dan waktu modul RTC DS3231, gunakan serial monitor dan masukkan informasi dalam format tahun, bulan, tanggal, jam, menit, detik.
Jika Anda mengetik informasi dengan benar, pesan akan ditampilkan.
Kode
kode
libraries
kodeArduino
//Programa: Display LCD 128x64 e RTC DS3231 //Autor: Arduino e Cia #include <U8glib.h> #include <DS3232RTC.h> #include <Streaming.h> #include <Time.h> #include <Wire.h> //A linha abaixo define as conexoes do display e deve ser //ajustada conforme o modelo utilizado U8GLIB_ST7920_128X64_1X u8g(6, 5, 4 , 7); //Enable, RW, RS, RESET int X2 = 0; int Y2 = 0; int X3 = 0; int Y3 = 0; float angulo = 0; int posicao = 0; int posicaoh = 0; int temperatura =0; int min_temp = 500; int max_temp = -500; int ScreenWith = 128; int ScreenWithC = 96; int ScreenHeight = 64; int ScreenHeightC = 32; #define botao 3 int estado_botao = 0; char* dia_da_semana[]={ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; void tela_1() { u8g.drawRFrame(0, 0, 128, 64, 3); u8g.setPrintPos(20, 30); u8g.print(temperatura); u8g.drawStr( 42, 30, "C"); u8g.drawCircle(37, 34, 2); mostra_relogio_digital(); fundo_relogio(); desenha_ponteiro(hour()-1, 12.0, 10); desenha_ponteiro(minute()-5, 60.0, 19); desenha_ponteiro(second()-5, 60, 21); } void tela_2() { u8g.drawRFrame(0, 0, 128, 64, 3); u8g.drawRFrame(68, 4, 55, 56, 2); mostra_relogio_digital(); u8g.setFont(u8g_font_5x8); u8g.drawStr( 78, 35, "MIN"); u8g.drawStr( 78, 53, "MAX"); u8g.setFont(u8g_font_6x13); u8g.setPrintPos(25, 41); u8g.print(dia_da_semana[(weekday()-1)]); u8g.setPrintPos(83, 19); u8g.print(temperatura); u8g.drawStr( 105, 19, "C"); u8g.drawCircle(100, 12, 2); u8g.setPrintPos(98, 36); u8g.print(min_temp); u8g.drawCircle(113, 29, 2); u8g.setPrintPos(98, 54); u8g.print(max_temp); u8g.drawCircle(113, 47, 2); } void desenha_ponteiro(float valor, float rotacao, int Radius) { angulo = valor * 2.0 * 3.1415 / rotacao - 1,5707; X2 = ScreenWithC + Radius * cos(angulo); Y2 = ScreenHeightC + Radius * sin(angulo); u8g.drawLine(ScreenWithC, ScreenHeightC, X2, Y2); } void fundo_relogio() { u8g.drawCircle(ScreenWithC, ScreenHeightC, 27); u8g.drawCircle(ScreenWithC, ScreenHeightC, 1); u8g.setFont(u8g_font_6x13); u8g.setFontPosTop(); u8g.drawStr(90, 9, "12"); u8g.drawStr(114, 25, "3"); u8g.drawStr(94, 44, "6"); u8g.drawStr(74, 25, "9"); for(int traco_minuto = 0; traco_minuto<12; traco_minuto++) { angulo = traco_minuto / 12.0 * 2 * 3.1415; X2 = ScreenWithC + 25 * cos(angulo); Y2 = ScreenHeightC + 25 * sin(angulo); X3 = ScreenWithC + 25 * cos(angulo); Y3 = ScreenHeightC + 25 * sin(angulo); u8g.drawLine(X2, Y2, X3, Y3); } } void mostra_relogio_digital() { u8g.setFont(u8g_font_5x8); u8g.setPrintPos(8, 55); u8g.print(day()); u8g.drawStr( 19, 55, "/"); u8g.setPrintPos(24, 55); u8g.print(month()); u8g.drawStr( 35, 55, "/"); u8g.setPrintPos(41, 55); u8g.print(year()); u8g.drawRBox(3, 4, 62, 21,2); u8g.setColorIndex(0); u8g.setFont(u8g_font_fub17); u8g.drawStr(29,21,":"); if (hour() < 10) { u8g.drawStr(3,23,"0"); posicaoh = 16; } else posicaoh = 3; u8g.setPrintPos(posicaoh, 23); u8g.print(hour()); if (minute() < 10) { u8g.drawStr(38,23,"0"); posicao = 51; } else posicao = 38; u8g.setPrintPos(posicao ,23); u8g.print(minute()); u8g.setColorIndex(1); } void setup() { pinMode(3, INPUT_PULLUP); Serial.begin(9600); if ( u8g.getMode() == U8G_MODE_R3G3B2 ) u8g.setColorIndex(255); else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) u8g.setColorIndex(3); else if ( u8g.getMode() == U8G_MODE_BW ) u8g.setColorIndex(1); setSyncProvider(RTC.get); Serial << F("RTC Sync"); if (timeStatus() != timeSet) Serial << F(" FAIL!"); Serial << endl; } void loop() { temperatura = RTC.temperature() / 4.; if (temperatura >= max_temp) { max_temp = temperatura; } if (temperatura <= min_temp) { min_temp = temperatura; } static time_t tLast; time_t t; tmElements_t tm; if (Serial.available() >= 12) { int y = Serial.parseInt(); if (y >= 100 && y < 1000) Serial<<F("Erro: Ano deve ter dois ou quatro digitos!") <<endl; else { if (y >= 1000) tm.Year = CalendarYrToTm(y); else tm.Year = y2kYearToTm(y); tm.Month = Serial.parseInt(); tm.Day = Serial.parseInt(); tm.Hour = Serial.parseInt(); tm.Minute = Serial.parseInt(); tm.Second = Serial.parseInt(); t = makeTime(tm); RTC.set(t); setTime(t); Serial << F("Horario modificado para: "); printDateTime(t); Serial << endl; while (Serial.available() > 0) Serial.read(); } } t = now(); if (t != tLast) { tLast = t; printDateTime(t); Serial << endl; } boolean valor_botao = digitalRead(3); if (valor_botao != 1) { while(digitalRead(3) != 1) { delay(100); } estado_botao = !estado_botao; } u8g.firstPage(); do { if (estado_botao == 0) { tela_1(); } if (estado_botao == 1) { tela_2(); } } while( u8g.nextPage() ); delay(10); } void printDateTime(time_t t) { printI00(day(t), 0); Serial << monthShortStr(month(t)) << _DEC(year(t)); Serial << ' '; printI00(hour(t), ':'); printI00(minute(t), ':'); printI00(second(t), ' '); } void printI00(int val, char delim) { if (val < 10) Serial << '0'; Serial << _DEC(val); if (delim > 0) Serial << delim; return; }