09 abril 2015

LCD 16x2 com módulo I2C e RTC DS1307

Vamos mostrar como utilizar dois dispositivos I2C no mesmo barramento, juntando o display LCD 16x2 com módulo I2C (que mostrei no artigo Como utilizar o módulo I2C com display LCD), ao módulo relógio de tempo real (RTC) DS1307, gerando o resultado abaixo :

LCD 16x2 i2c ds1307 rtc


Apesar de não ter falado ainda sobre o módulo RTC DS1307 aqui no blog, eu já mostrei como utilizar o CI DS1307, que segue o mesmo esquema de ligação. A diferença é que no módulo temos também alguns pinos de saída que podem ser utilizados para ligar os dispositivos em cascata.

Circuito módulo I2C e DS1307

O módulo I2C pode ser soldado diretamente no display, ou montado em uma protoboard, como no circuito abaixo. Apesar da utilização de vários componentes, perceba que temos as demais portas do Arduino totalmente livres para utilização com motores, sensores ou outros dispositivos.

Para comunicação entre o Arduino Uno e os módulos, vamos usar os dois pinos da interface I2C: A4 - SDA e A5 - SCL (se for um Arduino Mega, pinos 20 e 21).

Arduino Uno - LCD 16x2 e DS1307


Usando o esquema acima, podemos ligar vários sensores e módulos I2C no mesmo barramento, mas eles não podem ter o mesmo endereço. Os dispositivos geralmente já vem com um endereço pré-definido, e em alguns casos você pode alterar esse endereço para evitar conflitos, como é o caso do módulo I2C, que permite selecionar um endereço diferente alterando a configuração dos pinos A0, A1 e A2 :

Módulo I2C Endereços

Se você não souber qual o endereço do módulo, ou se deseja apenas confirmar se o dispositivo I2C está respondendo, pode utilizar no Arduino um programa chamado I2C Scanner

 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
// --------------------------------------
// i2c_scanner
//
// Version 1
//    This program (or code that looks like it)
//    can be found in many places.
//    For example on the Arduino.cc forum.
//    The original author is not know.
// Version 2, Juni 2012, Using Arduino 1.0.1
//     Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26  2013
//    V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
//    by Arduino.cc user Krodal.
//    Changes by louarnold removed.
//    Scanning addresses changed from 0...127 to 1...119,
//    according to the i2c scanner by Nick Gammon
//    http://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
//    As version 4, but address scans now to 127.
//    A sensor seems to use address 120.
// 
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.

#include <Wire.h>

void setup()
{
  Wire.begin();
  Serial.begin(9600);
  Serial.println("\nI2C Scanner");
}

void loop()
{
  byte error, address;
  int nDevices;
  Serial.println("Scanning...");
  nDevices = 0;
  for(address = 1; address < 127; address++ ) 
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
      nDevices++;
    }
    else if (error==4) 
    {
      Serial.print("Unknow error at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
  delay(5000);           // wait 5 seconds for next scan
}

Esse programa varre o barramento I2C e mostra no serial monitor o endereço dos dispositivos conectados:

Serial Monitor I2C Scanner


No caso, foram encontrados 3 dispositivos: o módulo I2C do display no endereço 0x27, o CI DS1307 no endereço 0x68 e a EEPROM do módulo RTC (CI 24C32), no endereço 0x50.

Mostrando data e hora no display

Juntando tudo isso, temos o programa que lê os dados do módulo DS1307 (data e hora), e envia essas informações para um display LCD 16x2. 

Retire as barras duplas da linha SelecionaDataeHora() (linha 22) para executar a rotina que vai ajustar a data e hora do seu módulo. Nas variáveis das linhas 86 à 92 você define os novos valores.

  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
// Programa : Modulo I2C Display e Modulo DS1307
// Autor : Arduino e Cia

#include "Wire.h"
#include <LiquidCrystal_I2C.h>

// Modulo RTC no endereco 0x68
#define DS1307_ADDRESS 0x68

// Modulo I2C display no endereco 0x27
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE);

byte zero = 0x00; 

void setup()
{
  Wire.begin();
  Serial.begin(9600);
  lcd.begin (16,2);
  
  //A linha abaixo pode ser retirada apos setar a data e hora
  //SelecionaDataeHora(); 
}

void loop()
{
  // Le os valores (data e hora) do modulo DS1307
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);
  Wire.endTransmission();
  Wire.requestFrom(DS1307_ADDRESS, 7);
  int segundos = ConverteparaDecimal(Wire.read());
  int minutos = ConverteparaDecimal(Wire.read());
  int horas = ConverteparaDecimal(Wire.read() & 0b111111);
  int diadasemana = ConverteparaDecimal(Wire.read()); 
  int diadomes = ConverteparaDecimal(Wire.read());
  int mes = ConverteparaDecimal(Wire.read());
  int ano = ConverteparaDecimal(Wire.read());

  // Mostra os dados no display
  lcd.setCursor(0,0);
  lcd.print("     ");
  // Acrescenta o 0 (zero) se a hora for menor do que 10
  if (horas <10)
    lcd.print("0");
  lcd.print(horas);
  lcd.print(":");
  // Acrescenta o 0 (zero) se minutos for menor do que 10
  if (minutos < 10)
     lcd.print("0");
  lcd.print(minutos);
  lcd.setCursor(2,1);
  // Mostra o dia da semana
  switch(diadasemana)
    {
      case 0:lcd.print("Dom");
      break;
      case 1:lcd.print("Seg");
      break;
      case 2:lcd.print("Ter");
      break;
      case 3:lcd.print("Quar");
      break;
      case 4:lcd.print("Qui");
      break;
      case 5:lcd.print("Sex");
      break;
      case 6:lcd.print("Sab");
    }
    lcd.setCursor(6,1);
    // Acrescenta o 0 (zero) se dia do mes for menor do que 10
    if (diadomes < 10)
      lcd.print("0");
    lcd.print(diadomes);
    lcd.print("/");
    // Acrescenta o 0 (zero) se mes for menor do que 10
    if (mes < 10)
      lcd.print("0");
    lcd.print(mes);
    lcd.print("/");
    lcd.print(ano);
}

void SelecionaDataeHora()   //Seta a data e a hora do DS1307
{
  byte segundos = 20; //Valores de 0 a 59
  byte minutos = 16; //Valores de 0 a 59
  byte horas = 15; //Valores de 0 a 23
  byte diadasemana = 4; //Valores de 0 a 6 - 0=Domingo, 1 = Segunda, etc.
  byte diadomes = 9; //Valores de 1 a 31
  byte mes = 4; //Valores de 1 a 12
  byte ano = 15; //Valores de 0 a 99
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero); //Stop no CI para que o mesmo possa receber os dados

  //As linhas abaixo escrevem no CI os valores de 
  //data e hora que foram colocados nas variaveis acima
  Wire.write(ConverteParaBCD(segundos));
  Wire.write(ConverteParaBCD(minutos));
  Wire.write(ConverteParaBCD(horas));
  Wire.write(ConverteParaBCD(diadasemana));
  Wire.write(ConverteParaBCD(diadomes));
  Wire.write(ConverteParaBCD(mes));
  Wire.write(ConverteParaBCD(ano));
  Wire.write(zero);
  Wire.endTransmission(); 
}

byte ConverteParaBCD(byte val)
{ 
  //Converte o número de decimal para BCD
  return ( (val/10*16) + (val%10) );
}

byte ConverteparaDecimal(byte val)  
{ 
  //Converte de BCD para decimal
  return ( (val/16*10) + (val%16) );
}

Futuramente vamos ver como ligar esse módulo I2C com display LCD 16x2 ao Raspberry Pi. Até lá !


56 comentários:

  1. Muito Obrigado. Seu blog é excelente, estava tentando achar o endereço de um modulo SHT15. Ajudou muito.

    ResponderExcluir
    Respostas
    1. Boa noite,

      Muito obrigado, aguardo sua visita sempre que possível. :)

      Abraço !

      Excluir
  2. PARABÉNS PELOS PROJETO DO BLOG, MUITO BOM!!

    ResponderExcluir
  3. Muito bom, parabéns. Como ficaria este código usando: Shield lcd 16x02; RTC 1307; shield Ethernet; Sendo, controlando via Internet 8 relay.Uma página simples em HTML. E visualizando a hora no LCD e na página de controle dos relay's.

    ResponderExcluir
    Respostas
    1. Boa noite Roberto,

      Obrigado. Em breve estarei publicando um post falando sobre o ethernet shield com página em html/php.

      Abraço !

      Excluir
  4. Boa tarde, gosto muito do site, amigo gostaria de saber como ficaria o esquema se fosse o modulo ds1302?

    ResponderExcluir
    Respostas
    1. Boa tarde Paulo,

      Eu tenho um post especifico sobre o DS1302, tente juntar esses dois programas:

      http://www.arduinoecia.com.br/2014/11/arduino-modulo-rtc-ds1302.html

      Abraço !

      Excluir
  5. olá, o seu é dos poucos blogues que eu consigo entender, Pode-me dizer como fasso para por tambem os segundos? Obrigado!

    ResponderExcluir
    Respostas
    1. Boa noite,

      Depois da linha 51, acrescente essas duas linhas:

      lcd.print(":");
      lcd.print(segundos);

      Abraço !

      Excluir
  6. Era exatamente o que eu procurava...muito obrigado!!!

    ResponderExcluir
    Respostas
    1. Legal poder ajudar. :-)

      Abraço!

      Excluir
    2. Descobri um errinho ai nesse codigo. Que quanto é o diadasemana DOMINGO ele não é zero... e sim 7. Somente corrigir as linhas:

      // Mostra o dia da semana
      switch(diadasemana)
      {
      case 7: lcd.print("Dom"); // Substituir o case 0 por case 7.
      break;

      void SelecionaDataeHora() //Seta a data e a hora do DS1307
      {

      byte diadasemana = 4; //Valores de 1 a 7 - 7=Domingo, 1 = Segunda, etc.

      Excluir
    3. Bom dia!

      Estranho, pode ser algum problema com versão de biblioteca, porque o meu circuito/programa realmente utilizam o zero como domingo..

      De qualquer forma, obrigado pela dica! :)

      Abraço!

      Excluir
  7. Eu conseguiria adicionar nesse projeto um sensor DHT 11 e um módulo de cartão SD??
    Como posso fazer isso?

    ResponderExcluir
    Respostas
    1. Boa tarde Brendo,

      Eu tenho projetos com DHT11 e também com módulos cartão SD aqui no site, dê uma verificada, por favor.

      Abraço!

      Excluir
  8. Posso um usar um rtc 3231 no lugar deste?

    ResponderExcluir
    Respostas
    1. Bom dia,

      Pode sim, o 3231 é um ótimo RTC, e é mais preciso do que o DS1307.

      Abraço!

      Excluir
  9. Parabéns pelo blog, eu utilizo um DS3231 e quando faço o scanner ele aparece dois endereços, 0x57 e 0x68, sabe me dizer porque? Obrigado.

    ResponderExcluir
    Respostas
    1. Bom dia Evandro,

      Um endereço é o do RTC propriamente dito, e o outro é da memória EEPROM que ele tem (AT24C32)

      Abraço!

      Excluir
  10. boa tarde o meu nao deu certo como faco para baixar essa biblioteca ele nao reconhece??? desculpe sou iniciante um amador rsrsrs

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Que erro está apresentando ?

      Abraço!

      Excluir
  11. Ola, bom dia,
    Gostaria de saber se já montou esse circuito com outro micrcontrolador como o Pic. Digo isso pois estou tentando fazê-lo funcionar com um PIC 18f4550 a 20MHz, simulando no Proteus e compilando no MikroC. Na simulação a hora do display demora muito para atualizar, 1 segundo demora quase 3. Acredito que seja devido ao fato do barramento i2c estar "carregado" por se comunicar con dois dispositivos "simultaneamente". Baixei um projeto pronto semelhante, porem usando LCD normal e funciona perfeitamente a 1Hz. Tem alguma idéia do que pode ser?

    ResponderExcluir
    Respostas
    1. Oi Jonathan,

      Infelizmente não. Usei apenas com Arduino.

      Abraço!

      Excluir
  12. Olá, bom dia,
    faz algum tempo que tento utilizar um controlador i2c. Porem não obtive sucesso pois endereçava de forma errada. com seu tutorial encontrei o endereço e esta tudo funcionando as mil maravilha. muito obrigado.

    sucesso ai na empreitada.
    vlw.

    ResponderExcluir
  13. Boa tarde, primeiramente parabéns pelo excelente trabalho, e segundo, como faço para resetar os valores de min, seg e hr?

    ResponderExcluir
    Respostas
    1. Boa noite,

      Atualize os valores na linha 22 do programa, e retire o comentário (barra dupla).

      Abraço e obrigado!

      Excluir
  14. Boa Noite! Gostaria de saber como colocar botoes de ajuste das horas/ data, seria de muita ajdua, nao tem nenhum forum aqui no site? obrigado!

    ResponderExcluir
  15. Amigo gostei muito do seus post. queria saber se vc poderia me ajudar com meu TCC de Tec em Eletrotécnica? tenho um kit arduino uno, um lcd com modulo i2c e 2 placas relé sendo um com 4 e 1 com 2 relé. quero montar um QTA (quadro de distribuição automático) e nos testes com o lcd só imprime a primeira coluna com. o módulo i2c o endereço é o 0x27 aí não entendi se precisa fazer algum jump no A0, A1 e A2. Aí minha dúvida é: terei que soldar um jump nas ilhas A0, A1 E A2 PARA FICAR 1 1 1. Seria isso? obrigado pela atenção.

    ResponderExcluir
    Respostas
    1. Oi Marx,

      Exato, para o endereço 0x27, coloque um jumper/solda no A0, A1 e A2.

      Abraço!

      Excluir
  16. vc teria alum projeto de QTA que possa me ajudar? esqueci de informar que tbm já tenho um gerador de 5kva. obrigado pela atenção

    ResponderExcluir
  17. Olá, boa noite. como faço para fazer a leitura do sensor dht11 com o módulo Ic2?

    ResponderExcluir
    Respostas
    1. Oi Fagner,

      Esse módulo é específico para uso com display LCD 16x2 ou 20x4.

      Abraço!

      Excluir
    2. Obrigado pela atenção!

      Mas não entendi muito sua fala (sou meio leigo!). O meu lcd é 16x2 e estou usando o módulo Ic2. Não posso usar o mesmo para fazer a leitura do sensor dht11?

      Aproveitando a oportunidade, posso utilizar a biblioteca LiquidCrystal para controlar o lcd 128x64? queria mostrar os valores de outro sensor em forma de tabela, pensei que este lcd seria possível. Obrigado, e parabéns pelo site! De muito ajuda!

      Excluir
    3. Oi Fagner,

      Sem problemas. Eu acho que não consegui explicar direito. vamos lá.. rs

      Esse módulo I2C jé específico para se comunicar com o display. Você não pode colocar ele para se comunicar, por exemplo, com o DHT11, que usa outro tipo de comunicação com o Arduino.

      Então, o que você pode fazer é sim utilizar o display com esse módulo I2C, e ao mesmo tempo usar o DHT11, mas ligado à outro pino do Arduino. Desse jeito, o Arduino vai ler as informações do DHT11, e exibir no display.

      Quanto ao display 128x64, o modelo que eu testei usa outra pinagem, outro tipo de comunicação com o Arduino, então esse módulo I2C não vai funcionar com ele, ok ? Existem módulo I2C específicos para utilizar com display gráfico 128x64.

      Abraço!

      Excluir
  18. Ola. Parabéns pelo trabalho.

    Eu estou fazendo o mesmo esquema que acima, mas com a biblioteca DS1307, quando utilizo um programa somente com o RTC enviando os dados pela serial está tudo perfeito, mas quando eu coloco esse programa junto que contem a parte do LCD ele começa a informar errado o horário e data, na forma: Hora : 27:85:85 Data : 85.85.@5 5.85.@5 Mesmo eu não alterando nada de um código para o outro.

    Sabe oq pode ser?

    ResponderExcluir
    Respostas
    1. Boa noite,

      Vi uma dica hoje sobre isso: coloca o Serial.begin() depois do lcd.begin(), na seção void setup().

      Depois me diga se funcionou, por favor.

      Abraço!

      Excluir
  19. Ola teria como fazer com dispertador e botões para acertar a hr de despertar e um buzzer para soar o alarme... to procurando algo parecido e nao acho obrigado. .

    ResponderExcluir
    Respostas
    1. Boa noite João,

      Ainda não tenho, mas está na lista de futuros posts. Que lcd vc está usando ?

      Abraço!

      Excluir
    2. Boa amigo,

      Estou atras de um programa para arduino uno, com programação de relógio em um display 16x2, que mande um sinal para o RF433mhz, o arduino funcionária como um radio relógio, você tem alguma programação parecida?

      Seria da seguinte forma, seria como um relógio ao vc realizar a programação para despertar, ele acionava o modulo RF433MHZ para o seu receptor receber o sinal e executar o alarme.

      abraço...

      Excluir
  20. o indereço do ic2 ta dando 0x3f o q fazer

    ResponderExcluir
    Respostas
    1. Oi João,

      Coloque esse endereço na linha 11, vai ficar assim:

      LiquidCrystal_I2C lcd(0x3f,2,1,0,4,5,6,7,3, POSITIVE);

      Abraço!

      Excluir
  21. Parabéns pelo blog!
    Uma pergunta... Eu preciso fazer a leitura do RTC e imprimir uma página web em meu projeto. Contudo as interrupções do RTC estão bloqueando a requisição/entrega da página web.
    Vocês sabem como corrigir isso? Eu penso em reduzir as interrupções do RTC com intervalos maiores, sabem como fazer isso?
    Um abraço!

    ResponderExcluir
    Respostas
    1. Boa noite,

      Acho que não entendi o problema.. Quais interrupções ?

      Abraço!

      Excluir
  22. Primeiramente parabéns pelo site!
    Comprei o Arduino na Alliexpress,chegou faz uma semana e estou aprendendo muito pelo site!!
    Comprei o kit completo(avançado) com rfid e um kit de 37 sensores tbm! haha

    Amigo, estou querendo colocar no meu lcd o seguinte(com programas separados eu já consegui, graças a sua ajuda)
    1- Tela print(" Infos do Dia e Aperte botão");
    2- Umidade e Temperatura.
    3-Hora!

    A minha programação foi um pouco baseada na sua, a dúvida é a seguinte:

    Primeiramente não sei mexer com botões hahaha!

    Como colocar apenas um botão para alternar os menus?
    Não sei fazer a programação disso, posso enviar meu programa e você corrige e me ensina esta pequena parte?, se puder me ajudar, agradeço!

    ResponderExcluir
  23. Segue o meu programa!

    LCD I2C + DHT11 + DS1302 + MENU!

    #include
    #include
    #include
    #include
    #include


    #define I2C_ADDR 0x3F // <<----- Add your address here. Find it from I2C Scanner
    #define BACKLIGHT_PIN 3
    #define En_pin 2
    #define Rw_pin 1
    #define Rs_pin 0
    #define D4_pin 4
    #define D5_pin 5
    #define D6_pin 6
    #define D7_pin 7

    //Declarações do 1302
    #define SCK_PIN 4
    #define IO_PIN 3
    #define RST_PIN 2


    //Declarações do DHT
    #define dht_dpin A3 //Pino 2 Data do sensor vai ligado a porta A3 do Arduino
    //Declarações do Botão
    ???


    LiquidCrystal_I2C lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin);

    dht DHT; //Inicialização do sensor

    int contador=1;



    char state=1; // variável que guarda posição atual do menu

    //============================================== SETUP
    void setup()
    {
    pinMode(botao, INPUT);
    lcd.begin(16, 2); // Iniciando a biblioteca do LCD

    lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
    lcd.setBacklight(HIGH);
    lcd.home (); // go home

    }


    //LOOP

    void loop()
    {



    switch (state)

    { // Define checa qual tela atual

    case 1: // executado quando na TELA 1
    switch (CheckButton())
    {
    case //VARIAVEL BOTAO?
    lcd.clear(); Set_state(2); // antes de mudar de tela, é necessário limpar o display com a função lcd.clear()
    break;
    default: // Caso nenhum botão tenha sido apertado, ela executa a set_state
    Set_state(1); // mesmo assim para atualizar o display.
    }
    break;
    case 2: // executado quando na TELA 2
    switch (CheckButton())
    {
    case //VARIAVEL BOTAO?
    lcd.clear(); Set_state(3);
    break;
    default:
    Set_state(2);
    }
    break;
    case 3: // executado quando na TELA 3
    switch (CheckButton())
    {
    case //VARIAVEL BOTAO?
    lcd.clear(); Set_state(1);
    break;
    default:
    Set_state(3);
    }
    break;

    default: ;
    }
    }
    // FIM da função LOOP


    // CheckButton

    char CheckButton()
    {
    // NÃO SEI FAZER
    }
    }

    //============================================== Set_state
    void Set_state(char index) {
    state = index; // Atualiza a variável state para a nova tela
    switch (state) { // verifica qual a tela atual e exibe o conteúdo correspondente

    case 1: //==================== state 1
    lcd.setCursor(0,0);
    lcd.print("Infos do Dia");
    lcd.setCursor(0,1);
    lcd.print( "Aperte o Botao"); // Alteração de Menu
    break;
    case 2: //==================== state 2

    DHT.read11(dht_dpin); //Faz leitura das informações do sensor
    lcd.setCursor(0,0);
    lcd.print("Umidade = ");
    lcd.print(DHT.humidity);
    lcd.print(" % ");
    lcd.setCursor(0,1);
    lcd.print("Temp = ");
    float tempnova = DHT.temperature +3; // Teste Vinii - Subbindo 3 Graus a Temperatura do Sensor- Detalhe: Coloquei aqui para dar tempo de o Sensor fazer a medida,somar e colocar no display.
    lcd.print(tempnova);
    lcd.println(" C ");
    delay(3000);
    lcd.clear();
    lcd.print("Fazendo Nova Med");
    delay(2000);
    break;
    case 3: //==================== state 3
    /* Os comandos abaixo servem para acertar data e hora retire
    as barras e acerte os valores, carregue o programa, recoloque
    as barras e recarregue o programa novamente*/

    rtc.setDOW(3); //Define o dia da semana
    rtc.setTime(02, 16, 00); //Define o horario
    rtc.setDate(23, 6, 2016); //Define o dia, mes e ano

    lcd.setCursor(4, 0);
    lcd.print(rtc.getTimeStr());

    lcd.setCursor(1,1);
    lcd.print(rtc.getDateStr(FORMAT_SHORT));

    lcd.setCursor(9, 1);
    lcd.print(" - ");

    lcd.setCursor(12, 1);
    lcd.print(rtc.getDOWStr(FORMAT_SHORT));

    delay (1000);
    break;

    default: ;
    }
    }

    ResponderExcluir
  24. Amigo, quando compilo o programa da esse erro: 'POSITIVE' was not declared in this scope.
    Agradeço desde já.

    ResponderExcluir
  25. Eu estou tentando usar um LCD 16x2 com módulo I2C (Sou iniciante). Usando esse sketch, consta que nenhum dispositivo I2C foi encontrado. E agora? Tenho um Arduino uno com ATmega 328p

    ResponderExcluir
    Respostas
    1. Boa noite,

      Por favor verifique as ligações, talvez seja o SCL invertido com o SDA. Tente também ligar apenas o display no Arduino e veja se ele reconhece algum dispositivo I2C.

      Abraço!

      Excluir
  26. Olá, estou com problemas na compilação no arduino mega, tendo em vista que meu modulo é o ds3231 e o display já está conectado ao modulo i2c

    Arduino: 1.6.11 (Windows 10), Placa:"Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)"

    C:\Users\Valdemir Dias\Documents\Arduino\sketch_Relogio_com_display_mega\sketch_Relogio_com_display_mega.ino: In function 'void setup()':

    sketch_Relogio_com_display_mega:19: error: 'lcd' was not declared in this scope

    lcd.begin (16,2);

    ^

    C:\Users\Valdemir Dias\Documents\Arduino\sketch_Relogio_com_display_mega\sketch_Relogio_com_display_mega.ino: In function 'void loop()':

    sketch_Relogio_com_display_mega:41: error: 'lcd' was not declared in this scope

    lcd.setCursor(0,0);

    ^

    C:\Users\Valdemir Dias\Documents\Arduino\sketch_Relogio_com_display_mega\sketch_Relogio_com_display_mega.ino: In function 'void SelecionaDataeHora()':

    sketch_Relogio_com_display_mega:93: error: 'DS1307_ADDRESS' was not declared in this scope

    Wire.beginTransmission(DS1307_ADDRESS);

    ^

    Foram encontradas múltiplas bibliotecas para "LiquidCrystal_I2C.h"
    Usado: C:\Users\Valdemir Dias\Documents\Arduino\libraries\LiquidCrystal_I2C
    Não usado: C:\Users\Valdemir Dias\Documents\Arduino\libraries\NewliquidCrystal
    Não usado: C:\Program Files (x86)\Arduino\libraries\LiquidCrystalI2C
    exit status 1
    'lcd' was not declared in this scope

    Este relatório teria mais informações com
    "Mostrar a saida detalhada durante a compilação"
    opção pode ser ativada em "Arquivo -> Preferências"

    ResponderExcluir
  27. Pessoal alguem pode me ajuda, estou tendo problema nos SEGUNDOS, eles não se atualiza, ficam no mesmo da compilação, ja li diversos tutoriais, e todos no mesmo os SEGUNDOS não muda.. oque faço ?

    ResponderExcluir
  28. Ola pessoal vocês poderiam me ajuda, sou novo nesse mundo de arduino, estou com um problema, ja li diversos tutoriais, mas sempre resulta no mesmo, OS SEGUNDOS NÃO SE ATUALIZA, fica no mesmo da compilação, ja coloquei resistor, varios códigos e sempre a mesma coisa.. o que faço ?

    ResponderExcluir
  29. Parabéns pelo projeto, ajudou muito !!!
    Estou tentando usar esse código para acionar um rele as 6:00 e as 22:00 e desligar 20 minutos apos os horários.
    Pensei em usar uma variável para receber o horário e comparar mas não sei como fazer isso alguém poderia me ajudar ?

    ResponderExcluir
  30. Alguém sabe se essa programação funciona fora do computador compilado ? se não como faço pra conseguir.O meu não esta funcionando, obrigado.

    ResponderExcluir