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.
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
Tags:
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.
Encontrei essa Data Logger bem interessante :
https://edwardmallon.wordpress.com/2014/10/07/the-diy-data-logger-v...
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por