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!
olá, estou tendo problemas em adicionar as bibliotecas que você
sugeriu, tem alguma forma de me ajudar?
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
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 😀
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.
Olá Flavio!
Sim, é possível juntar os dois códigos.
Através do Software Serial é possível usar mais de uma comunicação serial
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’
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
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);
O script em python eu salvo em qual lugar? ou coloco no mesmo arquivo arduino?
O Script Python pode ficar em qualquer pasta.
Obrigado pela ajuda. Que DEUS continue abençoando a tua caminhada. Obrigado!
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?
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/
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.