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 :
En Appuyant sur le Bouton de Démarrage :