Curso sobre Python e Arduino – Parte 4 – Acessando banco de dados

acessar o banco de dados usando Arduino e Python!

Fala moçada, tudo beleza com vocês? Aqui no blog Arduino Ômega já fizemos vários projetos lendo diversos tipos de sensores, porém todos eles consistiam em analisar o ambiente externo ao Arduino através de sensores e já atuar em tempo real, aí surgiu uma questão: e se eu precisar analisar os dados no futuro? No tutorial de hoje vamos aprender a acessar o banco de dados usando Arduino e Python!

Sempre que precisarmos consultar os dados posteriormente, podemos guardar em um Banco de Dados, um local protegido que guarda coisas valiosas, assim como o Banco de Dinheiro, e quando falo de valioso, falo de mais valioso até que dinheiro, ouro ou petróleo, dados hoje é o bem mais valioso da Terra.

Então, sabendo da importância dos dados, conhecendo as possibilidades de uso do Arduino e sabendo da facilidade me desenvolver em Python, nessa parte 4 do nosso mini curso, iremos unir 03 conhecimentos: o nosso querido e conhecido Arduino para sensorear o ambiente, onde em seguida enviará os dados dos sensores para o poderoso Python, que irá tratá-los e conectar-se com um banco de dados MySQL e guardá-los em uma tabela.

Parte 1 – A ideia do projeto com o Arduino

O nosso primeiro projeto com Banco de Dados consiste de fazer a leitura de um sensor que já é nosso conhecido aqui no Blog Arduino Ômega, inclusive já programamos ele com o Raspberry Pi Pico, depois dá uma conferida nesse post também.

Então, voltando para nosso projeto, para aprender a acessar o banco de dados usando Arduino e Python, o Arduino Uno (mas pode ser qualquer outro) irá ler a temperatura e umidade do ambiente e enviar via cabo USB para o computador, onde nele rodará um código em Python (iremos estudar esse código na parte 03 dessa série) que por sua vez estará conectado ao Banco de Dados MySQL (iremos estudar na parte 02 dessa série).

Diagrama conceitual do projeto

1.2 Material Utlizado

O material usado neste projeto é mínimo, usaremos apenas o sensor de temperatura e umidade DHT11 e um Arduino Uno, essas duas peças você encontra em nossa loja do Eletrônica Ômega nos links abaixo:

  1. Arduino Uno
  2. Sensor DHT11

1.3 Mergulhando no cóidgo

O código talvez já seja familiar a você que já acompanha nossos posts, porém adicionei duas novas funções disponíveis na biblioteca do Arduino para esta aplicação, a primeira é a concatenação de strings e a segunda é o “isnan” que verifica se a leitura de umidade do DHT11 é um número válido, então vamos esmiuçar esse código agora.

Primeiramente veja o código completo:

/* 
 * Arduino e Banco de Dados - Comunicação Serial 
 */
#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 para enviar novamente
}

Agora vamos entender as partes principais do código. Na primeira parte temos a importação da biblioteca DHT.h, definição do pino e versão do sensor e instanciação do objeto dht a classe DHT, logo em seguida na linha 08 tem a criação de uma variável do tipo String que será justamente a responsável por receber a string concatenada ao qual mencionei no início deste capítulo.

/* 
 * Arduino e Banco de Dados - Comunicação Serial 
 */
#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

Partindo para a segunda parte do código, dentro do setup, iremos inicializar a comunicação serial na linha 11 e logo na linha 12 sugiro definir um delay de 6 a 10 segundos, pois como a placa Arduino se conectará com o Python, essa conexão pode ter um retardo, caso o código passe rápido por essa instrução já tentando enviar dados, poderá haver um erro de comunicação ao qual irá interromper o processo do Python parando toda a aplicação. Em seguida na linha 13 iniciamos o sensor através do objeto dht.

void setup() {
  Serial.begin(9600);     //Inicia comunicação serial    
  delay(6000);            // Aguarda o sensor armar           
  dht.begin();            // Inicializa o sensor
}

Na última parte do código, as variáveis h e t, recebem respectivamente os valores das umidades e temperaturas lido pelo sensor e na linha 21, antes de enviar para o Python, tem a condicional if que irá testar se pelo menos uma das variáveis é um número válido, caso não seja, entrará no if forçando um return para o início do loop.

Na linha 26, caso o código passe pelo if, será concatenado os valores de t e h formando uma palavra única, ao qual será adicionada a variável sinais e logo em seguida enviado via USB para o Python através da instrução Serial.println().

O delay de 30 segundos, na última linha, é uma opção para que o banco não fique recebendo muitos dados, ou seja, ele será alimentado a cada 30 segundo, então você pode alterar de acordo com sua aplicação.

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 para enviar novamente
}

1.4 Finalizando a primeira parte

Isso ai galera, essa foi a primeira parte sobre como acessar banco de dados usando Arduino e Python. Mas vocÊ pode estar pensando assim: não teve nada de banco de dados até agora!? Calma meu amigos essa foi só a primeira parte! Acredito que as novidades foram poucas, mas aprendemos coisas novas nas próximas partes, como: isnan, concatenação de string e o operador OU com o ||.

Parte 2 – Conectando o Arduino no Python

Chegou a hora de conectar o nosso Arduino com o Python, até já fizemos algo parecido na segunda aula do nosso curso de Arduino com Python, onde desenvolvemos um assistente virtual comandado por voz que liga e desliga o led conectado no Arduino, se você ainda não viu esse projeto te convido a acessar o link e conhecer mais essa aplicação do Python no mundo maker.

A diferença para este projeto, é que no do assistente virtual era o Python que enviava os comandos para o Arduino, já nesse aqui, o nosso programa em Python irá receber os dados dos sensores lidos pelo Arduino.

Então, nesse post iremos conectar o Arduino com o computador pelo cabo USB através do Python, este irá receber os dados enviados pelo Arduino e no primeiro momento irá apresentar essas informações na tela do nosso computador. Na próxima parte, iremos conectar com o banco de dados e salvar esses dados lá.

2.1 Mergulhando no código

Nessa parte 2 vamos desenvolver a primeira parte do código, para que possamos conferir se os dados estão sendo enviados corretamente do Arduino, passando por essa etapa, ai iremos concluir o código em outro post adicionando os dados no Banco de Dados MySql.

import serial

comport = serial.Serial('COM20', 9600)
print('Serial Iniciada...\n')
print("(28.65, 68.99)")

while True:
  serialValue = str(comport.readline())
  characters = "b'"

  for x in range(len(characters)):
    serialValue = serialValue.replace(characters[x], "")

  data_sinais = serialValue.split("|")
  print(data_sinais)

Na linha 01 importamos a biblioteca serial que já é built-in do Python, ou seja, você não precisa instalá-la, ela já vem configurada no ato que você instala o Python.

Na linha 03 um novo objeto está sendo criado, o comport, que irá receber a configuração de conexão da comunicação serial através da classe Serial, nela se passa 02 parâmetros sendo eles: qual porta que seu Arduino se conectou, ou seja, você precisa conectar o Arduino no computador com o código que aprendemos na primeira parte desse projeto e verificar em qual porta ele está conectado, para isso basta fazer como a imagem abaixo:

Ainda na linha 03, segundo parâmetro é em relação a taxa de transmissão da comunicação serial, ela deve estar na mesma velocidade do código Arduino conforme o trecho abaixo:

void setup() {
  Serial.begin(9600);     //Inicia comunicação serial    
  delay(6000);            // Aguarda o sensor armar           
  dht.begin();            // Inicializa o sensor
}

Os dois códigos, Arduino e Python, estando na mesma configuração serial, podemos passar para a linha 04 onde é apenas para informar que a comunicação serial iniciou.

Da linha 06 a 14 temos o laço while principal do código onde ele irá ficar constantemente verificando a porta serial se tem algum dado chegando nela, essa verificação é feita na linha 07, com a função readLine() através do objeto comport que é quem traz a configuração de qual porta deve ser lida. Esse dado lido deve ser transformado no tipo string, str, e salvo em um novo objeto chamado de serialValue.

Como o valor recebido pelo python, originalmente vem no tipo binário, ao convertê-lo para string, surgirá a letra b’ no inicio da string e precisamos tirá-lo logo mais a frente, por isso vamos criar na linha 8 uma variável chamada de characters e atribuir a ela o valor “b’”.

As linhas 10 e 11 é o laço for para retirar o b’ da informação recebida, onde na linha 11 aplica-se a função replace( ) no objeto serialValue que tem o objetivo de substituir caracteres conhecidos de uma string por outro valor, no nosso caso estamos procurando o b’, e substituindo-o por uma valor vazio “”, atenção, isso não é um espaço “ “, e sim vazio, sem nada entre as aspas duplas. E para finalizar essa linha salvamos o resultado novamente no objeto serialValue reescrevendo o valor anterior.

Na linha 13, vamos aplicar mais um recurso de tratamento de strings, na linha anterior aplicamos o replace( ) agora vamos usar o split( ), que nada mais é do que fatiar a string a partir do caracter | que estou recebendo, ou seja, toda vez que encontrar a barra em pé, o código deve separar as frases. Aí você pode estar se perguntando, de onde vem esse “|”? Está sendo enviado pelo Arduino conforme imagem abaixo:

O novo valor, após o fatiamento, será gravado na variável data_sinais e logo em seguida na linha 14 iremos imprimir mostrando na tela o resultado dos dados recebidos.

2.2 Finalizando a segunda parte

Estamos chegando no fim da segunda parte do nosso projeto de como acessar o banco de dados usando Arduino e Python!

Agora é só executar o código e ver o resultado no console do PyCharm, lembrando que o Arduino deve estar conectado na porta USB, o código transferido para ele e o sensor DHT11 instalado e funcionando, para que o Python receba os dados e apresente na tela.

E aí? Tá difícil? Acredito que não, mas sugiro que revise o código, altere os valores, brinque com ele para que você ganhe propriedade, por que na próxima parte iremos estudar algo que ainda não vimos aqui no blog Arduino Ômega, banco de dados, por isso você precisa estar bem familiarizado até essa parte e qualquer dúvida não hesite de comentar aqui, que iremos responder assim que possível.

A minha montagem ficou assim:

Montagem do projeto no fim da parte 2

Parte 3 – Conectando no banco de dados

É isso ai pessoal, finamente chegamos no momento de acessar o banco de dados usando Arduino e Python! Se você nunca usou banco de dados, e nem sabe o que é, não se preocupe, iremos explicar tudo do início sobre esse assunto nessa parte 3.

3.1 O que é Banco de Dados

O banco de dados é responsável por organizar e armazenar as informações sobre um domínio específico, ou seja, é o agrupamento de dados que tratam de um mesmo assunto que tem a necessidade de serem armazenados para segurança ou uma futura conferência.

É comum que vários projetos com Arduino, ou outro sistema embarcado, tenham várias informações que precisem ser organizadas e posteriormente disponibilizadas para a equipe com o objetivo de fazer uma análise dos dados para decisões futuras do processo, seja de forma automática ou manual.


Por esse motivo é que um sistema de gerenciamento de banco de dados, ou conhecido pela sigla SGBD, é fundamental em quase todos os projetos de nível profissional, para conseguir manipular as informações e
tornar a rotina da aplicação do sistema muito mais simples.


Hoje, existem vários tipos de SGBDs, e cada um é adequado para uma aplicação sendo os mais comuns: Oracle, DB2, MySQL, SQL Server e PostgreSQL. Aqui, neste projeto iremos usar o MySQL, porém te convido a pesquisar sobre as outras possibilidades.

3.2 Baixando o XAMPP

Existem várias formas de se instalar o seu banco de dados, nós iremos instalá-lo por meio do XAMPP que é um pacote com os principais servidores de código aberto do mercado, incluindo FTP, banco de dados
MySQL e Apache com suporte as linguagens PHP e Perl, porém só iremos utilizar o MySQL, mas se por acaso você deseje que seus dados sejam mostrados em uma página WEB, o Apache já estará instalado e pronto para usar.

Todo o conteúdo será armazenado numa rede local, logo o acesso aos arquivos é realizado instantaneamente. Atualmente, o XAMPP é disponibilizado nos quatros sistemas operacionais: Windows, Linux, Mac OS X e Solaris, após download basta executar o arquivo .exe para iniciar a instalação, vamos fazer aqui o passo a passo para você acompanhar.

Pesquisando o Xampp no Google

Baixando a versão mais frequente

Executando o instalador

Iniciando a instalação

Basta autorizar o XAMPP para alterar seu computador, em seguida clicar em Yes e daqui para frente é apenas clicando em next, ao término seu XAMPP estará instalado e configurado, para conferir vamos procura- lo dentro das pastas do Windows.

Conferindo onde o XAMPP está instalado

Agora vamos iniciar o XAMPP e verificar se ele está funcionando direitinho, basta pesquisar na barra de tarefas do Windows, executar a aplicação e iniciar o banco de dados, vamos mostrar esse passo a passo também.

Buscando o XAMPP
Executando o XAMPP
Iniciando o MySQL

Se sua tela ficou assim com essas mensagens marcadas de amarelo, é porque está tudo Ok, agora é só partir para o para o próximo tópico, que seria criar o Banco de Dados.

3.3 Criando um Banco de Dados

Agora sim! Chegamos na parte chave do nosso tutorial sobre como acessar o banco de dados usando Arduino e Python!

Para criar o nosso primeiro banco de dados de uma forma mais fácil iremos utilizar o phpMyAdmin que é um administrador de bancos de dados em MySQL, foi desenvolvido para proporcionar um trabalho de gestão e edição de banco de dados com muito mais praticidade nas aplicações. É uma ferramenta, de código aberto e de uso que necessitam de uma interface mais simples, para usá-lo start o apache e depois digite localhost/phpmyadmin em seu navegador, confira o passo a passo nas imagens logo abaixo:

Iniciando o Apache
Abrindo o PHPMyAdmin

Pronto, agora podemos criar o nosso primeiro Banco de Dados, para isso siga o passo a passa das imagens a seguir.

Acesse localhost/phpmyadmin no seu navegador e clique em novo
Dê um nome para o seu banco de dados, no nosso caso o nome foi: banco_arduino
Pronto! O seu banco de dado foi criado com sucesso!
Clique em privilégios e em seguida em Adicionar conta de utilizador
Preencher e marcar conforme a imagem acima

Pronto, agora o seu banco de dados está criado e os dois últimos passos (as duas últimas imagens), foram para definir os privilégios, nome de usuário e senha para acesso ao banco, agora já podemos ir para o ambiente de escrita do código SQL para criar nossa tabela e aprender os principais comandos em SQL, então vamos para a parte 04 do nosso projeto.

3.4 Instruções básicas de SQL

A SQL é uma linguagem padrão para operação de bancos de dados, logo sem a SQL não é possível explorar o armazenamento de dos dados e basicamente essa tecnologia tem as seguintes ações no banco de dados:

  • inserir;
  • excluir;
  • alterar;
  • selecionar;
  • visualizar;
  • juntar;
  • ordenar;
  • mesclar;
  • intercalar.

Iremos trabalhar no programa principal no Python aqui neste post, com a ação de inserir os dados, porém neste tópico vamos aprender a Criar uma tabela, inserir os dados nela e visualizar.

Então para começar vamos abrir o Editor SQL do PHPMyAdmin e iniciar nossa aventura nesse novo conhecimento aqui no Blog Arduino Ômega.

Clique na aba SQL, escreva o comando de criar a tabela e clique em continuar
Confirmando que a tabela foi criada
Volte na aba SQL e escreva a instrução de inserir dados na tabela, e em seguida clique em continuar

Para confirmar, clique no nome da tabela sinais e confira se os dados foram inseridos conforme imagem

Outra forma de visualizar os dados através de instrução SQL

Pronto, isso é o básico do básico, somente o que iremos precisar no nosso projeto, porém o SQL tem muitas outras instruções, caso vocês tenham interesse em aprender mais sobre banco de dados comenta aqui que poderemos fazer um post mais voltado para esse assunto.

Agora vamos pegar o conhecimento adquirido até aqui e integrar tudo isso no nosso código do Python.

3.5 Integrando o SQL no Python

O primeiro passo no nosso script Python é instalar a biblioteca MySQL através do comando pip install mysql-connector-python digitada no seu prompt de comando, você também pode encontrar esse instalador e outros no site pypi.org, no caso da biblioteca que usaremos o endereço é https://pypi.org/project/mysql-connector-python/ .

PYPi

Após instalado chegou a hora de importar a biblioteca, não vamos editar o código passado, como terá algumas modificações além dos acréscimos referentes ao banco de dados, vamos começar do zero e explicar bloco a bloco, assim faremos até uma revisão em relação ao código do post anterior que apenas recebia os dados do sensor e printava na tela do computador.

Abaixo segue o código completo, e depois vamos detalhar cada parte importante:

import serial
comport = serial.Serial('COM20', 9600) 
print ('Serial Iniciada...\n')

import mysql.connector
cnx = mysql.connector.connect(
  user='bancoarduino',
  password='arduino123',
  host='127.0.0.1',
  database='banco_arduino'
)
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()

Na trecho abaixo, é feita a configuração inicial da comunicação serial, onde temos a importação da biblioteca serial na linha 1 e logo em seguida instanciamos o objeto serial a classe Serial passando as configurações da conexão como parâmetros que são: a porta ao qual o Arduino se conectou, terá que conferir na IDE do Arduino e a taxa de transmissão da comunicação serial que foi definida também no código do Arduino. A linha 03 é apenas para informar que a comunicação serial foi iniciada.

import serial
comport = serial.Serial('COM20', 9600) 
print ('Serial Iniciada...\n')

Seguindo no código, temos a configuração inicial do banco de dados, como pode ser visto no trecho abaixo. É feita a importação da biblioteca mysql na linha 5 e na linha seguinte a sua configuração criando um objeto cnx onde este irá receber algumas informações através da função connect( ) referente a conexão com o banco de dados, sendo esses parâmetros descritos de acordo com a criação do banco de dados que fizemos no capítulo anterior, sendo eles:

  • Nome de usuário
  • Senha
  • Onde o banco está hospedado (no nosso caso na máquina local)
  • Nome do Banco de Dados

Na linha 12 crio um objeto chamado “cursor” que será o responsável por abrir e fechar a manipulação no banco, e ele carrega consigo todos os parâmetros do banco de dados através do objeto cnx.

Na linha 13, é a linha responsável por inserir os dados no banco, observe que o comando SQL no Python é idêntico ao que escrevemos no capítulo 04 e tem que ter no mesmo nome das colunas da tabela que criamos, o seja, sin_temp e sin_umid.

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

Seguindo para o loop principal, através do laço while(True), temos na linha 16 a leitura dados dados que estão chegando na porta serial da placa Arduino, em seguida esse texto recebido é fatiado em 02 informações, o caractere de quebra dos dados é a barra em pé, que também é enviada propositalmente pelo Arduino, poderia ser qualquer outro caractere como uma vírgula ou hífen por exemplo.Na linha 18, mostro os dados na tela e logo em seguida, na linha 19, chamo o banco de dados passando dois parâmetros que são: o comando SQL de inserir os dados no banco (add_sinais) e o valor que será inserido (data_sinais).

Por fim, na linha 20 executo o commit.

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

As linhas 22, 23 e 24 são responsáveis por fechar a conexão com o banco de dados:

cursor.close()
cnx.close()

3.6 Conclusão

Ufa! Chegamos ao fim de uma parte do nosso mini curso! Dessa vez aprendemos como acessar o banco de dados usando Arduino e Python! Esse tutorial ficou bem completo! E ai o que vocês acharam? Nos ajude a divulgar este super tutorial ai nos seus grupos de amigos e da escola/faculdade! Deu bastante trabalho para fazer 🙂 Nesse projeto misturamos 3 linguagens em um único projeto! E poderíamos avançar mais e utilizar linguagens PHP, JavaScript, HTML e CSS, para exibir os dados coletados em uma página da web! Você gostaria que a gente avançasse nesse projeto com conteúdo de como publicar dados coletados pelo Arduino na web?

Essa é a última aula do nosso mini curso de Arduino e Python pessoal, vocês pedirem bastante nas nossas redes @arduinoomega e @profsandromesquita, a gente pode fazer um volume 2 do curso com tópicos mais avançados! Só depende de vocês!

Qualquer dúvida, estamos a disposição, foi um prazer participar desse projeto com vocês, TMJ um abraço de Sandro Mesquita e Rodrigo Mesquita.

Sobre Sandro Mesquita 20 artigos
Prof. Sandro Mesquita, Msc. Eng de Software, CREA - 44680 .

Seja o primeiro a comentar

Deixe uma resposta

O seu endereço de email não será publicado.


*