Boa tarde pessoal, me sinto honrado em poder participar deste grupo, desde já deixo expressa a minha gratidão, mas vamos ao que interessa... Estou construindo uma estação meteorológica com comunicação GPRS e postagem das informações em um servidor WEB.

Já está desenvolvida grande parte do projeto, atualmente a estação é composta por um Arduino Mega, um sensor pluviométrico, um módulo RTC DS3231(Possui sensor de temperatura interno), um módulo de cartão SD de forma a funcionar como um back-up dos dados e um módulo GSM/GPRS SIM800L para realizar a comunicação com o servidor WEB através de comandos AT.

O objetivo do meu trabalho é realizar o monitoramento continuo da quantidade de precipitação(mm) e temperatura(Cº) do local em que será instalada a estação e exibi-los num servidor WEB anteriormente criado.
Todas as informações lidas(Precipitação e temperatura) são armazenadas no cartão SD, o meu problema atualmente está em ler os dados armazenados no cartão SD (armazenados em um arquivo .CSV separados por ",") e enviá-los de forma controlada e correta para o servidor. Preciso realizar a leitura dos dados armazenados de 1 dia e enviá-los. Não estou conseguindo realizar a leitura especifica(de apenas 1 dia) dos dados, apenas consigo realizar a leitura de todos os dados armazenados no cartão SD. 

Alguém teria alguma sugestão? Ou alguem ja passou por este mesmo caso? Desde já muitíssimo obrigado!

Segue abaixo o código que estou utilizando para realizar a leitura dos arquivos dentro do cartão SD:

O código abaixo realiza a leitura de todos os arquivos contidos no cartão SD, no caso, eu quero realizar a leitura controlada e específica dos dados, por exemplo, a leitura de apenas 1 dia de dados armazenados e não a leitura desordenada de todos os dados.

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

/* CSV File Reading */
File file;

bool readLine(File &f, char* line, size_t maxLen) {
for (size_t n = 0; n < maxLen; n++) {
int c = f.read();
if ( c < 0 && n == 0) return false; // EOF
if (c < 0 || c == '\n') {
line[n] = 0;
return true;
}
line[n] = c;
}
return false; // line too long
}

bool readVals(float* v1, float* v2, String* loc, String* loc2) {
char line[200], *ptr, *str;
if (!readLine(file, line, sizeof(line))) {
return false; // EOF or too long
}
*v1 = strtod(line, &ptr);
if (ptr == line) return false; // bad number if equal
while (*ptr) {
if (*ptr++ == ',') break;
}
*v2 = strtod(ptr, &str);
while (*ptr) {
if (*ptr++ == ',') break;
}

String a = strtok_r(ptr, ",", &str);
String first(str);
*loc = first;
String let(a);
*loc2 = let;

return str != ptr; // true if number found
}
/* Close CSV File Reading */

void setup()
{
pinMode(53, OUTPUT);
//SD Card Reader Setup
Serial.begin(115200);
if (!SD.begin(53)) {
Serial.println("begin error");
return;
}
file = SD.open("LOGTESTE.csv", FILE_READ);
if (!file) {
Serial.println("open error");
return;
}
}

void loop() // run over and over
{
float x, y;
String string1, string2, loc, loc2;

while (readVals(&x, &y, &loc, &loc2)) {

string1 = "sensor=" + String(x); // Dados do pluviômetro
string2 = "&sensor1=" + String(y); // Dados do sensor de temperatura
Serial.print(string1 + string2); // Concatenando os dados em uma única string para enviá-los via método POST para o servidor WEB
Serial.println("," + loc + "," + loc2); // Concatenando dados obtidos pelo RTC. loc é a data e loc2 é o horário da leitura
delay(100);
}
}

Segue em anexo o arquivo que estou utilizando como teste para as leituras.

Exibições: 440

Anexos

Respostas a este tópico

Bom dia Amigo!

Desenvolvi um projeto de estação meteorológica apenas para gravar os dados em um SD.

Posso dar uma estudada aqui a respeito de fazer leitura destes dados.

Vou ver o que encontro e lhe retorno.

Att, 

M. L. Nogueira

Dê uma olhada nessa discussão:

https://forum.arduino.cc/index.php?topic=340849.0

Boa tarde amigo, finalmente consegui resolver o problema a partir desse link que me enviastes juntamente com uma biblioteca especifica para envio de arquivos utilizando o sim800L. Desde já muito obrigado!

Caro Murilo, bom dia.

Estou com um problema parecido, consigo gerar o arquivo no cartão SD, criar a pasta no servidor de FTP, mas o arquivo de dados coletados é gravado vazio no servidor de FTP.

Estou usando comandos AT e sei que estou me perdendo em algum momento.

A estação que desenvolvi está pronta, ela anemômetro, anomógrafo, pluviômetro, sensores de temperatura interno e externo, barômetro e medidor de UV, coleta os dados de 5 em 5 minutos, está tudo correto, só não consigo transmitir os dados, os arquivos chegam vazios no destino.

Você poderia me ajudar com orientações ?

Um abraço.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço