2017-12-22 4 views
0

Ich verwende einen Raspberry Pi, um eine einfache Grafik zu erstellen, die analoge Messwerte von einem Potentiometer über die GPIO-Pins anzeigt. Ich habe eine kleine Schaltung erstellt, die die Unfähigkeit des RPi, analoge Signale zu lesen, überwinden kann. Es gibt ein kleines Problem mit dem Plotten selbst. Der Code, den ich verwende, ist unten gezeigt.matplotlib plot() funktioniert nicht

# include RPi libraries in to Python code 
import RPi.GPIO as GPIO 
import time 
import matplotlib.pyplot as plt 
from drawnow import drawnow 

# instantiate GPIO as an object 
GPIO.setmode(GPIO.BCM) 

# define GPIO pins with variables a_pin and b_pin 
a_pin = 18 
b_pin = 23 
gainF = [] 
gainString = 0 
plt.ion() 
x_axis = 0 

def makeFig(): 
    plt.ylim(200,210) 
    plt.xlim(0,100) 
    plt.title('Readings') 
    plt.grid(True) 
    plt.ylabel('Gain') 
    print(gainString) 
    print(x_axis) 
    plt.plot(gainString, x_axis) 
    plt.show() 
    #plt.plot(gainString, 'ro-', label='Gain dBm') 


# create discharge function for reading capacitor data 
def discharge(): 
    GPIO.setup(a_pin, GPIO.IN) 
    GPIO.setup(b_pin, GPIO.OUT) 
    GPIO.output(b_pin, False) 
    time.sleep(0.005) 

# create time function for capturing analog count value 
def charge_time(): 
    GPIO.setup(b_pin, GPIO.IN) 
    GPIO.setup(a_pin, GPIO.OUT) 
    count = 0 
    GPIO.output(a_pin, True) 
    while not GPIO.input(b_pin): 
     count = count +1 
    return count 

# create analog read function for reading charging and discharging data 
def analog_read(): 
    discharge() 
    return charge_time() 

# provide a loop to display analog data count value on the screen 
while True: 
    print(analog_read()) 
    gainString = analog_read() 
    x_axis = x_axis + 1 
    #dataArray = gainString.split(',') 
    #gain = float(dataArray[0]) 
    #gainF.append(gain) 
    makeFig() 
    plt.pause(.000001) 
    time.sleep(1) 

    #GPIO.cleanup() 

Dieser Code zeigt die Erhöhung der x-Achse und die y-Achse Ablesungen vom makeFig() Funktion, aber die grafische Darstellung, die zeigt nicht etwas öffnet. Es bleibt gleich. Alles, was ich im Code ändern muss? Vielen Dank.

+0

Kann nichts davon laufen, um zu überprüfen, aber Sie speichern nur die letzt lesen? Mache 'gainString' (ist es wirklich eine Zeichenkette?) Eine Liste' gainString = [] 'und füge den gelesenen Wert in deine Schleife' gainString.append (analog_read()) 'ein. x_axis kann dann einfach 'x_axis = range (len (gainString))' sein. Lass mich wissen, wie das geht und poste einen Screenshot des falschen Graphen, wenn du kannst. –

+0

Ich habe den Code wie von Ihnen angewiesen geändert, siehe unten. 'while True: print (analog_read()) #gainString = analog_read() gainString.append (analog_read()) x_axis = range (len (gainString)) #x_axis = x_axis + 1 #dataArray = gainString.split ('') = #gain Schwimmers (dataarray [0]) # gainF.append (gain) makeFig() plt.pause (0,000001) time.sleep (1) ' Es erzeugt einen Ausgang eines Arrays wie unten '90 [195, 189] Bereich (0, 2) [195, 189, 96] Bereich (0, 3) ' was geht weiter, aber das Diagramm ist immer noch leer –

+0

@KenSyme Ich bekomme diesen Fehler am Anfang des Codes, beeinflusst es das Programm in irgendeiner Weg? 'analoge Lese 180 gainString = [183] ​​ x_axis = [1] /usr/lib/python3/dist-packages/matplotlib/backend_bases.py:2445: MatplotlibDeprecationWarning: Verwenden von Standardereignisschleife, bis diesem spezifischen Funktion GUI ist implementiert warnings.warn (str, mplDeprecation) ' –

Antwort

1

Sie versuchen, ein Liniendiagramm einzelner Werte zu zeichnen. Dies ist die gleiche wie

plt.plot([1],[5]) 

, die nicht angezeigt wird, weil eine Linie zwei Punkte zumindest muss eine Linie werden.

Sie können einen Marker verwenden, um einzelne Punkte im Fall anzuzeigen das ist, was sie ist nach

plt.plot([1],[5], marker="o")