From 1b23a30621e69e24f23e01362a4ed3a2217f6221 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Bail=C3=B3n=20Bustos?= Date: Mon, 10 Apr 2023 19:25:00 -0600 Subject: [PATCH] =?UTF-8?q?Agrega=20control=20para=20transistor=20en=20ard?= =?UTF-8?q?uino=20y=20boton=20en=20python,=20adem=C3=A1s=20de=20actualizac?= =?UTF-8?q?i=C3=B3n=20de=20interfaz?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GUI.py | 68 ++++++++++++++++++++----------- lecturaArduino.ino | 20 --------- lecturaArduino/lecturaArduino.ino | 14 +++++-- 3 files changed, 55 insertions(+), 47 deletions(-) delete mode 100644 lecturaArduino.ino diff --git a/GUI.py b/GUI.py index ac583bd..259f008 100644 --- a/GUI.py +++ b/GUI.py @@ -16,12 +16,15 @@ import tkinter as tk #Para la interfaz #Variables a utilizar global isRun #Valor booleano de programa corriendo +global on #Valor booleano del estatus del transistor +on = False #Inicializa transistor apagado isReceiving = False #Valor booleano de recibiendo datos isRun = True -dato1 = 0.0 #Variable del dato a leer desde Arduino -serialPort = 'COM3' #Puerto al que está conectado el Arduino +dato1 = 0.0 #Variable del dato convertido a float +serialPort = 'COM6' #Puerto al que está conectado el Arduino baudRate = 9600 #Baudios configurados en Arduino - +datos = 0.0 #Variable de dato a leer desde Arduino +estado = "off" #Variable de estado que se enviará al serial #Función de lectura de datos en Arduino def leer_datos(): @@ -32,10 +35,13 @@ def leer_datos(): global isReceiving #valor booleano de recibiendo datos global dato1 #dato a recibir desde Arduino print("RECIBIENDO...") - dato1 = float(arduino.readline().decode("utf-8").strip()) #Lectura del dato y conversión a float - print(dato1) - var.set("TEMPERATURA: " + str(dato1) + " °C") #impresión del dato numérico en la interfaz - isReceiving = True #Confirmación de que se ha recibido el dato + datos = arduino.readline().decode("utf-8").strip() #Lectura del dato + print(datos) + if(datos != ''): #Asegurar que se haya leído un dato + dato1 = float(datos) #Conversión del dato en float + print(dato1) #Datos en float + var.set("TEMPERATURA: " + str(dato1) + " °C") #impresión del dato numérico en la interfaz + isReceiving = True #Confirmación de que se ha recibido el dato #Función para iniciar la gráfica def iniciarGrafica(self, muestras,lines): @@ -48,11 +54,12 @@ def conectar_serial(): global arduino #Variable que va aguardar la conexión try: arduino = serial.Serial(serialPort, baudRate) #Asignación del objeto a la variable - arduino.timeout = 0.5 #Tiempo a esperar para que haya datos disponibles en el puerto serie + arduino.timeout = 0.1 #Tiempo a esperar para que haya datos disponibles en el puerto serie time.sleep(0.5) #Tiempo muerto para permitir la conexión print("CONECTADO") btnStart.config(state = "normal") btnConectar.config(state = "disabled") + btnManual.config(state = "normal") except: print("Error de conexión") @@ -68,19 +75,28 @@ def iniciar_hilo(): def guardarGrafica(): plt.savefig('miFigura.png') -#Ventana de control Manual (ON/OFF controlado por el usuario) +#Función de control Manual (ON/OFF controlado por el usuario) def control1(): - window2 = tk.Toplevel() - window2.resizable(width = 0, height = 0) - window2.title('Control Manual') - window2.geometry('500x300') + global on + global estado + global arduino + if on == False: #Cuando el transistor está apagado + on = True #Cambia la variable de condición + btnManual.config(bg = "#55DE1E", text = "ON") #Cambia color y texto del botón + estado = "on" #cambia la variable de estado + arduino.write(estado.encode()) #Se envía encender al serial de Arduino + else: #Cuando el transistor está encendido + on = False #Cambia la variable de condición + btnManual.config(bg = "red", text = "OFF") #Cambia color y texto del botón + estado = "off" #Cambia la variable de estado + arduino.write(estado.encode()) #Se envía apagar al serial de Arduino #Ventana para control según una temperatura dada (Automático) -def control2(): - window3 = tk.Toplevel() - window3.resizable(width = 0, height = 0) - window3.title('Control ON/OFF') - window3.geometry('500x300') +#def control2(): +# window3 = tk.Toplevel() +# window3.resizable(width = 0, height = 0) +# window3.title('Control ON/OFF') +# window3.geometry('500x300') #Función para pausar la gráfica def pausar(): @@ -137,10 +153,14 @@ root.rowconfigure(3, weigh=5) canvas = FigureCanvasTkAgg(fig, master=frame) canvas.get_tk_widget().pack(padx=0, pady=0, expand=True, fill='both') -btnManual = tk.Button(frame2, text = "Manual", command = control1) -btnManual.grid(row=0, column=0, pady=2, padx=10) -btnOnOff = tk.Button(frame2, text = "ON/OFF", command = control2) -btnOnOff.grid(row=0, column=1, pady=2, padx=10) +labelBlank = tk.Label(frame1, text="") +labelBlank.grid(row=0, column=4, pady=2, padx=155) +btnManual = tk.Button(frame1, text = "OFF", command = control1, bg = "red", state = "disabled") +btnManual.grid(row=0, column=6, pady=2, padx=10) +labelState = tk.Label(frame1, text="Transistor State:") +labelState.grid(row=0, column=5, pady=2, padx=5) +#btnOnOff = tk.Button(frame2, text = "ON/OFF", command = control2) +#btnOnOff.grid(row=0, column=1, pady=2, padx=10) btnConectar = tk.Button(frame1, text = "Connect", command = conectar_serial, bg="#00F1FC") btnConectar.grid(row=0, column=0, pady=2, padx=10) btnStart = tk.Button(frame1, text = "Start", command = iniciar_hilo, bg="#008C17", state="disabled") @@ -150,7 +170,7 @@ btnPause.grid(row=0, column=2, pady=2, padx=10) btnResume = tk.Button(frame1, text = "Resume", command = reanudar, bg="#00F428", state="disabled") btnResume.grid(row=0, column=3, pady=2, padx=10) btnDesconectar = tk.Button(frame2, text='Disconnect', command = desconectar_serial, bg="#FE5E5E") -btnDesconectar.grid(row=0, column=3, pady=2, padx=10) +btnDesconectar.grid(row=0, column=0, pady=2, padx=10) labelData = tk.Label(frame2, textvariable=var) labelData.grid(row=0, column=4, pady=2, padx=500) @@ -161,7 +181,7 @@ barraMenu.add_cascade(label="Archivo", menu=barra1) root.config(menu=barraMenu) #Animación de la gráfica (figura, función que grafica la línea, argumentos para graficar, rango de la figura) -anim = animation.FuncAnimation(fig, iniciarGrafica, fargs=(muestras, lines), interval = tiempoMuestreo) +anim = animation.FuncAnimation(fig, iniciarGrafica, fargs=(muestras, lines), interval = tiempoMuestreo, cache_frame_data=False) root.geometry('1000x600') root.mainloop() diff --git a/lecturaArduino.ino b/lecturaArduino.ino deleted file mode 100644 index 462244a..0000000 --- a/lecturaArduino.ino +++ /dev/null @@ -1,20 +0,0 @@ -#define in1 A0 - -float temp1, lectura1; - -void setup() { - // put your setup code here, to run once: - Serial.begin(9600); - pinMode(in1, INPUT); -} - -void loop() { - // put your main code here, to run repeatedly: - lectura1 = analogRead(in1); - temp1 = (lectura1 * 5000 / 1023 / 10) - 40; - Serial.print(temp1); - - - delay(800); -} - diff --git a/lecturaArduino/lecturaArduino.ino b/lecturaArduino/lecturaArduino.ino index 462244a..88f966f 100644 --- a/lecturaArduino/lecturaArduino.ino +++ b/lecturaArduino/lecturaArduino.ino @@ -1,6 +1,7 @@ #define in1 A0 - +#define out1 6 float temp1, lectura1; +String estado; void setup() { // put your setup code here, to run once: @@ -13,8 +14,15 @@ void loop() { lectura1 = analogRead(in1); temp1 = (lectura1 * 5000 / 1023 / 10) - 40; Serial.print(temp1); - + if(Serial.available()>0){ + estado = Serial.readString(); + if(estado == "on"){ + digitalWrite(out1, HIGH); + } + else if(estado == "off"){ + digitalWrite(out1, LOW); + } + } delay(800); } -