#-------------------------------------------------------------------------------# Name:         MESURE DE LA VITESSE DU SON AVEC UN CAPTEUR ULTRASONS# Level :       Niveau 2# Purpose:      Ce programme permet de calculer la vitesse du son par rapport a la#               distance parcourue et au temps de parcours de l'onde ultrasonore#               Utilisation du capteur Elab-US (ES17002)#               Utilisation de la librairie de fonctions Eurosmart pour la mesure#               directe de la duree retourne par le capteur ultrasons#               Ce capteur utilise 2 entrees numeriques de la carte EDUCADUINO-Lab.#               Les mesures effectuees sont transmises directement sur la console#               Python, sur un graphique et dans un fichier csv pour export Excel ou LATIS#               L'utilisation du graphique necessite d'installer la librairie "matplotlib"## Author:       EUROSMART# Created:      24/09/2019# Modified:     29/01/2020# Copyright:    (c) EUROSMART#-----------------------------------------------------------------------------'''----------------Procedure de detection d'EDUCADUINO-Lab-------------------''''''  Paragraphe a mettre au complet et absolument au debut de chaque script  ''''''       pour la reconnaissance de la carte EDUCADUINO-Lab par Python       '''from eurosmart  import *                    # Importation de la librairie Eurosmart# Configuration de la communication avec la carte EDUCADUINO-Lab (Elab)Elab, ComElab = PrepareEducaduinoLab()# Verification de l'etat de la communication avec EDUCADUINO-Labif (ComElab == None):    input('Probleme de communication avec la carte EDUCADUINO-Lab.\nProgramme interrompu ! Verifier la connection')    sys.exit();                             # Sortie du programme.if (Elab == None):    input("La librairie Nanpy n'a pas ete televersee dans la carte EDUCADUINO-Lab.\nProgramme interrompu !\nPour televerser Nanpy, executer le fichier Prepare_EDUCADUINO-Lab.py se trouvant sur la cle, dans le repertoire : Documentation\Prepare EDUCADUINO-Lab")    ComElab.close();                        # Liberation du port de communication.    sys.exit();                             # Sortie du programme.'''------------------------Librairies complementaires------------------------'''import  matplotlib.pyplot    as     plt     # Utilisation de la librairie graphique qu'on appelera "plt"from    time                 import sleep   # Importation fonction SLEEP de la librairie Python TIMEimport  math                                # Importation librairie mathematiqueimport  sys                                 # Importation librairie de controle des erreurs systemesimport  os                                  # Importation librairie des outils pour la gestion des fichiers'''-------------------------Constantes et Variables--------------------------'''eurosmart = Eurosmart(connection=ComElab)   # Creation d'un nom pour appel des fonctions de la librairie Eurosmart_NUM_BROCHE_ECHO = 18  			            # Broche de lecture du signal Echo_NUM_BROCHE_TRIG = 19                       # Broche de lecture du signal TrigNomFichier='Courbe vitesse du son.csv'      # Definition du nom du fichier csv'''----------------------------Boucle principale-----------------------------'''def main():    """    Procedure principale.    - Mesure de la vitesse du son grace a la mesure du temps de parcours du son      entre le capteur ELAB_US et la distance connue de l'obstacle    - Affichage de la mesure sur la console Python.    - Creation d'un fichier de donnes CSV pour exportation vers Excel ou LATIS    - Affichage de la courbe sur un graphique Python (matplotlib)    """# Configuration du fichier CSV qui sera cree a la fin de l'acquisition    repertoireCourant = os.getcwd()                         # Lecture du repertoire courant de l'application.    try:        file = open(NomFichier, 'w')                        # Creation du fichier.    except:        print('Le fichier', NomFichier , 'est verrouille par une autre application. Fermer le fichier et relancer le script.')        ComElab.close()         sys.exit()                                          # Sortie de l'application en cas d'erreur d'acces au fichier.    file.write('Distance_m;Duree_s\n')                      # Ecriture de la ligne de titres du fichier CSV# Creation et initialisation du graphique    fig = plt.figure()                                      # Creation de l'objet figure    ax = fig.add_subplot(111)                               # Configure 1e graphe sur la figure.        ax.set_title('Courbe D=f(t)')                           # Affectation du titre du graphe    ax.set_xlabel('Duree (ms)')                             # Titre des abscisses    ax.set_ylabel('Distance (cm)')                          # Titre des ordonnees    ax.grid(True)                                           # Affichage de la grille.    # Listes utilisees pour recueillir les mesures.    x = []    y = []    courbeXY, = ax.plot(x, y, '+r')                         # Associe la courbe aux liste de donnees.    # Remarque : Pour afficher des croix vertes, mettre '+g' au lieu de '+r'    plt.ion()                                               # Modification dynamique du graphe.    plt.show()                                              # Affichage du graphe.# Boucle de mesures    while True:                # Saisie manuelle de la valeur de la distance        valeurSaisie = input( "Saisir la valeur de la distance en cm ou [q] pour terminer la saisie :")        if (valeurSaisie == 'q'):            print("Fermer le graphe pour terminer l'application et lancer la sauvegarde du fichier csv.")            break                                           # Sortie de la boucle        else :            try:                distance_cm = float(valeurSaisie)            except:                print ('Saisie incorrecte.');                continue                                    # Retour en debut de boucle.                pass            pass        pass        # Creation d'une chaine de caracteres pour afficher la distance en cm avec 0 decimales (.0f)        chaineAffichageDistance_cm = f'Distance:{distance_cm:.0f} cm'                # Appel de la fonction de mesure de la duree en s A/R de l'onde depuis la librairie Eurosmart        dureeAR_s = eurosmart.MesureDtUS(_NUM_BROCHE_TRIG,_NUM_BROCHE_ECHO)        dureeR_s = dureeAR_s / 2                            # Calcul de la duree pour le retour uniquement         if dureeR_s == 0:                                   # Gestion de l'erreur si dureeR_s =0             print("Obstacle trop loin, defaut capteur ou erreur de connection. Verifier et relancer le programme.")            break        else:            # Conversion s en ms de la duree pour l'affichage            dureeR_ms = dureeR_s * 1000            # Creation d'une chaine de caracteres pour afficher la duree en ms avec 3 decimales (.3f)            chaineAffichageDuree_ms = f'Duree:{dureeR_ms:.3f} ms'                    # Calcul de la vitesse du son en m/s instantanee            distance_m = distance_cm / 100            VSon = distance_m / dureeR_s            # Creation d'une chaine de caracteres pour afficher la vitesse du son en m/s avec 0 decimales (.0f)            chaineAffichageVSon = f'Vitesse du son:{VSon:.0f} m/s'            # Affichage des resultats sur la console Python            print(chaineAffichageDistance_cm+'   '+chaineAffichageDuree_ms+'   '+chaineAffichageVSon)            # Ecriture des mesures dans le fichier CSV.            chaineAffichageDistance = f'{distance_m:.3f}'       # Formatage de la chaine d'affichage de la distance            chaineAffichageDuree = f'{dureeR_s:.6f}'            # Formatage de la chaine d'affichage de la duree                 file.write(chaineAffichageDistance+';'+chaineAffichageDuree+'\n')            # Affichage des mesures dans le graphe / Ajout de la nouvelle mesure dans les listes de points x et y            x.append(dureeR_ms)                                 # Ajout de la nouvelle mesure dans la liste de points x            y.append(distance_cm)                               # Ajout de la nouvelle mesure dans la liste de points y                    minX = min(x) - 0.1            maxX = max(x) + 0.1            minY = min(y) - 1            maxY = max(y) + 1            if max(y) > 0:                ax.set_ylim([minY,maxY])            if max(x) > 0:                ax.set_xlim([minX,maxX])            # Mise a jour de la courbe avec les nouvelles listes de points.            courbeXY.set_xdata(x)            courbeXY.set_ydata(y)            plt.pause(0.1)                                      # Delai permettant un rafraichissement du graphe.            pass    plt.ioff()                                              # Arret de la modification dynamique du graphe.    plt.show()                                              # Affichage du graphe.    file.close();                                           # Fermeture du fichier CSV    pass    # Liberation du port de communication avec la carte EDUCADUINO-Lab    ComElab.close()                  passif __name__ == '__main__':    main()