antoine_45170 | Bonjour à tous, J'ai pu appréhender le langage python à travers un projet qui consiste à allumer des LEDs dans un meuble de rangement pour indiquer la position de différents articles. Le programme marche sans aucun soucis lorsque l'ordinateur est en fonctionnement, c'est à dire que lorsque la session est lancée, et que j'appelle le script via une commande linux "python main.py" tout fonctionne parfaitement. Mon problème réside dans le fait que j'aimerai lancer automatiquement ce programme au boot de l'ordinateur. Dans ce cas, une erreur s'affiche "EOFError : EOF when reading a line" à la suite d'un input() (ligne 107). Je n'arrive pas bien à saisir ce qui change entre lancer le programme automatiquement au démarrage de l'ordinateur et le lancer manuellement. Je ne suis pas convaincu que l'intégralité du code vous intéresse mais je le poste tout de même au cas où. Merci d'avance pour votre aide
Code :
- # coding=utf-8
- import time
- time.sleep(15)
- #Boucle infini permettant de faire tourner le programme en continu
- while True :
- #IMPORT DES BIBLIOTHEQUES
- #L'ajout de ces deux bibliothèques permet de gérer l'acquisition des données
- #et de sortir du programme en fin d'acquisition
- import sys
- import select
- # La bibliothèque time permet de réaliser des delay avec time.sleep
- #import time
- # La bibliothèque Adafruit_CharLCD permet de piloter l'écran LCD
- import Adafruit_CharLCD as LCD
- #La bibliothèque RPi.GPIO permet d'utiliser les pins du GPIO pour envoyer un signal haut ou bas
- import RPi.GPIO as GPIO
- #Bibliothèque permettant de lire dans un fichier Excel
- import xlrd
- #OUVERTURE DE LA BASE DE DONNEE EXCEL
- #Ouverture du document Excel
- document = xlrd.open_workbook("/home/pi/Base.xlsx" )
- #On se place sur la feuille 1
- data = document.sheet_by_index(0)
- #On compte le nombre de lignes que comportent notre base de données,
- #ce qui équivaut à évaluer le nombre de références
- nbr_lignes = data.nrows
- #CONFIGURATION DU GPIO ET DES LEDS
- #On définit ici la façon dont les pins du GPIO seront appelées
- #GPIO.BOARD correspond au nommage des pins de 01 à 40
- #GPIO.BCM correspond au nommage des pins selon leur nom (numéro après GPIO)
- GPIO.setmode(GPIO.BCM)
- #Toutes les erreurs qui n'empêchent pas la compilation et l'éxécution du programme seront négligées
- GPIO.setwarnings(False)
- #Création de variables LEDx stockant les pins reliées aux LEDs
- LED1 = 21
- LED2 = 20
- LED3 = 16
- LED4 = 26
- #On configure ces pins en sortie (capable d'envoyer 0 ou 5V)
- GPIO.setup(LED1, GPIO.OUT)
- GPIO.setup(LED2, GPIO.OUT)
- GPIO.setup(LED3, GPIO.OUT)
- GPIO.setup(LED4, GPIO.OUT)
- #RAZ des leds
- GPIO.output(LED1,GPIO.LOW)
- GPIO.output(LED2,GPIO.LOW)
- GPIO.output(LED3,GPIO.LOW)
- GPIO.output(LED4,GPIO.LOW)
- #CONFIGURATION DU LCD
- # On définit la correspondance entre les pins du GPIO et de l'écran LCD
- lcd_rs = 25 #RS = Register Select
- lcd_en = 24 #EN = Enable
- lcd_d4 = 23 #d4,d5,d6,d7 sont les 4 pins de données
- lcd_d5 = 17 #nous commencons à d4 et non pas à d0 car les 4 premières pins
- lcd_d6 = 18 #(d0 -> d3) ne doivent pas être utilisées pour les opérations
- lcd_d7 = 22 #4 bits
- lcd_backlight = 4 #Borne + (anode) du rétroéclairage LCD
- # On renseigne la taille de l'écran (ici 20x4)
- lcd_columns = 20
- lcd_rows = 4
- # On renseigne dans la fonction CharLCD la correspondance LCD->GPIO définie précédemment
- lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows, lcd_backlight)
- #RAZ de l'écran LCD
- lcd.clear()
- #PROGRAMME OPERATEUR
- # Affichage d'une chaine de caractères sur l'écran LCD
- lcd.message('Scannez code datamatrix : \n')
- # Affichage sur le terminal de l'instruction
- print('Scannez le code : ')
- #La fonction input() permet de récupérer une entrée clavier
- code_1 = input()
- print(code_1)
- #On stocke les autres données du datamatrix dans des variables
- #La variable a contient l'entrée clavier
- #La dernière donnée de la fonction select.select() correspond au timeout
- a, b, c = select.select( [sys.stdin], [], [], 0.5)
- #Condition permettant de sortir du programme si aucune nouvelle entrée
- #clavier n'est détectée
- #Les conditions se succèdent pour couvrir les 5 lignes du datamatrix
- if(a) :
- code_2 = sys.stdin.readline().strip()
- print(code_2)
- print("1" )
- d, e, f = select.select( [sys.stdin], [], [], 0.5)
- if(d) :
- code_3 = sys.stdin.readline().strip()
- print(code_3)
- print("1" )
- g, h, i = select.select( [sys.stdin], [], [], 0.5)
- if(g) :
- code_4 = sys.stdin.readline().strip()
- print(code_4)
- print("1" )
- j, k, l = select.select( [sys.stdin], [], [], 0.5)
- if(j) :
- code_5 = sys.stdin.readline().strip()
- print(code_5)
- print("1" )
- m, n, o = select.select( [sys.stdin], [], [], 1.0)
- if(m) :
- code_6 = sys.stdin.readline().strip()
- print(code_6)
- print("1" )
- p, q, r = select.select( [sys.stdin], [], [], 1.0)
- if(p) :
- code_7 = sys.stdin.readline().strip()
- print(code_7)
- print("1" )
- s, t, u = select.select( [sys.stdin], [], [], 1.0)
- if(s) :
- code_8 = sys.stdin.readline().strip()
- print(code_8)
- print("1" )
- v, w, x = select.select( [sys.stdin], [], [], 1.0)
- if(v) :
- code_9 = sys.stdin.readline().strip()
- print(code_9)
- print("1" )
- time.sleep(5)
- #On initialise nos 2 variables utilisées dans les boucles suivantes
- Lexan = 0
- i = 0
- j = 0
- #On parcourt la base de donnée à la recherche d'une référence de PES ou de Lexan
- while i < nbr_lignes :
- #On définit la colonne du fichier Excel où se situent les données
- lecture_PES = data.cell_value(rowx=i, colx=1)
- lecture_Lexan = data.cell_value(rowx=i, colx=2)
- #Condition si correspondance entre le code scanné par l'opérateur
- #et la base de donnée
- if lecture_PES == code_1 or lecture_Lexan == code_1:
- #On va chercher la référence du Lexan dans la base de donnée
- #et on l'affiche sur l'écran LCD
- Lexan = data.cell_value(rowx=i, colx=2)
- lcd.clear()
- lcd.message(Lexan)
- #On va chercher la LED correspondant à l'emplacement
- #où est stocké le Lexan et on la configure en sortie
- LED = int(data.cell_value(rowx=i, colx=3))
- print(LED)
- GPIO.setup(LED, GPIO.OUT)
- #Boucle permettant de faire clignoter la LED indiquant à l'opérateur
- #l'emplacement du Lexan à utiliser
- while j<10 :
- GPIO.output(LED,GPIO.HIGH)
- time.sleep(0.5)
- GPIO.output(LED,GPIO.LOW)
- time.sleep(0.5)
- j = j+1
- print(Lexan)
- print(code_1)
- #Si la boucle est parcourue cela signifie qu'une correspondance a
- #été trouvée entre le scan et la base de données, on peut donc sortir
- #de la boucle
- i=nbr_lignes
- #On parcourt les lignes de la base de donnée
- i = i+1
- #Condition si aucune correspondance entre scan et base de données n'a été trouvée
- if Lexan == 0 :
- print("La référence n'est pas disponible" )
- lcd.clear()
- lcd.message("Pas disponible" )
- time.sleep(5)
|
|