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
-
Introduction:
- Présentation des éléments nécessaires pour la programmation.
- Importance de la programmation dans le projet de station météo.
-
Programmation:
- Commençons par la programmation sur Mblock.
TéN'oubliez pas d'installer l'extension pour le capteur en cliquant sur ce bouton,puis taper dans la barre de recherche "DHT22" et ensuite juste besoin de l'ajouter.
-
-
- 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
- Commençons par la programmation sur Mblock.
-
DéclarationCedescodelibrairiesvanécessairesnouset des adressespermettre destockagestocker la température dans la mémoireEEPROM.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 intadresseEEPROMEEPROM_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; // Adressede la mémoire EEPROMactuelle pour stockerlavoidtempératuresetup()(partie{entière)Serial.begin(9600);intBTSerial.begin(9600);adresseDecimaleEEPROMdht.begin();=Serial.println("Démarrage1;du système..."); //AdresseStockersuivantedespourdonnéesstockerdanslal'EEPROMpartieendécimalemode circulaire for (intadresseHumiditeEEPROMi =2;0;//iAdresse<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 validesif (!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ébutdesil'espaceonEEPROM adresseDecimaleEEPROM = 1; // Commencer à l'adresse suivante pourdépasse lapartie 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 mesuredelay(600000)3600000); // Attendretemps1 heure entre chaque mesure } } void loop() { // Pas besoin desecondescodeentredanslesloopmesurespour(ajustezcetteselon vos besoins)démonstration }0Maintenantaprès avoir stocker les température ilnousfautfautles récupérer, voici le codepour 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 intpartieEntiereTemperatureENTRY_SIZE =EEPROM.read(adresseEEPROM)sizeof(float);// Lire la partie décimale de la températureconst intpartieDecimaleTemperatureNUM_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 codeprincipaldansiciloop pour cette démonstration }
-
Validation:
- Vérification du programme pour s'assurer du bon fonctionnement.
- Test du stockage des valeurs dans la mémoire EEPROM.
-
Conclusion:
- Récapitulation des points clés de la séance.
- Réponses aux questions éventuelles.
Résolution de problèmes
- Si
dht.h
n'est pas reconnu quand vous vérifiez/compilez le fichier, essayer une librairie adaptée à la marque de votre DHT22. Par exemple pour DFRobot : - Cliquer sur Code > Télécharger ZIP https://github.com/CainZ/DHT
- Ajouter la librairie à la main dans ArduinoIDE
- Vérifier la bonne installation de la librairie, dans "contributed libraries"