
Quer fazer seu próprio relógio utilizando RTC e LCD? Basta continuar lendo este tutorial.
O RTC (Real Time Clock) é um circuito dedicado para a contagem do tempo dentro de um chip. Como relógio, ele é capaz de informar a hora no formato de 24h ou 12h (am/pm), os minuto e segundos; como calendário, tem-se a data e o dia da semana. Geralmente, é utilizado em computadores, microondas e em qualquer dispositivo que necessite “controlar” o tempo. Porém, para funcionar corretamente, o RTC precisa de alguns “acessórios” e, por isso, optamos por usar o Módulo RTC Tiny I2C, que já contém tudo incluso.
Neste tutorial, iremos desenvolver um relógio com ajuste manual, utilizando módulo RTC e shield LCD.
O Tiny I2C é composto pelo RTC DS1307, memória EEPROM, bateria e conexão para sensor de temperatura.
O DS1307 possui uma memória RAM de 64 bytes, no entanto, os dados permanecem gravados nela somente enquanto a bateria estiver conectada. Por isso, o módulo é dotado de uma memória EEPROM para armazenar as infomações caso o fornecimento de energia seja interrompido, além de ampliar a capacidade de armazenamento para 4.096 bytes.
Quanta à alimentação, uma bateria recarregável e que forneça 35mAh já é o suficiente, pois o DS1307 tem um baixo consumo.

Figura 1: Módulo RTC Tiny I2C.
Módulo Tiny I2C |
|
RTC |
DS1307 |
EEPROM |
AT24C32 |
Bateria |
LIR2032 |
Sensor de temperatura |
DS18B20 |
Tensão de operação |
5 VDC |
Tabela 1: Características técnicas do Tiny I2C.
- 1 Arduino UNO.
- 1 Cabo USB.
- 1 Shield LCD 16×2.
- 1 Módulo RTC Tiny I2C.
- Jumpers.

Figura 2: Circuito do relógio feito no software Fritzing
.
Conexões |
|
Tiny I2C |
Shield LCD |
SCL |
A5 |
SDA |
A4 |
VCC |
5 V |
GND |
GND |
Tabela 2: Conexão com arduino.
Antes de fazer Upload do código, é preciso baixar a biblioteca DS1307.h (ou clique aqui) e extrair seu conteúdo em \Arduino\libraries.
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 |
/*****************************PandoraLab****************************** ************************* Clock and Calendar ************************* *********************************************************************/ #include <Wire.h> #include <DS1307.h> #include <LiquidCrystal.h> //------------------------------------------------------------------// DS1307 RTC(A4, A5); LiquidCrystal LCD(8, 9, 4, 5, 6, 7); uint8_t Hour_Clock = 0; uint8_t Min_Clock = 0; uint8_t Sec_Clock = 0; uint8_t Day_Calendar = 1; uint8_t Mon_Calendar = 1; uint16_t Year_Calendar = 2017; uint8_t Day_Week = 1; //----------------------| Clock and Calendar |----------------------// void Active_Clock(); void Adjust_Hour(); void Adjust_Date(); void Adjust_Day(); //-----------------------------| Menu |-----------------------------// int Item_Menu = 0; void Menu(); void LCD_Menu(); void PandoraLab(); void Select(); //------------------------------------------------------------------// void setup() { Serial.begin(9600); RTC.halt(false); RTC.setSQWRate(0); RTC.enableSQW(true); LCD.begin(16, 2); PandoraLab(); } //------------------------------------------------------------------// void loop() { Menu(); } /******************************| Menu |******************************/ void Menu() { int BOT = analogRead(0); LCD.setCursor(0, 0); if(Item_Menu < 0 || Item_Menu > 4) { Item_Menu = 0; } if(BOT < 80) { //"Right" } else if(BOT < 200) { //"Up" Item_Menu = Item_Menu + 1; LCD_Menu(Item_Menu); } else if(BOT < 400){ //"Down" Item_Menu = Item_Menu - 1; LCD_Menu(Item_Menu); } else if(BOT < 800){ //"Select" Select(Item_Menu); } delay(100); } //------------------------------| LCD |-----------------------------// void LCD_Menu(int BOT) { switch(BOT) { case 1: PandoraLab(); LCD.print("< Relogio^"); break; case 2: PandoraLab(); LCD.print("< Ajustar Hora^"); break; case 3: PandoraLab(); LCD.print("< Ajustar Data^"); break; case 4: PandoraLab(); LCD.print("< Ajustar Dia^"); break; } } //----------------------------| Title |-----------------------------// void PandoraLab() { LCD.clear(); LCD.setCursor(1, 0); LCD.print("PandoraLab :)"); LCD.setCursor(0, 1); } //----------------------------| Select |----------------------------// void Select(int BOT) { switch(BOT) { case 1: LCD.clear(); Active_Clock(); break; case 2: LCD.clear(); Adjust_Hour(); break; case 3: LCD.clear(); Adjust_Date(); break; case 4: LCD.clear(); Adjust_Day(); break; } } /******************************| Clock |*****************************/ void Active_Clock() { int Bot_Select = analogRead(0); while(Bot_Select < 800) { LCD.setCursor(0, 0); LCD.print(RTC.getTimeStr()); LCD.setCursor(0, 1); LCD.print(RTC.getDateStr(1)); LCD.setCursor(13, 1); LCD.print(RTC.getDOWStr(1)); delay(1000); } } /**************************| Adjust Time |***************************/ void Print_Digits(int Digits) { if(Digits < 10) LCD.print('0'); LCD.print(Digits); } void Adjust_Hour() { int Bot_Left = analogRead(0); int Bot_Select = analogRead(0); LCD.setCursor(0, 0); Print_Digits(Hour_Clock); LCD.setCursor(2, 0); LCD.print(":"); LCD.setCursor(3, 0); Print_Digits(Min_Clock); LCD.setCursor(5, 0); LCD.print(":"); LCD.setCursor(6, 0); Print_Digits(Sec_Clock); if(Bot_Left < 600) { Min_Clock++; if(Min_Clock > 59) { Min_Clock = 0; Hour_Clock++; if(Hour_Clock > 23) { Hour_Clock = 0; } } } else if(Bot_Select < 800) { if(Min_Clock > 0) { Min_Clock--; } if(Hour_Clock > 0 && Min_Clock == 0) { Hour_Clock--; Min_Clock = 59; } } RTC.setTime(Hour_Clock, Min_Clock, Sec_Clock); } /***************************| Adjust Date |**************************/ void Adjust_Date() { int Left = analogRead(0); int Select = analogRead(0); LCD.setCursor(0, 1); Print_Digits(Day_Calendar); LCD.setCursor(2, 1); LCD.print(":"); LCD.setCursor(3, 1); Print_Digits(Mon_Calendar); LCD.setCursor(5, 1); LCD.print(":"); LCD.setCursor(6, 1); Print_Digits(Year_Calendar); if(Left < 600) { Day_Calendar++; if(Day_Calendar > 31) { Day_Calendar = 1; Mon_Calendar++; if(Mon_Calendar > 12) { Mon_Calendar = 1; Year_Calendar++; if(Year_Calendar > 2099) { Year_Calendar = 2000; } } } } else if(Select < 800) { if(Day_Calendar > 1) { Day_Calendar--; if(Day_Calendar == 1 && Mon_Calendar > 1) { Day_Calendar = 31; Mon_Calendar--; } } } RTC.setDate(Day_Calendar, Mon_Calendar, Year_Calendar); } /***************************| Adjust Day |***************************/ void Adjust_Day() { int Day_Left = analogRead(0); LCD.setCursor(13, 1); if(Day_Left < 600) { Day_Week++; if(Day_Week > 7) { Day_Week = 1; } } RTC.setDOW(Day_Week); LCD.print(RTC.getDOWStr(1)); } |
- Ajustar a hora
- Ajustar a data
- Ajustar o dia
- Relógio
Após compilar o código, pressione o botão “Up” e “Down” para ver cada opção do menu e “Select” para selecioná-la. Primeiro, selecione a opção “Ajustar Hora” e pressione o botão “Left” para incrementar o valor até chegar na hora exata. Caso queira decrementar, basta utilizar o “Select”.
Em seguida, selecione a opção “Ajustar Data”, pressione “Left” para incrementar e “Select” decrementar.
Para definir o dia da semana, selecione a opção “Ajustar Dia” e pressione o “Left”. Os dias estão abreviados em inglês por padrão da biblioteca do RTC, mas não se preocupe, pois temos a tradução abaixo:
Sun = Domingo
Mon = Segunda
Tue = Terça
Wed = Quarta
Thu = Quinta
Fri = Sexta
Sat = Sábado
Definida a hora e a data, verifique se o relógio está funcionando corretamente ao selecionar a opcão “Relógio”. Para voltar ao menu, use o “Reset”.
Dúvidas? Fale conosco, estamos aqui para te ajudar! 🙂
Uno SMD – Arduino compatível
Ideal para iniciantes, o Uno é um Arduino compatível bem capaz, barato e com diversos shields e sensores compatíveis disponíveis. Se você está começando a aprender sobre microcontroladores e Arduinos, esta é a placa perfeita! Ela é a nossa placa principal nos nossos tutoriais de Arduino.
Módulo Tiny RTC I2C DS1307
R$24,90Este Real Time Clock (RTC) é um relógio com calendário completo. É capaz de fornecer informações como segundo, minutos, dia, data, mês e ano.
Em sua placa há um circuito que detecta falhas de energia, acionando assim automaticamente a bateria para evitar perda de dados. Endereço e informações são transferidas via protocolo I2C. Correções como meses com menos de 31 dias e anos bissextos são feitas automaticamente. Opera tanto no formato 12 horas como 24 horas.
Boa noite. está dando erro pra mim na compilação.
This report would have more information with
“Show verbose output during compilation”
enabled in File > Preferences.
Arduino: 1.0.6 (Windows XP), Board: “Arduino Uno”
sketch_dec06c:8: error: ‘DS1307’ does not name a type
sketch_dec06c.ino: In function ‘void setup()’:
sketch_dec06c:31: error: ‘RTC’ was not declared in this scope
sketch_dec06c.ino: In function ‘void Active_Clock()’:
sketch_dec06c:114: error: ‘RTC’ was not declared in this scope
sketch_dec06c.ino: In function ‘void Adjust_Hour()’:
sketch_dec06c:161: error: ‘RTC’ was not declared in this scope
sketch_dec06c.ino: In function ‘void Adjust_Date()’:
sketch_dec06c:201: error: ‘RTC’ was not declared in this scope
sketch_dec06c.ino: In function ‘void Adjust_Day()’:
sketch_dec06c:213: error: ‘RTC’ was not declared in this scope
Você baixou a biblioteca do DS1307 e instalou corretamente?