Go Down

Topic: DS1307 Real time clock Datalogger (Read 3245 times) previous topic - next topic

peko86

else if (menulog == 'B')
                     {
               
                         myGLCD.clrScr();
                           
                           for (int k=5; k<numSensoresT;k++) //Cambiar 3 por 5 y 30 por 50 en prox fila
                           {
                                 int b=((10*k)-50);
                                                     
                                 myGLCD.print("T", 0, b);
                                 myGLCD.printNumI((k+1),8 ,b);
                                 myGLCD.print(":", 20, b);
                                 myGLCD.printNumF(temparray[k], 3, 25 ,b);  //El 3 se cambia segun precision requerida, Estoy usando 12 bits para el ds18b20-->0.0625?C precision
                                 myGLCD.print("*C", 62, b);
         
                           }
                           myGLCD.update();      
                       }
                       
                       
                       
                       
              else if (menulog == 'C')
                        {
               
                           
                              myGLCD.clrScr();
                              myGLCD.print("Caudal 1", 0, 0);
                              myGLCD.update();
                             
                        }
                       
                       
                       
                else if (menulog == 'D')
                        {
               
                              myGLCD.clrScr();
                              myGLCD.print("Caudal 2", 0, 0);
                              myGLCD.update();
                             
                        }
                       
                       
                       
                       
             else if (menulog == '0')
                         {
               
                           myGLCD.clrScr();
                      myGLCD.print("STOP", CENTER, 0);
                      myGLCD.print("0: MENU", 0, 10);
                      myGLCD.print("A/B:Temperaturas", 0, 20);
                      myGLCD.print("C/D:Caudales", 0, 30);
                      myGLCD.print("#-Confirmar", 0, 40);
                      myGLCD.update();
                      char menulog=Definelog();
                           }
               
                       
             
             
              char key = kpd.getKey();//Obtiene la pantalla de menu
                             if(key){
                               menulog=key;
                               {goto ini;}        
                             }
   


// Reseteo de registro
               Wire.beginTransmission(DS1307_ADDRESS);
               Wire.write(zero);
               Wire.endTransmission();
             
               Wire.requestFrom(DS1307_ADDRESS, 7);
             
               int second = bcdToDec(Wire.read());
               int minute = bcdToDec(Wire.read());
               int hour = bcdToDec(Wire.read() & 0b111111); //24 horas
               int weekDay = bcdToDec(Wire.read()); //0-6 -> Domingo-sabado
               int monthDay = bcdToDec(Wire.read());
               int month = bcdToDec(Wire.read());
               int year = bcdToDec(Wire.read());




         DateTime now = RTC.now();   //Para obtener el tiempo unix
         unsigned long currentTime = now.unixtime();//Obtiene el tiempo UNIX para el tiempo de refresco unicamente
             if (currentTime -lastReadTime >=  refresh_rate) {
               
             File logFile = SD.open("LOG.txt", O_CREAT | O_WRITE);//O_CREAT | O_WRITE puede cambiarse por FILE_WRITE
             lastReadTime = now.unixtime();
           
             
                      logFile.print(monthDay);
                      logFile.print("/");
                      logFile.print(month);
                      logFile.print("/");
                      logFile.print(year);
                     
                      logFile.print("  -  ");
                     
                      logFile.print(hour);
                      logFile.print(":");
                      logFile.print(minute);
                      logFile.print(":");
                      logFile.print(second);
                     
                      logFile.print(",");//Separador de columna
             
                     for (int l=0; l<numSensoresT; l++)
                         {
                           logFile.print(temparray[l]);
                              if (l < numSensoresT-1)
                                 {
                                 logFile.print(",");
                                 }
                              else
                                 {
                                   logFile.println();
                                   
                                 }
                         }
             
             logFile.close();
             
                                                 
             
             }                                  

 }
}








void ponerhora(){

                                  myGLCD.clrScr();
                                  myGLCD.print("Dia semana", 0, 0);
                                  myGLCD.print("(1-7)", 0, 10);
                                  myGLCD.print("*: Borrar", 0, 20);
                                  myGLCD.print("#: Confirmar", 0, 30);
                                  myGLCD.update();
                                  unsigned long ds = Definediasemana();
                                 

                                 
                                                                       
                                 myGLCD.clrScr();
                                  myGLCD.print("Dia del mes", 0, 0);
                                  myGLCD.print("(1-31)", 0, 10);
                                  myGLCD.print("*: Borrar", 0, 20);
                                  myGLCD.print("#: Confirmar", 0, 30);
                                  myGLCD.update();
                                  unsigned long dm = Definediames();
                                 
                                 
                                 

peko86

                                  myGLCD.clrScr();
                                  myGLCD.print("Mes", 0, 0);
                                  myGLCD.print("(1-12)", 0, 10);
                                  myGLCD.print("*: Borrar", 0, 20);
                                  myGLCD.print("#: Confirmar", 0, 30);
                                  myGLCD.update();
                                  unsigned long me = Definemes();
                                 
                                 
                                 
                                  myGLCD.clrScr();
                                  myGLCD.print("Ano", 0, 0);
                                  myGLCD.print("(0-99)", 0, 10);
                                  myGLCD.print("*: Borrar", 0, 20);
                                  myGLCD.print("#: Confirmar", 0, 30);
                                  myGLCD.update();
                                  unsigned long a = Defineano();
                                 
                                 
                                 
                                  myGLCD.clrScr();
                                  myGLCD.print("Hora", 0, 0);
                                  myGLCD.print("(0-23)", 0, 10);
                                  myGLCD.print("*: Borrar", 0, 20);
                                  myGLCD.print("#: Confirmar", 0, 30);
                                  myGLCD.update();
                                  unsigned long h = Definehora();
                             
                                 
                                 
                                  myGLCD.clrScr();
                                  myGLCD.print("Minutos", 0, 0);
                                  myGLCD.print("(0-59)", 0, 10);
                                  myGLCD.print("*: Borrar", 0, 20);
                                  myGLCD.print("#: Confirmar", 0, 30);
                                  myGLCD.update();
                                  unsigned long mi = Defineminutos();
                                 
                                 
                                 
                                  myGLCD.clrScr();
                                  myGLCD.print("Segundos", 0, 0);
                                  myGLCD.print("(0-59)", 0, 10);
                                  myGLCD.print("*: Borrar", 0, 20);
                                  myGLCD.print("#: Confirmar", 0, 30);
                                  myGLCD.update();
                                  unsigned long s = Definesegundos();
 
 
 byte second =      s; //0-59
 byte minute =      mi; //0-59
 byte hour =        h; //0-23
 byte weekDay =     ds; //1-7
 byte monthDay =    dm; //1-31
 byte month =       me; //1-12
 byte year  =       a; //0-99

 Wire.beginTransmission(DS1307_ADDRESS);
 Wire.write(zero); //stop Oscillator

 Wire.write(decToBcd(second));
 Wire.write(decToBcd(minute));
 Wire.write(decToBcd(hour));
 Wire.write(decToBcd(weekDay));
 Wire.write(decToBcd(monthDay));
 Wire.write(decToBcd(month));
 Wire.write(decToBcd(year));

 Wire.write(zero); //start

 Wire.endTransmission();

}

byte decToBcd(byte val){

//Convierte el numero normal decimal a binario codificado.
 return ( (val/10*16) + (val%10) );
}

byte bcdToDec(byte val)  {
// Convert el binario codificado a decimal
 return ( (val/16*10) + (val%16) );
}



void verhora(){

               // Reseteo de registro
               Wire.beginTransmission(DS1307_ADDRESS);
               Wire.write(zero);
               Wire.endTransmission();
             
               Wire.requestFrom(DS1307_ADDRESS, 7);
             
               int second = bcdToDec(Wire.read());
               int minute = bcdToDec(Wire.read());
               int hour = bcdToDec(Wire.read() & 0b111111); //24 horas
               int weekDay = bcdToDec(Wire.read()); //0-6 -> Domingo-sabado
               int monthDay = bcdToDec(Wire.read());
               int month = bcdToDec(Wire.read());
               int year = bcdToDec(Wire.read());

                     
                      myGLCD.printNumI(monthDay, 0, 20);
                      myGLCD.print("/", 15, 20);
                      myGLCD.printNumI(month, 26, 20);
                      myGLCD.print("/", 44, 20);
                      myGLCD.printNumI(year, 55, 20);
                     
                      myGLCD.printNumI(hour, 0, 30);
                      myGLCD.print(":", 15, 30);
                      myGLCD.printNumI(minute, 26, 30);
                      myGLCD.print(":", 44, 30);
                      myGLCD.printNumI(second, 55, 30);
                     
                      myGLCD.update();

     
   
}

dhenry

Code: [Select]
unsigned long currentTime = 3600*hour+60*minute+second;
             if (currentTime >= lastReadTime + refresh_rate) {


3600*hour can potentially overflow: 3600*23 = 82K > 64k (for unsigned short).

The same with "lastReadTime + refresh_rate"

Use this instead:
Code: [Select]
unsigned long currentTime = 3600ul*hour+60*minute+second;

A far better way, if you have implemented time.h, is to use an unsigned long type to keep time.

peko86

But as I said before...there are a lot of lines of code......Anyone knows how to store the first reading UNIX time into a variable??? The only idea I have is storing it on SD, and recover it. But if I have it I can make a cycle (i++) and with this I cant do the next for saving: CurrentTime-firstReadTime>=i*refresh_rate...What do you think?

NickPyner


I put 5 seconds of delay between samples and I begin to save data at 19:00:00, it continues with 19:00:05    19:00:10     19:00:15     19:00:20     19:00:25    19:00:31


You are telling the sketch when to do something but it has its own clock and you would be better off putting in a four second delay and asking it if it is ready to print the time. Something like "if last digit =0 or 5, then proceed, else go round and try again"

peko86

Thank you dhenry for your answer, but as I said before, this is a fake of my code, this may cause problems if the day changes.....I changed it for UNIXtime, which solves both problems (overflow and this error).

NickPyner: This is a good idea, but if the refresh rate is 1,2,3 seconds or 7...? But this could be a good option if I can't solve it by other way.

Thank you to both :)

dhenry

Your rtc will not return a 32-bit time. The only rtc that I know of that will do this is from st.

So regardless of how you keep time (via a 32-bit type or via struct time), you have to perform a conversion. That means you have to deal with promotion and issues surrounding that.

Go Up