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

14 comentários em “Arduino e Banco de Dados – Comunicação Serial”

  1. olá, estou tendo problemas em adicionar as bibliotecas que você
    sugeriu, tem alguma forma de me ajudar?

    1. Olá João!
      Relate o seu problema. Se puder me envie a mensagem de erro.
      Se quiser detalhar melhor, envie para meu email:josecintra@josecintra.com

  2. Bom dia José,
    estou tentando fazer o teste com o mesmo sensor, porém da alguns erros já no código do arduino, estou finalizando o tcc e preciso muito disso, se tiver outra forma de contato mais rápida agradeço 😀

  3. Olá Gostei de seu projeto de monitoramento de energia elétrica com o arduino e o outro módulo, mas gostria de interligá-lo de maneira que os dados coletados akimentassem um BD, vc teria uma dica valiosa pra me passar pra que eu faça desta forma ?
    Será que utilizando op primeiro projeto de medição de consumo, e utilizando a serial como este acima conseguiria conjugar os dois ?
    O que estava procurando mesmo seria um que utilizasse a ethernet shield, para publicar na web.

    1. Olá Flavio!
      Sim, é possível juntar os dois códigos.
      Através do Software Serial é possível usar mais de uma comunicação serial

  4. Rodei o script mas está dando o seguinte erro:
    Traceback (most recent call last):
    File “C:/Users/Angelo/Desktop/Teste Banco de Dados 1.py”, line 14, in
    data_sinais = serialValue.split(“|”)
    TypeError: a bytes-like object is required, not ‘str’

    1. Fala Angelo, como vai meu amigo.
      Tive o mesmo problema e resolvi acrescentando (b’) na frente. Não me aprofundei no erro mas acredito que esteja relacionado com a versão do Python.

      o Script ficou assim :
      X.split(b’,’)
      Onde:
      X – É a tua variável
      , – É o sinal que escolhi para servir de separador.

      Abraços e Sucesso

      1. Tenho um pequeno erro a enviadar dados para o banco de dados
        psycopg2.errors.SyntaxError: syntax error at or near “%”
        LINE 1: …T INTO core_readdata (humidity,temperature) VALUES (%s, %s);

  5. Boa noite
    José Cintra estou em uma pesquisa que foca justamente este assunto que você aborda aqui e mais a utilização de dois sensores. o Mq7 e Mq9, para medição de monóxido de cabono e metano (poluição). e gostaria de saber como posso implementar estes sensores neste código que você postou aqui?

    1. Esses sensores são mais fáceis de usar, pois não precisam de biblioteca. Você pode usá-los tanto com a interface digital quanto analógica.
      Para colocá-los no código, voce vai substituir a leitura do sensor de temperatura pelos sensores desejados.
      Como são dois sensores, terá que fazer duas vezes o processo.
      Veja aqui um tutoprial para usar esses sensores: https://portal.vidadesilicio.com.br/sensor-de-gas-mq-135/

      1. José Cintra .. Show
        Só que em minha pesquisa eu vou usar o sensores tambem dec temperatura e umidad e os de gazes mq7 e mq9 no mesmo código, ou seja vou ler estes 4 valoes e jogar no banco. Então é somente juntar no códugo não é?
        E mais uma vez muito obrigado.
        Eumazio.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *