From 77fa73e641c6846a2f206024c8ec664fb2e35285 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Bail=C3=B3n=20Bustos?= Date: Sat, 3 Jun 2023 01:42:49 +0000 Subject: [PATCH] Actualizar 'Readme.md' --- Readme.md | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) diff --git a/Readme.md b/Readme.md index 2ed4208..07f3912 100644 --- a/Readme.md +++ b/Readme.md @@ -323,6 +323,138 @@ def control2(): Según sea el botón de la interfaz con el que se interactúa, se hace la función de on/off de los transistores, para ello se hace uso de las variables `on1` y `on2` que indican el estado actual de estos dispositivos, de manera que si se presiona algún botón se ingresa a la función y se comprueba su estado actual, si el valor booleano actual de la variable `on` es *False* se enciende el transistor y se envía este cambio de estado al serial de Arduino, de lo contrario si el valor actual es *True* se apaga el transistor correspondiente e igualmente se envía la información a Arduino. El botón cambia de color y texto según el estado en que se encuentre el dispositivo, además se modifica el valor booleano de la variable `on1` u `on2`. +Para pausar la obtención de datos y detener la gráfica se utiliza la función `pausar`, la cual interrumpe el evento de la animación de las líneas y cierra la conexión con Arduino, además el botón de `Resume` se habilita y el de `pause` se deshabilita: + +``` +def pausar(): + global isRun + global arduino + isRun = False + anim.event_source.stop() + arduino.close() + btnResume.config(state = "normal") + btnPause.config(state = "disabled") +``` + +De manera similar, mediante la función `reanudar` se entabla nuevamente la conexión para recibir la temperatura de los transistores y se grafican nuevamente estos datos: + +``` +def reanudar(): + global arduino + global isRun + conectar_serial() + arduino.reset_input_buffer() + isRun = True + anim.event_source.start() + btnResume.config(state = "disabled") + btnPause.config(state = "normal") +``` + +Con la función `desconectar_serial` se detiene completamente la comunicación con Arduino, asimismo se deshabilitan los botnes para interactuar con la interfaz, esto con el propósito de finalizar la ejecución del programa. + +``` +def desconectar_serial(): + global isRun + global conected + anim.event_source.stop() + isRun = False + conected = False + arduino.close() + btnPause.config(state = "disabled") + btnResume.config(state = "disabled") + btnManual.config(state = "disabled") + btnManual2.config(state = "disabled") +``` + +Ahora bien, ya conociendo la labor de cada una de las funciones, lo siguiente corresponde a la parte del diseño de la interfaz que verá el usuario: + +Primeramente, se declaran ciertas variables ncesarias para graficar los datos provenientes de Arduino: + +``` +muestras = 100 +tiempoMuestreo = 100 +data = [] +lines = [] +for i in range(numData): + data.append(collections.deque([0] * muestras, maxlen = muestras)) + lines.append(Line2D([], [], color = "blue")) +``` + +`muestras` indica la cantidad de datos que se van a almacenar y visualizar, se crea una lista para guardar las lecturas de temperatura de los sensores y, de igual manera, `lines` que son las líneas 2D de cada figura para graficar los datos. + +Con las siguiente instrucciones se crea una nueva figura donde se van a visualizar las gráficar en la interfaz, posteriormente se agregan los respectivos subplots `ax1` para el sensor 1 y `ax2` para el sensor 2; en este caso se indica que se van a distribuir en la pantalla con un tamaño de 2 filas por 1 columna y se establecen sus límites de `xlim` indicando de 0 a 100 muestras y `ylim` para ver un rango de 0 a 150°C; también se le incorpora un título a cada subplot y etiquetas a los ejes; finalmente, y muy importante, indicar la línea que va a graficarse en cada subplot: + +``` +fig = plt.figure(facecolor = '0.94') #creación de la gráfica (figura) + +ax1 = fig.add_subplot(2, 1, 1, xlim=(0,100), ylim=(0, 150)) #Rango de ejes +ax1.title.set_text("Sensor 1 - Arduino") +ax1.set_ylabel("Voltaje") +ax1.add_line(lines[0]) + +ax2 = fig.add_subplot(2, 1, 2, xlim=(0,100), ylim=(0, 150)) #Rango de ejes +ax2.title.set_text("Sensor 2 - Arduino") +ax2.set_xlabel("Muestras") +ax2.set_ylabel("Voltaje") +ax2.add_line(lines[1]) +``` + +Todo lo que se muestra a continuación corresponde a la aplicación de funciones y objetos que forman parte de la paquetería de tkinter para haces el diseño y la distribución de los elementos de la interfaz: + +``` +root= tk.Tk() +root.title("Sistema de calentamiento") + +var = tk.StringVar() +var2 = tk.StringVar() +frame = tk.Frame(root, bd=2) +frame.grid(column=0, row=3, columnspan=2, sticky="nsew") +frame1 = tk.Frame(root) +frame1.grid(column=0, row=1, columnspan=2, sticky="EW") +frame2 = tk.Frame(root) +frame2.grid(column=0, row=2, columnspan=2, sticky="EW") +frame0 = tk.Frame(root) +frame0.grid(column=0, row=0, columnspan=2, sticky="EW") + +root.columnconfigure(0, weight=1) +root.columnconfigure(1, weight=1) +root.rowconfigure(3, weigh=5) + +canvas = FigureCanvasTkAgg(fig, master=frame) +canvas.get_tk_widget().pack(padx=0, pady=0, expand=True, fill='both') +labelBlank = tk.Label(frame1, text="") +labelBlank.grid(row=0, column=4, pady=2, padx=25) +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 1 State:") +labelState.grid(row=0, column=5, pady=2, padx=5) +labelBlank2 = tk.Label(frame1, text="") +labelBlank2.grid(row=0, column=7, pady=2, padx=125) +btnManual2 = tk.Button(frame1, text = "OFF", command = control2, bg = "red", state = "disabled") +btnManual2.grid(row=0, column=9, pady=2, padx=10) +labelState2 = tk.Label(frame1, text="Transistor 2 State:") +labelState2.grid(row=0, column=8, pady=2, padx=5) +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") +btnStart.grid(row=0, column=1, pady=2, padx=10) +btnPause = tk.Button(frame1, text = "Pause", command = pausar, bg="#E2E200", state="disabled") +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=0, pady=2, padx=10) +labelData = tk.Label(frame2, textvariable=var, font="Helvetica 10 bold") +labelData.grid(row=1, column=1, pady=2, padx=230) +labelData2 = tk.Label(frame2, textvariable=var2, font="Helvetica 10 bold") +labelData2.grid(row=1, column=2, pady=2, padx=1) + +barraMenu = tk.Menu(frame0) +barra1 = tk.Menu(barraMenu) +barra1.add_command(label="Guardar gráfica", command=guardarGrafica) +barraMenu.add_cascade(label="Archivo", menu=barra1) +root.config(menu=barraMenu) +``` ![](http://gmarxcc.com:8088/MSP430/GUI-Heater-System/raw/branch/master/Esquematico%20Conexiones/Esquematico_Sistema_de_Calentamiento.png)