首页 > 解决方案 > 显示来自 ADC 的平均数据的问题

问题描述

我的代码有问题。我正在尝试从我的 ADC 读取电压测量值并获取每 100 个读数的平均值,然后在我的默认屏幕上显示平均值。该过程应该重复,并且标签应该每 0.5 秒更新一次。但是,我的标签甚至没有显示在屏幕上。

这些是我的代码的一些片段

import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
import matplotlib.animation as animation
from matplotlib import style

import tkinter as tk
from tkinter import ttk
from matplotlib import pyplot as plt

import time
import Adafruit_ADS1x15
adc = Adafruit_ADS1x15.ADS1115()
GAIN = 1

LARGE_FONT = ('Verdana', 18)
NORM_FONT = ('Verdana', 14)
SMALL_FONT = ('Verdana' , 11)
MENU_FONT= ('Arial', 12, "bold")



def update_label(label):

    def getvoltage():

        readings = [0]*100
        maxsample = 100
        counter = 0

        while (counter < maxsample):

            reading = adc.read_adc(0, gain=GAIN)
            readings.append(reading)
            counter += 1

        avg = sum(readings)/100
        voltage = (avg * 0.1259)/100
        readings.clear()

        label.config(text=str('Voltage: {0:.2f}'.format(voltage)))
    label.after(500, getvoltage)



class Controller(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        tk.Tk.wm_title(self, "Controller")

        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0,weight=1)    
        self.show_frame(DefaultScreen)

class DefaultScreen(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self,parent)
        self.configure(bg="white")

        f = Figure(figsize = (10,3), dpi=100)
        a = f.add_subplot(111)
        a.plot([1,2,3,4,5,6,7,8],[2,4,6,8,10,12,14,16])

        button1 = ttk.Button(self,text="Contact Page",
                            command=lambda:controller.show_frame(ContactPage))
        button1.pack(anchor="se", pady=10, padx=10)
        ventilatorstatus="Ventilator Status: Closed"
        ventstatus= tk.Label(self, text=ventilatorstatus, font=LARGE_FONT, bg="white")
        ventstatus.place(relx=0.5, rely=0.15, anchor="center")
        voltage_label = tk.Label(self, font=LARGE_FONT, bg="white")
        voltage_label.place(relx=0.5, rely= 0.22, anchor="center")
        update_label(voltage_label)

        canvas= FigureCanvasTkAgg(f, self)
        canvas.show()
        canvas.get_tk_widget().pack(anchor="s", fill=tk.X, expand=True, pady=20)



app = Controller()
app.attributes('-fullscreen', True)
app.mainloop()

如果有人能告诉我我做错了什么,那就太好了。谢谢:)

标签: pythonpython-3.xtkinter

解决方案


对于那些可能会发现答案有用的人:

import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
import matplotlib.animation as animation
from matplotlib import style

import tkinter as tk
from tkinter import ttk
from matplotlib import pyplot as plt

import time
import Adafruit_ADS1x15
adc = Adafruit_ADS1x15.ADS1115()
GAIN = 1

LARGE_FONT = ('Verdana', 18)
NORM_FONT = ('Verdana', 14)
SMALL_FONT = ('Verdana' , 11)
MENU_FONT= ('Arial', 12, "bold")



def update_label(label):

    def getvoltage():

        readings = [0]*100
        maxsample = 100
        counter = 0

        while (counter < maxsample):

            reading = adc.read_adc(0, gain=GAIN)
            readings.append(reading)
            counter += 1

        avg = sum(readings)/100
        voltage = (avg * 0.1259)/100
        readings.clear()

        label.config(text=str('Voltage: {0:.2f}'.format(voltage)))
        label.after(500, getvoltage)
    getvoltage()



class Controller(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        tk.Tk.wm_title(self, "Controller")

        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0,weight=1)    
        self.show_frame(DefaultScreen)

class DefaultScreen(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self,parent)
        self.configure(bg="white")

        f = Figure(figsize = (10,3), dpi=100)
        a = f.add_subplot(111)
        a.plot([1,2,3,4,5,6,7,8],[2,4,6,8,10,12,14,16])

        button1 = ttk.Button(self,text="Contact Page",
                            command=lambda:controller.show_frame(ContactPage))
        button1.pack(anchor="se", pady=10, padx=10)
        ventilatorstatus="Ventilator Status: Closed"
        ventstatus= tk.Label(self, text=ventilatorstatus, font=LARGE_FONT, bg="white")
        ventstatus.place(relx=0.5, rely=0.15, anchor="center")
        voltage_label = tk.Label(self, font=LARGE_FONT, bg="white")
        voltage_label.place(relx=0.5, rely= 0.22, anchor="center")
        update_label(voltage_label)

        canvas= FigureCanvasTkAgg(f, self)
        canvas.show()
        canvas.get_tk_widget().pack(anchor="s", fill=tk.X, expand=True, pady=20)



app = Controller()
app.attributes('-fullscreen', True)
app.mainloop()

推荐阅读