spm6103-viewer/spm6103_viewer.py

176 lines
5.4 KiB
Python

import tkinter as tk
from tkinter.font import Font
import serial
import os
os.environ['GDK_SCALE'] = '2'
# Serial configuration
port = '/dev/ttyUSB0' # Adjust to your specific port
baud_rate = 115200 # Adjust to your device's baud rate
try:
ser = serial.Serial(port, baud_rate, timeout=1)
except serial.SerialException as e:
ser = None
print(f"Serial port error: {e}")
def send_command(command):
if not ser:
return "Serial port not available"
ser.write((command + '\n').encode('utf-8'))
response = ser.readline().decode('utf-8').strip()
return response
def get_id():
if not ser:
return "TEST"
return send_command('*IDN?')
def get_multimeter_data():
if not ser:
return "TEST,+00.1234TEST,TEST,TEST"
rawdata = send_command(f'CONFigure:ALL?')
return rawdata
def get_powersupply_data():
if not ser:
return "0.1234,0.1234,0.1234"
rawdata = send_command(f'MEASure:ALL:INFO?')
return rawdata
def set_res_mode():
if not ser:
return "TEST"
rawdata = send_command(f'[SENSe:]FUNCtion:RESistance')
rawdata = send_command(f'[SENSe:]RESistance:RANGe:AUTO')
return rawdata
def set_res200_mode():
if not ser:
return "TEST"
rawdata = send_command(f'[SENSe:]FUNCtion:RESistance')
rawdata = send_command(f'[SENSe:]RESistance:RANGe:200')
return rawdata
def set_cont_mode():
if not ser:
return "TEST"
rawdata = send_command(f'[SENSe:]FUNCtion:CONTinuity')
return rawdata
def set_diod_mode():
if not ser:
return "TEST"
rawdata = send_command(f'[SENSe:]FUNCtion:DIODe')
return rawdata
def set_voltdc_mode():
if not ser:
return "TEST"
rawdata = send_command(f'[SENSe:]FUNCtion:VOLTage:DC')
return rawdata
def set_voltac_mode():
if not ser:
return "TEST"
rawdata = send_command(f'[SENSe:]FUNCtion:VOLTage:AC')
return rawdata
def set_cap_mode():
if not ser:
return "TEST"
rawdata = send_command(f'[SENSe:]FUNCtion:CAPacitance')
return rawdata
# --- GUI Setup ---
def fetch_device_info():
# Fetch the device ID and Channel data
multimeter_data = get_multimeter_data()
# Update the labels
multimeter_type_var.set(multimeter_data.split(",")[0])
multimeter_data_var.set(multimeter_data.split(",")[1])
multimeter_range_var.set(multimeter_data.split(",")[3])
# Schedule this function to be called again after 100ms
app.after(100, fetch_device_info)
app = tk.Tk()
app.title("OWON SPM6103")
app.geometry("1080x200")
app.configure(bg="black")
multimeter_type_var = tk.StringVar()
multimeter_data_var = tk.StringVar()
multimeter_range_var = tk.StringVar()
# Create dynamic font objects
fontSmall = Font(size=10)
fontMedium = Font(size=20)
fontBig = Font(size=80)
resize_after_id = None
def apply_font_resize():
width = app.winfo_width()
fontSmall.configure(size=max(4, int(width * 0.02)))
fontMedium.configure(size=max(14, int(width * 0.03)))
fontBig.configure(size=max(24, int(width * 0.1)))
def resize_loop():
apply_font_resize()
app.after(200, resize_loop)
resize_loop() # start it once
# Bind resize event
#app.bind("<Configure>", resize_fonts)
# Configure grid to be fully responsive
app.rowconfigure(0, weight=4) # Top - medium
app.rowconfigure(1, weight=20) # Middle - big
app.rowconfigure(2, weight=1) # Bottom - small
for j in range(7):
app.columnconfigure(j, weight=1)
button_fg = "#444444"
# Labels
tk.Label(app, textvariable=multimeter_type_var, font=fontMedium, bg="black", fg="lightgrey") \
.grid(column=0, columnspan=3, row=0, sticky="nsew", padx=0, pady=0)
tk.Label(app, textvariable=multimeter_range_var, font=fontMedium, bg="black", fg="lightgrey") \
.grid(column=4, columnspan=3, row=0, sticky="nsew", padx=0, pady=0)
tk.Label(app, textvariable=multimeter_data_var, font=fontBig, bg="black", fg="lightgrey") \
.grid(column=0, columnspan=7, row=1, sticky="nsew", padx=0, pady=0)
tk.Button(app, text="RES", command=set_res_mode, font=fontSmall, bg="black", fg=button_fg, highlightbackground=button_fg, borderwidth=0) \
.grid(column=0, row=2, sticky="nsew", padx=0, pady=0)
tk.Button(app, text="RES200", command=set_res200_mode, font=fontSmall, bg="black", fg=button_fg, highlightbackground=button_fg, borderwidth=0) \
.grid(column=1, row=2, sticky="nsew", padx=0, pady=0)
tk.Button(app, text="CONT", command=set_cont_mode, font=fontSmall, bg="black", fg=button_fg, highlightbackground=button_fg, borderwidth=0) \
.grid(column=2, row=2, sticky="nsew", padx=0, pady=0)
tk.Button(app, text="VOLT:DC", command=set_voltdc_mode, font=fontSmall, bg="black", fg=button_fg, highlightbackground=button_fg, borderwidth=0) \
.grid(column=3, row=2, sticky="nsew", padx=0, pady=0)
tk.Button(app, text="VOLT:AC", command=set_voltac_mode, font=fontSmall, bg="black", fg=button_fg, highlightbackground=button_fg, borderwidth=0) \
.grid(column=4, row=2, sticky="nsew", padx=0, pady=0)
tk.Button(app, text="DIOD", command=set_diod_mode, font=fontSmall, bg="black", fg=button_fg, highlightbackground=button_fg, borderwidth=0) \
.grid(column=5, row=2, sticky="nsew", padx=0, pady=0)
tk.Button(app, text="CAP", command=set_cap_mode, font=fontSmall, bg="black", fg=button_fg, highlightbackground=button_fg, borderwidth=0) \
.grid(column=6, row=2, sticky="nsew", padx=0, pady=0)
# Initial fetch to start the auto-update process
fetch_device_info()
# Start GUI
app.mainloop()