Bonjour a tous,
Je dois actuellement extraire des données d'une jauge de contrainte (d'une balance en gros) afin d'étudier le comportement d'une pièce sur un banc de test.
J'ai donc brancher mon capteur sur mon Arduino Nano et écrit un code afin d'en retirer les données sur le port série. Jusqu'a la tout va bien.
J'utilise ensuite Python pour tracer une courbes en fonction de mon poids et du temps via le moniteur série de l'Arduino.
J'ai donc trouvé un tuto qui est exactement sur ce sujet : Traçage des données en temps réel de Arduino à l’aide de Python (matplotlib) - tubefr.com
Code C++ :
#include <HX711.h>
#define calibration_factor 7050.0 //This value is obtained using the SparkFun_HX711_Calibration sketch
#define DOUT 13
#define CLK A0
unsigned long int milli_time;
HX711 scale(DOUT, CLK);
void setup() {
Serial.begin(115200);
Serial.println("HX711 scale demo");
scale.set_scale(calibration_factor); //This value is obtained by using the SparkFun_HX711_Calibration sketch
scale.tare(); //Assuming there is no weight on the scale at start up, reset the scale to 0
}
void loop() {
Serial.print(scale.get_units(), 1); //scale.get_units() returns a float
Serial.print(" lbs"); //You can change this to kg but you'll need to refactor the calibration_factor
Serial.println();
delay(100);
}
Code Python :
import sys, serial, argparse
import numpy as np
from time import sleep
from collections import deque
import matplotlib.pyplot as plt
import matplotlib.animation as animation
# plot class
class AnalogPlot:
# constr
def __init__(self, strPort, maxLen):
# open serial port
self.ser = serial.Serial(strPort, 115200)
self.ax = deque([0.0]*maxLen)
self.ay = deque([0.0]*maxLen)
self.maxLen = maxLen
# add to buffer
def addToBuf(self, buf, val):
if len(buf) < self.maxLen:
buf.append(val)
else:
buf.pop()
buf.appendleft(val)
# add data
def add(self, data):
assert(len(data) == 2)
self.addToBuf(self.ax, data[0])
self.addToBuf(self.ay, data[1])
# update plot
def update(self, frameNum, a0, a1):
try:
line = self.ser.readline()
data = [float(val) for val in line.split()]
# print data
if(len(data) == 2):
self.add(data)
a0.set_data(range(self.maxLen), self.ax)
a1.set_data(range(self.maxLen), self.ay)
except KeyboardInterrupt:
print('exiting')
return a0,
# clean up
def close(self):
# close serial
self.ser.flush()
self.ser.close()
# main() function
def main():
# create parser
parser = argparse.ArgumentParser(description="LDR serial")
# add expected arguments
parser.add_argument('--port', dest='port', required=True)
# parse args
args = parser.parse_args()
#strPort = '/dev/tty.usbserial-A7006Yqh'
strPort = args.port
print('reading from serial port %s...' % strPort)
# plot parameters
analogPlot = AnalogPlot(strPort, 100)
print('plotting data...')
# set up animation
fig = plt.figure()
ax = plt.axes(xlim=(0, 100), ylim=(0, 1023))
a0, = ax.plot([], [])
a1, = ax.plot([], [])
anim = animation.FuncAnimation(fig, analogPlot.update,
fargs=(a0, a1),
interval=50)
# show plot
plt.show()
# clean up
analogPlot.close()
print('exiting.')
# call main
if __name__ == '__main__':
main()
Je n'arrive pas à comprendre ou mettre le COM sur le code ci-dessus (moi je suis sur le COM13).
Si quelqu'un à déjà fait des courbes en temps réel ou à une autre solution pour crée une courbe en temps réel de données récupéré par l'Arduino ça m'aiderais beaucoup ...
mercii