Armazenado QUERY para envio posterior no Arduino wifi

Bom dia Srs, 

Estou com dificuldades em entender como poderia fazer para armazenar uma QUERY caso a conexao com o banco de dados seja interrompida.

Meu projeto consistem e salvar a cada 10 segundos um valor no banco, e caso a conexão caia, esta query deve ser armazenada na fila para envio quando a rede retornar.

Atualmente utilizo o código abaixo com a lib do ChuckBell.

#include <Ethernet.h> 
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>
byte mac_addr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server_addr(10,0,1,35); // IP of the MySQL *server* here
char user[] = "root"; // MySQL user login username
char password[] = "secret"; // MySQL user login password

int status_banco; // variavel que recebe status banco, 0 para nao disponivel e 1 para disponivel.
unsigned long millisTarefa1 = millis();

// Query de dados
char INSERT_SQL[] = "INSERT INTO test_arduino.hello_arduino (message) VALUES ('Hello, Arduino!')";
EthernetClient client;
MySQL_Connection conn((Client *)&client);

void setup()
{
Serial.begin(115200);
while (!Serial);
Ethernet.begin(mac_addr);
Serial.println("Connecting...");
func_conecta_banco();
}

void loop()
{
func_conecta_banco();

if((millis() - millisTarefa1) < 10000)
{

if (status_banco == 1)
{
func_salvar_dados(); // função que executa a query
}
if (status_banco == 0)
{
// nesse ponto cria a fila de query
}
}
}

void func_conecta_banco();
if (conn.connect(server_addr, 3306, user, password))
{
status_banco = 1;
delay(1000);
} else {
Serial.println("Connection failed.");
status_banco = 0;
}

void func_salvar_dados()
{
Serial.println("Salvando dados");
MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
cur_mem->execute(INSERT_SQL);
delete cur_mem;
}



Exibições: 178

Responder esta

Respostas a este tópico

Renan, boa noite!

É meio complicado de arrumar uma solução.

Vc poderia usar arrays de Strings para armazenar as Queries. Mas isso poderia ocupar muito espaço em memória.

Não se sabe quanto a tempo a rede vai demorar para subir e podem acumular muitas queries na fila.

Uma solução para economizar memória é a seguinte: A sua query é sempre a mesma, só mudam os parâmetros, correto?

Então vc poderia guardar somente os parâmetros em um array e montar as queries na hora da execução.

Outra solução é guardar esses parâmetros todos em um cartão SD. Dessa forma não ocuparia espaço na memória.

Quando a rede estiver ok, você leria os dados do cartão e apagaria depois da leitura.

Um cartão SD tem espaço suficiente para armazenar muitos valores.

Poderia guardar também na EEPROM, mas no SD acho melhor, apesar de ficar mais caro o projeto.

Bom dia Jose A.
Pois é, me preocupo um pouco com a demora da rede mesmo, mas creio que se eu conseguir guardar até uns 50 registros esta excelente.

Quanto a sua sugestão:
"Então vc poderia guardar somente os parâmetros em um array e montar as queries na hora da execução."
É ai que nao consegui evoluir, como eu poderia fazer pra escrever esse trecho do código?

Qualquer ajuda é muito bem vinda!

Tenha um bom dia e um excelente final de semana.

Obrigado.

Renan, bom dia!

No seu código de exemplo, a sua query está como:

"INSERT INTO test_arduino.hello_arduino (message) VALUES ('Hello, Arduino!')"


Mas, provavelmente, esse um teste que vc fez que está armazenando um valor fixo na tabela "hello_arduino" do banco 'test_arduino".
No sketch real, você deve montar uma query em que vai guardar outros valores nos campos. Valores de sensores talvez.

Não sei os detalhes do projeto.
Para te ajudar, precisaria saber como vai ser a query real, os campos e as variáveis que vai usar para montar a query.
Dessa forma, posso te dar umas dicas.

Bom dia José A.
Sim, segue abaixo o trecho da query.

char INSERT_SQL[] = "INSERT INTO arduino.tab_registro_caldeira (maq,analog_1,analog_2,analog_3,analog_4) VALUES ('%d','%d','%d','%d','%d')";
char query[512];

O comando envia valor do tipo int nas variáveis:
int maq, analog_1, analog_2, analog_3, analog_4; 

e a cada tempo executa a query:

void salvar()
{
sprintf(query, INSERT_SQL, maq, analog_1, analog_2, analog_3, analog_4);
MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
cur_mem->execute(query);
delete cur_mem;
}

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço