[DUVIDA] Não consigo editar o horario do RTC DS1307 dentro do proprio sketch

Olá galera,

   Normalmente quando encontramos codigos pra lidar com RTCs,  o ajuste de horario ou é feito com um codigo que pega o horario do PC e o transfere para o RTC,  ou então escrevendo valores fixos em variáveis que quando gravadas no arquino serão setadas no RTC.

   Bem, o que eu queria era fazer um sketch onde atraves de um botão, eu pudesse alterar os horarios do sistema e ao final gravar no ci DS1307,  mas não esta acontecendo,  eu até altera o codigo, mas quando o programa volta a rodar no loop principal ele da todo doido,  dai eu reinicio o arduino e nenhuma alteração foi gravada no 1307.

   O que criei foi um sistema onde com apenas um botão dá pra mudar todas as configurações, baseado no tempo de pressionamento do botão.

  No trecho do sketch abaixo a parte de edição de data e hora funciona inicialmente chamando os segundos, minutos, hora, etc e atribuindo a variaveis,  depois essas variáveis vão ser chamadas uma a uma em um lcd 16x2 para serem editadas,  se o botão for pressionado rapido(menos de 2 seg)  ele acrescente mais um,  se ao contrario o botão for pressionado por mais de 2 seg, um S de sair, aparece na tela, e ele vai para o proximo item a ser configurado.

   Após configurar todas as variáveis, elas deveriam ser gravadas no DS1307,  mas isso não esta acontecendo.

   Alguem ai pode em ajudar ?

  

void menuopcao3(){    // **************************   EDITA A DATA E HORA DO SISTEMA

Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);
  Wire.endTransmission();
  Wire.requestFrom(DS1307_ADDRESS, 7);
  segundos = ConverteparaDecimal(Wire.read());
  minutos = ConverteparaDecimal(Wire.read());
  horas = ConverteparaDecimal(Wire.read() & 0b111111);
  diadasemana = ConverteparaDecimal(Wire.read());
  diadomes = ConverteparaDecimal(Wire.read());
  mes = ConverteparaDecimal(Wire.read());
  ano = ConverteparaDecimal(Wire.read());


segundos = 30;  // os segundos é um valor fixo, não editável por questão de ganho de tempo.

lcd.setCursor(0,0);   // ***************************  Edita MINUTOS do tempo
lcd.print("                ");
lcd.setCursor(0,1);
lcd.print("                ");
lcd.setCursor(0,0);
lcd.print("AJUSTE MINUTOS");
int sairlaco = 0;
 while(sairlaco==0){
  lcd.setCursor(0,1);
  lcd.print("                ");
  lcd.setCursor(0,1);
  lcd.print(minutos);
  delay(100);   
         if(digitalRead(12)==1){
            primeirotempo=millis();
            while(digitalRead(12)==1){
            int tempopressionado= millis() - primeirotempo;
            if(tempopressionado < 2000){ minutos++; delay(200); if(minutos > 59){minutos=0;} }       else{sairlaco=1;  lcd.setCursor(9,2);  lcd.print("S");}
}}} //  fim do Edita MINUTOS do tempo


lcd.setCursor(0,0);   // ***************************  Edita HORAS do tempo
lcd.print("                ");
lcd.setCursor(0,1);
lcd.print("                ");
lcd.setCursor(0,0);
lcd.print("AJUSTE HORAS");
sairlaco = 0;
 while(sairlaco==0){
  lcd.setCursor(0,1);
  lcd.print("                ");
  lcd.setCursor(0,1);
  lcd.print(horas);
  delay(100);   
         if(digitalRead(12)==1){
            primeirotempo=millis();
            while(digitalRead(12)==1){
            int tempopressionado= millis() - primeirotempo;
            if(tempopressionado < 2000){ horas++; delay(200); if(horas > 23){horas=0;} }       else{sairlaco=1;  lcd.setCursor(9,2);  lcd.print("S");}
}}} //  fim do Edita HORAS do tempo


lcd.setCursor(0,0);   // ***************************  Edita DIA DA SEMANA do tempo
lcd.print("                ");
lcd.setCursor(0,1);
lcd.print("                ");
lcd.setCursor(0,0);
lcd.print("AJUSTE DIA/SEMANA");
sairlaco = 0;
 while(sairlaco==0){
  lcd.setCursor(0,1);
  lcd.print("                ");
  lcd.setCursor(0,1);
  switch(diadasemana){
      case 0:lcd.print("Domingo         ");
      break;
      case 1:lcd.print("Segunda         ");
      break;
      case 2:lcd.print("Terca           ");
      break;
      case 3:lcd.print("Quarta          ");
      break;
      case 4:lcd.print("Quinta          ");
      break;
      case 5:lcd.print("Sexta           ");
      break;
      case 6:lcd.print("Sabado          ");
    }
  delay(100);   
         if(digitalRead(12)==1){
            primeirotempo=millis();
            while(digitalRead(12)==1){
            int tempopressionado= millis() - primeirotempo;
            if(tempopressionado < 2000){ diadasemana++; delay(200); if(diadasemana > 6){diadasemana=0;} }       else{sairlaco=1;  lcd.setCursor(9,2);  lcd.print("S");}
}}} //  fim do Edita DIA DA SEMANA do tempo


lcd.setCursor(0,0);   // ***************************  Edita DIA DO MES do tempo
lcd.print("                ");
lcd.setCursor(0,1);
lcd.print("                ");
lcd.setCursor(0,0);
lcd.print("AJUSTE DIA/MES");
sairlaco = 0;
 while(sairlaco==0){
  lcd.setCursor(0,1);
  lcd.print("                ");
  lcd.setCursor(0,1);
  lcd.print(diadomes);
  delay(100);   
         if(digitalRead(12)==1){
            primeirotempo=millis();
            while(digitalRead(12)==1){
            int tempopressionado= millis() - primeirotempo;
            if(tempopressionado < 2000){ diadomes++; delay(200); if(diadomes > 31){diadomes=1;} }       else{sairlaco=1;  lcd.setCursor(9,2);  lcd.print("S");}
}}} //  fim do Edita DIA DO MES do tempo


lcd.setCursor(0,0);   // ***************************  Edita MES do tempo
lcd.print("                ");
lcd.setCursor(0,1);
lcd.print("                ");
lcd.setCursor(0,0);
lcd.print("AJUSTE O MES");
sairlaco = 0;
 while(sairlaco==0){
  lcd.setCursor(0,1);
  lcd.print("                ");
  lcd.setCursor(0,1);
  switch(mes){
      case 1:lcd.print("Janeiro         ");
      break;
      case 2:lcd.print("Fevereiro      ");
      break;
      case 3:lcd.print("Marco          ");
      break;
      case 4:lcd.print("Abril          ");
      break;
      case 5:lcd.print("Maio           ");
      break;
      case 6:lcd.print("Junho          ");
      break;
      case 7:lcd.print("Julho         ");
      break;
      case 8:lcd.print("Agosto        ");
      break;
      case 9:lcd.print("Setembro        ");
      break;
      case 10:lcd.print("Outubro        ");
      break;
      case 11:lcd.print("Novembro       ");
      break;
      case 12:lcd.print("Dezembro       ");
    }
 delay(100);   
         if(digitalRead(12)==1){
            primeirotempo=millis();
            while(digitalRead(12)==1){
            int tempopressionado= millis() - primeirotempo;
            if(tempopressionado < 2000){ mes++; delay(200); if(mes > 12){mes=1;} }       else{sairlaco=1;  lcd.setCursor(9,2);  lcd.print("S");}
}}} //  fim do Edita MES do tempo



lcd.setCursor(0,0);   // ***************************  Edita ANO do tempo
lcd.print("                ");
lcd.setCursor(0,1);
lcd.print("                ");
lcd.setCursor(0,0);
lcd.print("AJUSTE ANO max50");
sairlaco = 0;
 while(sairlaco==0){
  lcd.setCursor(0,1);
  lcd.print("                ");
  lcd.setCursor(0,1);
  lcd.print(ano);
  delay(100);   
         if(digitalRead(12)==1){
            primeirotempo=millis();
            while(digitalRead(12)==1){
            int tempopressionado= millis() - primeirotempo;
            if(tempopressionado < 2000){ ano++; delay(200); if(ano > 50){ano=14;} }       else{sairlaco=1;  lcd.setCursor(9,2);  lcd.print("S");}
}}} //  fim do Edita ANO do tempo

Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero); //Stop no CI para que o mesmo possa receber os dados
  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();

}//******************************************** FIM DA opcao 3 em edicao

Exibições: 1007

Responder esta

Respostas a este tópico

ninguem ?

Ninguem pra me ajudar ?

Nao seria mais facil usar  a biblioteca do RTC ou TIME?

exemplo:

//Carrega a biblioteca do RTC DS1307
#include <DS1307.h>

José Gustavo,

   O problema é que encontrei algumas bibliotecas e em nelas a data era setada buscando a data do PC no momento da conexão com o arduino e o que estou tendo problemas é justamente em colocar um menu que permita durante o proprio funcionamento do arduino, poder acessar a memoria do DS1307 , editar e gravar,  a coisa até rola, mas tá dando um pau danado.

   O DS1307 tem uma eeprom interna que grava o horario, as bibliotecas tem formulas prontas para acessa-las e demonstrar os resultados,  mas editar essa memoria é fooooda.

Veja se isso pode ajuda-lo :

https://github.com/adafruit/RTClib

José Gustavo,

    Amigo, tô viajando a trabalho, quando chegar em casa vou testar algo interessante que achei.

O lance é que normalmente essa biblioteca vem com exemplo com o seguinte codigo de ajuste de horario:

 rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

  o que faz o que citei, ou seja, o arduino consultar a data e hora do sistema no pc e setar no RTC.

  Porem, vi um exemplo onde há o codigo:

  rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));

   Se der certo, e não ouver conflitos, vou poder trocar os valors por variáveis e trabalhar com essas variáveis para testar,   bem... valeu, pode ser que dê certo.

Obrigado.

Isso ! Esta no link que enviei :

rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));

Muito obrigado,    assim que chegar em casa vou testar.

Como aprendi recentemente uma técnica de estruturação do codigo(ao qual estou fazendo um tutorial que lancarei em breve), não haverá grandes traumas em substituir o metodo caso dê certo.

Por isso muito obrigado !

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço