Como gravar dados no cartao SD externo no arduino ? Ajuda pfv

Olá, gostaria muito da ajuda de vocês se possível, tenho um projeto para faculdade de monitorar a tensão de uma placa solar durante uns 6 meses, não só muito expert em arduino, vagando na net, achei um código, abaixo mostrarei ele.. queria adaptar esse código ou se alguém tem um e possa me ajudar.. preciso gravar a tensão da placa em 3 horários... 8:00, 12:00 e 16:00 horas.. somente nesses horários, e gravar esses dados no cartão do arduino, externo claro, com data e hora.. tem como adaptar o código abaixo para isso? Grato desde já ..

#include <EEPROM.h>
#include <SD.h>


File arquivo;
byte inicio_ok;

void setup ()
{
inicio_ok =1;
Serial.begin (9600);
if (!SD.begin(4))
{
Serial.println("Erro ao iniciar o cartao SD !");
inicio_ok =0;
return;
}

Serial.println ("Iniciacao Ok!");
}

void loop ()
{
if (inicio_ok)
{
int opcao = Serial.read();
if (opcao == 'C')
{
Serial.println ("Opcao Configuracao Selecionada");
opcao = Serial.read();
while (opcao == -1)
{
opcao = Serial.read();
}
int valorConfig = opcao - 48;
EEPROM.write (0 , valorConfig);
Serial.print ("Valor gravado com sucesso:");
Serial.println (valorConfig);
}
else if (opcao == 'w')
{
while (opcao !='x')
{
int leituraSensor = analogRead (0);
arquivo = SD.open ("sensor.txt, FILE_WRITE");
if (arquivo)
{
arquivo.print ("Valor do sensor em:");
arquivo.print (millis());
arquivo.print (" ms: ");
arquivo. println (leituraSensor);
arquivo.close();
delay (1000 * EEPROM.read (0));
Serial.print ("Feita leitura do sensor em");
Serial.print (EEPROM.read(0), DEC);
Serial.println("segs.");
}
else
{
Serial.println ("Erro ao abrir o arquivo para escrita!");
}
opcao = Serial.read();
}
Serial.println ("Terminando leitura do Sensor!");
}
else if (opcao == 'r')
{
arquivo = SD.open ("sensor.txt");
if (arquivo)
{
while (arquivo.available())
{
Serial.write( arquivo.read());
}
arquivo.close();
Serial.println("Termino da leitura");
}
else
{
Serial.println ("Erro ao abrir arquivo para leitura");
}
}
else if (opcao == 'e')
{
SD.remove ("sensor.txt");
if (!SD.exists ("sensor.txt") )
{
Serial.println ("Arquivo apagado com ");
}
else
{
Serial.println ("Erro ao apagar arquivo!");
          }
     }
   }
}

Exibições: 6155

Responder esta

Respostas a este tópico

Alguem sabe mexer com a EEPROM do arduino?

Wiechert vlw, mais já tinha visto esse topico e não ajudo, pois preciso usar cartaão externo junto com um shield relogio RTC para o arduino, assim poder gravar nas horas certas.. ta tenso achar isso...

Você tem tudo aqui. Só que no lugar do nome do arquivo, de um jeito de jogar na string do nome , o ano,mes,dia e hora a qual o arquivo foi gerado. Ai todos os arquivos ficam com nome diferente e nunca serão substituídos, e  pelo nome ja sabe quando foi criado.

Ficaria mais ou menos assim:

arquivo = SD.open ("AAMMDDHH.txt, FILE_WRITE");
if (arquivo)
{
arquivo.print ("Valor da tensão:");

arquivo. print (leituraSensor);

arquivo.print (" V ");
arquivo.close();

}

Problema também, é como fazer ele ler apenas nos horários 8:00. 12:00 e 16:00 horas, sendo bem humilde e não tenho um conhecimento avançado, mais entendi que disse como estive-se apenas trocando o nome do arquivo txt.. para cada dia que ele fizesse a leitura, cria-se um arquivo com a data e hora daquele dia, porem, tenho que fazer ele ler somente naqueles horários, isso que ta pegando, já vi vários fóruns, tópicos e nada..

static int flag=0;// variavel de controle pra gravar somente uma vez cada minuto e nao ficar sobre escrevendo dados

if(((hora == 8) || (hora == 12) || (hora ==16)) && ((min == 0) && (flag==0))

{

arquivo = SD.open ("AAMMDDHH.txt, FILE_WRITE");
if (arquivo)
{
arquivo.print ("Valor da tensão:");

arquivo. print (leituraSensor);

arquivo.print (" V ");
arquivo.close();

}

flag=1;

}

if((min != 0)) 

flag=0;

Vc não declarou a variavel flag por isso o erro

flag não pode ser static, se vc altera o valor dele, variavel static nao se altera o estado dela é sempre o mesmo coloca int flag só.

#include <EEPROM.h>
#include <SD.h>
#include "Wire.h"
#define DS1307_ADDRESS 0x68
byte zero = 0x00;

File arquivo;
byte inicio_ok;

void setup ()
{
Wire.begin();
SelecionaDataeHora();
inicio_ok =1;
Serial.begin (9600);
if (!SD.begin(4))
{
Serial.println("Erro ao iniciar o cartao SD !");
inicio_ok =0;
return;
}

Serial.println ("Iniciacao Ok!");
}

void loop ()
{
Mostrarelogio();
delay(1000);
{
if (inicio_ok)
{
int opcao = Serial.read();
if (opcao == 'C')
{
Serial.println ("Opcao Configuracao Selecionada");
opcao = Serial.read();
while (opcao == -1)
{
opcao = Serial.read();
}
int valorConfig = opcao - 48;
EEPROM.write (0 , valorConfig);
Serial.print ("Valor gravado com sucesso:");
Serial.println (valorConfig);
}
else if (opcao == 'w')
{
while (opcao !='x')
{
int leituraSensor = analogRead (0);
arquivo = SD.open ("sensor.txt, FILE_WRITE");
if (arquivo)
{
arquivo.print ("Valor do sensor em:");
arquivo.print (millis());
arquivo.print (" ms: ");
arquivo. println (leituraSensor);
arquivo.close();
delay (1000 * EEPROM.read (0));
Serial.print ("Feita leitura do sensor em");
Serial.print (EEPROM.read(0), DEC);
Serial.println("segs.");
}
else
{
Serial.println ("Erro ao abrir o arquivo para escrita!");
}
opcao = Serial.read();
}
Serial.println ("Terminando leitura do Sensor!");
}
else if (opcao == 'r')
{
arquivo = SD.open ("sensor.txt");
if (arquivo)
{
while (arquivo.available())
{
Serial.write( arquivo.read());
}
arquivo.close();
Serial.println("Termino da leitura");
}
else
{
Serial.println ("Erro ao abrir arquivo para leitura");
}
}
else if (opcao == 'e')
{
SD.remove ("sensor.txt");
if (!SD.exists ("sensor.txt") )
{
Serial.println ("Arquivo apagado com ");
}
else
{
Serial.println ("Erro ao apagar arquivo!");
}
}
}
}
}

void SelecionaDataeHora() //Seta a data e a hora do DS1307
{
byte segundos = 40; //Valores de 0 a 59
byte minutos = 59; //Valores de 0 a 59
byte horas = 23; //Valores de 0 a 23
byte diadasemana = 1; //Valores de 0 a 6 - 0=Domgino, 1 = Segunda, etc.
byte dia = 17; //Valores de 1 a 31
byte mes = 4; //Valores de 1 a 12
byte ano = 13; //Valores de 0 a 99

Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero); //Stop no CI para que o mesmo possa receber os dados

//As linhas abaixo escrevem no CI os valores de data e hora que foram colocados nas variaveis acima
Wire.write(ConverteParaBCD(segundos));
Wire.write(ConverteParaBCD(minutos));
Wire.write(ConverteParaBCD(horas));
Wire.write(ConverteParaBCD(diadasemana));
Wire.write(ConverteParaBCD(dia));
Wire.write(ConverteParaBCD(mes));
Wire.write(ConverteParaBCD(ano));

Wire.write(zero); //Start no CI
Wire.endTransmission();
}

byte ConverteParaBCD(byte val){ //Converte o número de decimal para BCD
return ( (val/10*16) + (val%10) );
}

byte ConverteparaDecimal(byte val) { //Converte de BCD para decimal
return ( (val/16*10) + (val%16) );
}

void Mostrarelogio(){
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.endTransmission();

Wire.requestFrom(DS1307_ADDRESS, 7);

int segundos = ConverteparaDecimal(Wire.read());
int minutos = ConverteparaDecimal(Wire.read());
int horas = ConverteparaDecimal(Wire.read() & 0b111111);
int diadasemana = ConverteparaDecimal(Wire.read());
int dia = ConverteparaDecimal(Wire.read());
int mes = ConverteparaDecimal(Wire.read());
int ano = ConverteparaDecimal(Wire.read());

//Mostra a data no Serial Monitor
Serial.print("Data: ");
Serial.print(dia);
Serial.print("/");
Serial.print(mes);
Serial.print("/");
Serial.print(ano);
Serial.print(" ");
Serial.print("Hora : ");
Serial.print(horas);
Serial.print(":");
Serial.print(minutos);
Serial.print(":");
Serial.print(segundos);
switch(diadasemana)
{
case 0:Serial.println(", Domingo");
break;
case 1:Serial.println(", Segunda");
break;
case 2:Serial.println(", Terca");
break;
case 3:Serial.println(", Quarta");
break;
case 4:Serial.println(", Quinta");
break;
case 5:Serial.println(", Sexta");
break;
case 6:Serial.println(", Sabado");
}
}

    #include <SD.h>
    #include "Wire.h"
    #define DS1307_ADDRESS 0x68
    byte zero = 0x00;

    File arquivo;
    byte inicio_ok;

    void setup ()
    {
    Wire.begin();
    Mostrarelogio();
    delay(1000);
    SelecionaDataeHora();
    inicio_ok =1;
    Serial.begin (9600);
    if (!SD.begin(4))
    {
    Serial.println("Erro ao iniciar o cartao SD !");
    inicio_ok =0;
    return;
    }

    Serial.println ("Iniciacao Ok!");
    }
    
    void loop ()
        {
    
      int leituraSensor = analogRead (0);
        arquivo = SD.open ("teste2.txt", FILE_WRITE);
        if (arquivo)
        {
    Mostrarelogio();
    delay(1000);
          arquivo. println (leituraSensor);
          arquivo.close();
        }   
    }
    
 void SelecionaDataeHora() //Seta a data e a hora do DS1307
    {
    byte segundos = 40; //Valores de 0 a 59
    byte minutos = 59; //Valores de 0 a 59
    byte horas = 23; //Valores de 0 a 23
    byte diadasemana = 1; //Valores de 0 a 6 - 0=Domgino, 1 = Segunda, etc.
    byte dia = 17; //Valores de 1 a 31
    byte mes = 4; //Valores de 1 a 12
    byte ano = 13; //Valores de 0 a 99

    Wire.beginTransmission(DS1307_ADDRESS);
    Wire.write(zero); //Stop no CI para que o mesmo possa receber os dados

    //As linhas abaixo escrevem no CI os valores de data e hora que foram colocados nas variaveis acima
    Wire.write(ConverteParaBCD(segundos));
    Wire.write(ConverteParaBCD(minutos));
    Wire.write(ConverteParaBCD(horas));
    Wire.write(ConverteParaBCD(diadasemana));
    Wire.write(ConverteParaBCD(dia));
    Wire.write(ConverteParaBCD(mes));
    Wire.write(ConverteParaBCD(ano));

    Wire.write(zero); //Start no CI
    Wire.endTransmission();
    }

    byte ConverteParaBCD(byte val){ //Converte o número de decimal para BCD
    return ( (val/10*16) + (val%10) );
    }

    byte ConverteparaDecimal(byte val) { //Converte de BCD para decimal
    return ( (val/16*10) + (val%16) );
    }

    void Mostrarelogio(){
    Wire.beginTransmission(DS1307_ADDRESS);
    Wire.write(zero);
    Wire.endTransmission();

    Wire.requestFrom(DS1307_ADDRESS, 7);

    int segundos = ConverteparaDecimal(Wire.read());
    int minutos = ConverteparaDecimal(Wire.read());
    int horas = ConverteparaDecimal(Wire.read() & 0b111111);
    int diadasemana = ConverteparaDecimal(Wire.read());
    int dia = ConverteparaDecimal(Wire.read());
    int mes = ConverteparaDecimal(Wire.read());
    int ano = ConverteparaDecimal(Wire.read());

    //Mostra a data no Serial Monitor
    Serial.print("Data: ");
    Serial.print(dia);
    Serial.print("/");
    Serial.print(mes);
    Serial.print("/");
    Serial.print(ano);
    Serial.print(" ");
    Serial.print("Hora : ");
    Serial.print(horas);
    Serial.print(":");
    Serial.print(minutos);
    Serial.print(":");
    Serial.print(segundos);
    switch(diadasemana)
    {
    case 0:Serial.println(", Domingo");
    break;
    case 1:Serial.println(", Segunda");
    break;
    case 2:Serial.println(", Terca");
    break;
    case 3:Serial.println(", Quarta");
    break;
    case 4:Serial.println(", Quinta");
    break;
    case 5:Serial.println(", Sexta");
    break;
    case 6:Serial.println(", Sabado");
    }
    }

Pessoal, da uma ajuda ae, eu reduzi a codigo acima, o que o Diego me passo tava muito grande e tava dando problemas, porem ta gravando blz a tensão, so que nao to conseguindo grava a hora e data dentro do arquivo "sensor.txt", tentei chamar a varial que é a "Mostrarelogio", sem ela nao aparece nada, com ela aparece no monitor serial do arduino, mais nao to conseguindo fazer ela gravar no arquivo, onde ta sublinhado, é o problema, alguem pode me ajudar nisso, grato desde já...

Fala Luiz,

Conseguiu resolver o seu código, podeira compartilhar estou precisando de algo parecido com seu, mas ao invéz de gravar dados de tensão, tenho que gravar dados de temp. e umidade do ar em tempos determinados.

Att,

Felipe Mendes

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço