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.
Tags:
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:
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.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por