# -*- coding: utf-8 -*-
"""
Created on Thu Jul 22 12:45:16 2021

@author: Antoine Bérut
"""

import numpy as np
import matplotlib.pyplot as plt
import time
import serial #non installé par défaut dans Anaconda, s'installe avec la commande "conda install pyserial" ou "pip install pyserial"

ser = serial.Serial('COM3', 9600, timeout=None) #on définit le port sur lequel l'arduino est branché

nb_mesures = 1000 #nombre de points de mesures que l'on veut mesurer
nb_donnees=2 #nombre de valeurs que l'arduino renvoie sur chaque ligne (pour cet exemple : le temps et la température)

data=np.zeros((nb_mesures,nb_donnees)) #on crée un tableau de données de la bonne dimension (pour l'instant rempli de zéros)

time.sleep(1) #pause de 1 s pour laisser le temps à l'arduino de démarrer

ser.reset_input_buffer() #élimine tout ce qui peut avoir été envoyé sur le port série avant de commencer les mesures

try :
    print(ser.readline()) #on affiche la première ligne de données envoyée par l'arduino pour vérifier que tout va bien
except:
    print('Problème de réception des données')

#La mesure peut être intérrompue en appuyant sur ctrl + C s'il y a un problème (par exemple si on se rend compte que ça prend beaucoup plus de temps que prévu)
for i_mes in range(nb_mesures) :
    try:
        data_byte=ser.readline() #on récupère les données envoyées ligne par ligne
        data_string=data_byte.decode('ascii') #on transforme les données en chaîne de caractère
        data[i_mes,0:(nb_donnees+1)]=np.fromstring(data_string, dtype=float, sep="\t") #on remplit progressivement le tableau "data" avec les données reçues
        
        if i_mes % 100 == 0 :
            print("Mesure {} / {} ".format(i_mes,nb_mesures)) #permet d'afficher une "barre de progression" de la mesure
    
    except KeyboardInterrupt:
        print("Vous avez interrompu la lecture") #ce qui s'affiche si on arrête la boucle en appuyant sur ctrl + C
        time.sleep(0.1)
        break

ser.close() #on arrête la connexion avec l'arduino via le port série

#On trace les données obtenues

temps = (data[:,0]-data[0,0])/1000 # on fixe t = 0 à la première mesure, et on convertit les ms en s
temperature = data[:,1]

plt.figure()
plt.plot(temps,temperature)
plt.xlabel('Temps (s)')
plt.ylabel('Température (°C)')
plt.title('Évolution de la température')