Problema com projeto de datalogger.

Pessoal,

estou começando a fazer um datalogger usando o código de exemplo da IDE para SD. Apenas o alterei para trabalhar com apenas 1 sensor analógico (DHT11, carreguei a biblioteca dele) e ajustei a saída a ser gravada no .txt.

Estou tendo dois problemas:

  1. Os dados só são gravados no SD se eu abrir o serial monitor. É mesmo o esperado pra esse código? Eu queria alguma coisa q rodasse com uma fonte externa, não ligado a um computador.

  2. Toda vez que eu (re)abro o serial monitor o arduino reinicia (vejo novamente as saídas geradas pelo void setup() e um contador millis() que eu pus volta ao zero)

Alguém tem idéia do que possa ser?

Abraço!

Segue o código…

/*
  SD card datalogger

 by Tom Igoe

 This example code is in the public domain.

 */

#include <SPI.h>
#include <SD.h>

// On the Ethernet Shield, CS is pin 4. Note that even if it's not
// used as the CS pin, the hardware CS pin (10 on most Arduino boards,
// 53 on the Mega) must be left as an output or the SD library
// functions will not work.
const int chipSelect = 4;


// Parte DHT11
#include <dht.h>
#define dht_dpin A1 //Pino DATA do Sensor ligado na porta Analogica A1
dht DHT; //Inicializa o sensor



void setup()
 {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  delay(2000);

  

  Serial.print("Initializing SD card...");
  // make sure that the default chip select pin is set to
  // output, even if you don't use it:
  pinMode(10, OUTPUT);

  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");
}





void loop()
{
  
  DHT.read11(dht_dpin); //Lê as informações do sensor
  Serial.print("Umidade = ");
  Serial.print(DHT.humidity);
  Serial.print(" %  ");
  Serial.print("Temperatura = ");
  Serial.print(DHT.temperature); 
  Serial.println(" Celsius  ");

  //Não diminuir o valor abaixo. O ideal é a leitura a cada 2 segundos
  delay(2000);  
  
  

 

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  File dataFile = SD.open("datalogx.txt", FILE_WRITE);
  delay(300);
  // if the file is available, write to it:
  if (dataFile) {
    delay(100);
    dataFile.println( );
    delay(100);
    dataFile.print("Minutos gravando... ");
    delay(100);
    dataFile.println(millis()/60000);
    delay(100);
    dataFile.print("Umidade = ");
    delay(100);
    dataFile.print(DHT.humidity);
    delay(100);
    dataFile.print(" %  ");
    delay(100);
    dataFile.print("Temperatura = ");
    delay(100);
    dataFile.print(DHT.temperature); 
    delay(100);
    dataFile.println(" Celsius  ");
    delay(100);
    dataFile.close();
    delay(100);
    // print to the serial port too:
    Serial.print("Minutos rodando:  ");
    Serial.println(millis()/60000);
  }
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");
    dataFile.close();
    delay(100);
    
  }


}
  1. Os dados só são gravados no SD se eu abrir o serial monitor. É mesmo o esperado pra esse código? Eu queria alguma coisa q rodasse com uma fonte externa, não ligado a um computador.

Ele tambem devia gravar se apenas o alimentasses com uma alimentação externa

  1. Toda vez que eu (re)abro o serial monitor o arduino reinicia (vejo novamente as saídas geradas pelo void setup() e um contador millis() que eu pus volta ao zero)

È perfeitamente normal.Sempre que abres o monitor o avr renicia pois pensa que é um novo programa que lhe esta a chegar.Podes desactivar este comportamento, procurando por disable auto-reset.Consiste em forçar um pull-up no pino de reset para nao o deixar fazer reset.
Como sabes que nao esta a gravar no cartao?
Retiraste o cartao e confirmaste no teu pc?

HugoPT:
Ele tambem devia gravar se apenas o alimentasses com uma alimentação externa
È perfeitamente normal.Sempre que abres o monitor o avr renicia pois pensa que é um novo programa que lhe esta a chegar.Podes desactivar este comportamento, procurando por disable auto-reset.Consiste em forçar um pull-up no pino de reset para nao o deixar fazer reset.

Muito legal! Não conhecia essa ainda. Obrigado pela dica! Com sua dica cheguei a esse link: http://playground.arduino.cc/Main/DisablingAutoResetOnSerialConnection . Deixo a referência aí no tópico pra quem mais interessar.

HugoPT:
Como sabes que nao esta a gravar no cartao?
Retiraste o cartao e confirmaste no teu pc?

Sim, coloquei o cartão no pc. Nem sequer o arquivo está sendo criado pelo “SD.open”.

Mais uma vez, obrigado!

O que acontece quando elimina as chamadas às funções da porta serie?
Há aí um confusão entre o sensor DHT11 e as entradas analógicas. (mas isso não tem influência neste problema)

Eu, se tivesse na sua situação, tentava depurar com o LED (ou seja, o seu programa quando ocorre algo errado envia uma mensagem para a porta série, no entanto, como não tem a porta serie ligada, não consegue percebe que isso aconteceu, se em vez disso acender o LED, consegue ver quando algo errado acontece).

luisilva:
Eu, se tivesse na sua situação, tentava depurar com o LED (ou seja, o seu programa quando ocorre algo errado envia uma mensagem para a porta série, no entanto, como não tem a porta serie ligada, não consegue percebe que isso aconteceu, se em vez disso acender o LED, consegue ver quando algo errado acontece).

Boa idéia! Coloquei dois leds pra ir indicando a execução de cada etapa do código. Não conhecia essa ainda, vou passar a usar sempre.

Olha, não identifiquei exatamente qual era o problema, mas agora está funcionando bem. Está gravando no SD mesmo com fonte externa e eliminei o auto-reset com um pull-up no pino reset.

Obrigado, Hugo e Luis!

Até a próxima!

Felipe, também estou trabalhando num problema semelhante. E estou batendo cabeça ainda.
Qual a versão final do seu código com a modificação do auto reset?
Pode passar a versão com a modificação?
Obrigado!