## Pilotage Acquisition Arduino - Capteurs ports analogiques A0, A1, ...
import numpy as np # module de calcul numérique
import os # module de dialogue avec le système d'exploitation
import matplotlib.pyplot as plt # module graphique
import serial # gestion du port série
import time # module de gestion du temps

# Définition du nom de l'expérience pour les sauvegardes
# name_exp = 'Exp_1' # 1 mot, pas de caratères spéciaux
name_exp = input("Entrer le nom de l'expérience (ex: Exp_1): ")
namefig = name_exp + '_brut.png'
namefile = name_exp + '_brut.txt'
# Paramètres initiaux de l'échantillon avant étirement (1ère évaluation)
#l0 = float(input("Entrer la longueur initiale de l'échantillon (mm) : "))

# Connexion de l'ordinateur au port série, même débit que dans le code Arduino
# Supported baud rates 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 31250, ...
serial_port = serial.Serial(port = 'COM9', baudrate =115200) # Ouverture du port
    # port sous LINUX: '/dev/ttyACM0' (ou /dev/ttyACM1, ou /dev/ttyUSB0...)
    # port sous WINDOWS: 'COM9' (ou 'COM0, 1, 2, 3,... choisir a priori le plus élevé)
#serial_port = serial.Serial(port = '/dev/ttyACM0', baudrate =115200) # Ouverture du port

serial_port.setDTR(False) # Initialisation de la carte Arduino
time.sleep(1) # temps de stabilisation - temporisation
serial_port.setDTR(True) # Activation de la carte
serial_port.reset_input_buffer() # Vide le tampon de stockage existant

# Réception des mesures
N=500 # nombre d'acquisitions (ajuster en fonction de Te et durée requise)
instants = np.zeros(N) # Tableau des instants, type float64 par défaut.
capteur0 = np.zeros(N) # Tableau d'acquisition des valeurs de position
capteur1 = np.zeros(N) # Tableau d'acquisition des valeurs de position
capteur2 = np.zeros(N) # Tableau d'acquisition des valeurs de position
try:
    for i in range(N) :
        mesures = serial_port.readline().split() # lit une ligne avec EOL + séparation
        instants[i] = int(mesures[0])
        capteur0[i] = int(mesures[1])
        capteur1[i] = int(mesures[2])
        capteur2[i] = int(mesures[3])
# conversion en cours d'acquisition pour affichage en console
#        temperatures[i] = (5/1024*int(mesures[1]))/3*(365+80) - 80
        print(i,capteur0[i],capteur1[i],capteur2[i])
except:
    print("defaut de fonctionnement")
    pass

# Fermeture du port série
serial_port.close()

## TRAITEMENT (conversion signal numérique [0;1023] en valeur mesurée)
instants = instants/1000 # conversion en secondes
#temperatures = (5/1024*temperatures)/3*(365+80) - 80 # degrés Celsius, d'après constructeur

# Sauvegarde des valeurs dans un fichier texte
file=open(namefile,'w') # Ouverture en lecture et écriture ('w': write)
# 1ères lignes : écriture d’un en-tête
file.write("Expérience: \t"+ name_exp +"\n") 
file.write("Instant \t Temperatures \n") 
# lignes suivantes : valeurs numériques séparées par des tabulations et EOL en fin
for i in range(N): 
    file.write(str(instants[i]) + '\t' + str(capteur0[i])+ '\t' + str(capteur1[i])+ '\t' + str(capteur2[i]) + '\n')
file.close()
#'\t' = tabulation
# '\n' = retour à la ligne (EOL)
# str(X) : conversion du nombre en chaîne de caractères

# Graphe de contrôle
plt.plot(instants,capteur0,'-b')
plt.plot(instants,capteur1,'-k')
plt.plot(instants,capteur2,'-r')
plt.xlabel("Temps (s)")
plt.ylabel("Valeurs capteur (numérique 10 bits)")
plt.title(name_exp+' - Signaux bruts')
plt.grid()
plt.savefig(namefig)
plt.show()

# Pour gérer le répertoire courant depuis Python (emplacement sauvegardes):
#os.getcwd() # obtenir le nom du répertoire courant
#os.chdir('chemin_de_mon_repertoire') # changer le répertoire courant

