Problemas con rtc y retardo en lcd de un datalog

buenas tardes , me pico la curiosidad y empece a leer y intentar hacer andar un data log con lcd y tarjeta sd para grabar los datos , hay va mi duda!!!

Al colocar el delay de grabación de datos, en la sd también me atrasa el visionado, y lo que keria era ver la hora actual y la del ultimo registro en el lcd he probado varias combinaciones pero siempre me hace lo mismo :frowning:

soy muy novato en esto y si hay alguna metedura de pata ruego me perdonéis .
posteo lo que tengo a ver si me podéis aclarecer las dudas

Gracias

#include <OneWire.h>
#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "RTClib.h"
const int chipSelect = 10; 
RTC_DS1307 RTC;

float celsius;

OneWire  ds(8); 

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

File dataFile;
DateTime now;

void setup() {
  lcd.begin(20, 4);
 
 Serial.begin(9600);
  Wire.begin();
  RTC.begin();
//check or the Real Time Clock is on
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    RTC.adjust(DateTime(__DATE__, __TIME__));
  
    
  }
  

   Serial.print("INICIANDO SD ..");

  if (!SD.begin(chipSelect)) {
    Serial.println("SD FALLA, NO PRESENTE ??");
    return;
  }
  
  Serial.println("SD INICIADA.");


    now = RTC.now();
    dataFile = SD.open("datalog.txt", FILE_WRITE);
    dataFile.print("Start logging on: ");
    dataFile.print(now.year(),DEC);
    dataFile.print('/');
    dataFile.print(now.month(),DEC);
    dataFile.print('/');
    dataFile.print(now.day(),DEC);
    dataFile.println(" ");
    dataFile.println("Celsius              Time");
    dataFile.close();
    

  



}

void loop(void) {
  

pickUpTemperature();

  now = RTC.now();

   dataFile = SD.open("datalog.txt", FILE_WRITE);

  if (dataFile) {
    dataFile.print(celsius);
    dataFile.print("                 ");
    
    dataFile.print(now.hour(),DEC);
    dataFile.print(":");
    dataFile.print(now.minute(),DEC);
    dataFile.print(":");
    dataFile.println(now.second(),DEC);
    dataFile.close();
   
   
    Serial.println("data stored");
  }
  else {
    Serial.println("error opening datalog.txt");
  }

  delay(1000); // tiempo para grabar registro 
  
  }



void pickUpTemperature(){
    byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
 
  
  if ( !ds.search(addr)) {
    ds.reset_search();
    delay(250);
    return;
  }
  ;
  for( i = 0; i < 8; i++) {

  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();
 
  switch (addr[0]) {
    case 0x10:

      type_s = 1;
      break;
    case 0x28:
 
      type_s = 0;
      break;
    case 0x22:
  
      type_s = 0;
      break;
    default:

      return;
  } 

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);       
  
  delay(1000);     
 
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);      

  
  for ( i = 0; i < 9; i++) {           
    data[i] = ds.read();

  }


  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; 
    if (data[7] == 0x10) {
     
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw & ~7;  
    else if (cfg == 0x20) raw = raw & ~3; 
    else if (cfg == 0x40) raw = raw & ~1; 
    
  }

  celsius = (float)raw / 16.0;
  Serial.print("  Temperatura = ");
   Serial.print(celsius);
  Serial.print(" Grados, ");
   lcd.setCursor(2,0);
   
    lcd.print(" DATALOG LCD ");
    lcd.setCursor(0,1);
    lcd.print(" TEMPERATURA: ");
    lcd.setCursor(13,1);
    lcd.print(celsius);
    lcd.setCursor(18,1);
    lcd.print((char)223);
    lcd.setCursor(1,2);
    lcd.print(" ULTIMO REGISTRO ");
    lcd.setCursor(0,3);
    
   lcd.print(now.day(), DEC); // Dia
   lcd.print('/');
   lcd.print(now.month(), DEC); // Mes
   lcd.print('/');
   lcd.print(now.year(), DEC); // Año
   lcd.print(' ');
   lcd.print(now.hour(), DEC); // Horas
   lcd.print(':');
   lcd.print(now.minute(), DEC); // Minutos
   lcd.print(':');
   lcd.print(now.second(), DEC); // Segundos
   delay(1000); // La información se actualiza cada 1 seg.

   
  
}

Le agregaste un delay(1000) al final de pickUpTemperature y otro al final del loop?
A eso te referies? Saca el de pickUpTemperature y modifica el del final del loop y no tendras problema.

hola , gracias por contestar .

me sigue haciendo lo mismo ,

la idea es que el registro en la sd sea cada 10 minutos , pero que el la pantalla me marque la hora actual como si fuese un relog , y luego añadir una linea del ultimo registro en fecha y hora .

al intentar cambiar los delay siempre me precede el del registro de la sd !!!

Gracias

A ver con este códigio

#include <OneWire.h>
#include <DallasTemperature.h>
#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "RTClib.h"
const int chipSelect = 10;

RTC_DS1307 RTC;

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
float celsius;

OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

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

File dataFile;
DateTime now;
unsigned long start;

void setup() {
  lcd.begin(20, 4);
 
  Serial.begin(9600);
  Wire.begin();
  RTC.begin();
  //check or the Real Time Clock is on
  if (! RTC.isrunning()) {
      Serial.println("RTC is NOT running!");
      RTC.adjust(DateTime(__DATE__, __TIME__));  
  }
  
  Serial.print("INICIANDO SD ..");

  if (!SD.begin(chipSelect)) {
    Serial.println("SD FALLA, NO PRESENTE ??");
    return;
  }
  
  Serial.println("SD INICIADA.");


  now = RTC.now();
  dataFile = SD.open("datalog.txt", FILE_WRITE);
  dataFile.print("Start logging on: ");
  dataFile.print(now.year(),DEC);
  dataFile.print('/');
  dataFile.print(now.month(),DEC);
  dataFile.print('/');
  dataFile.print(now.day(),DEC);
  dataFile.println(" ");
  dataFile.println("Celsius              Time");
  dataFile.close();
    // Start up the library
  sensors.begin();
}

void loop(void) {
  // no hago nada... asi que libre para presentar cosas durante los 10 minutos o
  // o apagar el arduino.
  
  if (millis() > start ) {
      dataFile = SD.open("datalog.txt", FILE_WRITE);

      if (dataFile) {

          now = RTC.now();
          pickUpTemperature();
          dataFile.print(celsius);
          dataFile.print("                 ");
          dataFile.print(now.hour(),DEC);
          dataFile.print(":");
          dataFile.print(now.minute(),DEC);
          dataFile.print(":");
          dataFile.println(now.second(),DEC);
          dataFile.close();   
          Serial.println("data stored");
      }
      else {
          Serial.println("error opening datalog.txt");
      }
      start = millis()+600000UL; // cargo a start con el valor próximo
  }
  
}



void pickUpTemperature(){

  sensors.requestTemperatures(); // Send the command to get temperatures

  celsius = sensors.getTempCByIndex(0);  
  Serial.print("  Temperatura = ");
  Serial.print(celsius);
  Serial.print(" Grados, ");
  lcd.setCursor(2,0);
   
  lcd.print(" DATALOG LCD ");
  lcd.setCursor(0,1);
  lcd.print(" TEMPERATURA: ");
  lcd.setCursor(13,1);
  lcd.print(celsius);
  lcd.setCursor(18,1);
  lcd.print((char)223);
  lcd.setCursor(1,2);
  lcd.print(" ULTIMO REGISTRO ");
  lcd.setCursor(0,3);

  lcd.print(now.day(), DEC); // Dia
  lcd.print('/');
  lcd.print(now.month(), DEC); // Mes
  lcd.print('/');
  lcd.print(now.year(), DEC); // Año
  lcd.print(' ');
  lcd.print(now.hour(), DEC); // Horas
  lcd.print(':');
  lcd.print(now.minute(), DEC); // Minutos
  lcd.print(':');
  lcd.print(now.second(), DEC); // Segundos
}

no me gusta delay asi que lo reemplacé por millis()
durante 10 min no hace nada asi que el Arduino esta libre para hacer algo o dormir.
Te agregué esta librería

#include <DallasTemperature.h>

y saqué todo eso que tenías para leer lo mismo.

hola , gracias por tu aportacion ,me sigue lo mismo greo que es el datalog shield arduino, esperare a que me llegue un relog a tiempo real y un datalog sin shield , y os cuento .

mil Gracias

Esta instrucción controla la tasa de actualización del logger

start = millis()+600000UL; // cargo a start con el valor próximo

yo le puse 600x1000 = 600 segundos = 10 min o 600/60 seg= 10 min
Muy difirente es la hora y dia que grabe cada 10 min, ya que nunca fue puesto en hora porque no tiene RTC, arrancará en 0:00:00 1/01/1970 o algo parecido

Es lo que consultaste, sino se mas específico con tu consulta.

@nmedalacabeza

Basandome en el código de surbyte he hecho unas pequeñas modificaciones, comprueba ahora si funciona como quieres:

#include <OneWire.h>
#include <DallasTemperature.h>
#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "RTClib.h"
const int chipSelect = 10;

RTC_DS1307 RTC;

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
float celsius;

OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

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

File dataFile;
DateTime now;
unsigned long start;

void setup() {
  lcd.begin(20, 4);
 
  Serial.begin(9600);
  Wire.begin();
  RTC.begin();
  //check or the Real Time Clock is on
  if (! RTC.isrunning())
  {
      Serial.println("RTC is NOT running!");
      RTC.adjust(DateTime(__DATE__, __TIME__)); 
  }
 
  Serial.print("INICIANDO SD ..");

  if (!SD.begin(chipSelect))
  {
    Serial.println("SD FALLA, NO PRESENTE ??");
    return;
  }
 
  Serial.println("SD INICIADA.");


  now = RTC.now();
  dataFile = SD.open("datalog.txt", FILE_WRITE);
  dataFile.print("Start logging on: ");
  dataFile.print(now.year(),DEC);
  dataFile.print('/');
  dataFile.print(now.month(),DEC);
  dataFile.print('/');
  dataFile.print(now.day(),DEC);
  dataFile.println(" ");
  dataFile.println("Celsius              Time");
  dataFile.close();
    // Start up the library
  sensors.begin();
}

void loop(void)
{
  // no hago nada... asi que libre para presentar cosas durante los 10 minutos o
  // o apagar el arduino.
 
  now = RTC.now();
  if (millis() > start )
  {
      dataFile = SD.open("datalog.txt", FILE_WRITE);
      if (dataFile)
  {
          pickUpTemperature();
          dataFile.print(celsius);
          dataFile.print("                 ");
          dataFile.print(now.hour(),DEC);
          dataFile.print(":");
          dataFile.print(now.minute(),DEC);
          dataFile.print(":");
          dataFile.println(now.second(),DEC);
          dataFile.close();   
          Serial.println("data stored");
      }
      else
  {
          Serial.println("error opening datalog.txt");
      }
      start = millis()+600000UL; // cargo a start con el valor próximo
  }

  lcd.setCursor(1,2);
  lcd.print(" ULTIMO REGISTRO ");
  lcd.setCursor(0,3);
  lcd.print(now.day(), DEC); // Dia
  lcd.print('/');
  lcd.print(now.month(), DEC); // Mes
  lcd.print('/');
  lcd.print(now.year(), DEC); // Año
  lcd.print(' ');
  lcd.print(now.hour(), DEC); // Horas
  lcd.print(':');
  lcd.print(now.minute(), DEC); // Minutos
  lcd.print(':');
  lcd.print(now.second(), DEC); // Segundos
}



void pickUpTemperature(){

  sensors.requestTemperatures(); // Send the command to get temperatures

  celsius = sensors.getTempCByIndex(0); 
  Serial.print("  Temperatura = ");
  Serial.print(celsius);
  Serial.print(" Grados, ");
  lcd.setCursor(2,0);
   
  lcd.print(" DATALOG LCD ");
  lcd.setCursor(0,1);
  lcd.print(" TEMPERATURA: ");
  lcd.setCursor(13,1);
  lcd.print(celsius);
  lcd.setCursor(18,1);
  lcd.print((char)223);
}

ahora si , va perfecto muchas gracias !!!!

me iré empapando de todo , que este mundillo engancha , Gracias de nuevo

No las merece.

Por cierto la deteccion de error por no encontar la SD, no parece muy eficiente.
Prueba esto (incluye lo anterior):

#include <OneWire.h>
#include <DallasTemperature.h>
#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "RTClib.h"
const int chipSelect = 10;

RTC_DS1307 RTC;

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
float celsius;

OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

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

File dataFile;
DateTime now;
unsigned long start;
boolean haySD=false;

void setup() {
  lcd.begin(20, 4);
 
  Serial.begin(9600);
  Wire.begin();
  RTC.begin();
  //check or the Real Time Clock is on
  if (! RTC.isrunning())
  {
      Serial.println("RTC is NOT running!");
      RTC.adjust(DateTime(__DATE__, __TIME__)); 
  }
 
  Serial.print("INICIANDO SD ..");

  if (!SD.begin(chipSelect))
  {
    Serial.println("SD FALLA, NO PRESENTE ??");
    return;
  }
  
  haySD=true;
  Serial.println("SD INICIADA.");

  now = RTC.now();
  dataFile = SD.open("datalog.txt", FILE_WRITE);
  dataFile.print("Start logging on: ");
  dataFile.print(now.year(),DEC);
  dataFile.print('/');
  dataFile.print(now.month(),DEC);
  dataFile.print('/');
  dataFile.print(now.day(),DEC);
  dataFile.println(" ");
  dataFile.println("Celsius              Time");
  dataFile.close();
    // Start up the library
  sensors.begin();
}

void loop(void)
{
  // no hago nada... asi que libre para presentar cosas durante los 10 minutos o
  // o apagar el arduino.
 
  now = RTC.now();
  if(haySD)
  {
	if (millis() > start )
	{
		dataFile = SD.open("datalog.txt", FILE_WRITE);
		if (dataFile)
		{
			pickUpTemperature();
			dataFile.print(celsius);
			dataFile.print("                 ");
			dataFile.print(now.hour(),DEC);
			dataFile.print(":");
			dataFile.print(now.minute(),DEC);
			dataFile.print(":");
			dataFile.println(now.second(),DEC);
			dataFile.close();   
			Serial.println("data stored");
		}
		else
		{
			Serial.println("error opening datalog.txt");
		}
		start = millis()+600000UL; // cargo a start con el valor próximo
	}
  }
  else
  {
	lcd.setCursor(0,0);
	lcd.print(" No hay tarjeta ");
  }

  lcd.setCursor(1,2);
  lcd.print(" ULTIMO REGISTRO ");
  lcd.setCursor(0,3);
  lcd.print(now.day(), DEC); // Dia
  lcd.print('/');
  lcd.print(now.month(), DEC); // Mes
  lcd.print('/');
  lcd.print(now.year(), DEC); // Año
  lcd.print(' ');
  lcd.print(now.hour(), DEC); // Horas
  lcd.print(':');
  lcd.print(now.minute(), DEC); // Minutos
  lcd.print(':');
  lcd.print(now.second(), DEC); // Segundos
}



void pickUpTemperature(){

  sensors.requestTemperatures(); // Send the command to get temperatures

  celsius = sensors.getTempCByIndex(0); 
  Serial.print("  Temperatura = ");
  Serial.print(celsius);
  Serial.print(" Grados, ");

  lcd.setCursor(2,0);
  lcd.print(" DATALOG LCD ");
  lcd.setCursor(0,1);
  lcd.print(" TEMPERATURA: ");
  lcd.setCursor(13,1);
  lcd.print(celsius);
  lcd.setCursor(18,1);
  lcd.print((char)223);
}

Ahora quita la SD y ejecuta para ver la diferencia.

Saludos

Vaya que te explicas mal, qnmedalacabezal!!
Todo lo que querías era ver el registro en el LCD?
Es la única diferencia entre mi modificación y el código de Alfaville.

No. Repasalo verás que hay alguna cosa más