Pessoal tenho o seguinte código:

Estou Criando um data log aonde crio um registro em um arquivo txt no cartão SD a cada 1 segundo com uma linha de 8 posições (segundo/minuto/horas/dias). Para que eu monte essa linha no arquivo eu crio contadores que funciona como um relógio digital.

  • A cada segundo a variável global (segundos e preenchida um +1).
  •  Quando a variável (segundos chega de 59) eu zero a variável e acrescento +1 a variável (minutos).
  • Quando a variável minutos chega a 59 eu zero a variável e acrescento +1 a variável (horas).
  • Quando a variável horas chega a 24 zero a variável e acrescento +1 a variável (dias); 

Feito todo esse processo eu crio um arquivo txt com os valores gerados. Ex : 01201040;

01 = Dias;

20 = Horas;

10 = minutos;

40 = Segundos;

Objetivo deste log:

Tem uma aplicação que deve ficar 21 dias ligado sem parar. Em caso de queda de luz o arduino ira reiniciar do 0 e não da ontem parou na hora da queda de energia: Exemplo :

A minha aplicação esta funcionando a 3 dias, 4 horas, 20 minutos e 45 segundos , e ocorre um queda de energia. O contador reinicia em 0 dias, 0 horas, 0 minutos e o segundos. Porém deveria iniciar em 3 dias, 4 horas, 20 minutos e 45 segundos.

Para corrigir esse erro eu inicio o arduino buscando pelo arquivo de log no SD chamado dados.txt;

Se na busca o arduino me retornar um arquivo é porque teve uma queda de energia e as variáveis (dias, horas, minutos e segundos) devem iniciar a partir do ultimo log gerado no txt.

Para isso eu criei a variável datalog aonde terá a linha gerada antes da queda de energia.

Porém não estou conseguindo manipular a variavel datalog e converter o a string em inteiro:

Exemplo:

Datalog = “01103020”

Segundos = datalog da posição (7 e 6] que corresponde os segundos;

Minutos = datalog da posição (5 e 4) que corresponde os minutos;

Horas  = datalog da posição (3 e 2 que corresponde as horas;

Dias = datalog da posição (1 e 0) que corresponde aos dias

Então jogo parte da datalog em char de 3 posições e depois converto usando a função Atoi;

Alguém poderia me ajudar?

Código: 

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

File myFile;

int segundos, minutos, horas, dias, in_acao; //variáveis do relógio
char datalog[8], v_segundos[2], v_minutos[2], v_horas[2], v_dias[2];

int cont = 0;

void setup() {
Serial.begin(9600);

if (!SD.begin(4)) {
Serial.println("initialization failed!");
return;
}
else {
if (SD.exists("Dados.txt")) {
// re-open the file for reading:
myFile = SD.open("dados.txt");
if (myFile) {
while (myFile.available()) {
datalog[cont] = myFile.read(); // carrego os log gerado no arquivo txt
cont ++;
}

datalog[8] = '\0';

myFile.close();

Serial.println(datalog);

v_segundos[0] = datalog[6]; // jogo parte da string datalog
v_segundos[1] = datalog[7];
v_segundos[2] = datalog[8];

v_minutos[0] = datalog[4];
v_minutos[1] = datalog[5];
v_minutos[2] = datalog[8];

v_horas[0] = datalog[2];
v_horas[1] = datalog[3];
v_horas[2] = datalog[8];

v_dias[0] = datalog[1];
v_dias[1] = datalog[0];
v_dias[2] = datalog[8];

Serial.println (v_segundos);
Serial.println (v_minutos);
Serial.println (v_horas);
Serial.println (v_dias);

segundos = atoi (v_segundos); // converto parte da string do datalog para as variaveis globais
minutos = atoi (v_minutos);
horas = atoi (v_horas);
dias = atoi (v_dias);
}
}
}
}


void loop() {
relogio();
}

void relogio()
{
segundos ++;
//int cont = 0;

if (segundos > 59)
{
segundos = 0;
minutos++;


if (minutos > 59)
{
minutos = 0;
horas++;

if (horas > 23)
{
horas = 0;
dias ++;

if (dias > 21)
{
dias = 0;
}
}

} //end if minutos

} //end if segundos

if (SD.exists("Dados.txt")) {
SD.remove("Dados.txt");
}

myFile = SD.open("Dados.txt", FILE_WRITE);
if (myFile) {
if (dias < 10)
{
myFile.print("0");
}

myFile.print(dias);
if (horas < 10)
{
myFile.print("0");
}
myFile.print(horas);
if (minutos < 10)
{
myFile.print("0");
}
myFile.print(minutos);
if (segundos < 10)
{
myFile.print("0");
}
myFile.print(segundos);
myFile.close();
} else {
// if the file didn't open, print an error:
Serial.println("error opening Dados.txt");
}

delay (1000);
} //end relogio

Exibições: 392

Responder esta

Respostas a este tópico

Olá,

Altera o seguinte:

char datalog[8], v_segundos[2], v_minutos[2], v_horas[2], v_dias[2];

para:

char datalog[9], v_segundos[3], v_minutos[3], v_horas[3], v_dias[3];

Te expliquei que o char[] precisa de 1 elemento adicional no chat principal, porém parece que ignorou o que eu disse.

Boa sorte,

  'Eiju

Peço desculpas Celso. Porém já esta criado com 3 elementos esse char [2]. Dois elementos para o datalog e um reservado. 

v_segundos[0] = datalog[6]; //datalog
v_segundos[1] = datalog[7]; //datalog
v_segundos[2] = datalog[8];// reservado

De novo ....

Se voce declara sua variavel assim:

char v_segundos[2];

Voce terá somente os ...

v_segundos[0] = datalog[6]; //datalog
v_segundos[1] = datalog[7]; //datalog

E dará erro nesta linha:

v_segundos[2] = datalog[8];// reservado

Obrigado Celso. Irei testar assim que chegar em casa e postarei os resultado no forum.

Olá, 

nada que agregar ao que o colega Celso já comentou, apenas sugiro que quando poste um código aqui, siga as orientações do colega Rui Viana, http://labdegaragem.com/forum/topics/sugest-o-de-como-postar

Abs.

Funcionou perfeitamente depois da correção sugerida pelo Celso mudando char [3] e não como estava no código char[2]. Assim então:

datalog[9], v_segundos[3], v_minutos[3], v_horas[3], v_dias[3];

Obrigado Celso pela ajuda. 

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço