Capitulo 8 - Python X IoT - RevFinal
Capitulo 8 - Python X IoT - RevFinal
com
[email protected]
Python x IoT Página 2
LISTA DE FIGURAS
LISTA DE CÓDIGOS-FONTE
SUMÁRIO
8 PYTHON X IOT
Mas, então, o que fazer com todos esses dados? Como transformá-los em
informações, para que possam auxiliar na tomada de decisão, seja ela gerencial,
executiva ou até mesmo legislativa? Pois bem, iremos fazer a persistência dos
dados coletados por dispositivos IoT para que, posteriormente, você utilize o que
aprendeu em Machine Learning ou ainda o que irá aprender em Data Science, para
que possa converter todos esses dados persistidos em informações relevantes, seja
para a empresa, para um projeto pessoal ou até mesmo para um projeto
governamental. Então, vamos lá!
Procure pensar em soluções para você, siga avançando nas ideias até
desenvolver um projeto que talvez possa gerar uma startup e, quem sabe, você
possa ter em mãos o novo “unicórnio” brasileiro, assim como a “99 Taxi”. Também é
importante dizer que a ideia central deste capítulo é estabelecer a comunicação
entre Python e um dispositivo, seja passando ou recebendo dados. Informações
mais detalhadas sobre IoT você encontrará nos capítulos específicos sobre o
assunto.
Primeiro, a proposta pode ser resolvida com qualquer uma das duas
plataformas, a diferença está, primeiramente, no custo, com Raspberry você
investirá quatro ou cinco vezes mais. A segunda diferença é que como o Raspberry
é um microcomputador, ele consome muito mais energia que um Arduino. Se você
optasse por um Raspberry teria que mantê-lo conectado em uma fonte de energia
ou se preocupar frequentemente se a bateria dele não está precisando de carga.
Diferente de um Arduino que, dependendo da aplicação, pode até mesmo se manter
por meio de uma bateria simples por anos. Ou seja, para um projeto como esse, o
ideal seria desenvolver sobre o Arduino mesmo.
Se for Windows:
Se for Linux:
import serial
conexao = serial.Serial('COM3', 115200, timeout=0.5)
Código-fonte 8.1 – Utilizando o pacote “serial”
Fonte: Elaborado pelo autor (2018)
quando todos os dados já estiverem prontos. Se você utiliza uma distribuição Linux,
a segunda linha deveria ser alterada para algo como:
Se você executar o seu código, irá verificar uma mensagem de erro, como a
apresentada na imagem seguinte:
O erro acima representa que a porta “COM3” não está disponível. Esse erro
somente não será apresentado para você, caso já esteja com o Arduino conectado
no seu computador e também se o Arduino estiver conectado na porta COM3. E
quando não sabemos exatamente em qual porta o nosso dispositivo está
conectado? Poderíamos abrir o Arduino Sketch e verificar atrás dele, mas essa ação
ficaria pouco prática. Podemos fazer isso dentro do nosso próprio código Python,
acrescentando as seguintes linhas:
import serial
conexao=""
for porta in range(10):
try:
conexao = serial.Serial("COM"+str(porta), 115200, timeout=0.5)
print("Conectado na porta: ", conexao.portstr)
break
except serial.SerialException:
pass
if conexao!="":
conexao.close()
print("Conexão encerrada")
else:
print("Sem portas disponíveis")
Código-fonte 8.2 – Listando as portas
Fonte: Elaborado pelo autor (2018)
Esse código está próprio para Windows, caso utilize Linux deverá alterar a
linha:
Por:
• conexao = serial.Serial("/dev/ttyUSB"+str(porta),
115200)
• Linha 7: irá abandonar o laço, uma vez que a conexão já foi estabelecida
com sucesso.
• Linha 9: esta linha faz com que o sistema não seja abortado, caso ocorra
a exceção “serial.SerialException”.
• Linhas 10, 11 e 12: se o conteúdo da variável não for vazio (significa que
uma conexão ocorreu com sucesso), irá fechar a conexão e exibir a
mensagem “Conexao encerrada”.
Agora que a estrutura está pronta, vamos desenvolver o código que o nosso
Arduino deverá receber, abra o “Arduino Sketch” e digite o código como apresentado
na imagem:
import serial
conexao=""
for porta in range(10):
try:
conexao = serial.Serial("COM"+str(porta), 115200, timeout=0.5)
print("Conectado na porta: ", conexao.portstr)
break
except serial.SerialException:
pass
if conexao!="":
acao=input("Digite:\n<L> para Ligar\n<D> para Desligar: ").upper()
while acao=="L" or acao=="D":
if acao=="L":
conexao.write(b'1')
else:
conexao.write(b'0')
acao = input("Digite:\n<L> para Ligar\n<D> para Desligar: ").upper()
conexao.close()
print("Conexao encerrada")
else:
print("Sem portas disponíveis")
Código-fonte 8.3 – Código Python para enviar dados
Fonte: Elaborado pelo autor (2018)
void setup()
{
pinMode(10, OUTPUT);
Serial.begin(115200);
}
void loop() {
int intervalo_pisca;
intervalo_pisca=4000;
digitalWrite(10, LOW);
Serial.write('0');
delay(intervalo_pisca);
digitalWrite(10, HIGH);
Serial.write('1');
delay(intervalo_pisca);
}
Código-fonte 8.4 – Código Arduino Sketch para enviar dados
Fonte: Elaborado pelo autor (2018)
• Nas duas primeiras linhas, criamos uma variável para controlar o intervalo
de tempo entre ligar e desligar o led. A unidade de medida utilizada é em
milissegundos, por isso, com 4000 estamos representando de quatro em
quatro segundos.
• Na quarta linha, escrevemos na porta serial o valor “0”, por meio da função
“write()”.
• Nas três últimas linhas, ligamos o led, escrevemos na saída serial o valor
“1” e ativamos a espera.
import serial
conexao=""
for porta in range(10):
try:
conexao = serial.Serial("COM"+str(porta), 115200)
print("Conectado na porta: ", conexao.portstr)
break
except serial.SerialException:
pass
if conexao!="":
while True:
resposta = conexao.read()
if resposta==b'1':
print("LED Ligado")
else:
print("LED Desligado")
conexao.close()
print("Conexão encerrada")
else:
print("Sem portas disponíveis")
Código-fonte 8.5 – Código Python para receber dados do Arduino
Fonte: Elaborado pelo autor (2018)
Dessa forma, conecte o seu Arduino, caso não tenha realizado a transferência
do novo código, faça-a nesse momento e execute o seu código Python. Você verá
que, quando o led acender, o Python irá receber o valor e imprimir a mensagem de
que o led está “ligado”. Quando receber o valor “0”, irá imprimir a mensagem de que
o led foi “desligado” e assim ficará, infinitamente, até que você interrompa o
processo.
Agora, vamos montar mais um exemplo no qual a nossa aplicação Python irá
receber os dados e gravá-los fisicamente em um arquivo “json”. Para isso, vamos
utilizar um sensor de luminosidade LDR (Light Dependent Resistor) que funciona
variando sua resistência elétrica por meio da luminosidade recebida. Isso significa
que quanto mais luz, menor a resistência elétrica e vice-versa. Precisaremos, para o
desenvolvimento desse exemplo, de: um sensor de luminosidade LDR, uma
protoboard, um resistor (marrom, preto, laranja), três cabos machos e a nossa placa
Arduino.
Agora que a ligação está pronta, conecte a sua placa Arduino ao seu
computador e, no Arduino Sketch, digite o seguinte código:
void setup() {
Serial.begin(115200);
}
void loop() {
int luz=analogRead(1);
Serial.println(luz);
delay(5000);
}
Código-fonte 8.6 – Código para retornar valores capturados pelo sensor de luminosidade
Fonte: Elaborado pelo autor (2018)
Em seguida, iremos transmitir para a saída Serial o valor que foi retornado
pelo sensor. Detalhe para a utilização do método “println()” e não o “write()”, devido
ao retorno do dado ser dinâmico em relação ao seu tamanho, ou seja, não
conseguimos precisar a quantidade de caracteres que será retornada pelo sensor.
Assim, utilizaremos “println()”, que é um método mais flexível, e, por fim,
acrescentaremos um tempo de 5 segundos para a próxima captura. Compile e, em
caso de sucesso, transmita o código para a sua placa Arduino.
Agora, vamos para o PyCharm. Crie um novo arquivo do tipo “Python File”,
denominado “Capturar_Temperatura.py”, no qual irá digitar o seguinte código:
import serial
conexao=""
for porta in range(10):
try:
conexao = serial.Serial("COM"+str(porta), 115200)
print("Conectado na porta: ", conexao.portstr)
break
except serial.SerialException:
pass
if conexao!="":
while True:
resposta = conexao.readline()
print(resposta.decode())
conexao.close()
print("Conexão encerrada")
else:
print("Sem portas disponíveis")
Código-fonte 8.7 – Recebendo no Python os dados devolvidos pelo sensor de luminosidade
Fonte: Elaborado pelo autor (2018)
Agora, basta executar a sua aplicação Python. Você verá algum número
provavelmente entre “100 e 999”, quanto menor, menos luminosidade, e vice-versa.
Procure colocar o seu dedo sobre o sensor e observe a alteração do valor que será
exibida. Procure também posicionar a lanterna do celular sobre o sensor e verá que
o número irá aumentar. Agora, iremos realizar uma pequena alteração para que
possamos armazenar os dados em um arquivo, posteriormente. Poderíamos utilizá-
los para realizar médias, montar relatórios com histórico, entre tantas outras ações
com esses dados. Dentro do código anterior, realize as seguintes alterações:
import serial
import json
import time
from datetime import datetime
conexao=""
for porta in range(10):
try:
conexao = serial.Serial("COM"+str(porta), 115200)
print("Conectado na porta: ", conexao.portstr)
break
except serial.SerialException:
pass
if conexao!="":
dicionario={}
cont=0
while cont<10:
resposta=conexao.readline()
dicionario[str(datetime.now())]=[resposta.decode('utf-8')[0:3]]
print(resposta.decode('utf-8')[0:3])
cont+=1
with open('Temperatura.json', "w") as arq:
json.dump(dicionario, arq)
conexao.close()
print("Conexão encerrada")
else:
print("Sem portas disponíveis")
Código-fonte 8.8 – Persistindo dados do sensor
Fonte: Elaborado pelo autor (2018)
• Linha 15: iniciamos um laço que irá repetir o código por dez vezes, o laço
será controlado por meio da variável “cont”.
Agora, cabe a você, com toda a sua criatividade, utilizar diversos sensores
para que possa desenvolver soluções aplicadas para a sua área de atuação
profissional. Por exemplo, você pode desenvolver uma solução que ficará
responsável por verificar a resposta de um IP responsável por algum serviço dentro
da rede, e assim que ele não responder, o seu componente IoT pode disparar uma
sirene, gerar um log, piscar uma luz ou passar um sinal para um aplicativo no
smartphone ou qualquer outra forma de aviso de que o serviço saiu do ar.
REFERÊNCIAS