How to generate a graph of temperatures x time of data taken by an arduino?

1
Good afternoon, I'm trying to use a program in python to read seven temperature values through the serial port with the arduino, so far the program I've done collects the data, saves it to a text file, and when I interrupt the execution it saves the text file and prints the graph on the screen, but I would like to generate the graph over time, not only at the end of running the program, I would like to know how I could do this, I searched for one studying about matplotlib, but I could not find what I was looking for. Well, I'm leaving here in the question what I wrote so far, and an image of the graph I generated.

####importando as bibliotecas necessarias###
import serial
import time
import matplotlib.pyplot as plt
import pandas as pd
try:
    porta = str("/dev/ttyACM" + input('Digite o numero da porta em que o arduino está conectado: '))
    nome = str(input('Nome do arquivo que será salvo: ') + '.csv')
    i = 0
    velocidade = 9600
    conexao = serial.Serial(porta, velocidade) #aqui inicia a comunicação serial com o arduino
    with open(nome, 'w', encoding='utf-8') as salvo:
        conexao.write(str.encode('false'))# os dados são armazenados num arquivo de texto
        while True:
            i += 1 #aqui os dados que o arduino envia são lidos até parar a execução do programa
            horario = time.strftime('%H:%M:%S')
            dados = str(conexao.readline())[2:-5]
            if 'Hora' in dados: #a primeira linha que o programa deve ler é a do titulo
                print(dados[-25:])
                salvo.write(dados + '\n')
            if i > 2: #aqui o programa pula as duas primeiras linhas que as vezes o arduino manda com a formatação zoada
                print(horario + ',' + dados)
                salvo.write(horario + ',' + dados + '\n')
except FileNotFoundError: #caso a porta esteja errada
    print('Porta não encontrada!')
except KeyboardInterrupt: #quando o programa é encerrado e o grafico aparece
    data = pd.read_csv(nome)
    #essa parte usa o Pandas para converter o arquivo de texto gerado nas listas que formam o gráfico
    hora = data.iloc[:, 0]
    t1 = data.iloc[:, 1]
    t2 = data.iloc[:, 2]
    t3 = data.iloc[:, 3]
    t4 = data.iloc[:, 4]
    t5 = data.iloc[:, 5]
    t6 = data.iloc[:, 6]
    t7 = data.iloc[:, 7]

    #Essa parte imprime o gráfico na tela
    plt.plot(hora, t1)
    plt.plot(hora, t2)
    plt.plot(hora, t3)
    plt.plot(hora, t4)
    plt.plot(hora, t5)
    plt.plot(hora, t6)
    plt.plot(hora, t7)
    plt.show()
    print('Programa encerrado')

    
asked by anonymous 02.11.2018 / 22:34

2 answers

0

Try to put this within the while true, I believe this will generate the graph as you receive the data

data = pd.read_csv(nome)
#essa parte usa o Pandas para converter o arquivo de texto gerado nas listas que formam o gráfico
hora = data.iloc[:, 0]
t1 = data.iloc[:, 1]
t2 = data.iloc[:, 2]
t3 = data.iloc[:, 3]
t4 = data.iloc[:, 4]
t5 = data.iloc[:, 5]
t6 = data.iloc[:, 6]
t7 = data.iloc[:, 7]

#Essa parte imprime o gráfico na tela
plt.plot(hora, t1)
plt.plot(hora, t2)
plt.plot(hora, t3)
plt.plot(hora, t4)
plt.plot(hora, t5)
plt.plot(hora, t6)
plt.plot(hora, t7)
plt.show()
    
25.11.2018 / 23:22
0

If you have already been able to load data from Arduino into a DataFrame, try making the following change in the plot routine:

hora = data.iloc[:, 0]
t1   = data.iloc[:, 1]
t2   = data.iloc[:, 2]
t3   = data.iloc[:, 3]

t1.index = hora
t2.index = hora
t3.index = hora

t1.plot()
t2.plot()
t3.plot()
    
18.12.2018 / 19:51