Skip to main content

Data logger 2

Un modèle de documentation minimal pour tous les types de projets. Toutes les catégories ci-dessous doivent être renseignées, même de façon succincte.
IMPORTANT : Merci de sélectionner le / les tags adéquats dans le menu de droite, et de ne pas créer de nouveau tag.
Les fichiers sources doivent idéalement être joints à cette page grâce à l'icône trombone du menu de droite.
Des hésitations sur comment bien documenter et utiliser l'interface ? Consultez le tutoriel "Comment documenter"

Informations

  • Caroline Sreng
  • Adresse mail : caroline.vann_sreng@sorbonne-universite.fr
  • Service civique au Fablab 2024/2025
  • 01/10/2024- 2025

Contexte

Il s'agit d'un projet transversal Ă  l'interface des espaces prototypage et biologie/chimie, pour lequel les langages informatiques C++ et Python, l'Ă©lectronique et la chimie seront mobilisĂ©s. 

Objectifs

Un objectif serait de pouvoir confectionner au Fablab un boĂ®tier Ă©lectronique permettant d'afficher les informations sur la prise de mesures de tempĂ©rature, de pH, et d'autres valeurs physiques relevĂ©es lors de travaux pratiques effectuĂ©s dans le cadre d'enseignement secondaire/supĂ©rieure. Les valeurs des mesures seraient affichĂ©es sur un ordinateur par une communication par le port USB pour une première version et  par une application via un rĂ©seau internet, pour une version amĂ©liorĂ©e. Dans un second temps, Ă  partir d'un ordinateur, des seuils et des alertes seraient mises en place lorsque des valeurs souhaitĂ©es seraient atteintes. De la mĂŞme manière que prĂ©cĂ©demment, une première version vise Ă  instaurer une communication par le port USB.


image-1653061695508.jpeg

Ajouter au moins une image de votre projet

Matériel

Boîte contenant notre boîtier

  • Ă  voir ultĂ©rieurement (partie non traitĂ©e encore)

Electronique

  • un m5Core2
  • des fils Ă©lectriques
  • un câble USB-C vers port m5Core2
  • un breadboard
  • un ordinateur (logiciel Arduino IDE, Python, VSCode)
  • une sonde de tempĂ©rature DS18B20, (une sonde de pH de type SEN0161 par DFROBOT)
  • des rĂ©sistances

Machines utilisées

à voir ultérieurement (partie non traitée encore)

Construction

(Fichiers, photos, code, explications, paramètres d'usinage, photos, captures d'écran...)

Étape 1

Partie informatique/Ă©lectronique

Une première Ă©tape est de se familiariser avec l'Ă©lectronique et les langages informatiques C++ et Python. 

Étape 2

----

Étape 3

----

Journal de bord

Avancée du projet à chaque étape, difficultés rencontrées, modifications et adaptations (facultatif pour les petits projets)

01/10/2024 -~mi-novembre 2024

J'ai commencĂ© Ă  me familiariser avec l'Ă©lectronique/les microcontrĂ´leurs Arduino en lisant : arduino-premiers-pas-en-informatique-embarquee.pdf  . J'ai Ă  peu près tout lu dans les grandes lignes exceptĂ©e la partie sur les Ă©crans LCD. J'ai aussi utilisĂ© Tinkercad pour tester certains branchements de manière virtuelle et aussi IRL une breadboard, un microcontrĂ´leur Arduino Uno et des LED. 

image.png

image.png

mi-novembre 2024 - 6/01/2025

Etant donnĂ© qu'il serait pertinent de crĂ©er une communication par l'utilisation d'une application entre un microcontrĂ´leur et un ordinateur, je me suis tournĂ©e vers un M5Core2 qui possède de nombreuses caractĂ©ristiques comme un Ă©cran, la possibilitĂ© de configurer entre autre une alarme, les connexions bluetooth et WI-FI. De plus, pour la crĂ©ation d'une application, il serait prĂ©fĂ©rable d'utiliser un autre langage informatique que le C++, je me suis tournĂ©e vers le langage Python. J'ai donc commencĂ© Ă  me familiariser avec le langage en lisant le livre Apprenez Ă  programmer en Python par Vincent Le Goff aux Editions Eyrolles (4ème Ă©dition). En parallèle, j'ai regardĂ© des vidĂ©os sur youtube en faisant des exercices de cas. J'ai aussi fait des branchements entre un M5core2 et un capteur de tempĂ©rature, en rĂ©cupĂ©rant les donnĂ©es de tempĂ©rature sur le terminal de sĂ©rie de l'Arduino IDE et mettant des seuils depuis ce terminal de sĂ©rie. 

Voici une photo du branchement (alimentation 3.3V, GPIO 27 et ground) :

image.pngimage.png

Le code C++ saisi sur Arduino IDE: 

#include <M5Core2.h>
#include <OneWire.h>
#include <DallasTemperature.h>


// Pin du capteur
#define ONE_WIRE_BUS 27


// Créer une instance OneWire
OneWire oneWire(ONE_WIRE_BUS);


// Passer l'instance OneWire Ă  DallasTemperature
DallasTemperature sensors(&oneWire);


// Déclarer la constante seuil par défaut à 20°C
float seuil = 20;


void setup() {
  // Initialiser M5Core2
  M5.begin();
  M5.Axp.SetSpkEnable(true); //activer le haut-parleur du m5core2  
  // Initialise la communication sĂ©rie
  Serial.begin(115200);
  Serial.println("Programme dĂ©marrĂ©. Tapez un nouveau seuil ou 'exit' pour quitter.");
  Serial.print("Seuil actuel : ");
  Serial.println(seuil);


  // Initialiser le capteur
  sensors.begin();


  // Initialiser l'affichage
  M5.Lcd.setTextSize(2);
  M5.Lcd.setCursor(0, 0);
  M5.Lcd.print("TempĂ©rature : ");
}


void loop() {
  // Demander les tempĂ©ratures
  sensors.requestTemperatures();
 
  // Lire la tempĂ©rature en degrĂ©s Celsius
  float temperatureC = sensors.getTempCByIndex(0);


  // Afficher la tempĂ©rature sur l'Ă©cran
  M5.Lcd.setCursor(0, 30);
  M5.Lcd.fillRect(0, 30, 240, 40, BLACK); // Effacer la ligne prĂ©cĂ©dente
  M5.Lcd.print(temperatureC);
  M5.Lcd.print(" °C");


  // Afficher la tempĂ©rature sur le terminal sĂ©rie
  Serial.print("TempĂ©rature actuelle : ");
  Serial.print(temperatureC);
  Serial.println(" °C");


  // VĂ©rifie si des donnĂ©es sont disponibles sur le port sĂ©rie
  if (Serial.available() > 0) {
    String input = Serial.readStringUntil('\n'); // Lit l'entrĂ©e jusqu'Ă  un retour Ă  la ligne


    // Permet Ă  l'utilisateur de quitter le programme
    if (input.equalsIgnoreCase("exit")) {
      Serial.println("Programme terminĂ©.");
      while (true); // ArrĂŞte le programme
    } else {
      // Convertir l'entrĂ©e en float et mettre Ă  jour le seuil
      float newSeuil = input.toFloat();
      if (newSeuil != 0 || input.equals("0")) { // VĂ©rifie si la conversion est valide
        seuil = newSeuil;
        Serial.print("Nouveau seuil dĂ©fini : ");
        Serial.println(seuil);
      } else {
        Serial.println("EntrĂ©e invalide. Veuillez entrer un nombre valide.");
      }
    }
  }


  // VĂ©rifier si la tempĂ©rature dĂ©passe le seuil
  if (temperatureC > seuil) {
    M5.Lcd.setCursor(0, 80);
    M5.Lcd.setTextColor(RED);
    M5.Lcd.fillRect(0, 80, 240, 40, BLACK); // Effacer la ligne prĂ©cĂ©dente
    M5.Lcd.println("ALERTE : TempĂ©rature Ă©levĂ©e !");
    Serial.println("ALERTE : TempĂ©rature Ă©levĂ©e !");
    M5.Axp.SetVibration(true);  // Open the vibration.  
    delay(1000);
    M5.Axp.SetVibration(false);  // Open the vibration.  
    delay(1000);
  } else {
    M5.Lcd.setCursor(0, 80);
    M5.Lcd.setTextColor(WHITE);
    M5.Lcd.fillRect(0, 80, 240, 40, BLACK); // Effacer la ligne prĂ©cĂ©dente
    M5.Lcd.println("TempĂ©rature OK.");
    Serial.println("TempĂ©rature OK.");
  }


  // Attendre 2s avant la prochaine lecture
  delay(2000);
}

J'ai ensuite compilé et téléchargé le script vers le M5Core2.

6/01/2025-27/02/2025

Après m'être familiarisé avec le langage Python, j'ai commencé à me pencher sur la communication des données via le port série. Il existe une bibliothèque du langage de programmation Python appelée Pyserial qui permet ceci. J'ai réussi à faire afficher dans le terminal de l'éditeur de code VScode les valeurs de températures mesurées toutes les 2 secondes et également à saisir des valeurs de seuil.

Voici le code Ă  saisir en langage Python dans un Ă©diteur de code comme VScode:

 

import serial
import threading


# Configuration du port série
PORT = 'COM9'  # Remplacez par le port sĂ©rie de votre M5Core2, port 9 pour moi
BAUD_RATE = 115200  # Taux de transmission utilisĂ© par le M5Core2.


def lire_temperature(ser):
    """
    Fonction qui lit les donnĂ©es reçues sur le port sĂ©rie en continu
    et les affiche dans le terminal.
    """
    while True:
        try:
            # VĂ©rifie s'il y a des donnĂ©es disponibles sur le port sĂ©rie.
            if ser.in_waiting > 0:
                # Lit une ligne complète, la dĂ©code et supprime les espaces/sauts de ligne inutiles.
                data = ser.readline().decode('utf-8').strip()
                # Affiche les donnĂ©es reçues (par exemple : tempĂ©rature mesurĂ©e).
                print(f"[M5Core2] {data}")
        except Exception as e:
            # En cas de problème lors de la lecture, affiche un message d'erreur.
            print(f"Erreur lors de la lecture du port sĂ©rie : {e}")
            break



def envoyer_seuil(ser):
    """
    Fonction qui permet d'envoyer un seuil de tempĂ©rature Ă  partir du terminal.
    L'utilisateur entre un seuil qui est envoyĂ© au M5Core2.
    """
    while True:
        try:
            # Demande Ă  l'utilisateur d'entrer un seuil ou de taper "exit" pour quitter.
            user_input = input("Entrez un seuil de tempĂ©rature (ou 'exit' pour quitter) : ")
            if user_input.lower() == 'exit':
                # Si l'utilisateur tape 'exit', on arrĂŞte la boucle.
                print("Fin de l'envoi de commandes.")
                break
            # Envoie la valeur entrĂ©e au M5Core2 via le port sĂ©rie.
            ser.write((user_input + '\n').encode('utf-8'))
        except Exception as e:
            # En cas de problème lors de l'envoi, affiche un message d'erreur.
            print(f"Erreur lors de l'envoi du seuil : {e}")
            break



def main():
    """
    Fonction principale qui initialise la connexion sĂ©rie, lance les threads
    pour la lecture et gère l'envoi des seuils.
    """
    try:
        # Ouvre la connexion sĂ©rie avec le port et le baud rate configurĂ©s.
        ser = serial.Serial(PORT, BAUD_RATE, timeout=1)
        print("Connexion au M5Core2 Ă©tablie.\n")


        # DĂ©marre un thread sĂ©parĂ© pour lire les tempĂ©ratures en permanence.
        thread_lecture = threading.Thread(target=lire_temperature, args=(ser,))
        thread_lecture.daemon = True  # Assure que le thread s'arrĂŞte lorsque le programme principal termine.
        thread_lecture.start()


        # Lance la fonction d'envoi des seuils dans le thread principal.
        envoyer_seuil(ser)


    except serial.SerialException as e:
        # Si le port sĂ©rie ne peut pas ĂŞtre ouvert, affiche un message d'erreur.
        print(f"Erreur de connexion sĂ©rie : {e}")
    except Exception as e:
        # Capture d'autres erreurs potentielles et affichage.
        print(f"Erreur : {e}")
    finally:
        # Ferme la connexion sĂ©rie proprement Ă  la fin du programme.
        if 'ser' in locals() and ser.is_open:
            ser.close()
            print("Connexion sĂ©rie fermĂ©e.")



# Point d'entrée du programme.
if __name__ == "__main__":
    main()

Pour rĂ©cupĂ©rer les donnĂ©es, il faut tĂ©lĂ©verser le script ci-dessus dans l'Ă©diteur de code.  Veuillez Ă  faire attention Ă  ne pas laisser le terminal Arduino IDE ouvert sinon on ne pourra avoir accès au port sur VSCode. Si une erreur de type "Erreur de connexion sĂ©rie : could not open port 'COM9': Permission Error(13, 'Accès refusĂ©.', None, 5)" s'affiche, fermez le terminal sur Arduino IDE, dĂ©branchez le port USB  et rebranchez-le.

28/01/2025-

A présent, afin d'utiliser les données pour des analyses, je vais essayer de récupérer ces mesures de températures (mesurées à une fréquence de 2 secondes ici) en fonction du temps. Pour cela, il faudrait enregistrer dans un fichier CSV ces données et faire une copie des log du M5Core2 sur une carte micro SD où les données seront récupérées. On pourra récupérer ces données sur un ordinateur via cette carte micro SD.