import matplotlib.pyplot as plt
from microcontroleurs import arduino
from port_Arduino import port_Arduino
from scipy.integrate import simps
import time, sys
import numpy as np
import pandas as pd
#----------------- paramétrage de la communication -----------------------------
port=port_Arduino()
carte=arduino(port)
#----------------- fonction d'affichage des valeurs ---------------------------
def plotValues():
    plt.grid ()
    plt.title("fonctionnement du moteur")
    plt.xlabel('date (s)')
    plt.ylabel('Puissance (W)')
    plt.plot(t,P)
##
#  programme principal
valeurs_t = [] # dates
valeurs_Im = [] # courant dans le moteur
valeurs_Um = [] # tension au bornes du moteur
plt.figure(figsize=(5,5))
time.sleep(0.1) # durée d'établissement de la connexion sur le port série avec l'arduino
# initialisation des variables et paramètres
m0=0
m1=0
Umax=5.0 # tension correspondant à la valeur maximale pour une entrée arduino
#
R0= 5 # valeur en ohms de la résistance en série sur le moteur (à renseigner en remplaçant ?)
R1= 10000 # valeur en ohms de la résistance n°1 du pont diviseur (à renseigner en remplaçant ?)
R2= 5000 # valeur en ohms de la résistance n°2 du pont diviseur (à renseigner en remplaçant ?)
F= R2/(R1+R2) # facteur du pont diviseur
#
seuil=25 # valeur à modifier pour la condition de déclenchement
Dt=0.10 # intervalle de temps minimmum entre deux mesures à modifier
# Attention la boucle d'acqusition et d'affichage s'exécute entre 80 et 100 ms minimum
#------------------ écoute sur A0 pour le déclenchement ---------------------------------
ecoute=True
print("attente du déclenchement...")
while ecoute :
    m0=carte.entree_analogique(0) # lecture de la valeur numérique sur A0 (1024 niveaux)
    if m0>seuil :
        print("déclenchement de l'acquisition")
        ecoute = False
t1=time.perf_counter() # date de début d'acquisition (temps machine)
#------------------ lancement de l'acquisition ---------------------------------
while m0>seuil: # acquisition tant que le moteur est actionné
    m0=carte.entree_analogique(0) # lecture de la valeur numérique (1024 niveaux)
    m1=carte.entree_analogique(2) # lecture de la valeur numérique (1024 niveaux)
    t2=time.perf_counter()
    date=round(t2-t1,3)
    U0=round(Umax/1023*m0,4) # conversion de la valeur numérique lue
    U2=round(Umax/1023*m1,4) # conversion de la valeur numérique lue
    valeurs_t.append(date)
    valeurs_Um.append(U2/F-U0)
    valeurs_Im.append(U0/R0)
    print("t = ",date," s \t Um = ",U2/F-U0," V \t Im = ",U0/R0," A")
    time.sleep(Dt) # pause entre deux mesures successives
carte.fermer() # fermeture du port de communication avec l'arduino
print("fin de l'acquisition des mesures")
print("durée de l'acquisition des mesures (s) : "+str(date)+" s")
#--------------- calcul de la puissance fournie au moteur à chaque instant et de l'énergie
U=np.array(valeurs_Um) # conversion de la liste en tableau de valeurs
I=np.array(valeurs_Im) # conversion de la liste en tableau de valeurs
t=np.array(valeurs_t) # conversion de la liste en tableau de valeurs
P=U*I # calcul de la puissance instantanée fournie au moteur
E=simps(y=P[:-1], x=t[:-1], even='avg') # intégration de Pdt méthode Simpson
# Affichage du résultat
print("Energie totale délivrée au moteur E = ", round(E,2)," J")
#-------------- sauvegarde des données et de la courbe -------------------------
fichier=input("Nom du fichier de sauvegarde (sans.csv) : ?")
valeurs = {'date': t[:-1],'Um': U[:-1],'Im': I[:-1]}
data = pd.DataFrame(valeurs)
print(data)
data.to_csv(fichier+'.csv',sep=';',index=False)
plotValues()
plt.savefig(fichier+'.png')
plt.show()
if sys.platform.startswith('darwin'):
    sys.exit()