Go Down

Topic: RTC DS1307 (Read 91 times) previous topic - next topic

soaresmsr

Bom dia , to montando um medidor de temperatura com relógio e LCD 1602, mas fica aparecendo data e hora estranhas e com alguns numeros no final .
ex: Dom, 01/06/176655
      23:41:2665
em alguns momentos esse numeros  no final ficam mudando e tem horas que o lcd trava, como se nao estivesse sendo atualizado a hora.
alguém pode me Ajudar ?

giova014

#1
Jun 19, 2017, 04:43 pm Last Edit: Jun 19, 2017, 04:43 pm by giova014
Quote
fica aparecendo data e hora estranhas e com alguns numeros no final
Simples, só não enviar para o LCD esses números no final.

Essa é a melhor resposta quando você NÃO fornece o código fonte.
Sem ele, não é possível dar uma solução específica, pois pode ter sido escrito de infinitas formas.

Quote
em alguns momentos esse numeros  no final ficam mudando e tem horas que o lcd trava, como se nao estivesse sendo atualizado a hora.
Código, por favor.
Arduino!!

soaresmsr

Meu Código :

/* Configuraoes do 74hc595
 *  Pino 1 -  RS LCD
 *  Pino 2 -  VAZIO
 *  Pino 3 -  E LCD
 *  Pino 4 -  D4 LCD
 *  Pino 5 -  D5 LCD
 *  Pino 6 -  D6 LCD
 *  Pino 7 -  D7 LCD
 *  Pino 8 -  GROUND
 *  Pino 9 -  VAZIO
 *  Pino 10 - 5V
 *  Pino 11 - D13 ARDUINO
 *  Pino 13 - D9 ARDUINO
 *  Pino 13 - GROUND
 *  Pino 14 - D11 ARDUINO
 *  Pino 15 - VAZIO
 *  Pino 16 - 5V
 *
 */
 
 /* Configuraoes do LCD 1602
  * Pino 1 -  GROUND
  * Pino 2 -  5V
  * Pino 3 -  CONTRASTE
  * Pino 4 -  PINO 1 CI74hc595
  * Pino 5 -  GROUND
  * Pino 6 -  PINO 3 CI74hc595
  * Pino 7 -  DESCONECTADO
  * Pino 8 -  DESCONECTADO
  * Pino 9 -  DESCONECTADO
  * Pino 10 - DESCONECTADO
  * Pino 11 - PINO 4 CI74hc595
  * Pino 12 - PINO 5 CI74hc595
  * Pino 13 - PINO 6 CI74hc595
  * Pino 14 - PINO 7 CI74hc595
  * Pino 15 - LUZ LCD
  * Pino 16 - GROUND
  *
  * CONTRASTE VAI DE 0 A 150;
  */
 
 /*Configuraoes do DHT11
  * PINO 1 - 5V
  * PINO 2 - PORTA A3 ARDUINO
  * PINO 3 - DESCONECTADO
  * PINO 4 - GROUND
 */


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

//BIBLIOTECAS
#include <Wire.h>
#include <SPI.h>
#include <LiquidCrystal.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>


//PINOS
int PinoDht = 2;                          // DEFINE LOCAL DO SENSOR DHT11
int PinoLuzLCD = 5;                       // DEFINE LOCAL DA LUZ LCD
int PinoContraste = 6;                    // DEFINE LOCAL DO CONTRASTE LCD


//DEFINIÇÕES
LiquidCrystal lcd(9);                     // DEFINE LOCAL DO LCD CI74hc595
#define DHTTYPE  DHT11                    // DEFINE MODELO DO SENSOR
DHT_Unified dht(PinoDht, DHTTYPE);
#define DS1307_ADDRESS 0x68

byte zero = 0x00;
//VARIAVEIS
uint32_t delayMS;


//Simbolos Array LCD
byte temperatura[8] = {
B00100,
B01010,
B01010,
B01010,
B01110,
B11111,
B11111,
B01110
};
byte umidade[8] = {
B00100,
B00100,
B01010,
B01010,
B10001,
B10001,
B10001,
B01110
};
byte grau[8] = {
B11100,
B10100,
B11100,
B00000,
B00000,
B00000,
B00000,
B00000
};
byte erro[8] = {
B00100,
B00100,
B00100,
B00100,
B00100,
B00000,
B00000,
B00100
};



void setup() {
 Wire.begin();
  pinMode(PinoLuzLCD, OUTPUT);
  CaractereLCD();
  dht.begin();
  lcd.begin(16, 2);
  digitalWrite(PinoLuzLCD, HIGH);
  delay(5000);
  lcd.clear();
  Serial.begin(9600);
 }
 
void loop() {
  ContrasteLCD();
  CarregarRelogio();
  Serial.println("TESTE");
}

void CaractereLCD(){
lcd.createChar(1, temperatura);
lcd.createChar(2, umidade);
lcd.createChar(3, grau);
lcd.createChar(4, erro);
}

void TemperaturaHumidade (){
 // delay(delayMS);
  // CARREGA TEMPERATURA E UMIDADE
  sensors_event_t event; 
  dht.temperature().getEvent(&event);
 
  // VERIFICA A TEMPERATURA
  if (isnan(event.temperature)) {
   lcd.setCursor(0,0);
   lcd.write((byte)1);
   lcd.setCursor(2,0);
   lcd.write((byte)4);
   lcd.write((byte)3);
   lcd.print("C");
   }
  else {
   lcd.setCursor(0,0);
   lcd.write((byte)1);
   lcd.setCursor(2,0);
   lcd.print(event.temperature);
   lcd.write((byte)3);
   lcd.print("C");
  }
 
   // VERIFICA A UMUIDADE
     dht.humidity().getEvent(&event);
  if (isnan(event.relative_humidity)) {
    lcd.setCursor(0,1);
    lcd.write((byte)2);
    lcd.setCursor(2,1);
    lcd.write((byte)4);
  }
  else {
    lcd.setCursor(0,1);
    lcd.write((byte)2);
    lcd.setCursor(2,1);
    lcd.print(event.relative_humidity);
   }

}

void ContrasteLCD(){
   analogWrite(PinoContraste,  100);
}

void ConfigurarDataHora()   //Seta a data e a hora do DS1307
{
  byte segundos = 40; //Valores de 0 a 59
  byte minutos = 55; //Valores de 0 a 59
  byte horas = 22; //Valores de 0 a 23
  byte diadasemana = 0; //Valores de 0 a 6 - 0=Domingo, 1 = Segunda, etc.
  byte diadomes = 1; //Valores de 1 a 31
  byte mes = 6; //Valores de 1 a 12
  byte ano = 17; //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); //Start no CI
  Wire.endTransmission();
}

void CarregarRelogio(){
// 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);
  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, ");
    }
    if (diadomes < 10){
      lcd.print("0");
    }
      lcd.print(diadomes);
      lcd.print("/");
     if (mes < 10){
      lcd.print("0");
    }
      lcd.print(mes);
      lcd.print("/");
      lcd.print(ano);
      lcd.setCursor(0,1);
      if(horas <10){
        lcd.print("0");
      }
      lcd.print(horas);
      lcd.print(":");
      if(minutos <10){
        lcd.print("0");
      }
      lcd.print(minutos);
      lcd.print(":");
      if(segundos <10){
        lcd.print("0");
      }
      lcd.print(segundos);
}

giova014

#3
Jun 20, 2017, 02:10 pm Last Edit: Jun 20, 2017, 02:11 pm by giova014
Quote
Meu Código :
Você esqueceu as tag [ code][ /code], para seu código aparecer assim:
Code: [Select]
Código
Edite seu post e adicione as tag, que ajudam a ler o código.

Se não for um requisito usar a biblioteca Wire diretamente, recomendo usar uma biblioteca para o DS1307, que já está tudo pronto e testado para funcionar.
Link para uma das muitas bibliotecas:
https://github.com/filipeflop/DS1307
Veja esses links em português:
Relógio com o módulo RTC DS1307 e Arduino
Relógio com o módulo RTC DS1307 e LCD 20×4

Leia, teste e traga as dúvidas.
Arduino!!

Go Up