Heating system interface for communication with Arduino and data graphing
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

157 lines
4.9 KiB

# -*- coding: utf-8 -*-
"""
Created on Wed Feb 15 10:44:49 2023
@author: david
"""
from threading import Thread
import collections #Colección de datos para graficarlos
import matplotlib.pyplot as plt #Gráficación de datos
import matplotlib.animation as animation #Animar la gráfica
import time
import serial
#import numpy as np
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg #Crear una figura para insertar en tkinter
import tkinter as tk #Para la interfaz
#from matplotlib.lines import Line2D
def leer_datos():
time.sleep(1.0)
arduino.reset_input_buffer()
print("leyendo")
while(isRun):
global isReceiving
global dato1
print("RECIBIENDO...")
dato1 = float(arduino.readline().decode("utf-8").strip())
print(dato1)
var.set("TEMPERATURA: " + str(dato1) + " °C")
isReceiving = True
def iniciarGrafica(self, muestras,lines):
global dato1
data.append(dato1)
lines.set_data(range(muestras), data)
global isRun
isReceiving = False
isRun = True
dato1 = 0.0
serialPort = 'COM3'
baudRate = 9600
def conectar_serial():
global arduino
try:
arduino = serial.Serial(serialPort, baudRate)
arduino.timeout = 0.5
time.sleep(0.5)
print("CONECTADO")
btnStart.config(state = "normal")
btnConectar.config(state = "disabled")
except:
print("Error de conexión")
def iniciar_hilo():
global thread
thread = Thread(target=leer_datos)
thread.start()
btnStart.config(state = "disabled")
btnPause.config(state = "normal")
def guardarGrafica():
plt.savefig('miFigura.png')
def control1():
window2 = tk.Toplevel()
window2.resizable(width = 0, height = 0)
window2.title('Control Manual')
window2.geometry('500x300')
def control2():
window3 = tk.Toplevel()
window3.resizable(width = 0, height = 0)
window3.title('Control ON/OFF')
window3.geometry('500x300')
def pausar():
anim.event_source.stop()
btnResume.config(state = "normal")
btnPause.config(state = "disabled")
def reanudar():
anim.event_source.start()
btnResume.config(state = "disabled")
btnPause.config(state = "normal")
def desconectar_serial():
global isRun
anim.event_source.stop()
isRun = False
arduino.close()
btnPause.config(state = "disabled")
btnResume.config(state = "disabled")
muestras = 100
data = collections.deque([0] * muestras, maxlen = muestras)
tiempoMuestreo = 100
fig = plt.figure(facecolor = '0.94')
ax = plt.axes(xlim=(0,100), ylim=(-40, 150))
plt.title("Sensor 1 - Arduino")
ax.set_xlabel("Muestras")
ax.set_ylabel("Voltaje")
lines = ax.plot([], [])[0]
root= tk.Tk()
root.title("Sistema de calentamiento")
var = 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)
#self.master.rowconfigure(0, weigh=1)
#self.master.rowconfigure(1, weigh=1)
#self.master.rowconfigure(2, weigh=1)
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)
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=3, pady=2, padx=10)
labelData = tk.Label(frame2, textvariable=var)
labelData.grid(row=0, column=4, pady=2, padx=500)
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)
anim = animation.FuncAnimation(fig, iniciarGrafica, fargs=(muestras, lines), interval = tiempoMuestreo)
root.geometry('1000x600')
root.mainloop()