Как построить в графическом интерфейсе с помощью MatplotLib значения, полученные от датчика? - PullRequest
1 голос
/ 12 июля 2020

Я разрабатываю графический интерфейс, который запрашивает имя создаваемого нового файла типа txt и запрашивает у вас последовательный порт, на котором находится ваш Arduino, когда вы запускаете программу python, подключающуюся к Arduino с помощью на указанный порт c и принимает данные 25 датчиков (используйте потенциометр для выполнения тестов), и эти полученные данные записываются в текстовый файл, в дополнение к этому, чтобы показать в графическом интерфейсе результаты, будут отображать их на графике. Проблемы, с которыми я столкнулся при выполнении своей цели, следующие:

Считывает данные как байты, поэтому, когда вы сохраняете их в текстовый файл, он сохраняет их таким образом

b'NUMBER\r\n'

, а это означает, что когда вы хотите использовать replace ('b \ r \ n', ''), дайте мне

TypeError: a bytes-like object is required, not 'str'

Это, в свою очередь, означает, что при построении графика данные размещаются не в порядке возрастания, а по внешнему виду

Values received from the graphed sensor

At the moment I do not know how to capture this graph that is generated in the interface when it ends but if I do not solve this first will not do any good.

I leave the part where I try to replace commented so that they know where I put it, here my python code

import matplotlib.pyplot as plt

from tkinter import*
import serial, time
def createTEXT(reading):
    text=''
    for i in range(len(reading)):
        text += str(reading[i]) + ' '

    return text

def graph(reading):
    y=[]
    for i in range(len(reading)):
        y.append(reading[i])
    return y

def SEND():
    NAME=str(NOMBRE.get())
    PORT=str(PUERTO.get())
    PORT=str(PUERTO.get())
    try:
        arduino = serial.Serial(PORT,9600)
        time.sleep(4)#Stabilize the connection
        for i in range(25):
            arduino.write(b'1')#Bits are sent here
        reading=[]
        
        for i in range(25):
            reading.append(arduino.readline())
        arduino.close()
        
        # for i in range(len(reading)):
        #     reading[i][len(reading[i])-1] = reading[i][len(reading[i])-1].replace('b\r\n','')
    except:
        messagebox.showinfo(message="Please verify that the Port you put in is the right one", title="ERROR")

    archive = open(NAME+".txt","w") #Open the file in write mode "write" 
    Text=createTEXT(reading)

    archive.write(Text)
    archive.close()
    print(Text)
    y=graph(reading)
    plt.plot(y)

    # plt.show

POTENTIOMETER = Tk()
frame = Frame(POTENTIOMETER)

#Objects to use
ASKNAME = Label(frame,text= "Welcome, what name will this new file have?")
NOMBRE = Entry(frame)
ASKPORT = Label(frame,text= "Which port your ARDUINO UNO is connected to?")
PUERTO = Entry(frame)
SEND= Button(frame, text = "SEND", command = SEND)


#Content
ASKNAME.pack()
NOMBRE.pack()
ASKPORT.pack()
PUERTO.pack()
SEND.pack()
frame.pack(padx = 200, pady=150)#Tamaño márco
POTENTIOMETER.mainloop()

And here's my Arduino code, the one I'm using is Arduino One and so it's all connected введение к описанию водных изображений

int s = 0;
void setup() {
  Serial.begin(9600);
  pinMode(A2, INPUT);

}

void loop() {
  if (Serial.read() == '1') {
    delay(1000);
    for (int i = 0; i < 25; i++) {
      s = analogRead(A2);
      delay(500);
      Serial.println(s);

    }
  }
}

как вы, возможно, видели, я поместил print(text) для просмотра с консоли python, не открывая файл file.txt, что было сохранено, здесь я оставляю вам то, что напечатано

b'1016\r\n' b'1019\r\n' b'1016\r\n' b'1018\r\n' b'1016\r\n' b'1017\r\n' b'1019\r\n' b'1018\r\n' b'1016\r\n' b'1018\r\n' b'1018\r\n' b'965\r\n' b'1016\r\n' b'1002\r\n' b'1018\r\n' b'781\r\n' b'1019\r\n' b'1018\r\n' b'1019\r\n' b'1019\r\n' b'1019\r\n' b'1019\r\n' b'811\r\n' b'418\r\n' b'369\r\n' 

программа сделана так, чтобы график аналогично отображался в консоли python до закрытия программы

...