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:
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:
- Repare que os dados dos sensores, delimitados por “Pipes” foram encapsulados em uma String para serem enviados à saída serial;
- 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:
- O campo “sin_id” (chave primária) será incrementado automaticamente a cada inserção;
- A mesma coisa acontecerá o campo “sin_data” que guardará a data e hora em que o sinal foi enviado;
- 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:
- serial – Realiza a comunicação serial
- mysql-conector – Driver de MySQL para Python
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:
- Estou usando a porta 5. Substitua pela porta que você está usando.
- 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!