Offline
Sr. Member
Karma: 0
Posts: 451
|
 |
« on: March 04, 2011, 02:34:20 pm » |
Bonjours a tous, Je début dans Arduino et ses dérivés et je souhaiterais monter dans le futur une install domotique mais pour le moment je souhaite faire un projet tout simple et pourtant je galère pas mal  Je souhaiterais donc pour le moment réaliser le Gmail-notifier avec une LED . J'ai vu que cela étais réalisable avec un code python, mais c'est tout nouveau pour moi ce truc .... J'ai donc récupéré ce code, ce dernier permet de créer un avertisseur de Gmail: import serial, sys, feedparser #Settings - Change these to match your account details USERNAME="xxxx@gmail.com" PASSWORD="xxxxxxx" PROTO="https://" SERVER="mail.google.com" PATH="/gmail/feed/atom" SERIALPORT = "/dev/tty.usbserial-COM3" # Change this to your serial port! # Set up serial port try: ser = serial.Serial(SERIALPORT, 9600) except serial.SerialException: print "no device connected - exiting" sys.exit()
newmails = int(feedparser.parse(PROTO + USERNAME + ":" + PASSWORD + "@" + SERVER + PATH)["feed"]["fullcount"]) # Output data to serial port if newmails > 0: ser.write("m") print "some mail" else: ser.write("n") print "no mail" #print data to terminal
# Close serial port ser.close() Le soucis est que le code python ne fonctionne pas, il ne trouve pas le "serial"  j'ai bien sur mis mon adresse Gmail et mon MDP Pour l'arduino j'ai trouvé ce code: // led wired + to pin 13, resistor to positive +5v
int outPin = 13; // Output connected to digital pin 12 int mail = LOW; // Is there new mail? int val; // Value read from the serial port void setup() { pinMode(outPin, OUTPUT); // sets the digital pin as output Serial.begin(9600); Serial.flush(); mail = HIGH; // start off with lights out }
void loop() { // Read from serial port if (Serial.available()) { val = Serial.read(); Serial.println(val, BYTE);
if (val == 110) // n = 110 in dec { mail = HIGH; // HIGH is off because led is connected to +5v on the other side }
else if (val == 109) //109 = m in dec { mail = LOW; // LOW is on because led is connected to +5v on the other side } }
// Set the status of the output pin digitalWrite(outPin, mail); }
Apparemment ce code devrais être bon  Donc merci a vous de m'aiguiller sur le soucis du code python car j'ai cherché et pour le moment j'ai rien trouvé .... Le prochain projet sera de commander une LED (on/off) a partir d'un autre PC grâce a un code python, ça risque encore de pas être de la tarte :/ merci
|
|
|
|
|
Logged
|
|
|
|
|
France
Offline
Edison Member
Karma: 13
Posts: 1841
There is an Arduino for that
|
 |
« Reply #1 on: March 05, 2011, 04:44:22 am » |
SERIALPORT = "/dev/tty.usbserial-COM3" # Change this to your serial port! Tu es sous Linux? Il faut adapter le nom du périphérique suivant l'OS utilisé.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Sr. Member
Karma: 0
Posts: 451
|
 |
« Reply #2 on: March 05, 2011, 07:25:05 am » |
Non je suis sous win7 c'est pour ça que j'avais mis a la fin "COM3" car mon arduino est sur le port usb nomé COM3 .... "/dev/tty.usbserial-COM3" Je doit donc mettre quoi à la place de ça ? juste COM3 ? merci beaucoup PS: ser = serial.Serial(SERIALPORT, 9600) a la place de SERIALPORT faut-il aussi que je mette COM3 ou je laisse SERIALPORT ? merci
|
|
|
|
« Last Edit: March 05, 2011, 07:28:30 am by chicotore »
|
Logged
|
|
|
|
|
Toulouse - FRANCE
Offline
Newbie
Karma: 0
Posts: 47
|
 |
« Reply #3 on: March 05, 2011, 08:00:11 am » |
Pour checker tes mail en python, c'est plus propre de passer par le protocole IMAP. Actives le dans les paramètres de ton compte, puis voilà une fonction que tu pourras adapter en y ajoutant le serial... #!/usr/bin/env python # -*- coding: utf-8 -*-
import imaplib import re import time
# -------------------------------------------------------------------------------------------------------- #
server = 'imap.gmail.com' port = 993 ssl = True
user = 'adresseemail@gmail.com' password = 'tonmotdepasse'
delay = 5
# -------------------------------------------------------------------------------------------------------- #
def check_unread_number (server, port, ssl, user, password): try: if ssl: connection = imaplib.IMAP4_SSL(server, port) else: connection = imaplib.IMAP4(server, port) except: return {'status' : False, 'error' : u'Unable to connect to server !'} else: try: connection.login(user, password) except: return {'status' : False, 'error' : u'Bad login !'} else: try: reply = connection.status('INBOX', '(UNSEEN)') except: return {'status' : False, 'error' : u'Unable to read INBOX content !'} else: number = re.findall('[0-9]+', reply[1][0]) if len(number) == 1: return {'status' : True, 'number' : int(number[0])} else: return {'status' : False, 'error' : u'Bad result after string manipulation !'}
# -------------------------------------------------------------------------------------------------------- #
while True: values = check_unread_number(server, port, ssl, user, password) if values['status']: print values['number'] else: print 'ERROR : ' + values['error'] time.sleep(delay) Et tu peux modifier la condition dans la boucle, genre si il y a des mails, tu envois 1 (allume la LED verte et éteint la rouge) au lieu d'afficher le nombre, 0 si aucun (éteint la LED verte et la LED rouge) et 2 si une erreur (éteint la verte et allume la rouge). Au moins, même si erreur de connexion... EDIT : SERIALPORT est une variable. Tu dois la changer par la valeur... Soit ton port COM, mais étant sous Linux je ne peux pas t'aider pour ça. Regarde sur Google, tu dois trouver facilement je pense.
|
|
|
|
« Last Edit: March 05, 2011, 08:07:48 am by Darel »
|
Logged
|
|
|
|
|
Offline
Sr. Member
Karma: 0
Posts: 451
|
 |
« Reply #4 on: March 05, 2011, 09:07:12 am » |
Merci a toi mais en fait j'ai découvert python depuis hier et encore le code que j'ai posté je vois a peut prêt le cheminement, autant le tient  outchh c'est complexe  Je croit que je vais finnalement investir dans un ethernet shield, ça m'a l'air bien plus simple que de passer par un "truc" en python  J'ai cherché pour les ports mais a chaque fois c'est pour Linux, jamais sous windows :/ merci +++
|
|
|
|
|
Logged
|
|
|
|
|
Toulouse - FRANCE
Offline
Newbie
Karma: 0
Posts: 47
|
 |
« Reply #5 on: March 05, 2011, 09:15:48 am » |
C'est dommage, python est un langage formidable  ! Je te file un lien au cas ou un jour (J'ai appris les base en 2 jours avec, et depuis... J'ai du mal à m'en passer  !) : http://www.swaroopch.com/notes/Python_fr:Table_des_Mati%C3%A8resPython + Arduino, je peux te dire que c'est de la pure tuerie  ! Après, à chaque problème, il est vrai qu'il existe différentes solutions, certaines plus simple que d'autres. J'ai regardé un peu pour le port COM sur Windows, je pense que oui, COM3 doit passer. Cf. : http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1235512781Bonne continuation.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Sr. Member
Karma: 0
Posts: 451
|
 |
« Reply #6 on: March 05, 2011, 09:27:16 am » |
Voila l'erreur obtenu : Traceback (most recent call last): File "C:\Python27\checkgmail.py", line 1, in <module> import serial, sys, feedparser ImportError: No module named serial En lançant ce code: import serial, sys, feedparser #Settings - Change these to match your account details USERNAME="xxxxxxxxx@gmail.com" PASSWORD="xxxxxxxx" PROTO="https://" SERVER="mail.google.com" PATH="/gmail/feed/atom" SERIALPORT = "COM3" # Change this to your serial port! # Set up serial port try: ser = serial.Serial(COM3, 9600) except serial.SerialException: print "no device connected - exiting" sys.exit()
newmails = int(feedparser.parse(PROTO + USERNAME + ":" + PASSWORD + "@" + SERVER + PATH)["feed"]["fullcount"]) # Output data to serial port if newmails > 0: ser.write("m") print "some mail" else: ser.write("n") print "no mail" #print data to terminal
# Close serial port ser.close()
|
|
|
|
|
Logged
|
|
|
|
|
Toulouse - FRANCE
Offline
Newbie
Karma: 0
Posts: 47
|
 |
« Reply #7 on: March 05, 2011, 09:37:38 am » |
Le module serial n'est pas installé pour ta version de python. Normal que ça ne marche pas  ! Il faut que tu aile voir du coté de : http://sourceforge.net/projects/pyserial/files/pyserial/2.5/Télécharge pyserial-2.5.win32.exe, installe le, et normalement... Magie !
|
|
|
|
|
Logged
|
|
|
|
|
France
Offline
Edison Member
Karma: 13
Posts: 1841
There is an Arduino for that
|
 |
« Reply #8 on: March 05, 2011, 09:45:18 am » |
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Sr. Member
Karma: 0
Posts: 451
|
 |
« Reply #9 on: March 06, 2011, 05:07:49 am » |
Ah merci  Il me manquait donc bien pyserial et feedparser que je vient d'installer et le code se lance enfin a peut prêt  Il me reste l'histoire des ports a solutionner, je vais lire le petit truc sur pyserial histoire de trouver la soluce Traceback (most recent call last): File "C:\Python27\checkgmail.py", line 11, in <module> ser = serial.Serial(COM3, 9600) NameError: name 'COM3' is not defined merci PS: bon apparement c'est bien COM3 qu'il faut mettre pourtant .... Il n'y aurait pas un paramètre a régler dans pyserial par hasard pour "router" les ports COM ou quelque chose dans le genre ? merci a vous et désolé avec mes questions de noobs 
|
|
|
|
« Last Edit: March 06, 2011, 05:23:23 am by chicotore »
|
Logged
|
|
|
|
|
Toulouse - FRANCE
Offline
Newbie
Karma: 0
Posts: 47
|
 |
« Reply #10 on: March 06, 2011, 05:50:57 am » |
La par contre, je suis incapable de te répondre.
Dis toi que l'on commence tous un jour, donc forcément, on y passe tous par cette phase de "noob"... Mais il ne faut pas oublier que Google est là avant de poster sur les forums !
Bonne continuation.
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Jr. Member
Karma: 0
Posts: 59
Arduino rocks
|
 |
« Reply #11 on: March 06, 2011, 06:36:42 am » |
Attention chicotore, si tu es sous Windows (apparemment ?) ce n'est pas SERIALPORT = "/dev/tty.usbserial-COM3" # Change this to your serial port! /dev/tty.usbserial-COM3 devient autre chose sous Windows, je ne sais plus quoi en revanche ça m'échappe, désolé J'ai l'impression que c'est ça que tu as laissé ? Le gestionnaire de périphérique te dit certainement où est branché l'arduino, COM3 aussi d'après ce que tu dis.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Sr. Member
Karma: 0
Posts: 451
|
 |
« Reply #12 on: March 06, 2011, 07:11:11 am » |
Salut, J'ai mis ça en fait: SERIALPORT = "COM3" # Change this to your serial port! C'est ce qui été écrit dans le "FAQ" de pyserial mais a priori ça marche pas :/ je retourne a chercher sur google au cas ou j'aurais zapé un truc  merci
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Sr. Member
Karma: 0
Posts: 451
|
 |
« Reply #13 on: March 06, 2011, 08:11:47 am » |
Bon bah voila ça fonctionne, j'ai retaper COM3 et cette fois il c'est mis en vert et ça "fonctionne"  Reste un soucis, il fonctionne sous le GUI python avec "Run module" mais si je le lance dans la console python ça plante grrrrrr  Le fait qu'il ne tourne que dans le GUI ne me dérange pas trop mais en fait il ne fait qu'un seul "checkmail" et ensuite s’arrête, j'aimerais bien qu'il tourne constamment moi pour checker mes mails toute la journée .... Est ce que cela vient du fait que le code soit lancé dans le GUI et non dans la console ? ou cela vient du code python auquel il faudrait intégré un "loop" ? J'ai aussi refait un code pour l'arduino car a la base la LED est allumé et elle s’éteint brièvement lorsqu'un mail arrive. Moi je cherche a faire en sorte que la LED reste éteinte (ça c'est ok ) et quelle clignote lorsqu'un mail arrive et qu'elle reste clignotante jusqu’à ce que le mail soit supprimé ... // led wired + to pin 12, resistor to positive +5v
int outPin = 13; // Output connected to digital pin 12 int mail = LOW; // Is there new mail? int val; // Value read from the serial port void setup() { pinMode(outPin, OUTPUT); // sets the digital pin as output Serial.begin(9600); Serial.flush(); mail = LOW; // start off with lights out }
void loop() { // Read from serial port if (Serial.available()) { val = Serial.read(); Serial.println(val, BYTE);
if (val == 110) // n = 110 in dec { mail = HIGH; // HIGH is off because led is connected to +5v on the other side }
else if (val == 109) //109 = m in dec { mail = LOW; // LOW is on because led is connected to +5v on the other side delay(1000); mail = HIGH; // LOW is on because led is connected to +5v on the other side delay(1000); } }
// Set the status of the output pin digitalWrite(outPin, mail); }
Le soucis est que ma LED est bien éteinte en permanence mais a l'arrivé d'un mail elle s'allume une seul fois et ensuite elle ce ré-éteins alors que j'ai mis une fonction de clignotement dedans et en boucle .... merci a vous
|
|
|
|
|
Logged
|
|
|
|
|
Toulouse - FRANCE
Offline
Newbie
Karma: 0
Posts: 47
|
 |
« Reply #14 on: March 06, 2011, 08:20:15 am » |
1. C'est pas comme ça qu'on lance un script Python. Ajoute le répertoire d'installation de Python à ton PATH (une variable d'environnement), ensuite pour lancer le script : python C:\Python27\checkgmail.py Et pour faire encore mieux, regarde pour le mettre en service Windows, ça permet de le lancer automatiquement au démarrage, et en tâche de fond (pas de fenêtre de l'invite de commande...). 2. C'est exactement ce que fait mon programme, dans le tiens il te manque une boucle infinie avec un sleep (une sorte de "delay" comme sur l'Arduino).
|
|
|
|
|
Logged
|
|
|
|
|
|