|
|
@ -17,10 +17,14 @@ from matplotlib.lines import Line2D #Para hacer las líneas de las gráficas |
|
|
|
|
|
|
|
#Variables a utilizar |
|
|
|
global isRun #Valor booleano de programa corriendo |
|
|
|
global on #Valor booleano del estatus del transistor |
|
|
|
on = False #Inicializa transistor apagado |
|
|
|
global on1 #Valor booleano del estatus del transistor |
|
|
|
global on2 |
|
|
|
global conected |
|
|
|
conected = False |
|
|
|
on1 = False #Inicializa transistor 1 apagado |
|
|
|
on2 = False #Inicializa transistor 2 apagado |
|
|
|
isReceiving = False #Valor booleano de recibiendo datos |
|
|
|
isRun = True |
|
|
|
isRun = False |
|
|
|
dato = 0.0 #Variable del dato convertido a float |
|
|
|
serialPort = 'COM3' #Puerto al que está conectado el Arduino |
|
|
|
baudRate = 9600 #Baudios configurados en Arduino |
|
|
@ -33,32 +37,37 @@ def leer_datos(): |
|
|
|
time.sleep(1.0) |
|
|
|
arduino.reset_input_buffer() #limpia el buffer de datos |
|
|
|
print("leyendo") |
|
|
|
while(isRun): |
|
|
|
global isReceiving #valor booleano de recibiendo datos |
|
|
|
global dato #dato a recibir desde Arduino |
|
|
|
global data #Colección de datos a graficar |
|
|
|
for i in range(numData): |
|
|
|
datos = arduino.readline().decode("utf-8").strip() #Lectura del dato |
|
|
|
print(datos) |
|
|
|
if(datos != ''): #Asegurar que se haya leído un dato |
|
|
|
print("RECIBIENDO..." + str(i)) |
|
|
|
dato = float(datos) #Conversión del dato en float |
|
|
|
data[i].append(dato) #Agrega el dato a la colección |
|
|
|
var.set("TEMPERATURA: " + str(dato) + " °C") #impresión del dato numérico en la interfaz |
|
|
|
else: |
|
|
|
break; |
|
|
|
isReceiving = True #Confirmación de que se ha recibido el dato |
|
|
|
while(conected): |
|
|
|
if(isRun == True): |
|
|
|
global isReceiving #valor booleano de recibiendo datos |
|
|
|
global dato #dato a recibir desde Arduino |
|
|
|
global data #Colección de datos a graficar |
|
|
|
for i in range(numData): |
|
|
|
datos = arduino.readline().decode("utf-8").strip() #Lectura del dato |
|
|
|
print(datos) |
|
|
|
if(datos != ''): #Asegurar que se haya leído un dato |
|
|
|
print("RECIBIENDO..." + str(i)) |
|
|
|
dato = float(datos) #Conversión del dato en float |
|
|
|
data[i].append(dato) #Agrega el dato a la colección |
|
|
|
if(i == 0): |
|
|
|
var.set("TEMPERATURA 1: " + str(dato) + " °C") #impresión del dato numérico en la interfaz |
|
|
|
else: |
|
|
|
var2.set("TEMPERATURE 2: " + str(dato) + " °C") #impresión del dato numérico en la interfaz |
|
|
|
else: |
|
|
|
break; |
|
|
|
isReceiving = True #Confirmación de que se ha recibido el dato |
|
|
|
|
|
|
|
#Función para iniciar la gráfica |
|
|
|
def iniciarGrafica(self, muestras,lines): |
|
|
|
global dato |
|
|
|
if(datos != ''): |
|
|
|
lines[0].set_data(range(muestras), data[0]) #Se grafica en la línea la colección de datos |
|
|
|
lines[1].set_data(range(muestras), data[1]) |
|
|
|
#if(datos != ''): |
|
|
|
lines[0].set_data(range(muestras), data[0]) #Se grafica en la línea la colección de datos |
|
|
|
lines[1].set_data(range(muestras), data[1]) |
|
|
|
|
|
|
|
#Establecer conexión con Arduino |
|
|
|
def conectar_serial(): |
|
|
|
global arduino #Variable que va aguardar la conexión |
|
|
|
global conected |
|
|
|
try: |
|
|
|
arduino = serial.Serial(serialPort, baudRate) #Asignación del objeto a la variable |
|
|
|
arduino.timeout = 0.2 #Tiempo a esperar para que haya datos disponibles en el puerto serie |
|
|
@ -67,12 +76,17 @@ def conectar_serial(): |
|
|
|
btnStart.config(state = "normal") |
|
|
|
btnConectar.config(state = "disabled") |
|
|
|
btnManual.config(state = "normal") |
|
|
|
btnManual2.config(state = "normal") |
|
|
|
conected = True |
|
|
|
except: |
|
|
|
print("Error de conexión") |
|
|
|
|
|
|
|
#Hilo para la lectura de datos constante |
|
|
|
def iniciar_hilo(): |
|
|
|
global thread #Variable donde guardar el hilo |
|
|
|
global isRun |
|
|
|
btnStart.config(state = "disabled") |
|
|
|
isRun = True |
|
|
|
thread = Thread(target=leer_datos) #Creación del hilo con la función para leer los datos |
|
|
|
thread.start() #Inicio de la lectura |
|
|
|
btnStart.config(state = "disabled") |
|
|
@ -87,15 +101,30 @@ def control1(): |
|
|
|
global on |
|
|
|
global estado |
|
|
|
global arduino |
|
|
|
if on == False: #Cuando el transistor está apagado |
|
|
|
on = True #Cambia la variable de condición |
|
|
|
if on1 == False: #Cuando el transistor está apagado |
|
|
|
on1 = 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 |
|
|
|
estado = "on1" #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 |
|
|
|
on1 = 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 |
|
|
|
estado = "off1" #Cambia la variable de estado |
|
|
|
arduino.write(estado.encode()) #Se envía apagar al serial de Arduino |
|
|
|
|
|
|
|
def control2(): |
|
|
|
global on2 |
|
|
|
global estado |
|
|
|
global arduino |
|
|
|
if on2 == False: #Cuando el transistor está apagado |
|
|
|
on2 = True #Cambia la variable de condición |
|
|
|
btnManual2.config(bg = "#55DE1E", text = "ON") #Cambia color y texto del botón |
|
|
|
estado = "on2" #cambia la variable de estado |
|
|
|
arduino.write(estado.encode()) #Se envía encender al serial de Arduino |
|
|
|
else: #Cuando el transistor está encendido |
|
|
|
on2 = False #Cambia la variable de condición |
|
|
|
btnManual2.config(bg = "red", text = "OFF") #Cambia color y texto del botón |
|
|
|
estado = "off2" #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) |
|
|
@ -107,24 +136,37 @@ def control1(): |
|
|
|
|
|
|
|
#Función para pausar la gráfica |
|
|
|
def pausar(): |
|
|
|
anim.event_source.stop() |
|
|
|
btnResume.config(state = "normal") |
|
|
|
btnPause.config(state = "disabled") |
|
|
|
global isRun |
|
|
|
global arduino |
|
|
|
isRun = False |
|
|
|
anim.event_source.stop() |
|
|
|
arduino.close() |
|
|
|
btnResume.config(state = "normal") |
|
|
|
btnPause.config(state = "disabled") |
|
|
|
|
|
|
|
#Función para continuar graficando |
|
|
|
def reanudar(): |
|
|
|
anim.event_source.start() |
|
|
|
btnResume.config(state = "disabled") |
|
|
|
btnPause.config(state = "normal") |
|
|
|
global arduino |
|
|
|
global isRun |
|
|
|
conectar_serial() |
|
|
|
arduino.reset_input_buffer() #limpia el buffer de datos |
|
|
|
isRun = True |
|
|
|
anim.event_source.start() |
|
|
|
btnResume.config(state = "disabled") |
|
|
|
btnPause.config(state = "normal") |
|
|
|
|
|
|
|
#Función para finaliar la conexión con Arduino |
|
|
|
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") |
|
|
|
|
|
|
|
#Variables a graficar |
|
|
|
muestras = 100 #Número de datos a visualizar |
|
|
@ -151,6 +193,7 @@ 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) |
|
|
@ -170,11 +213,17 @@ 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=155) |
|
|
|
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 State:") |
|
|
|
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) |
|
|
|
#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") |
|
|
@ -187,8 +236,10 @@ btnResume = tk.Button(frame1, text = "Resume", command = reanudar, bg="#00F428", |
|
|
|
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) |
|
|
|
labelData.grid(row=0, column=4, pady=2, padx=500) |
|
|
|
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) |
|
|
@ -201,4 +252,3 @@ anim = animation.FuncAnimation(fig, iniciarGrafica, fargs=(muestras, lines), int |
|
|
|
|
|
|
|
root.geometry('1000x600') |
|
|
|
root.mainloop() |
|
|
|
|