2017-04-02 164 views
0

我实际上正在研究一个schoolar项目。我们需要读取并显示来自4个不同传感器的信号。我决定使用python而不是matlab(simulink),因为matlab不识别树莓派3.我已经做了一个非常简单的指南惠特Tkinter,它读取并显示传感器的值,并将其保存在图表中。问题是,当我将代码放在图上时,它会停止传感器的刷新,并在一个图中显示四个值。这个问题是:使用matplotlib绘制python

如何显示四个值的四个图形?

如何使自动刷新?

如何使用一个按钮关闭所有数字?

如果它可能可以告诉我在哪里可以找到信息,使更多的视觉图形?如何定制de graph。

这里是我的代码有:

#IMPORTAR LIBRERIAS NECESARIAS 
from Tkinter import * 
from drawnow import * 
import RPi.GPIO as GPIO 
import matplotlib.pyplot as plt 
import numpy 
import tkFont 
import time 
import Adafruit_DHT 

#Variables 
trig = 16 
echo = 18 
pir = 15 
distance = 0 
distancia = 0 
tiempo = 0 
temp = 0 
humd = 0 
distanciaM = [] 
temperaturaM = [] 
presenciaM = [] 
humedadM = [] 

#DECLARAR ENTRADAS Y SALIDAS 
GPIO.setmode(GPIO.BOARD) 
GPIO.setwarnings(False) 
GPIO.setup(trig, GPIO.OUT) 
GPIO.setup(echo, GPIO.IN) 
GPIO.setup(pir, GPIO.IN) 


#VENTANAS 
win = Tk() 
plt.figure() 

#TITULO DE LA VENTANA 
win.title("Lectura sensores") 

#DIMENSIONES DE INICIO 
win.geometry('1050x500') 

#FUENTES 
myFont = tkFont.Font(family = 'Helvetica', size = 36) 
titles = tkFont.Font(family = 'Helvetica', size = 50, weight = 'bold') 

#FUNCIONES 
##LEER SENSORES 
def med(): 
    ###DISTANCIA 
    global distance 
    global distancia 
    global temp 
    global humd 
    GPIO.output(trig, False) 
    time.sleep(1) 
    GPIO.output(trig, True) 
    time.sleep(0.00001) 
    GPIO.output(trig, False) 

    while GPIO.input(echo)==0: 
     pulse_start = time.time() 

    while GPIO.input(echo)==1: 
     pulse_end = time.time() 

    pulse_duration = pulse_end - pulse_start 

    distance = pulse_duration * 17150 
    distance = round(distance, 2) 

    distancia.configure(text=str(distance)) 
    distanciaM.append(str(distance)) 
    print(distanciaM) 
    ###PRESENCIA 
    i=GPIO.input(pir) 
    if i==1: 
     rb1.configure(text = str(i)) 
     time.sleep(0.1) 
    else: 
     rb1.configure(text = str(i)) 
     time.sleep(0.1) 
    presenciaM.append(str(i)) 
    print (presenciaM) 
    ###TEMPERATURA Y HUMEDAD 
    humidity, temperature = Adafruit_DHT.read_retry(11, 27) 
    temp = temperature 
    humd = humidity 
    templl.configure(text=str(temp)) 
    humll.configure(text=str(humd)) 
    temperaturaM.append(str(temp)) 
    humedadM.append(str(humd)) 
    print(temperaturaM) 
    print(humedadM) 
    ###GRAFICAR 
    plt.plot(distanciaM, label ='Distancia','r') 
    plt.plot(presenciaM, label='Presencia', 'g') 
    plt.plot(temperaturaM, label='Temperatura', 'b') 
    plt.plot(humedadM, label='Humedad', 'y') 
    plt.show() 
##LECTURA CONTINUA 
def leccont(): 
    med() 
    win.after(1000, leccont) 
##SALIR DEL PROGRAMA 
def exitProgram(): 
    GPIO.cleanup() 
    win.quit() 

#WIDGETS 

##TITULO 
titulo = Label(win, text="Lectura de cuatro sensores", font = titles) 
titulo.grid(columnspan = 3) 

##DISTANCIA 
dist = Label(win, text = "Distancia:", font = myFont) 
dist.grid(row = 1, column=0, sticky=W) 

##ETIQUETA DISTANCIA 
distancia = Label(win, text = "Distancia" , font=myFont) 
distancia.grid(row=1, column=1) 

##ETIQUETA UNIDADES DISTANCIA 
cms=Label(win, text = "cms", font = myFont) 
cms.grid(row = 1, column = 2) 

##ETIQUETA PRESENCIA 
pa=Label(win, text = "Presencia:", font = myFont) 
pa.grid(row=2, column = 0, sticky=W) 

##INDICADOR PRESENCIA 
rb1 = Label(win, text = "No Presente", font = myFont) 
rb1.grid(row = 2, column =1) 

##TEMPERATURA 
templ=Label(win, text="Temperatura:", font=myFont) 
templ.grid(row=3,column=0,sticky=W) 

##ETIQUETA TEMPERATURA 
templl=Label(win, text="Temperatura", font=myFont) 
templl.grid(row=3,column=1) 

##ETIQUETA UNIDADES TEMPERATURA 
tempu=Label(win, text = "C", font = myFont) 
tempu.grid(row = 3, column = 2) 

##HUMEDAD 
huml=Label(win, text="Humedad relativa:", font=myFont) 
huml.grid(row=4,column=0,sticky=W) 

##ETIQUETA HUMEDAD 
humll=Label(win, text="humedad", font=myFont) 
humll.grid(row=4,column=1) 

##ETIQUETA UNIDADES HUMEDAD 
humu=Label(win, text = "HR", font = myFont) 
humu.grid(row = 4, column = 2) 

##MOSTRAR VALORES 
medir=Button(win,text="Medir",font=myFont,command=med,height=1,width=6) 
medir.grid(row=6,column=0) 

##LECTURA CONTINUA 
lecconti=Button(win, text="Medicion continua", font = myFont, command = leccont, height = 1, width = 15) 
lecconti.grid(row = 6, column = 1) 

##BOTON SALIR 
exitButton = Button(win, text = "Salir", font = myFont, command = exitProgram, height = 1 , width = 6) 
exitButton.grid(row = 6, column = 2) 

mainloop() 
+0

是否有你需要使用matplotlib,而不是另外一个图形系统,更设计了一个理由用于像pyqtgraph或bokeh这样的交互式使用? – TheBlackCat

+0

即时通讯新的python所以它的第一件事出来时,我做研究。如果有更容易的欢迎。 –

回答

0

我已经解决了它所以这里的代码:

# -*- coding: utf-8 -*- 
#IMPORTAR LIBRERIAS NECESARIAS 
from Tkinter import * 
from drawnow import * 
from matplotlib import style 
import RPi.GPIO as GPIO 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 
import numpy 
import tkFont 
import time 
import Adafruit_DHT 

#Variables 
trig = 16 
echo = 18 
ldr = 15 
distance = 0 
distancia = 0 
tiempo = 0 
temp = 0 
humd = 0 
distanciaM = [] 
temperaturaM = [] 
resistenciaM = [] 
humedadM = [] 

style.use('fivethirtyeight') 

#DECLARAR ENTRADAS Y SALIDAS 
GPIO.setmode(GPIO.BOARD) 
GPIO.setwarnings(False) 
GPIO.setup(trig, GPIO.OUT) 
GPIO.setup(echo, GPIO.IN) 
GPIO.setup(ldr, GPIO.OUT) 


#VENTANAS 
win = Tk() 
fig = plt.figure() 

#TITULO DE LA VENTANA 
win.title("Lectura sensores") 

#DIMENSIONES DE INICIO 
win.geometry('900x500') 

#FUENTES 
myFont = tkFont.Font(family = 'Helvetica', size = 36) 
titles = tkFont.Font(family = 'Helvetica', size = 50, weight = 'bold') 

#FUNCIONES 
##LEER SENSORES 
def med(i): 
    ###DISTANCIA 
    global distance 
    global distancia 
    global temp 
    global humd 
    GPIO.output(trig, False) 
    time.sleep(1) 
    GPIO.output(trig, True) 
    time.sleep(0.00001) 
    GPIO.output(trig, False) 

    while GPIO.input(echo)==0: 
     pulse_start = time.time() 

    while GPIO.input(echo)==1: 
     pulse_end = time.time() 

    pulse_duration = pulse_end - pulse_start 

    distance = pulse_duration * 17150 
    distance = round(distance, 2) 

    distancia.configure(text=str(distance)) 
    distanciaM.append(str(distance)) 
    print(distanciaM) 
    ###RESISTENCIA 
    count = 0 
    GPIO.setup(ldr, GPIO.OUT) 
    GPIO.output(ldr, GPIO.LOW) 
    time.sleep(0.1) 
    GPIO.setup(ldr, GPIO.IN) 
    while (GPIO.input(ldr) == GPIO.LOW): 
     count += 1 
     rb1.configure(text = str(count)) 
    print count 
    resistenciaM.append(str(count)) 
    print (resistenciaM) 
    ###TEMPERATURA Y HUMEDAD 
    humidity, temperature = Adafruit_DHT.read_retry(11, 27) 
    temp = temperature 
    humd = humidity 
    templl.configure(text=str(temp)) 
    humll.configure(text=str(humd)) 
    temperaturaM.append(str(temp)) 
    humedadM.append(str(humd)) 
    print(temperaturaM) 
    print(humedadM) 
    ###GRAFICAR 
    plt.plot(distanciaM, label ='Distancia',color='r') 
    plt.plot(resistenciaM, label='Resistencia', color='g') 
    plt.plot(temperaturaM, label='Temperatura', color='b') 
    plt.plot(humedadM, label='Humedad', color='k') 
    count = 0 
##LECTURA CONTINUA 
def leccont(): 
    ani = animation.FuncAnimation(fig, med, interval=2000) 
    plt.legend() 
    plt.show() 
    win.after(1000, leccont) 
##SALIR DEL PROGRAMA 
def exitProgram(): 
    GPIO.cleanup() 
    plt.close() 
    win.quit() 
#WIDGETS 

##TITULO 
titulo = Label(win, text="Lectura de cuatro sensores", font = titles) 
titulo.grid(columnspan = 3) 

##DISTANCIA 
dist = Label(win, text = "Distancia:", font = myFont) 
dist.grid(row = 1, column=0, sticky=W) 

##ETIQUETA DISTANCIA 
distancia = Label(win, text = "Distancia" , font=myFont) 
distancia.grid(row=1, column=1) 

##ETIQUETA UNIDADES DISTANCIA 
cms=Label(win, text = "Cms", font = myFont) 
cms.grid(row = 1, column = 2) 

##ETIQUETA RESISTENCIA 
pa=Label(win, text = "Resistencia:", font = myFont) 
pa.grid(row=2, column = 0, sticky=W) 

##INDICADOR RESISTENCIA 
rb1 = Label(win, text = "Resistencia", font = myFont) 
rb1.grid(row = 2, column =1) 

##ETIQUETA RESITENCIA 
ohms=Label(win, text="Ohms", font = myFont) 
ohms.grid(row=2, column = 2) 

##TEMPERATURA 
templ=Label(win, text="Temperatura:", font=myFont) 
templ.grid(row=3,column=0,sticky=W) 

##ETIQUETA TEMPERATURA 
templl=Label(win, text="Temperatura", font=myFont) 
templl.grid(row=3,column=1) 

##ETIQUETA UNIDADES TEMPERATURA 
tempu=Label(win, text = "C", font = myFont) 
tempu.grid(row = 3, column = 2) 

##HUMEDAD 
huml=Label(win, text="Humedad relativa:", font=myFont) 
huml.grid(row=4,column=0,sticky=W) 

##ETIQUETA HUMEDAD 
humll=Label(win, text="humedad", font=myFont) 
humll.grid(row=4,column=1) 

##ETIQUETA UNIDADES HUMEDAD 
humu=Label(win, text = "HR", font = myFont) 
humu.grid(row = 4, column = 2) 

##LECTURA CONTINUA 
lecconti=Button(win, text="Medicion", font = myFont, command = leccont, height = 1, width = 15) 
lecconti.grid(row = 6, column = 0) 

##BOTON SALIR 
exitButton = Button(win, text = "Salir", font = myFont, command = exitProgram, height = 1 , width = 6) 
exitButton.grid(row = 6, column = 2) 

mainloop()