15 de abril de 2012

Relógio digital

Um relógio com LCD 16x2 e RTC DS1307.

  


O circuito RTC é composto basicamente pelo CI DS1307 e um Cristal de 32,768KHz. Deve ser alimentado separadamente por uma bateria de 3v (CR2032), e seu consumo é tão baixo que a bateria dura anos.

 

Para controle e leitura do RTC, optei em utilizar uma biblioteca feita pelo Álvaro Justen. Fiz algumas modificações e deixei disponível para download nesses links:

Segue o esquema elétrico do circuito e o código fonte do microcontrolador.

Valeu!



  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
/*-------------------------
 RELOGIO DIGITAL - RTC
 FELLIPE COUTO - 10/03/2012
 -------------------------*/
#include <Wire.h>
#include <DS1307.h> //Biblioteca do RTC.
#include <LiquidCrystal.h> //Biblioteca do LCD.
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //LCD(RS, E, D4, D5, D6, D7)

char dateTime[20];
char date[10];
char time[10];
int RTCValues[7];
int x = 0;
int y = 0;
int count = 0;

void setup(){
  DS1307.begin();
  lcd.begin(16, 2); //LCD com 16 colunas e 2 linhas
  //setDate(15, 05, 12, 1, 15, 00); //(DIA, MES, ANO, SEMANA, HORA, MINUTO)
}

void loop(){
  getDateTime();
  count++;
  if (count == 1){
    randomSeed(analogRead(0));  //Para o random ficar aleatorio, sem repetir a sequencia.
    do{
      y = random(5); //Valores de 0 a 4.
    }
    while (y == x);
    x = y;
  }
  else{
    if (count >= 7){
      count = 0; 
    }
  }
  switch(x){
  case 0:
    relogioHora();
    break;
  case 1:
    relogioData();
    break;
  case 2:
    relogioDataHora();
    break;
  case 3:
    relogioFeriado();
    break;
  case 4:
    relogio();
    break; 
  }
}

void getDateTime(){
  DS1307.getDate(RTCValues);
  if (RTCValues[6] > 59){ //Se o segundo for mais que 59, o RTC não esta ajustado.
    setDateTime(01, 01, 12, 1, 00, 00); //(DIA, MES, ANO, SEMANA, HORA, MINUTO) Ajusta o RTC.
  }
  else{
    //RTCValues [0]=ANO, [1]=MES, [2]=DIA-MES, [3]=DIA-SEMANA, [4]=HORA, [5]=MINUTO, [6]=SEGUNDO  
    sprintf(dateTime, "%02d/%02d/20%02d %02d:%02d", RTCValues[2], RTCValues[1], RTCValues[0], RTCValues[4], RTCValues[5]);
    sprintf(date, "%02d/%02d/%02d", RTCValues[2], RTCValues[1], RTCValues[0]);
    sprintf(time, "%02d:%02d:%02d", RTCValues[4], RTCValues[5], RTCValues[6]);
  }
}

void setDateTime(int dia, int mes, int ano, int semana, int hora, int minuto){
  DS1307.setDate(ano, mes, dia, semana, hora, minuto, 00); //(ANO, MES, DIA-MES, DIA-SEMANA, HORA, MINUTO, SEGUNDO)
  /*---------------------
   ANO: de 00 a 99
   MES: de 01 a 12
   DIA DO MES, de 01 a 31
   DIA DA SEMANA, de 1 (domingo) a 7 (sabado)
   HORA: de 0 a 23
   MINUTO: de 0 a 59
   SEGUNDO: de 0 a 59
   ---------------------*/
}

void relogioHora(){
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("----------------");
  lcd.setCursor(4,1);
  lcd.print(time);
  delay(1000);
}

void relogioData(){
  if (count == 1){
    lcd.clear();
    lcd.setCursor(16,0);
    lcd.print(fromNumberToWeekDay(RTCValues[3], 2)); //1=EN, 2=PT
    for (int i=0; i<16; i++){ //Leva para esquerda
      lcd.scrollDisplayLeft();
      delay(100);
    }
    lcd.setCursor(24,1);
    LetraPorLetra(date);
  }

  if (count == 0){
    for (int i=0; i<16; i++){ //Leva para esquerda
      lcd.scrollDisplayLeft();
      delay(100);
    }
  }
  delay(500);
}

void relogioDataHora(){
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(date);
  lcd.setCursor(8,1);
  lcd.print(time);
  delay(1000);
}

void relogioFeriado(){
  lcd.clear();
  lcd.setCursor(4,0);
  lcd.print(date);
  lcd.setCursor(0,1); //Segunda linha

  if (RTCValues[1] == 01 & RTCValues[2] == 01){
    lcd.print("FELIZ ANO NOVO!!");
  }
  else if (RTCValues[1] == 04 & RTCValues[2] == 21){
    lcd.print("VIVA TIRADENTES!");
  }
  else if (RTCValues[1] == 05 & RTCValues[2] == 01){
    lcd.print("DIA DO TRABALHO!");
  }
  else if (RTCValues[1] == 9 & RTCValues[2] == 07){
    lcd.print(" INDEPENDENCIA!");
  }
  else if (RTCValues[1] == 10 & RTCValues[2] == 12){
    lcd.print("NOSSA PADROEIRA!");
  }
  else if (RTCValues[1] == 11 & RTCValues[2] == 02){
    lcd.print(" DIA DE FINADOS");
  }
  else if (RTCValues[1] == 11 & RTCValues[2] == 15){
    lcd.print("SALVE REPUBLICA!");
  }
  else if (RTCValues[1] == 12 & RTCValues[2] == 24){
    lcd.print("  Ho Ho Ho...!");
  }
  else if (RTCValues[1] == 12 & RTCValues[2] == 25){
    lcd.print("  FELIZ NATAL!");
  }
  else if (RTCValues[1] == 12 & RTCValues[2] == 31){
    lcd.print("ADEUS ANO VELHO!");
  }
  else{
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(fromNumberToWeekDay(RTCValues[3], 2)); //1=EN, 2=PT
    lcd.setCursor(8,1);
    lcd.print(time);
  }
  delay(1000);
}

void relogio(){
  lcd.clear();
  lcd.setCursor(1,0);
  lcd.print(". EfeitoNerd .");
  delay(300);
  lcd.setCursor(0,1);
  LetraPorLetra(dateTime);
  delay(4000);
  for (int i=0; i<16; i++){ //Leva para direita
    lcd.scrollDisplayRight();
    delay(100);
  }
  count = 0;
}

void LetraPorLetra(String texto){
  int tamanho = texto.length();
  for (int i=0; i<tamanho; i++){
    lcd.print(texto.substring(i,i+1));
    delay(130);
  }
}

40 comentários:

  1. Muito bom teu blog cara! Me ajudou muito!

    ResponderExcluir
  2. Bom dia amigo, gostei muito do seu projeto, so tenho uma duvida
    apos fazer o circuito como vc faz para acertar a hora e a data ..?

    ResponderExcluir
    Respostas
    1. Opa!

      Por falta de tempo, não fiz a parte de ajuste da data/hora através de hardware.
      Ajustei direto via código mesmo.

      É usando o SetDate(). Conforme esta no código (comentado) em Setup().

      setDate(15, 05, 12, 1, 15, 00); //(DIA, MES, ANO, SEMANA, HORA, MINUTO)

      Excluir
  3. ola fellipe testei seu codigo no meu arduino 0022 e nao rodo porque sera isso me ajude desde ja te agradeço

    ResponderExcluir
    Respostas
    1. Bom dia!
      Houve algumas modificações no software Arduino, a partir da versão 1.0, e efetuei essas alterações na biblioteca DS1307.h
      Baixa a nova versão no site que vai rodar legal. ( http://arduino.cc/en/Main/Software )
      Abraços!!

      Excluir
  4. Muito bom seu tutorial, mas estava querendo usar outra porta do arduino com RTC vc saberia como mudar?

    ResponderExcluir
    Respostas
    1. Não olhei sobre mudar as portas, mas acredito que seja apenas mudar o endereço dentro da biblioteca. Vou dar uma olhada nisso e posto depois.
      Abraços!

      Excluir
  5. Boa noite Fellipe.
    Dei uma estudada na sua implementação e tentei fazer uma com "acerto" de horas, so que esta so funcionou quando eu utilizei somente os segundos do rtc para incrementar minuto segundo e a data, so que quando desligo meu arduino a hora nao continua contando, queria saber se vc me da uma dica de como fazer um laço onde a hora e data que colocarei no compilador fique "ligada" a hora do RTC. Valeu, bom trabalho o seu!

    ResponderExcluir
    Respostas
    1. Boa tarde, Leandro!
      Você conectou a bateria de 3v no DS1307?! E além da bateria, não pode esquecer de conectar o pino 4 do RTC ao GND do Arduino. São os terras que devem estar conectados entre si. Pelo o que eu entendi, aparetemente seria isso. Assim, quando o Arduino é desligado o RTC permanece ligado, pela bateria 3v (CR2032).
      Seria isso?!
      Obrigado pelo elogio ao blog!
      Abraços!

      Excluir
  6. Olá Felipe,

    Tentei alterar o código para visualizar a data no seguinte formato, DD-MM-AA. Porém não funcionou. Tenho que alterar o código ou a biblioteca? Obrigado

    ResponderExcluir
    Respostas
    1. Olá Joaldo!

      O formato de data está sendo setado em forma de máscara no 'sprintf' dentro da função getDateTime() no próprio código.


      - sprintf(dateTime, "%02d/%02d/20%02d %02d:%02d",...)


      Abraços!

      Excluir
    2. Pois já tinha feito essa alteração no 'sprintf', mas os valores não estão batendo com que estou setando. olha ai o código:

      #include
      #include

      char dateTime[22],n;
      int RTCValues[7], i = 0, year, month, dayOfMonth, dayOfWeek, hour, minute,
      second;

      void setup()
      {
      Serial.begin(9600);
      Serial.println("Para ajustar as horas digite A");
      DS1307.begin();
      }

      void loop()
      {
      Serial.available();
      n = Serial.read();
      if(n == 'A')
      {
      Serial.println("Please enter date and time in the format \"DD-MM-AAAA HH:MM:SS D\",");
      Serial.println("Where D is the number of the day of week (1 = Sunday, 7 = Saturday).");
      Serial.println("Example: 2011-04-23 02:25:27 7");


      while (i < 21)
      {
      if (Serial.available())
      {
      char c = Serial.read();
      dateTime[i] = c;
      i++;
      }
      }
      dateTime[i] = '\0';

      dayOfMonth = 10 * (dateTime[2] - 48) + (dateTime[3] - 48);
      month = 10 * (dateTime[5] - 48) + (dateTime[6] - 48);
      year = 10 * (dateTime[8] - 48) + (dateTime[9] - 48);
      dayOfWeek = (dateTime[20] - 48);
      hour = 10 * (dateTime[11] - 48) + (dateTime[12] - 48);
      minute = 10 * (dateTime[14] - 48) + (dateTime[15] - 48);
      second = 10 * (dateTime[17] - 48) + (dateTime[18] - 48);

      DS1307.setDate(year, month, dayOfMonth, dayOfWeek, hour, minute, second);
      Serial.println("Date and time set!");
      Serial.println("Reading data from RTC...");
      }
      else
      {
      DS1307.getDate(RTCValues);
      sprintf(dateTime, "%02d-%02d-20%02d %02d:%02d:%02d", RTCValues[2],
      RTCValues[1], RTCValues[0], RTCValues[4], RTCValues[5],
      RTCValues[6]);
      Serial.println(dateTime);

      delay(1000);
      }
      }

      Excluir
  7. Ola.Estou com dificuldades no uso do DS1307 com Arduino Mega 2560.Cheguei a comprar um igual ao do link (Já vem montado)__http://www.emartee.com/product/42059/Tiny%20RTC%20DS1307%20Shield%20V2.0
    mas não consegui usa-lo com os exemplo/tutoriais que achei na net.Comprei o componentes e montei eu mesmo,mas o comportamento foi o mesmo.O monitor serial sempre mostra os mesmos valores,sem alteração.Poderia me ajudar?

    ResponderExcluir
    Respostas
    1. Boa noite! Um erro comum, que eu por descuido cometo algumas vezes é esquecer de conectar os terras (gnd). O GND do arduino deve estar conectado ao GND do RTC. Já testou com outro arduino?! Abraços!

      Excluir
  8. Este comentário foi removido pelo autor.

    ResponderExcluir
  9. deu erro fromNumberToWeekDay(RTCValues[3], 2)NAO foi declerada neste escopo
    o que fazer??????????????

    ResponderExcluir
    Respostas
    1. Bom dia!
      Essa função faz parte da biblioteca DS1307.h que eu fiz alterações, conforme comentado no código. Corrigi alguns erros e fiz algumas modificações para se ajustar melhor as minhas necessidades. Você pode fazer o download da biblioteca: http://www.4shared.com/rar/HIZiPup2/DS1307.html
      Abraços!

      Excluir
  10. Cara tem como me ajudar? Preciso do relogio, mas sem o lcd.
    Somente mostrando no Serial Monitor.

    ResponderExcluir
    Respostas
    1. Bom dia!
      Conforme as linhas 66 a 68 do fonte, a data e hora estão nas variáveis 'dateTime', 'date', e 'time'. Para exibi-las no serial monitor, pode-se usar, por exemplo: Serial.println(dateTime);

      Excluir
    2. Devo só trocar em todas as linhas então?

      Excluir
    3. Dessa forma vc consegue visualizar a data e a hora. Para obter os efeitos de texto, é necessário o LCD.

      Excluir
  11. Bom dia,
    Fiz o teste do seu programa e não está aparecendo nada no display.
    Na função:
    void relogioDataHora()
    {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(date);
    lcd.print("alo"); // implementei este comando no intuito de descobrir se esta função está funcionando. Apareceu só ela.
    lcd.setCursor(8,1);
    lcd.print(time);
    delay(1000);

    o que pode ser?

    ResponderExcluir
    Respostas
    1. Só apareceu a mensagem "alo"?! Se for isso, as variáveis date e time estão vindo vazias. Pode ser algum problema no RTC (DS1307). Verificou se ele está retornando data/hora corretamente?

      Excluir
  12. Olá felipe teria com me da uma ajuda neste seu projeto?
    achei muito legal!
    abraços!

    ResponderExcluir
  13. Bom dia Felipe, parabens pelo seu blog!
    Seguinte ja baixei e instalei a sua biblioteca atualizada do DS1307, porem quando rodo a compilação apareçe a seguinte falha (error: 'fromNumberToWeekDay' was not declared) como se não tivese na biblioteca, o que estou fazendo errado, tem alguma dica?
    Obrigado pela sua atenção!

    ResponderExcluir
  14. Bom dia Felipe, parabens pelo seu blog!
    Seguinte ja baixei e instalei a sua biblioteca atualizada do DS1307, porem quando rodo a compilação apareçe a seguinte falha (error: 'fromNumberToWeekDay' was not declared) como se não tivese na biblioteca, o que estou fazendo errado, tem alguma dica?
    Obrigado pela sua atenção!

    ResponderExcluir
    Respostas
    1. Bom dia, Delmir! Obrigado pelo elogio!
      Estranho esse erro. A princípio não tive nenhuma ideia do que poderia ser. Vc está usando qual versão do software arduino?
      Abraços!

      Excluir
  15. Boa Tarde

    Achei interessante seu código
    Tentei rodar aqui para poder estudar ele e implementar num controlador aqui que estou projetando, mas não rodou.

    Estou utilizando o software mais recente do Arduino 1.0.5

    ResponderExcluir
    Respostas
    1. Boa tarde!
      A biblioteca está dentro da pasta libraries do diretório do software Arduino?!
      Já rodei com a versão 1.0.5 e funciona!
      Abraços!

      Excluir
  16. alguem tem ideia se rola com o pic 18f4550
    ?

    ResponderExcluir
  17. Boa Noite. Cara to fazendo um Projeto TCC e to com a ideia de fazer um "Alimentador Automatico para cão". vi varias ideias no youtube como essa que estou tendo fazer "http://www.youtube.com/watch?v=snba1JM-PoM" ...Problema meu tah em como fazer os menus pra adcionar hora ... vai ser bem simples não presisa de RTC somente demonstrativo. Tem alguma ideia de como começar igual a esse do video ? to quebrando a cabeça ... Começando agora com Arduino.

    ResponderExcluir
    Respostas
    1. Bom dia! Para esse tipo de menu, a idéia a seguir é trabalhar com variáveis. Usa-se uma variável de controle, onde por ela vc vai verificando nas condicionais do fonte qual a mensagem (menu) deve ser mostrada no momento. Resumidamente, é isso. Abraços!

      Excluir
  18. Ola Felipe, estou com este código abaixo para acionar um aquecedor de água e precisava incluir um relógio digital nele, que eu tivesse á opção também alem do controle de temperatura, ajustar por botões há hora de ligar e desligar o circuito, tem como você me ajudar?

    #include
    int contador=0;
    int inicialTempMax = 40; // Temperatura Máxima padrão
    int inicialTempo = 10; // Tempo Padrão
    int estado = 1; // estado da luz de fundo
    int contaMax = 0;
    int contaMin = 1;
    int luzFundo = 7;
    const int Aquecedor = 8; // Pino Aquecedor
    const int buttonMenu = 11; // Pino Botão Menu
    const int buttonPinMais = 12; // Pino Botão Aumenta
    const int buttonPinMenos = 13; // Pino Botão Diminui
    LiquidCrystal lcd(10, 6, 5, 4, 3, 2);
    int pinoSensor = 0; //pino que está ligado o terminal central do LM35 (porta analogica 0)
    int valorLido = 0; //valor lido na entrada analogica
    float temperatura = 0; //valorLido convertido para temperatura
    int tempoEntreAcao = 1000; // tempo à esperar entre ligar o ac e acionar a tecla atalho
    // VOID SETUP
    void setup(){
    lcd.begin(16, 2);
    pinMode(Aquecedor, OUTPUT);
    pinMode(buttonMenu, INPUT);
    pinMode(buttonPinMais, INPUT);
    pinMode(buttonPinMenos, INPUT);
    pinMode(luzFundo, OUTPUT);
    digitalWrite(luzFundo, HIGH);
    Serial.begin(9600);

    }
    //VOID LOOP
    void loop(){

    // 1.A #### LENDO A TEMPERATURA E CONVERTENDO #####
    valorLido = analogRead(pinoSensor);
    temperatura = (valorLido * 0.00488); // (5V / 1023) = 0.00488 (precisão do A/D) OBS: USANDO LM35
    temperatura = temperatura * 100; //Converte milivolts para graus celcius, lembrando que a cada 10mV equivalem a 1 grau celcius

    // botao que seleciona a funcao do menu
    if (digitalRead(buttonMenu) == HIGH) {
    delay(250);
    contador=contador+1;
    }
    if (contador>3){ // zera o contador para voltar ao inicio tenho tres opcoes apenas
    contador=0;
    }

    // switch para puxar a funcao de cada opcao do menu
    switch(contador){
    case 0:
    inicio();
    break;
    case 1:
    tempMaxAjuste();
    break;
    case 2:
    tempMinAjuste();
    break;
    case 3:
    luz();
    break;
    }
    delay (tempoEntreAcao);;

    ligarDesligar();

    } // FIM DO LOOP
    // SECAO DAS FUNCOES
    //funcao da tela inicial
    void inicio()
    {
    lcd.setCursor(0,0);
    lcd.print("MAX TEMP/ATUAL");
    lcd.setCursor(0,1);
    lcd.print(inicialTempMax);
    lcd.print("C");
    lcd.print(" ");
    lcd.print(temperatura);
    lcd.print("C");
    }
    // Funcao de ajuste da temperatura Maxima
    void tempMaxAjuste()
    {
    if(digitalRead(buttonPinMais) == HIGH && contador == 1){
    inicialTempMax = inicialTempMax ++;
    }
    if(digitalRead(buttonPinMenos) == HIGH && contador == 1){
    inicialTempMax = inicialTempMax --;
    }
    // imprime no LCD
    lcd.setCursor(0,0);
    lcd.print("Temp/ MAX / Liga");
    lcd.setCursor(0,1);
    lcd.print(inicialTempMax);
    lcd.print(" ");

    }
    // Funcao de Ajuste da Temperatura Minima
    void tempMinAjuste()
    {
    if(digitalRead(buttonPinMais) == HIGH && contador == 2){

    }
    if(digitalRead(buttonPinMenos) == HIGH && contador == 2){

    }
    // imprime no LCD



    }
    // Funcao de ajuste do tempo de leitura da temperatura
    void luz()
    {
    if(digitalRead(buttonPinMais) == HIGH && contador == 3){
    digitalWrite(luzFundo, HIGH);
    estado = 1;
    }
    if(digitalRead(buttonPinMenos) == HIGH && contador == 3){
    digitalWrite(luzFundo, LOW);
    estado = 0;
    }
    // imprime no LCD
    lcd.setCursor(0,0);
    lcd.print(" Luz de Fundo ");
    lcd.setCursor(0,1);
    if(estado == 1){
    lcd.print("Ligado ");
    }
    lcd.setCursor(0,1);
    if(estado == 0){
    lcd.print("Desligado ");
    }
    }
    // funcao que controla o A/C responsavel por medir a temperatura e ligar ou desligar o A/C
    void ligarDesligar(){
    if(temperatura > inicialTempMax && contaMax == 0){ // SE A TEMPERATURA ESTIVER MAIOR DO QUE A max DEFINIDA NO LCD LIGA O AR
    digitalWrite(Aquecedor, HIGH);

    }
    else if(temperatura < inicialTempMax && contaMax == 0){ // SE A TEMPERATURA ESTIVER MENOR DO QUE A min DEFINIDA NO LCD DESLIGA O AR
    digitalWrite(Aquecedor, LOW);
    delay (tempoEntreAcao);
    }
    }

    ResponderExcluir
  19. Ola Felipe, estou com este código abaixo para acionar um aquecedor de água e precisava incluir um relógio digital nele, que eu tivesse á opção também alem do controle de temperatura, ajustar por botões há hora de ligar e desligar o circuito, tem como você me ajudar?

    #include
    int contador=0;
    int inicialTempMax = 40; // Temperatura Máxima padrão
    int inicialTempo = 10; // Tempo Padrão
    int estado = 1; // estado da luz de fundo
    int contaMax = 0;
    int contaMin = 1;
    int luzFundo = 7;
    const int Aquecedor = 8; // Pino Aquecedor
    const int buttonMenu = 11; // Pino Botão Menu
    const int buttonPinMais = 12; // Pino Botão Aumenta
    const int buttonPinMenos = 13; // Pino Botão Diminui
    LiquidCrystal lcd(10, 6, 5, 4, 3, 2);
    int pinoSensor = 0; //pino que está ligado o terminal central do LM35 (porta analogica 0)
    int valorLido = 0; //valor lido na entrada analogica
    float temperatura = 0; //valorLido convertido para temperatura
    int tempoEntreAcao = 1000; // tempo à esperar entre ligar o ac e acionar a tecla atalho
    // VOID SETUP
    void setup(){
    lcd.begin(16, 2);
    pinMode(Aquecedor, OUTPUT);
    pinMode(buttonMenu, INPUT);
    pinMode(buttonPinMais, INPUT);
    pinMode(buttonPinMenos, INPUT);
    pinMode(luzFundo, OUTPUT);
    digitalWrite(luzFundo, HIGH);
    Serial.begin(9600);

    }
    //VOID LOOP
    void loop(){

    // 1.A #### LENDO A TEMPERATURA E CONVERTENDO #####
    valorLido = analogRead(pinoSensor);
    temperatura = (valorLido * 0.00488); // (5V / 1023) = 0.00488 (precisão do A/D) OBS: USANDO LM35
    temperatura = temperatura * 100; //Converte milivolts para graus celcius, lembrando que a cada 10mV equivalem a 1 grau celcius

    // botao que seleciona a funcao do menu
    if (digitalRead(buttonMenu) == HIGH) {
    delay(250);
    contador=contador+1;
    }
    if (contador>3){ // zera o contador para voltar ao inicio tenho tres opcoes apenas
    contador=0;
    }

    // switch para puxar a funcao de cada opcao do menu
    switch(contador){
    case 0:
    inicio();
    break;
    case 1:
    tempMaxAjuste();
    break;
    case 2:
    tempMinAjuste();
    break;
    case 3:
    luz();
    break;
    }
    delay (tempoEntreAcao);;

    ligarDesligar();

    } // FIM DO LOOP
    // SECAO DAS FUNCOES
    //funcao da tela inicial
    void inicio()
    {
    lcd.setCursor(0,0);
    lcd.print("MAX TEMP/ATUAL");
    lcd.setCursor(0,1);
    lcd.print(inicialTempMax);
    lcd.print("C");
    lcd.print(" ");
    lcd.print(temperatura);
    lcd.print("C");
    }
    // Funcao de ajuste da temperatura Maxima
    void tempMaxAjuste()
    {
    if(digitalRead(buttonPinMais) == HIGH && contador == 1){
    inicialTempMax = inicialTempMax ++;
    }
    if(digitalRead(buttonPinMenos) == HIGH && contador == 1){
    inicialTempMax = inicialTempMax --;
    }
    // imprime no LCD
    lcd.setCursor(0,0);
    lcd.print("Temp/ MAX / Liga");
    lcd.setCursor(0,1);
    lcd.print(inicialTempMax);
    lcd.print(" ");

    }
    // Funcao de Ajuste da Temperatura Minima
    void tempMinAjuste()
    {
    if(digitalRead(buttonPinMais) == HIGH && contador == 2){

    }
    if(digitalRead(buttonPinMenos) == HIGH && contador == 2){

    }
    // imprime no LCD



    }
    // Funcao de ajuste do tempo de leitura da temperatura
    void luz()
    {
    if(digitalRead(buttonPinMais) == HIGH && contador == 3){
    digitalWrite(luzFundo, HIGH);
    estado = 1;
    }
    if(digitalRead(buttonPinMenos) == HIGH && contador == 3){
    digitalWrite(luzFundo, LOW);
    estado = 0;
    }
    // imprime no LCD
    lcd.setCursor(0,0);
    lcd.print(" Luz de Fundo ");
    lcd.setCursor(0,1);
    if(estado == 1){
    lcd.print("Ligado ");
    }
    lcd.setCursor(0,1);
    if(estado == 0){
    lcd.print("Desligado ");
    }
    }
    // funcao que controla o A/C responsavel por medir a temperatura e ligar ou desligar o A/C
    void ligarDesligar(){
    if(temperatura > inicialTempMax && contaMax == 0){ // SE A TEMPERATURA ESTIVER MAIOR DO QUE A max DEFINIDA NO LCD LIGA O AR
    digitalWrite(Aquecedor, HIGH);

    }
    else if(temperatura < inicialTempMax && contaMax == 0){ // SE A TEMPERATURA ESTIVER MENOR DO QUE A min DEFINIDA NO LCD DESLIGA O AR
    digitalWrite(Aquecedor, LOW);
    delay (tempoEntreAcao);
    }
    }

    ResponderExcluir
  20. Muito bom, fiz algumas alterações no codio para acertar a hora com botoes, mas me ajudou muito!!! Parabens

    ResponderExcluir
  21. Olá Felipe. Parabéns e obrigado por disponibilizar o seu projeto; aliás, vários projetos! É possível usar o DS3231 em lugar do DS1307? Mudaria alguma coisa no código?

    ResponderExcluir
    Respostas
    1. Bom dia! É possível sim, porém será necessário alterar alguns pontos no código fonte. As chamadas onde retornamos a informação do DS1307 para a forma como é retornado as informações do DS3231. As bibliotecas são diferentes. Não seriam grandes modificações.

      Excluir
  22. Colega como faço para instalar meu Display C12

    ResponderExcluir
    Respostas
    1. Bom dia! Seria esse display da postagem com módulo I2C?! Na postagem "Validador de CPF" uso o display com o módulo I2C. Abraços!

      Excluir