Go Down

Topic: Dúvida em código/programação envio via POST utilizando SIM800L e comandos AT (Read 70 times) previous topic - next topic

joaozz


Boa tarde caros colegas desenvolvedores!

Hoje estou enfrentando um problema tanto quanto curioso... Estou desenvolvendo uma automação  utilizando Arduíno MEGA para envio de informações de forma automática para um servidor web. Irei explicar o meu layout: É realizada uma leitura das informações gravadas em um arquivo do tipo .CSV no cartão SD(ler linha por linha), após a leitura é realizado o envio das informações via método POST utilizando o módulo SIM800L e utilizo os comandos AT para isso. A minha dificuldade está em achar um método efetivo de programação para enviar estas informações lidas linha por linha contidas neste arquivo .CSV dentro do cartão SD passando pelos comandos AT para enviar cada linha lida, não estou conseguindo realizar tal função de envio das informações. Postarei o código para se alguém tiver condição de me ajudar nesta árdua tarefa! Desde já, muito obrigado!!!
Segue em anexo o arquivo utilizado na leitura.

Code: [Select]

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

/* CSV File Reading */
File file;
int SC = 53;  //SC - Pin 53 Arduino Mega
char location;
void envArq();
String Grsp;

SoftwareSerial gsm(10, 11); // RX, TX ()

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(SC)) {
    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 loc, loc2;
  if (Serial.available()) {
    envArq();
  }
}

void envArq() {
  float x, y;
  String loc, loc2;

 Serial.println("Enviando post request");
  delay(2000);
  Serial.println("AT+SAPBR=3,1,\"Contype\",\"GPRS\"");
  gsm.println("AT+SAPBR=3,1,\"Contype\",\"GPRS\"");
  Grsp = gsm.readString();
  Serial.println(Grsp);
  delay(5000);
  Serial.println("AT+SAPBR=3,1,\"APN\",\"claro.com.br\"");
  gsm.println("AT+SAPBR=3,1,\"APN\",\"claro.com.br\"");
  Grsp = gsm.readString();
  Serial.println(Grsp);
  delay(5000);
  Serial.println("AT+SAPBR=1,1");
  gsm.println("AT+SAPBR=1,1");
  Grsp = gsm.readString();
  Serial.println(Grsp);
  delay(6000);
  Serial.println("AT+SAPBR=2,1");
  gsm.println("AT+SAPBR=2,1");
  Grsp = gsm.readString();
  Serial.println(Grsp);
  delay(5000);
  Serial.println("AT+HTTPINIT");
  gsm.println("AT+HTTPINIT");
  Grsp = gsm.readString();
  Serial.println(Grsp);
  delay(5000);
  Serial.println("AT+HTTPPARA=\"CID\",1");
  gsm.println("AT+HTTPPARA=\"CID\",1");
  Grsp = gsm.readString();
  Serial.println(Grsp);
  delay(5000);
  Serial.println("AT+HTTPPARA=\"URL\",\"http://www.ekoblokos.com.br/entradados.php\"");
  gsm.println("AT+HTTPPARA=\"URL\",\"http://www.ekoblokos.com.br/entradados.php\"");
  Grsp = gsm.readString();
  Serial.println(Grsp);
  delay(5000);
  Serial.println("AT+HTTPPARA=\"CONTENT\",\"application/x-www-form-urlencoded\"");
  gsm.println("AT+HTTPPARA=\"CONTENT\",\"application/x-www-form-urlencoded\"");
  Grsp = gsm.readString();
  Serial.println(Grsp);
  delay(5000);
  
  while (readVals(&x, &y, &loc, &loc2)) {

    String string1 = "sensor=" + String(x);
    String string2 = "&sensor1=" + String(y);

    Serial.println("AT+HTTPDATA=28,20000");
    gsm.println("AT+HTTPDATA=28,20000");
    Grsp = gsm.readString();
    Serial.println(Grsp);
    delay(4000);
    Serial.println(string1 + string2);
    gsm.println(string1 + string2);
    Grsp = gsm.readString();
    Serial.println(Grsp);
    delay(3000);
    Serial.println("AT+HTTPACTION=1");
    gsm.println("AT+HTTPACTION=1");
    Grsp = gsm.readString();
    Serial.println(Grsp);
    delay(13000);
  }
  
  Serial.println("AT+HTTPTERM");
  gsm.println("AT+HTTPTERM");
  Grsp = gsm.readString();
  Serial.println(Grsp);
  delay(2000);
  gsm.println("AT+SAPBR=0,1");
  Grsp = gsm.readString();
  Serial.println(Grsp);
  delay(5000);
  Serial.println("Finalizado!");
  
}

hugo007

Boas
Olhando para o conteúdo do teu CSV, penso que o horário e a data é desnecessário ja que se vais enviar isso via POST para algum servidor web no momento que recebes esse POST é super fácil saberes a data e a hora desse evento no lado do server no PHP , antes de tratares os dados ou o gravares numa base de dados, tudo do lado do servidor web.Desta forma a data e hora vai estar sempre correcta, não necessita de ter um RTC local, mudanças horarias ...
Guardar no cartao SD pode também ser redundante, já pensou a cada leitura enviar a temperatura directamente?
Pelo período das amostras vejo que são cerca de 1 segundo o que para temperatura deve ser excessivo, a temperatura nao deve variar assim tao rapidamente.
Se mesmo assim desejar enviar esses dados como estao eu no seu lugar guardaria no SD isso em formato JSON e depois periodicamente lia esse json e enviava via POST para o servidor web.No lado do servidor web fazia o parse do json e tratava os dados ...
Bons estudos
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

Go Up