quarta-feira, 21 de dezembro de 2016

Arduino e Python: Uma combinação poderosa:

Pessoal cá estou eu novamente em meu blog, esse post é mais uma resposta a um leitor que entrou em contato pedindo ajuda de um alarme com alerta via e-mail. E este é a maneira que une com mais fidelidade a eficácia com a eficiência na missão.Que é utilizar um arduino ethernet shield + um código python específico rodando e toda vez que vir o alerta: PIMBA^^ e-mail enviado...

Umas considerações:
 Luciano, para isso você terá de deixar o computador ligado???
Sim, obviamente.
Mas Luciano, não dá pra fazer com o ethernet shield???
Da também. Mas por que eu optei pelo Python em vez do ethernet shield??? Pelo simples fato que o ethernet é de lua, para email as vezes ele funciona as vezes ele trava, não te dá confiança. Ainda mais se você estiver fazendo algum projeto critico, ahe ferrou de veiz, além do mais, se quiser economizar um pc da pra usar um rasp e ser feliz:)....




Bom agora que definimos o método, vamos primeiro salientar algumas explicações.
1° o que diabos é Python??
Se voce estudou embarcados então deve saber que python é a linguagem do momento, ela se encaixa perfeitamente ao linux e inclusive algumas versões do linux são feitas em python, mas dá pra se usar com o windows também.

o python possui 2 versões, a 2.7 e a 3.5 com as duas linguagens ligeiramente distintas entre si, sugiro aprender a linguagem 3.xx pois por ser mais nova ela tem mais funções,atuaizações etc.
Baixe o python aqui

e depois baixe uma ide para o python, pois ele é tipo um "dos" e sem ide fica ruim programar.
Eu sugiro o pycharm ou o eclipse, sendo que no eclipse você tem que configurar o suporte ao python, ja no pycharm o bagio ja vem pronto.
De qualquer modo pra eu não ficar repetindo as coisas siga esse tutorial de como baixar o eclipse e configurar o python nele aqui

Partindo do pressuposto que você já tem o eclipse configurado ou o pycharm com python e os etcs... Vamos por a mão na massa
primeiro instale a biblioteca pyserial no python, no ubuntu é bem fácil fazer isso, mas no windows é mais dificultoso, mas nada impossível. Siga este tutorial aqui


pronto agora vamos testar:)
No arduino digite um código bem boçal mesmo,so pra ver se fumfa:

---------------------
void setup(){
Serial.begin(9600);
}
void loop(){
Serial.println("11");
delay(500);
Serial.println("15");
delay(500);
}
-----------------------
Ahe depois de compilar esse troço vamos testar o python.
Na ide do eclipse ou pycharm digite:

----------------------------------
import serial
import time

while True:
    a= serial.Serial("COMX",9600)
    mensagem= a.readline()
    print (mensagem)
    time.sleep(0.5)
----------------------
Como vocês podem perceber o python não utiliza ponto e virgula para quebrar a linha, o programa "sabe" o que ta acontecendo por causa da identação, então, se você for copiar o programa e não respeitar os espaços, dará erro. Outra coisa também, eu deixei COMX mas obviamente não é COMX é que o arduino toda vez que pluga escolhe aleatoriamente uma COM no windows, então voce tem que ver qual COM está conectada e trocar ali, COM2, COM3 sei lah.. senão dá erro também..

Se tudo der certo você verá algo como no terminal do eclipse:
b'11\r\n'
meio segundo depois:
b'15\r\n

Ok, os dois programas conversaram. Então podemos realmente fazer o que estamos querendo fazer^^


--------------------------------
Importante salientar que o seu e-mail no gmail tem que ter permissão para que aplicativos de 3 funcionem em
sua conta, senão não irá rolar

veja como fazer isso aqui
O código a seguir ira mostrar um sensor de temperatura, tipicamente um lm35, e se ela subir acima de 30 graus, manda o alerta. Nem preciso dizer que é configurável neah?
Primeiro conecte a saída analógica no lm 35 no pino A0 de seu arduino.

Bom então vamos a bagaça do código no arduino:

-----------------------------------
boolean vetor=LOW;
int sensor=A0;
int led=13;
int valor=0;
void setup(){
pinMode(led,OUTPUT);
pinMode(sensor,INPUT);
Serial.begin(9600);
}
void loop(){
valor= analogRead(sensor);
valor= map(valor,0,1023,0,100);
if (valor>=30 && vetor==LOW){
Serial.println("e");
vetor=HIGH;
digitalWrite(led,HIGH);
delay(500);
digitalWrite(led,LOW);
}
if (valor<=30 && vetor==HIGH){
Serial.println("e");
vetor=LOW;
digitalWrite(led,HIGH);
delay(500);
digitalWrite(led,LOW);
}
}
--------------------------
Pronto, a vogal esta sendo mandada pelo monitor serial, e é apenas isto que o arduino deve fazer. Agora vamos ao Python:
--------------
import time
import serial
import smtplib

TO = 'oemailquequermandar@hotmail.com'GMAIL_USER = 'suacontanogmail@gmail.com'GMAIL_PASS = 'suasenhadogmail'
SUBJECT = 'Alerta!!'TEXT = 'A temperatura subiu acima do toleravel'
ser = serial.Serial('COMX', 9600)


def send_email():
    print("Sending Email")
    smtpserver = smtplib.SMTP("smtp.gmail.com", 587)
    smtpserver.ehlo()
    smtpserver.starttls()
    smtpserver.ehlo
    smtpserver.login(GMAIL_USER, GMAIL_PASS)
    header = 'To:' + TO + '\n' + 'From: ' + GMAIL_USER
    header = header + '\n' + 'Subject:' + SUBJECT + '\n'    print(header)
    msg = header + '\n' + TEXT + ' \n\n'    smtpserver.sendmail(GMAIL_USER, TO, msg)
    smtpserver.close()


while True:
    message = ser.readline()

    print(message)
    if message == b'e\r\n':
        send_email()

        time.sleep(0.5)
----------------------


E pronto, toda vez que a temperatura subir, você receberá um email, e quando ela voltar ao estado inicial, receberá outro e-mail e assim sucessivamente. Com essas informações, você saberá quando o momento exato que entrou e saiu do ponto crítico. E até a próxima.


Nenhum comentário: