Browse Source

Actualizar 'Readme.md'

master
parent
commit
77fa73e641
1 changed files with 132 additions and 0 deletions
  1. +132
    -0
      Readme.md

+ 132
- 0
Readme.md View File

@ -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`. 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) ![](http://gmarxcc.com:8088/MSP430/GUI-Heater-System/raw/branch/master/Esquematico%20Conexiones/Esquematico_Sistema_de_Calentamiento.png)


Loading…
Cancel
Save