X

Arduino e Banco de Dados – Comunicação Serial

Neste artigo vamos mostrar como enviar dados coletados de sensores e armazená-los em um banco de dados usando como meio de comunicação a saída serial (porta USB) do Arduino


Nosso projeto de exemplo, vai funcionar da seguinte maneira:

  • A cada 30 segundos o Arduino vai ler os dados do sensor e enviá-los pela saída serial que estará conectada a um computador (porta USB);
  • No computador um script Python vai ficar monitorando a porta serial e, assim que os dados forem detectados, irá gravá-los no banco de dados através de uma conexão TCP/IP aberta para essa finalidade.

Supõe-se que o leitor tenha conhecimentos básicos sobre a teoria de Bancos de Dados Relacionais e MySQL.
No final do artigo relaciono alguns links úteis nesse sentido.

Passo 1: Protótipo Arduino

Para nosso teste vamos usar o sensor de temperatura e umidade DHT11 que nos fornecerá dados de temperatura e umidade

Montagem:

Arduino e Banco de Dados – Comunicação Serial

O sketch ficou da seguinte forma:

// Arduino e Banco de Dados - Comunicação Serial
// 2016, por Jose Augusto Cintra
// www.josecintra.com/blog

#include "DHT.h"         // DHT lib
#define DHTPIN 3         // Pino em que será conectado o sensor
#define DHTTYPE DHT11    // Versão do sensor
DHT dht(DHTPIN, DHTTYPE);// Criação objeto DHT
String sinais; // Variável usada para enviar os sinais
void setup() {
  Serial.begin(9600); //Inicia comunicação serial    
  delay(6000); // Aguarda o sensor armar           
  dht.begin(); // Inicializa o sensor
}

void loop() {
 
  float h = dht.readHumidity();    // Leitura da umidade 
  float t = dht.readTemperature(); // Leitura da Temperatura em Celsius
  // Verificar por erros
  if (isnan(h) || isnan(t)) {    
    return;
  }
  //Linha que envia os sinais do sensor via Serial para gravar no BD
  sinais = String(t) + "|" + String(h);
  Serial.println(sinais);
  delay(30000); //Aguarda 30 segundos

}

Obs:

  1. Repare que os dados dos sensores, delimitados por “Pipes” foram encapsulados em uma String para serem enviados à saída serial;
  2. Como trata-se de um exemplo, para simplificar usamos o comando “delay” na criação de um intervalo de 30 segundos entre as leituras.

Passo 2: Criação do Banco de Dados

Para criar o banco e a tabela, utilizei a ferramenta phpMyAdmin que vem com o uWamp – pacote de instalação do Apache + PHP + MySQL

Crie o banco de dados “exemplo” no MySQL e a tabela “sinais” que receberá os dados do sensor e possuirá a seguinte estrutura:

CREATE TABLE `sinais` (
  `sin_id` int(11) NOT NULL AUTO_INCREMENT,
  `sin_data` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `sin_temp` float NOT NULL,
  `sin_umid` float NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Obs:

  1. O campo “sin_id” (chave primária) será incrementado automaticamente a cada inserção;
  2. A mesma coisa acontecerá o campo “sin_data” que guardará a data e hora em que o sinal foi enviado;
  3. Os campos ‘sin_temp’ e ‘sin_umid’ vão armazenar os dados de temperatura e umidade enviados pelo Arduino através do script em Python.

Passo 3: Script Python

O script Python será instalado no computador e sua função será monitorar a porta serial e, a cada valor detectado, gravar no banco de dados na tabela “sinais” criada no passo anterior.

Para isso, você precisará instalar as seguintes bibliotecas:

Vejamos:

#!/usr/bin/python
# -*- coding: iso-8859-1 -*-
import serial
comport = serial.Serial('COM5', 9600) 
print 'Serial Iniciada...\n'

import mysql.connector
cnx = mysql.connector.connect(user='root', password='root', host='127.0.0.1', database='exemplo')
cursor = cnx.cursor()
add_sinais = ("INSERT INTO sinais (sin_temp,sin_umid) VALUES (%s, %s)")

while (True):
  serialValue = comport.readline()
  data_sinais = serialValue.split("|")
  print data_sinais
  cursor.execute(add_sinais, data_sinais)
  cnx.commit()

cursor.close()
cnx.close()
comport.close()

Obs:

  1. Estou usando a porta 5. Substitua pela porta que você está usando.
  2. O metodo “split” é responsável por separar a String com os sinais e armazená-los separadamente em um array

Juntando Tudo

Depois de criar o banco e upar o sketch para o Arduino, realize a seguinte sequência de passos para ver tudo funcionando:

  • Startar o BD através da ferramenta uWamp;
  • Conectar o USB do Arduino ao Computador;
  • Startar o script Python

Pronto! Para ver o resultado abra o phpMyAdmin e execute o seguinte comando SQL:

SELECT * FROM SINAIS

E então você verá os dados chegando a cada 30 segundos.
Até a próxima!

Referências

José Cintra:
Related Post