3 votes

Si l'instruction n'est pas exécutée?

J'ai un programme qui lit les broches numériques de l'Arduino UNO. J'ai activé toutes les broches numériques par défaut en utilisant le mot-clé "PULLUP". Maintenant, si j'insère un "Fil de pontage" dans une quelconque broche numérique, elle devient PULLDOWN (mot-clé). Je lis les états des broches numériques en continu après un intervalle de 0,5 ms (cet intervalle est codé dans l'IDE Arduino) et cela me donne "1" et "0", si le fil de pontage est inséré dans une quelconque broche numérique, cela donnera "0" sinon cela donnera "1".

Ensuite, les "0" et "1" sont stockés dans deux tableaux nommés "predata pour maintenir l'état précédent, newdata pour maintenir l'état actuel" des broches numériques et les états sont affichés à l'écran de l'interface graphique.

En exécutant l'Arduino UNO pour la première fois, les "newdata" et "predata" sont identiques. Ensuite, j'ai une boucle infinie qui lit en continu les broches numériques et les stocke dans un tableau "curdata" et les compare avec le tableau "predata". Si les tableaux "predata" et "curdata" ne correspondent pas, toutes les valeurs du tableau "curdata" sont écrites dans le "predata" et affichées à l'écran de l'interface graphique.

Tout le code fonctionne correctement sauf cette instruction if, elle ne s'exécute pas. À cause de cela, le programme se bloque :

if (curdata[a7] != predata[a7]):
     predata[a7]=curdata[a7]
     oldstatus()
     newstatus()

*Code Complet :

from serial import Serial
import time
from tkinter import *
import tkinter as tk

# Établir une connexion avec l'Arduino
arduinodata = Serial("COM6",9600)

# Lire les données de l'Arduino    
data1 = arduinodata.readline()

# Configuration de l'écran de l'interface graphique
win = Tk()
win.title("Arduino")
win.geometry("800x600+50+50")
win.config(bg='white')

# Étiquette d'entête
label1=Label(win, text="État des broches numériques", font=("Calibri",24,"bold"), bg='white', borderwidth=1, relief="solid", padx=20, pady=20) #"flat", "raised", "sunken", "ridge", "solid", et "groove"
label1.pack(pady=(15,60))

# Conversion des données des broches numériques en chaîne et stockage dans un tableau firstdata
firstdata=str(data1)

# Initialisation des tableaux
predata=[]
newdata=[]
curdata=[]

# Stocker le premier état des dix premières broches numériques dans les tableaux "predata" et "curdata"
i=2
for a0 in range(10):
    predata.append(firstdata[i])
    newdata.append(firstdata[i])
    i=i+2

# Affichage du numéro des broches numériques à l'écran de l'interface graphique
lblframe = tk.Frame(win)
for a1 in range(10):
    pre1=Label(lblframe, text=("PIN",(a1+2)), font=("Calibri",12, "bold"), bg="white", borderwidth=1, relief="solid", padx=5, pady=2)
    pre1.grid(row=0, column=a1)

# Affichage des données du tableau "predata" à l'écran de l'interface graphique
for a2 in range(10):
    binary1 = predata[a2]
    if ( binary1 == "1" ):
        pre2=Label(lblframe, text="OFF", font=("Calibri",12,"bold"), bg="white", fg="Green", borderwidth=1, relief="solid", padx=11, pady=1)
        pre2.grid(row=1, column=a2, sticky="nw")
    else:
        pre2=Label(lblframe, text="ON", font=("Calibri",12,"bold"), bg="white", fg="Red", borderwidth=1, relief="solid", padx=11, pady=1)
        pre2.grid(row=1, column=a2, sticky="nw")

# Affichage des données du tableau "curdata" à l'écran de l'interface graphique
for a3 in range(10):
    binary2 = newdata[a3]
    if (binary2 == "1"):
        pre3=Label(lblframe, text="OFF", font=("Calibri",12,"bold"), bg="white", fg="Green", borderwidth=1, relief="solid", padx=11, pady=1)
        pre3.grid(row=2, column=a3, sticky="nw")
    else:
        pre3=Label(lblframe, text="ON", font=("Calibri",12,"bold"), bg="white", fg="Red", borderwidth=1, relief="solid", padx=11, pady=1)
        pre3.grid(row=2, column=a3, sticky="nw")

lblframe.pack()

# Cette fonction est pour changer la valeur de predata sur l'écran de l'interface graphique
def oldstatus():
    for a4 in range(10):
        binary=predata[a4]
        if(binary=="1"):
            pre2.config(text="OFF")
        else:
            pre2.config(text="ON")

# Cette fonction est pour changer la valeur de curdata sur l'écran de l'interface graphique    
def newstatus():
    for a5 in range(10):
        binary=curdata[a5]
        if(binary=="1"):
            pre3.config(text="OFF")
        else:
            pre3.config(text="ON")

# Cette fonction est pour lire en continu les broches numériques et si des changements sont détectés, mettre à jour les tableaux predata et curdata et ne fonctionne que lorsque le bouton est pressé.
def allstatus():
    while True:
        data2 = arduinodata.readline()
        seconddata=str(data2)
        j=2
        for a6 in range(10):
            curdata.append(seconddata[j])
            j=j+2
        for a7 in range(10):
            if (curdata[a7] != "1"):
                predata[a7]=curdata[a7]
                oldstatus()
                newstatus()

# C'est pour exécuter la fonction allstatus.
button1=Button(win,text="Démarrer",width=10,height=2, font=("Calibri",16,"bold"), bg="noir",fg="blanc", command=allstatus)
button1.pack(pady=(30,0))

win.mainloop()

Sortie :

Première Sortie :

Première Sortie

En Appuyant sur le Bouton de Démarrage :

En Appuyant sur le Bouton de Démarrage

3voto

Kashif Iftikhar Points 1005

Essayez ceci :

de série importation Série
import time
de tkinter importation *
import tkinter comme tk

#Lecture de l'Arduino
arduinodata = Série("COM6",9600)

#Stockage des données de l'Arduino dans le tableau data1
data1 = arduinodata.readline()

#Création de l'écran GUI    
gagner = Tk()
win.title("Arduino")
win.geometry("800x600+50+50")
win.config(bg='blanc')

#Affichage du titre sur l'écran GUI    
label1=Label(gagner, text="État de la broche numérique", police=("Calibri",24,"gras"), bg='blanc', borderwidth=1, relief="solide", padx=20, pady=20) #"plat", "élevé", "enfoncé", "crête", "solide" et "rainure"
label1.pack(pady=(15,60))

#Conversion de la donnée de type data1 du binaire en chaîne.
firstdata=str(data1)

#Initialisation du tableau pour stocker les valeurs de l'état courant et précédent des broches numériques de l'Arduino.
predata=[]
newdata=[]

#Stockage des données de l'Arduino dans les tableaux.
i=2
pour a0 in gamme(10):
    predata.append(firstdata[i])
    newdata.append(firstdata[i])
    je=i+2

lblframe = tk.Frame(win)
#Affichage de l'en-tête de la broche numérique sur l'écran GUI.
pour a1 in gamme(10):
    pre1=Label(lblframe, text=("PIN",(a1+2)), police=("Calibri",12, "gras"), bg="blanc", borderwidth=1, relief="solide", padx=5, pady=2)
    pre1.grid(row=0, column=a1)

#La fonction mesétiquettes affichera les valeurs des tableaux predata et newdata sur l'écran GUI.
définition mesétiquettes():
    pour a2 in gamme(10):
        #Affichage des données du tableau predata sur l'écran GUI
        si ( int(predata[a2]) == 1 ):
            pre2=Label(lblframe, text="ARRÊT", police=("Calibri",12,"gras"), bg="blanc", fg="Vert", borderwidth=1, relief="solide", padx=11, pady=1)
            pre2.grid(row=1, column=a2, collant="nw")
        autre:
            pre2=Label(lblframe, text="SOUS", police=("Calibri",12,"gras"), bg="blanc", fg="Rouge", borderwidth=1, relief="solide", padx=11, pady=1)
            pre2.grid(row=1, column=a2, collant="nw")

    #Affichage des données du tableau newdata sur l'écran GUI   
    pour a3 in gamme(10):
        si ( int(newdata[a3]) == 1):
            pre3=Label(lblframe, text="ARRÊT", police=("Calibri",12,"gras"), bg="blanc", fg="Vert", borderwidth=1, relief="solide", padx=11, pady=1)
            pre3.grid(row=2, column=a3, collant="nw")
        autre:
            pre3=Label(lblframe, text="SOUS", police=("Calibri",12,"gras"), bg="blanc", fg="Rouge", borderwidth=1, relief="solide", padx=11, pady=1)
            pre3.grid(row=2, column=a3, collant="nw")

lblframe.pack()

#Appel de la fonction mylabel() automatiquement lorsque l'écran GUI est créé.  
mesétiquettes()

#Fonction statuschanger pour changer l'état des tableaux predata et newdata sur le GUI et dans le tableau.
définition statuschanger():
    #Effacer les tableaux predata et newdata pour stocker de nouvelles valeurs en eux.
    predata.clear()
    newdata.clear()
    #Lecture à nouveau des BROCHES NUMÉRIQUES de la carte Arduino.
    data2 = arduinodata.readline()
    #Conversion des données des broches numériques de l'Arduino du binaire en chaîne.
    seconddata=str(data2)
    #Stockage des données de l'Arduino dans les tableaux.
    j=2
    pour a6 in gamme(10):
        predata.append(seconddata[j])
        newdata.append(seconddata[j])
        j=j+2
    #Appel de la fonction mylabel pour mettre à jour les valeurs sur l'écran GUI.
    mesétiquettes()
    #Appel de la fonction statuschanger encore et encore après chaque 100ms.
    win.after(100, statuschanger)

#Bouton1 pour exécuter la fonction statuschanger.
bouton1=Button(gagner,text="Démarrer",largeur=10,hauteur=2, police=("Calibri",16,"gras"), bg="noir",fg="blanc", command=statuschanger)
button1.pack(pady=(30,0))

gagner.mainloop()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X