Go Down

Topic: DS1307 Real time clock Datalogger (Read 3926 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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy