class SingleMode: # init function, sets up global variables and objects, builds the GUI def __init__(self, master): # global variables self.master = master # available sensors list self.Sensors = ["----", "TMP36", "LMT86", "ADXL335 X-axis", "ADXL335 Y-axis", "ADXL335 Z-axis", "ADXL335 Total", "BMP180 Temp", "BMP180 Pressure", "TSL2561"] # State controls if the software actively measures self.State = False # Interval controls the interval between measurements self.Interval = 100 # Sensor_values displays actual measured values self.Sensor_value1 = Tk.StringVar(master) self.Sensor_value1.set("0.0") # SensorSelects controls which sensor are selected self.SensorSelect1 = Tk.StringVar(master) self.SensorSelect1.set(self.Sensors[0]) # ChannelSelects controls which channels are selected self.ChannelSelect1 = Tk.IntVar(master) self.ChannelSelect1.set(0) # FreqeuncySelect controls frequency of measurements self.FrequencySelect = Tk.IntVar(master) self.FrequencySelect.set(10) # Sensor_units displays units of actively measured values self.Sensor_unit1 = Tk.StringVar(master) self.Sensor_unit1.set("--") # creates SensorReader and DataLogger objects self.sr = SensorReader(True, True, False) self.DL1 = DataLogger(False) # configures the grid layout master.columnconfigure(1, weight=0) master.columnconfigure(2, weight=2) master.columnconfigure(3, weight=1) master.columnconfigure(4, weight=1) master.rowconfigure(1, weight=1) master.rowconfigure(2, weight=0) master.rowconfigure(3, weight=0) master.rowconfigure(4, weight=0) # configures the window properties master.resizable(0, 0) master.geometry("500x250+300+300") master.title("LabPi SINGLE MODE") # GUI elements config # labels which display current value and unit self.sensor_value1 = Tk.Label(master, textvariable=self.Sensor_value1, font=("Helvetica", 60)) self.sensor_value1.grid(row=1, column=1, columnspan=3) self.sensor_unit1 = Tk.Label(master, textvariable=self.Sensor_unit1, font=("Helvetica", 50)) self.sensor_unit1.grid(row=1, column=4, columnspan=3) # static labels self.Select_label1 = Tk.Label(master, text="Sensor 1:") self.Select_label1.grid(row=2, column=1, sticky="nsew") self.Select_label2 = Tk.Label(master, text="Channel 1:") self.Select_label2.grid(row=3, column=1, sticky="nsew") self.Select_label3 = Tk.Label(master, text="Frequency:") self.Select_label3.grid(row=4, column=1, sticky="nsew") # optionmenus for configuring self.sensor_Select1 = Tk.OptionMenu(master, self.SensorSelect1, *self.Sensors) self.sensor_Select1.grid(row=2, column=2, sticky="nsew") self.channel_Select1 = Tk.OptionMenu(master, self.ChannelSelect1, 0, 1, 2, 3) self.channel_Select1.grid(row=3, column=2, sticky="nsew") self.frequency_Select = Tk.OptionMenu(master, self.FrequencySelect, 1, 2, 5, 10, 25, 50) self.frequency_Select.grid(row=4, column=2, sticky="nsew") # control buttons self.Start_button = Tk.Button(master, text="Start", command=self.start) self.Start_button.grid(row=2, column=3, sticky="nsew") self.Stop_button = Tk.Button(master, text="Stop", command=self.stop) self.Stop_button.grid(row=3, column=3, sticky="nsew") self.Save_button = Tk.Button(master, text="Save", command=self.save) self.Save_button.grid(row=2, column=4, sticky="nsew") self.Plot_button = Tk.Button(master, text="Plot", command=self.plot) self.Plot_button.grid(row=3, column=4, sticky="nsew") # refresh function, checks if State=True, then runs measurement again after set interval def refresh(self): if self.State: self.master.after(self.Interval, self.refresh) self.updateVar1() # start function, configures app for measurement, then starts the refresh function def start(self): # clean previously logged data self.DL1.eraseData() # update measuring frequency self.updateFrequency() # update unit self.updateUnit1() # write info block into data log self.DL1.writeInfo(info="sensor:" + str(self.SensorSelect1.get()) + ", date:" + time.strftime("%Y-%m-%d %H:%M:%S") + ", interval: " + str(self.Interval)) # disable GUI elements self.sensor_Select1.configure(state="disabled") self.Start_button.configure(state="disabled") self.channel_Select1.configure(state="disabled") self.frequency_Select.configure(state="disabled") self.Save_button.configure(state="disabled") self.Plot_button.configure(state="disabled") # set state to True and run refresh function self.State = True self.refresh() # save function, saves the logged data via DataLogger function def save(self): self.DL1.saveData(location="measurements/", name=("Sensor1"+time.strftime("%Y-%m-%d-%H%M%S"))) # plot function, plots logged data with pyplot, configure pyplot def plot(self): plt.plot(self.DL1.readData()) plt.ylabel(self.Sensor_unit1.get()) plt.xlabel("Samples") plt.grid(True) plt.show() # stop function, sets State to False, enables disabled GUI elements def stop(self): self.State = False self.sensor_Select1.configure(state="normal") self.Start_button.configure(state="normal") self.channel_Select1.configure(state="normal") self.frequency_Select.configure(state="normal") self.Save_button.configure(state="normal") self.Plot_button.configure(state="normal") # updateUnit function, updates displayed unit to proper one def updateUnit1(self): if self.SensorSelect1.get() == "----": self.Sensor_unit1.set("--") elif self.SensorSelect1.get() == "TMP36": self.Sensor_unit1.set("C") elif self.SensorSelect1.get() == "LMT86": self.Sensor_unit1.set("C") elif self.SensorSelect1.get() == "ADXL335 X-axis": self.Sensor_unit1.set("m/s2") elif self.SensorSelect1.get() == "ADXL335 Y-axis": self.Sensor_unit1.set("m/s2") elif self.SensorSelect1.get() == "ADXL335 Z-axis": self.Sensor_unit1.set("m/s2") elif self.SensorSelect1.get() == "ADXL335 Total": self.Sensor_unit1.set("m/s2") elif self.SensorSelect1.get() == "BMP180 Temp": self.Sensor_unit1.set("C") elif self.SensorSelect1.get() == "BMP180 Pressure": self.Sensor_unit1.set("Pa") elif self.SensorSelect1.get() == "TSL2561": self.Sensor_unit1.set("lux") # updateVar function, updates displayed unit to proper one, writes data to data log def updateVar1(self): if self.SensorSelect1.get() == "TMP36": value = self.sr.readTMP36(self.ChannelSelect1.get()) elif self.SensorSelect1.get() == "LMT86": value = self.sr.readLMT86(self.ChannelSelect1.get()) elif self.SensorSelect1.get() == "ADXL335 X-axis": value = self.sr.readADXL335XAccel(self.ChannelSelect1.get()) elif self.SensorSelect1.get() == "ADXL335 Y-axis": value = self.sr.readADXL335YAccel(self.ChannelSelect1.get()) elif self.SensorSelect1.get() == "ADXL335 Z-axis": value = self.sr.readADXL335ZAccel(self.ChannelSelect1.get()) elif self.SensorSelect1.get() == "ADXL335 Total": value = self.sr.readADXL335TotalAccel(0, 1, 2) elif self.SensorSelect1.get() == "BMP180 Temp": value = self.sr.readBMP085Temp() elif self.SensorSelect1.get() == "BMP180 Pressure": value = self.sr.readBMP085Pressure() elif self.SensorSelect1.get() == "TSL2561": value = self.sr.readTSL2561Lux() else: value = 0 self.Sensor_value1.set(str(value)) self.DL1.writeData(value) # updateFrequency function, sets interval between measurements to selected value def updateFrequency(self): if self.FrequencySelect.get() == 1: self.Interval = 1000 elif self.FrequencySelect.get() == 2: self.Interval = 500 elif self.FrequencySelect.get() == 5: self.Interval = 200 elif self.FrequencySelect.get() == 10: self.Interval = 100 elif self.FrequencySelect.get() == 25: self.Interval = 40 elif self.FrequencySelect.get() == 50: self.Interval = 20