Page 2 sur 6
Re: Projet mini automate de contrôle
Posté : mer. 29 avr. 2015 16:02
par Cluclu
La solution de la date marche nickel merci beaucoup
Actuellement je cherche à lancer mon script principal via un mini script qui tournera en tache de fond au lancement du PI
J'ai essayé la fonction exec() mais pas concluant, j'ai testé aussi subprocess mais rien non plus
En gros le fichier 1.py sera lancé au démarrage du PI et le 2.py se lancera quand la condition du script 1.py sera vraie
Merci d'avance
Re: Projet mini automate de contrôle
Posté : mer. 29 avr. 2015 18:10
par dbrion0606
Excusez moi, mais mes talents de télépathe sont très limités et je serais curieux de voir ce qu'il y a dans script1.py et script2.py (peut être devriez vous leur donner des noms évoquant leur fonction, pour pouvoir les réutiliser/dépanner/faire évoluer dans 6 mois...), ce pour savoir :
* s'ils partagent des variables ,
* si l'execution de l'un bloque l'autre (sinon, pourquoi ne pas en faire une fonction, tout bêtement)
* voire même, trivialement, s'ils sont bien écrits (autant partir sur des bases à peu près saines)
A noter que la grille de saisie de ce forum offre des possibilités d'inclure du code, en respectant les indentations qui font l'étrange charme de python et que vous gagneriez du temps (le prix d'un copié collé ) et vos lecteurs/correcteurs potentiels aussi (n'auraient pas à deviner ce que vous avez fait et se concentreraient sur l'essentiel )
Re: Projet mini automate de contrôle
Posté : mer. 29 avr. 2015 18:29
par Cluclu
Voilà le code de mon fichier :
Code : Tout sélectionner
import time
aux=time.strftime("Le %d/%m/%Y à %H:%M")
import pifacedigitalio as pi
pi.init()
while pi.digital_read(7) ==1 :
if pi.digital_read(0) == 1 :
# print(aux)
print("Alarme SMART Surcharge Transfo")
print("------------------------")
pi.digital_write(0, 1)
else :
pi.digital_write(0 ,0)
if pi.digital_read(1) == 1 :
# print(aux)
print("Déclenchement SMART")
print("------------------------")
pi.digital_write(1, 1)
else :
pi.digital_write(1 ,0)
if pi.digital_read(2) == 1 :
# print(aux)
print("Défaut Equipement")
print("------------------------")
pi.digital_write(2, 1)
else :
pi.digital_write(2 ,0)
if pi.digital_read(3) == 1 :
# print(aux)
print("Déclenchement départ n°1")
print("------------------------")
pi.digital_write(3, 1)
else :
pi.digital_write(3 ,0)
if pi.digital_read(4) == 1 :
# print(aux)
print("Déclenchement départ n°2")
print("------------------------")
pi.digital_write(4, 1)
else :
pi.digital_write(4 ,0)
if pi.digital_read(5) == 1 :
# print(aux)
print("Déclenchement départ n°3")
print("------------------------")
pi.digital_write(5, 1)
else :
pi.digital_write(5 ,0)
if pi.digital_read(6) == 1 :
# print(aux)
print("Déclenchement départ n°4")
print("------------------------")
pi.digital_write(6, 1)
else :
pi.digital_write(6 ,0)
if pi.digital_read(7) == 0 :
print("Coupure Utilisateur")
L'entrée 7 de ma carte Piface 2 est relié à un commutateur ON/OFF
Je voudrais qu'au démarrage de Raspbian, un script tourne en tache de fond afin de regarder l'entrée 7. Si elle passe à 1 il lance le script que j'ai mis en code ci dessus, sinon il attends.
En parallèle de ça il me reste à inclure la fonction "clear" dans le script du dessus pour éviter d'avoir des lignes en doubles sur l'affichage IDLE et associer l'arrêt propre du PI lorsqu'on repasse le commut sur OFF après un délais de 5/6 secondes
Re: Projet mini automate de contrôle
Posté : mer. 29 avr. 2015 19:21
par dbrion0606
Déjà, votre tâche de fond doit boucler, en scrutant toutes les 1/10 secondes (par exemple), l'état d'un interrupteur
Je verrais la boucle de scrutation suivante:
Code : Tout sélectionner
faire toujours :
dormir 1/10 seconde (time.sleep(0.1), ceci pour ne pas utiliser du CPU bêtement
si interrupteur de démarrage actif ET si le script n'a pas été déjà lancé:
lancer le script de visualisation (s'il y a un utilisateur connecté)
noter qu'il a été lancé
Option 1 : le script de visualisation gère le piface
si le script de visualisation a détecté qu'il y a un bouton d'arrêt pressé et qu'il a créé un fichier
détruire ce fichier (qui sert à transmettre un message par sa présence)
executer sudo halt -pi (arret du RPi)
Ou (le script de visualisation ne fait que de la visualisation)
ecrire dans un "named pipe" les messages au lieu de les sortir sur la console (le script de visualisation les lira dans l'ordre où ils ont été émis, et se contentera de les afficher.
Un "named pipe" est un tyau permettant de transmettre les informations de la tâche de fond à la tâche de visualisation -par exemple- : une explication en est donnée en http://www.roman10.net/named-pipe-in-linux-with-a-python-example/ (à noter que l'exemple est plus complexe , car les deux tâches dialoguent dans les deux sens -ici, je crois qu'il ne faut que donner l'état des boutons - et doit être adapté -sinon, il y a blocage si on écrit et que le lecteur n'est pas prêt-
A noter que, dans la parie visualisation, vous n'avez peut être pas besoin de la rafraîchir tout le temps , mais uniquement quand l'état a été modifié -ceci évite d'avoir un écran scintllant, qui est très fatiguant-
Re: Projet mini automate de contrôle
Posté : jeu. 30 avr. 2015 08:03
par Cluclu
Pour le time.sleep() pas de souci, pour le reste j'ai pas trop compris comment faire une liaison entre celui qui tourne en tache de fond et celui qui attends d'être lancé
Re: Projet mini automate de contrôle
Posté : jeu. 30 avr. 2015 09:02
par dbrion0606
La tâche de fond (qui nécessite un accès root par sudo) envoye ses données (en l'occurrence des lignes de texte) dans un "fichier" qui est lu par la tâche d'affichage.
Je pense qu'un fichier spécial du type "named pipe" -j'ai demandé à google 'named pipe python' - serait approprié (avec quelques points dont je ne suis pas sûr : doit on le rendre -option par défaut- blocant : si l'afficheur n'est pas prêt, la tâche de fond attend que l'afficheur se réveille ou pas? doit on transmettre l'état à une cadence rapide (0.1 seconde générera des cligotements sur l'afficheur, ce qui est désagréable) ou les modifications de l'etat -a priori, sauf tremblante du mouton, le rafraichissement serait plus agréable- ?
Modifié
que fait la ligne python suivante chez vous (je sais ce que ça fait sous cygwin, cf
http://ascii-table.com/ansi-escape-sequences.php)
print "\033[2J\033[1m lll"
et
print "\033[2J\033[0m lll"
Re: Projet mini automate de contrôle
Posté : jeu. 30 avr. 2015 09:43
par Cluclu
Dans IDLE la ligne print "\033[2J\033[1m lll" donne
[2J [ 1m lll la ligne print "\033[2J\033[0m lll" donne
[2J [ 0m lll 
Re: Projet mini automate de contrôle
Posté : jeu. 30 avr. 2015 11:23
par Cluclu
J'avance doucement,
J'ai réussi à faire le clear dans ma boucle avec un délais de 1sec pour éviter le scintillement.
Mon script python se lance après double clic dans une fenetre de terminal, bien plus propre et lisible pour mon projet.
Il me reste donc à voir le lancement automatique avec la tache de fond. L'utilisateur branche la maquette, celle ci arrive sur le bureau Raspbian. L'utilsateur n'a qu'un commutateur ON/OFF pour dialoguer avec le PI. Lorsqu'il passe le commut sur ON la tache de fond devra lancer le script python. Quand il repassera le commu sur OFF le script s'arrête et le PI s'éteint proprement, je vais rajouter un poussoir à retour sur l'alim +5 du PI pour pouvoir le relancer rapidement (équivalent à retirer la prise et la remettre quand il est éteint)
Re: Projet mini automate de contrôle
Posté : jeu. 30 avr. 2015 11:33
par dbrion0606
J'ai demandé à google ce donne "idle clear screen" et .. les résultats ne sont pas glorieux (idle étant un environnement de développement ne reconnaîtrait pas les séquences de contrôle de terminal). Que se passerait il si vous tapiez/copiiez-colliez :
Code : Tout sélectionner
echo print \"\\033[2J\\033[0m lll\" | python # notez les doubles escapes garantissant la transmission idoine depuis le shell jusqu'à python...
dans lxterminal (avec xterm, je suis presque sûr que ça fonctionnera comme chez moi, mais il faut l'installer sous rapsbian IIRC 'apt-get install xterm')
Re: Projet mini automate de contrôle
Posté : jeu. 30 avr. 2015 16:09
par Cluclu
J'ai réussi à mettre une tache de fond au démarrage. Pour le moment elle scrute l'entrée 8 de ma carte et allume une LED ou l'éteint selon l'état du commutateur.
Toujours pas réussi à lancer le script python dans un terminal à partir d'un autre script.
Pour ta ligne de code dbrion0606 je fais le test sous IDLE ou dans LXTerminal ?
Edit : Dans LXTerminal j'obtiens une ligne vide puis 111 à la ligne du dessous