Go Down

Topic: Ler dado do DB e executar ação usando condição IF (Read 88 times) previous topic - next topic

DenisRR

Olá!

Preciso que o Arduino abra um dispositivo (trava solenóide), após checar no banco de dados (MySQL - local) qual é o status do dispositivo - 1 livre / 0 bloqueado
As alterações deste status são feitas por um sistema Web (Laravel).
A conexão com o banco de dados está OK, a leitura está sendo feita (testei outros comandos no banco e foi sucesso: insert, alter).
Estou com dificuldades em fazer o Arduino atender à condição (IF) que eu preciso para que a trava seja liberada.
No banco a coluna status está como int(2), pois o projeto prevê termos mais do que 2 status futuramente, escolhi não deixar boolean.
Não sei se o tipo de dado retornado pelo SELECT que estou fazendo não bate com o que estou comparando, mudei algumas vezes, mas ainda assim não foi.

Alguém tem alguma dica sobre o que posso fazer?


Obrigada!

Atualmente o código está assim:
Code: [Select]

#include <SPI.h>
#include <Ethernet.h>
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>

#define TRAVA 13 // Solenoide

byte mac_addr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

IPAddress servidor_bd(192, 168, 0, 114);  // IP do Servidor Mysql
char user[] = "pbl";                      // Usuario do MySQL
char password[] = "";                     // Senha do Usuario MySQL

// Buscar status do armario no banco de dados
//char SELECT_SQL[] = "SELECT status AS NUM FROM pbl.guardians WHERE owner_id = 2";

//teste
char SELECT_TESTE_SQL[] = "SELECT G.status FROM pbl.guardians as G INNER JOIN pbl.rentals AS R ON G.id = R.guardians_id WHERE R.end_at IS null";

// insert teste
//char INSERT_SQL[] = "INSERT INTO pbl.comments (sac_id, user_id, comentario) VALUES (1, 3, 'testando')";

EthernetServer server(80);
EthernetClient client;
MySQL_Connection conn((Client *)&client);

void setup() {
  pinMode(TRAVA, OUTPUT);

  Serial.begin(9600);
  Ethernet.begin(mac_addr);

  if (Ethernet.begin(mac_addr) == 0) {
    Serial.println("Falha ao conectar a rede");
    Ethernet.begin(mac_addr);
  }
  Serial.print("Conectado a rede no ip: ");
  Serial.println(Ethernet.localIP());

  conectaBanco();
}

void loop() {
  delay(2000);

  // Inicia query
  MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
  // Executa query
  cur_mem->execute(SELECT_TESTE_SQL);
  cur_mem->show_results();

  //buscando status do armário e liberando trava
  if (SELECT_TESTE_SQL == '1') {
    digitalWrite(TRAVA, HIGH);
    Serial.println("Porta aberta");
    delay(2000);
    digitalWrite(TRAVA, LOW);
    delete cur_mem;
  }
  else {
    Serial.println("Sem acao");
    delete cur_mem;
  }
}

void conectaBanco() {
  while (!Serial);
  Serial.println("Connecting...");
  if (conn.connect(servidor_bd, 3306, user, password)) {
    Serial.println("Servidor Encontrado");
    delay(1000);
  }
  else
    Serial.println("Conexão Falhou.");
}

bubulindo

Estás a perguntar ao arduino se a string "SELECT G.status FROM pbl.guardians as G INNER JOIN pbl.rentals AS R ON G.id = R.guardians_id WHERE R.end_at IS null" é igual a 1...

É esse o teu problema.

Vê este exemplo em baixo.
https://github.com/ChuckBell/MySQL_Connector_Arduino/blob/master/examples/basic_select/basic_select.ino

particularmente este pedaço de código:
Code: [Select]
  // Read the row (we are only expecting the one)
  do {
    row = cur_mem->get_next_row();
    if (row != NULL) {
      head_count = atol(row->values[0]);
    }
  } while (row != NULL);
  // Deleting the cursor also frees up memory used
delete cur_mem;


This... is a hobby.

Go Up