Skip to main content

Phase 3 - Programmation

Phase 3 - Câblage et Programmation de la station

Objectifs

Compétences techniques:

  • Programmation pour stocker les valeurs de température et d'humidité dans la mémoire de l'Arduino Nano.

Déroulement de la séance

  1. Introduction:

    • Présentation des éléments nécessaires pour la programmation.
    • Importance de la programmation dans le projet de station météo.
  2. Programmation:

    • Commençons par la programmation sur Mblock.
    • N'oubliez pas d'installer l'extension pour le capteur en cliquant sur ce boutonimage.png,puis taper dans la barre de recherche "DHT22" et ensuite juste besoin de l'ajouter.

      image.png

    •  

      Maintenant vous avez juste besoin de faire le code qui permet de mesuré la température grâce au DHT 22 et qui la renvoie sur le moniteur série.

      image.png

    •  

      Le code fini vous pouvez constater que le code vous renvoi la température en hexadécimale donc à vous de traduire cette température grâce à internet. 
    • Pour la suite nous allons passer sur le logiciel "Arduino IDE" car il nous offre plus de possibilités.
    • Dans un premier temps télécharger la librairie Arduino DHT de Adafruit https://www.arduino.cc/reference/en/libraries/dht-sensor-library/ 
      • bien installer la dépendance Adafruit Unified Sensor

image.png

    • DéclarationCe descode librairiesva nécessairesnous et des adressespermettre de stockagestocker la température dans la mémoire EEPROM.de notre Arduino nano et tous ca toute les heures.
    • #include <SoftwareSerial.h>
      #include <DHT.h>
      #include <EEPROM.h>
      
      #define DHTPIN 2        // La broche à laquelle le capteur DHT est connecté9
      #define DHTTYPE DHT22   // Type de capteur DHT (DHT11 dans cet exemple)
      
      void setup(){
      Serial.begin(9600);
      
      }
      
      DHT dht(DHTPIN, DHTTYPE);
      
      #define RX_PIN 3
      #define TX_PIN 4
      
      SoftwareSerial BTSerial(RX_PIN, TX_PIN);
      
      const int adresseEEPROMEEPROM_SIZE = 512; // Taille de l'EEPROM en octets
      const int ENTRY_SIZE = sizeof(float); // Taille d'une entrée en octets
      const int NUM_ENTRIES = EEPROM_SIZE / ENTRY_SIZE; // Nombre d'entrées que l'on peut stocker
      
      int currentAddress = 0; // Adresse de la mémoire EEPROMactuelle pour stocker
      
      lavoid températuresetup() (partie{
        entière)Serial.begin(9600);
        intBTSerial.begin(9600);
        adresseDecimaleEEPROMdht.begin();
        =Serial.println("Démarrage 1;du système...");
      
        // AdresseStocker suivantedes pourdonnées stockerdans lal'EEPROM partieen décimalemode circulaire
        for (int adresseHumiditeEEPROMi = 2;0; //i Adresse< suivanteNUM_ENTRIES; pour stocker l'humidité (partie entière)
      int adresseDecimaleHumiditeEEPROM = 3; // Adresse suivante pour stocker la partie décimale de l'humidité
    • Fonctionnement de la fonction loop pour mesurer la température et l'humidité.
    • Stockage des valeurs dans la mémoire EEPROM avec gestion des adresses.
    • Réinitialisation des adresses lorsque la mémoire est pleine.
    • void loop(i++) {
        // Mesurer la température et l'humidité
          float temperature = dht.readTemperature();
          float humidite = dht.readHumidity();
      
        // Vérifier si les mesures sont valides
        if (!isnan(temperature) && !isnan(humidite)) {
            //EEPROM.put(currentAddress, Stocker la température en interne (partie entière à adresse, partie décimale à adresseDecimaleEEPROM)
          EEPROM.write(adresseEEPROM, int(temperature));
            EEPROM.write(adresseDecimaleEEPROM, int((temperature - int(temperature)) * 100));
      
          // Stocker l'humidité en interne (partie entière à adresseHumiditeEEPROM, partie décimale à adresseDecimaleHumiditeEEPROM)
          EEPROM.write(adresseHumiditeEEPROM, int(humidite));
          EEPROM.write(adresseDecimaleHumiditeEEPROM, int((humidite - int(humidite)) * 100));
      
          // Incrémenter les adresses pour la prochaine mesure
          adresseEEPROMcurrentAddress += 4;  // Incrémenter de 4 pour laisser un espace pour la prochaine paire (température et humidité)
          adresseDecimaleEEPROM += 4;
          adresseHumiditeEEPROM += 4;
          adresseDecimaleHumiditeEEPROM += 4;
      
          // Vérifier si nous avons atteint la fin de l'espace EEPROMENTRY_SIZE;
            if (adresseEEPROMcurrentAddress >= EEPROM.length())EEPROM_SIZE) {
              adresseEEPROMcurrentAddress = 0; // Revenir au début desi l'espaceon EEPROM
            adresseDecimaleEEPROM = 1;  // Commencer à l'adresse suivante pourdépasse la partie décimale de la température
            adresseHumiditeEEPROM = 2;  // Commencer à l'adresse suivante pour la partie entièretaille de l'humidité
            adresseDecimaleHumiditeEEPROM = 3;  // Commencer à l'adresse suivante pour la partie décimale de l'humiditéEEPROM
            }
          }
          else {
          Serial.println("Erreur de lecture du capteur.");
        }
      
        // Attendre avant la prochaine mesure
        delay(600000)3600000); // Attendre temps1 heure entre chaque mesure
        }
      }
      
      void loop() {
        // Pas besoin de secondescode entredans lesloop mesurespour (ajustezcette selon vos besoins)démonstration
      }0
      
    • Maintenantaprès avoir stocker les température il nousfaut fautles récupérer, voici le code pour lire les valeurs stockées. :
      #include <EEPROM.h>
      
      const int adresseEEPROMEEPROM_SIZE = 0;512;
      // Adresse de la mémoire EEPROM pour la lecture des données
      
      void lireDonneesEEPROM() {
        Serial.println("Lecture des données depuis l'EEPROM:");
      
        while (adresseEEPROM < EEPROM.length()) {
          // Lire la partie entière de la températureconst int partieEntiereTemperatureENTRY_SIZE = EEPROM.read(adresseEEPROM)sizeof(float);
      // Lire la partie décimale de la températureconst int partieDecimaleTemperatureNUM_ENTRIES = EEPROM.read(adresseEEPROM + 1);EEPROM_SIZE // Lire la partie entière de l'humidité
          int partieEntiereHumidite = EEPROM.read(adresseEEPROM + 2);
          // Lire la partie décimale de l'humidité
          int partieDecimaleHumidite = EEPROM.read(adresseEEPROM + 3);
      
          // Afficher les valeurs lues
          Serial.print("Température: ");
          Serial.print(partieEntiereTemperature);
          Serial.print(".");
          Serial.print(partieDecimaleTemperature);
          Serial.print(" °C, Humidité: ");
          Serial.print(partieEntiereHumidite);
          Serial.print(".");
          Serial.print(partieDecimaleHumidite);
          Serial.println(" %");
      
          // Incrémenter l'adresse pour la prochaine paire de valeurs
          adresseEEPROM += 4;
        }
      }ENTRY_SIZE;
      
      void setup() {
        Serial.begin(9600);
        lireDonneesEEPROM(Serial.println("Démarrage du système...");
      
        // Lire et afficher toutes les données stockées
        for (int i = 0; i < NUM_ENTRIES; i++) {
          int address = i * ENTRY_SIZE;
          float storedTemperature;
          EEPROM.get(address, storedTemperature);
          Serial.print("Température stockée à l'adresse ");
          Serial.print(address);
          Serial.print(": ");
          Serial.print(storedTemperature);
          Serial.println(" °C");
        }
      }
      
      void loop() {
        // VotrePas besoin de code principaldans iciloop pour cette démonstration
      }
      
       
  1. Validation:

    • Vérification du programme pour s'assurer du bon fonctionnement.
    • Test du stockage des valeurs dans la mémoire EEPROM.
  2. Conclusion:

    • Récapitulation des points clés de la séance.
    • Réponses aux questions éventuelles.

Résolution de problèmes

image.png

  • Ajouter la librairie à la main dans ArduinoIDE

image.png

  • Vérifier la bonne installation de la librairie, dans "contributed libraries"

image.png