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` 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)
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: