Bonjour, je vous remercie.
J'ai donc lu votre tuto, j'ai corrigé, tout fonctionne correctement.
Programme Arduino
//***ARDUINO 1.8.5***//
//***Arduino nano***//
#define BUF_LEN 128
char buffer[BUF_LEN];
char chaine_Python;
const int Led = 13;
unsigned long previousMillis = 0;
unsigned long prevuMillis = 0;
int Reste_chaine_Python_int = 0;
int Nb_tours = 0;
int compte_Nb_tours = 0;
int Etat = 0;
int Vitesse_T_sec = 1;
int Temps_tour = 0;
//*************************************************************
void setup()
{
Serial.begin(9600);
pinMode(Led, OUTPUT);
}
//*************************************************************
void loop()
{
if (Serial.available() > 0)// Reçu de Python
{
Serial.print("Serial.available() : ");
Serial.println(Serial.available());
char chaine_Python = (Serial.read()); // Lit le premier octet reçu et le met dans la variable
Serial.print("chaine_Python : ");
Serial.println(chaine_Python);
switch (chaine_Python) //si le premier octet correspond au code
{
case 65://65=A
lecture_nombre_int();
Nb_tours = Reste_chaine_Python_int;
Serial.print("Nb_tours :");
Serial.println(Nb_tours);
Etat = 1;
break;
case 66://66=B
lecture_nombre_int();
Vitesse_T_sec = Reste_chaine_Python_int;
Serial.print("Vitesse_T_sec :");
Serial.println(Vitesse_T_sec);// Envoi vers Python
break;
}
}
if (Etat == 1)
{
Tour();
}
}
//*************************************************************
void lecture_nombre_int()
{
digitalWrite(Led, HIGH);
Reste_chaine_Python_int = Serial.parseInt(); // lit le reste des octets
digitalWrite(Led, LOW);
}
//************************************************************************
void Tour()
{
unsigned long courentMillis = millis(); // Enregistrement du temps
if ((compte_Nb_tours <= Nb_tours) && (courentMillis - prevuMillis >= 1000 / Vitesse_T_sec))
{
Temps_tour = 1000 / Vitesse_T_sec;
Serial.print("Temps_tour :");
Serial.println(Temps_tour);
prevuMillis = courentMillis;
digitalWrite(Led, HIGH);
snprintf(buffer, sizeof(buffer), "C%d\n\r", compte_Nb_tours);
Serial.println(buffer);
digitalWrite(Led, LOW);
compte_Nb_tours++;
}
}
Programme Python
#***************** coding: UTF-8 ******************#
#**********environnement PYTHON IDE 3.7.4**********#
#****************Tk version 8.6.9******************#
#*****************ARDUINO 1.8.5********************#
#*****Arduino nano Atmege 328P old Bootloader******#
from serial import Serial
import serial.tools.list_ports
from tkinter import *
import tkinter.ttk as ttk
serial_port = None
# Liste des Ports
liste_ports = []
ports = serial.tools.list_ports.comports(include_links=False)
for port in ports:
liste_ports.append(port.device)
# Selection du Port serie
def Selection_port(event):# sur evenement
global serial_port
port = combo.get()
baudrate = '9600'
try:
serial_port = serial.Serial(port, baudrate, timeout=0.1) # initialise port serie forme réduite
print ("Ouverture du port série : "+port+", vitesse : "+baudrate+" réussie")
except:
#print ("Echec ouverture du port série "+port)
tkinter.messagebox.showwarning("ERREUR communication","Echec ouverture du port série "+port)
def Valider():
global nombre
nombre = TextEntree_Nb_tour.get()
nombre = "A" + nombre + "\r" # code commande A
nombre = nombre.encode()
print ("Envoi Nb tours Arduino")
print (nombre)
serial_port.write(nombre)# Envoi port série
Recu_Arduino()
def Recu_Arduino():
id = Fenetre_Principale.after(100, Recu_Arduino)# Appel de la fonction tous les xxxms
nombre_lu_Arduino = serial_port.readline().rstrip()# Lecture ports série
nombre_lu_Arduino = str(nombre_lu_Arduino)# transforme en string
if('C' in nombre_lu_Arduino):
print ("Retour Arduino")
print (nombre_lu_Arduino)# b'Cnombre'
Decode_nombre_lu_Arduino = nombre_lu_Arduino[3:]# Lecture à partir du 3ème caractère
Decode_nombre_lu_Arduino = Decode_nombre_lu_Arduino[0:-1]# Efface dernier caractère
Decode_nombre_lu_Arduino = int(Decode_nombre_lu_Arduino)# transforme en nombre entier
print ("nombre_lu_Arduino")
print (Decode_nombre_lu_Arduino)
Retour_Arduino.config(text = Decode_nombre_lu_Arduino)
def Valeur_Tours(nouvelleValeur):## nouvelle valeur 'curseur Nb Tour/sec'
global nombre
nombre = nouvelleValeur
nombre = "B" + nombre + "\r" # code commande B
nombre = nombre.encode()
print ("Envoi vitesse Arduino")
print (nombre)
serial_port.write(nombre)# Envoi port série
# Création Fenetre_Principale
Fenetre_Principale = Tk()
Fenetre_Principale.resizable(width=False, height=False) # pas de redimensionnement
Fenetre_Principale.geometry("600x150") # Taille Fenetre_Principale
Fenetre_Principale.title("Compteur Tour") # titre fenetre
# Création d'un widget combobox 'choix USB'
combo = ttk.Combobox(values=liste_ports, width = 6)
combo.bind('<<ComboboxSelected>>', Selection_port)# Fonction séléction du port
combo.place(x = 10, y = 5)
# création de widgets 'Label'
Affichage_Nb_tour = Label(Fenetre_Principale, text ='Nb Tours', width = 12, fg = 'RED', borderwidth=2, background='bisque', relief='sunken')
Affichage_Nb_tour.place(x = 205, y = 5)
# création de widgets 'Entry' Entrée nombre
TextEntree_Nb_tour = StringVar()
Entree_Nb_tour = Entry(Fenetre_Principale, textvariable = TextEntree_Nb_tour, border=3, width = 8)
Entree_Nb_tour.place(x = 320, y = 5)
# création de widgets 'Label'Affichage Arduino
Affichage_Arduino_Tour = Label(Fenetre_Principale, text ='Retour Arduino', width = 12, fg = 'RED', borderwidth=2, background='bisque', relief='sunken')
Affichage_Arduino_Tour.place(x = 400, y = 5)
# création de widgets 'Label'Retour Arduino
Retour_Arduino = Label(Fenetre_Principale, text = "", width = 5, borderwidth=2, background='white', relief='sunken', justify = LEFT)
Retour_Arduino.place(x = 515, y = 5)
# Création d'un widget Button 'Valider'
Bouton = Button(Fenetre_Principale, text ='Valider', command = Valider)
Bouton.place(x = 320, y = 40)
# Création d'un widget Scale 'curseur Nb Tour/sec'
Valeur_Nb_tour = StringVar()
Valeur_Nb_tour.set(1)# position départ du curseur Scale
Vitesse_Nb_tour = Scale(Fenetre_Principale,from_=1,to=5, orient=HORIZONTAL, length=180,width=12,label="Vitesse Tour/sec",\
tickinterval=1, variable=Valeur_Nb_tour, command = Valeur_Tours)
Vitesse_Nb_tour.place(x = 20, y = 30)
# démarrage :
Fenetre_Principale.mainloop()
C'est peut être moins le souk?
Cordialement.
Marc.