J'ai fabriqué un appareil pour suivre la tension de décharge d'une batterie en utilisant le capteur INA219 et Arduino, les informations recueillies par Arduino puis envoyées au Raspberry pi en communication série, et dans le but de coder python et matplotlib, modules dessinés, la sortie sera tracée en temps réel sur un écran LCD, j'ai défini une fonction de surveillance pour qu'Arduino soit réinitialisé s'il se bloque de toute façon, mais en attendant, comment puis-je utiliser le module pyserial pour attendre qu'un port fermé s'ouvre à nouveau et ne se termine pas? dans ce qui suit, vous pouvez voir mon code python:

import serial
from datetime import datetime, timedelta
import matplotlib.pyplot as plt
from matplotlib.ticker import AutoMinorLocator
from matplotlib.dates import AutoDateLocator, AutoDateFormatter
from drawnow import *
#import csv

Voltage_0 = [0]
Current_0 = [0]
ResInt_0 = [0]
Power_0 = [0]
Voltage_1 = [0]
Current_1 = [0]
ResInt_1 = [0]
Power_1 = [0]
Voltage_4 = [0]
Current_4 = [0]
ResInt_4 = [0]
Power_4 = [0]
Voltage_5 = [0]
Current_5 = [0]
ResInt_5 = [0]
Power_5 = [0]
Time = []
StartTime = 0
PlotTime = 0
PresentTime = 0
i = 0

if __name__ == '__main__':
    arduino = serial.Serial('/dev/ttyUSB0', 115200, timeout=1)
plt.ion()
StartTime = datetime.now()
h = StartTime.hour
m = StartTime.minute
s = StartTime.second
PresentTime = StartTime + timedelta(seconds=5)
PlotTime = PresentTime - timedelta(hours= h,minutes= m, seconds= s)
Time.append(PlotTime)

def CreatePlot():
    plt.suptitle('Type AA Battery Discharge Window')

    ax0 = plt.subplot(2,2,1)
    plt.grid(True)
    plt.plot(Time, Voltage_0,'#ff0400', label='V0')
    ax0.set(xlabel='Time', ylabel='Voltage')
    plt.legend(loc='upper center')
    plt.subplots_adjust(wspace=0.05, hspace=0.07)
    locator = AutoDateLocator()
    ax0.xaxis.set_major_locator(locator)
    formatter = AutoDateFormatter(locator)
    ax0.xaxis.set_major_formatter(formatter)
    ax0.xaxis.set_minor_locator(AutoMinorLocator())
    plt.xticks(rotation=45, ha='right')
    plt.subplots_adjust(bottom=0.30)
    plt.ylim(0,1.7)
    ax0.label_outer()

    ax1 = plt.subplot(2,2,2)
    plt.grid(True)
    plt.plot(Time, Voltage_1,'#ffaa00', label='V1')
    ax1.set(xlabel='Time', ylabel='Voltage')
    plt.legend(loc='upper center')
    plt.subplots_adjust(wspace=0.05, hspace=0.07)
    locator = AutoDateLocator()
    ax1.xaxis.set_major_locator(locator)
    formatter = AutoDateFormatter(locator)
    ax1.xaxis.set_major_formatter(formatter)
    ax1.xaxis.set_minor_locator(AutoMinorLocator())
    plt.xticks(rotation=45, ha='right')
    plt.subplots_adjust(bottom=0.30)
    plt.ylim(0,1.7)
    ax1.label_outer()

    ax2 = plt.subplot(2,2,3)
    plt.grid(True)
    plt.plot(Time,Voltage_4, '#fff200', label='V4')
    ax2.set(xlabel='Time', ylabel='Voltage')
    plt.legend(loc='upper center')
    plt.subplots_adjust(wspace=0.05, hspace=0.07)
    locator = AutoDateLocator()
    ax2.xaxis.set_major_locator(locator)
    formatter = AutoDateFormatter(locator)
    ax2.xaxis.set_major_formatter(formatter)
    ax2.xaxis.set_minor_locator(AutoMinorLocator())
    plt.xticks(rotation=45, ha='right')
    plt.subplots_adjust(bottom=0.30)
    plt.ylim(0,1.7)
    ax2.label_outer()

    ax3 = plt.subplot(2,2,4)
    plt.grid(True)
    plt.plot(Time,Voltage_5, '#0af219', label='V5')
    ax3.set(xlabel='Time', ylabel='Voltage')
    plt.legend(loc='upper center')
    plt.subplots_adjust(wspace=0.05, hspace=0.07)
    locator = AutoDateLocator()
    ax3.xaxis.set_major_locator(locator)
    formatter = AutoDateFormatter(locator)
    ax3.xaxis.set_major_formatter(formatter)
    ax3.xaxis.set_minor_locator(AutoMinorLocator())
    plt.xticks(rotation=45, ha='right')
    plt.subplots_adjust(bottom=0.30)
    plt.ylim(0,1.7)
    ax3.label_outer()

while True:
    if arduino.in_waiting > 0:
        arduinoString = arduino.readline().decode('UTF-8').rstrip()
        PresentTime = datetime.now()
        dataArray = arduinoString.split(',')

        vol_0 = float( dataArray[0])
        cur_0 = float( dataArray[1])
        res_0 = float( dataArray[2])
        pow_0 = float( dataArray[3])
        Voltage_0.append(vol_0)
        Current_0.append(cur_0)
        ResInt_0.append(res_0)
        Power_0.append(pow_0)

        vol_1 = float( dataArray[4])
        cur_1 = float( dataArray[5])
        res_1 = float( dataArray[6])
        pow_1 = float( dataArray[7])
        Voltage_1.append(vol_1)
        Current_1.append(cur_1)
        ResInt_1.append(res_1)
        Power_1.append(pow_1)

        vol_4 = float( dataArray[8])
        cur_4 = float( dataArray[9])
        res_4 = float( dataArray[10])
        pow_4 = float( dataArray[11])
        Voltage_4.append(vol_4)
        Current_4.append(cur_4)
        ResInt_4.append(res_4)
        Power_4.append(pow_4)

        vol_5 = float( dataArray[12])
        cur_5 = float( dataArray[13])
        res_5 = float( dataArray[14])
        pow_5 = float( dataArray[15])
        Voltage_5.append(vol_5)
        Current_5.append(cur_5)
        ResInt_5.append(res_5)
        Power_5.append(pow_5)

        ArdTime = float( dataArray[16])

        PlotTime = PresentTime - timedelta(hours= h,minutes= m, seconds= s)
        Time.append(PlotTime)

        with open('AA_OUTPUT.csv', 'a') as f:
            if i==0:
                f.write('Time,Voltage_0 (V),Current_0 (mA), Internal Resistance_0 (mohm), Power_0 (mW),'
                    'Voltage_1 (V),Current_1 (mA), Internal Resistance_1 (mohm), Power_1 (mW),'
                    'Voltage_4 (V),Current_4 (mA), Internal Resistance_4 (mohm), Power_4 (mW),'
                    'Voltage_5 (V),Current_5 (mA), Internal Resistance_5 (mohm), Power_5 (mW)\n')
                f.write('{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}\n'.format(ArdTime,
                    Voltage_0[-1],Current_0[-1],ResInt_0[-1],Power_0[-1],
                    Voltage_1[-1],Current_1[-1],ResInt_1[-1],Power_1[-1],
                    Voltage_4[-1],Current_4[-1],ResInt_4[-1],Power_4[-1],
                    Voltage_5[-1],Current_5[-1],ResInt_5[-1],Power_5[-1])) #for Python2 users
                i+=1
            else:
                #f.write(f'{PlotTime},{vol_0},{cur_0},{res_0},{pow_0},{vol_1},{cur_1},{res_1},
                    # {pow_1},{vol_4},{cur_4},{res_4},{pow_4},{vol_5},{cur_5},{res_5},{pow_5}\n') #for Python3 users
                f.write('{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}\n'.format(ArdTime,
                    Voltage_0[-1],Current_0[-1],ResInt_0[-1],Power_0[-1],
                    Voltage_1[-1],Current_1[-1],ResInt_1[-1],Power_1[-1],
                    Voltage_4[-1],Current_4[-1],ResInt_4[-1],Power_4[-1],
                    Voltage_5[-1],Current_5[-1],ResInt_5[-1],Power_5[-1])) #for Python2 users
    drawnow(CreatePlot)
    plt.pause(0.0001)
0
farzad latifeh 9 mars 2021 à 10:51

1 réponse

Meilleure réponse

is_open du module pySerial peut être utilisé pour récupérer son état actuel.

while True:
    if arduino.is_open:
        if arduino.in_waiting > 0:
            # rest of your code
        drawnow(CreatePlot)
        plt.pause(0.0001)
    else:
        arduino.open()
0
Teejay Bruno 10 mars 2021 à 02:57