Mesure température, humidité et enregistrement carte SD

Dans le cadre mon travail, je devais mesurer une température et un taux d’humidité. La mesures devait se faire en instantanée ou en continue. Pour lier l’utile à l’agréable, je vais détailler les différentes étapes.

Mon premier projet avec l’Arduino était une station météo très simple avec une simple lecture et un affichage sur un afficheur LCD 4×20. Cet article ne traite pas directement de la réalisation d’une station (trop peu de paramètres) mais il est facile de le modifier pour en faire un.

Ma problématique

Afin de contrôler une enceinte, je devais y mesurer la température et le taux d’humidité, cette mesure peut se faire en direct mais aussi dans le temps. Les solutions commerciales sont rapidement chères notamment à cause de l’enregistrement (ou transfert) et la visualisation.

J’ai donc décidé de faire un petit appareil me permettant de :

  • mesurer et visualiser la température en direct
  • enregistrer ces paramètres avec appui sur bouton

Matériels nécessaires

Pour ce projet, j’ai utilisé :

  • un arduino nano (lien x10)
  • un capteur DHT22 (lien x3)
  • résistance 1kΩ et 10kΩ (lot de résistances)
  • un lecteur de carte sd pour arduino (lien x2)
  • un potentiomètre 10kΩ (lien x10)
  • un boitier pour contenir le tout (lien)
  • une carte sd (lien)
  • un interrupteur (lien)
  • un bouton poussoir (lien)
  • un afficheur lcd 4×20 (lien)

J’ai préféré prendre un lecteur de carte sd et une carte sd plutôt que du micro sd pour une question de coût et surtout c’est ce que j’avais sous la main.

Le montage de la station de mesure

Je n’ai malheureusement pas pris le temps de photographier les différentes étapes, déjà le montage finale :

Boitier face finale
Boitier face finale
Emplacement carte sd et bouton
Emplacement carte sd et bouton
schema câblage
schema câblage

Je tiens à m’excuser de la médiocrité de ce schéma !!!!

Le script Arduino pour la station de mesure de température et humidité

J’ai utilisé pour le faire différentes sources :

Le script de la station de mesure

J’ai mis quelques commentaires dans le script afin de permettre de comprendre.

La seule chose de bloquante pour le fonctionnement est l’absence et le dysfonctionnement du capteur. Si aucune est insérée dans le lecteur de carte, l’enregistrement n’est pas possible mais la visualisation est toujours disponible.

//inclusion des librairies
#include <SD.h>
#include "DHT.h"
#include <LiquidCrystal.h>

//temps
unsigned long debut;
unsigned long temps;
unsigned long heure;
unsigned long minutes;
unsigned long derniere_valeur;
//ecran
const int RS=5; 
const int E=6; 
const int D4=7;  
const int D5=8; 
const int D6=9;  
const int D7=14;
LiquidCrystal lcd(RS, E, D4, D5, D6, D7);

 // déclaration de quelques variables pour SD
const int chipSelect = 10;  //pin de l'Arduino reliee au CS du module SD
Sd2Card card;
File fichier;

//gestion de l'ecriture
boolean ecriture; //activation de l'ecriture sur la carte
int pinBouton = 3;
int EtatBouton;
String msg_ecriture;

//détermination du fichier à écrire
String nom_fichier;
String base ;
int numero_fichier;

// déclaration pour DHT22
#define DHTPIN 2     
#define DHTTYPE DHT22   
DHT dht(DHTPIN, DHTTYPE);
 
void setup() { 
  //initialisation bouton
  pinMode(pinBouton, INPUT);
  EtatBouton = LOW;
  ecriture = false;
  base = "releve";
  //initialisation DHT22
  dht.begin();
  //intialisation carte sd
  pinMode(10, OUTPUT);
  card.init(SPI_HALF_SPEED, chipSelect);
  SD.begin(chipSelect);
  //initialisation de l'ecran
  lcd.begin(20,4);
  delay(10);
  lcd.clear();
}
 
void loop() {
  mesure de la temperature et humidite
  float h = dht.readHumidity();
  float t = dht.readTemperature();
 
  if (isnan(t) || isnan(h)) {//test de presence du capteur
    lcd.setCursor(0,0);
    lcd.print("Lecture impossible du capteur DHT22");
    lcd.print("                                     ");
  } else {
    //affichage a l'ecran
    if(ecriture){
      msg_ecriture = "Enregistrement      ";
    }else{
      msg_ecriture = "Pas d'enregistrement";
    }
    lcd.setCursor(0,0);
    lcd.print("Humidite : ");
    lcd.setCursor(14,0);
    lcd.print(h);
    lcd.setCursor(0,1);
    lcd.print("Temperature : ");
    lcd.setCursor(14,1);
    lcd.print(t);
    lcd.setCursor(0,2);
    lcd.print(msg_ecriture);
    if(ecriture){
      lcd.setCursor(0,3);
      lcd.print(nom_fichier);
      //affichage heure du temps d'enregistrement
      lcd.setCursor(15,3);
      temps = (millis() - debut) / 60000;
      heure = temps / 60;
      minutes = temps % 60;
      lcd.print(heure);
      lcd.print(":");
      lcd.print(minutes);
    }else{
      lcd.setCursor(0,3);
      lcd.print("                    ");
    }
    //verification si pression sur bouton pour enregistrement
    demande_ecriture();
    if (ecriture && (millis() - derniere_valeur) >= 5000){
      ecriture_sd(h,t);
      derniere_valeur = millis();
      //delay(2000);
    }
    delay(100);
  }
}
//fonction d'ecriture sur la carte sd
void ecriture_sd(float humidite, float temperature){
  fichier = SD.open(nom_fichier, FILE_WRITE);
  if (fichier) {
    fichier.print(humidite);
    fichier.print(";");
    fichier.print(temperature);
    fichier.print(";");
    fichier.print(heure);
    fichier.print(":");
    fichier.print(minutes);
    fichier.print(";");
    fichier.println(millis() - debut);
    fichier.close();
  } 
  else {
    //utile pour le debug
    Serial.println("impossible d'ouvrir le fichier pour l'ecriture");
  }
}
//fonction de verification pression bouton
void demande_ecriture(){
  EtatBouton = digitalRead(pinBouton);
  if(!EtatBouton){
    if(ecriture){
      ecriture = false;
      nom_fichier = "";
      delay(1000);
    }else{   
      //recherche du dernier fichier et choix du fichier    
      int numero = 1;
      nom_fichier = "";
      nom_fichier += base;
      nom_fichier += numero;
      nom_fichier += ".txt";
      while(SD.exists(nom_fichier)){
        numero = numero + 1;
        nom_fichier = "";
        nom_fichier += base;
        nom_fichier += numero;
        nom_fichier += ".txt";
      }
      fichier = SD.open(nom_fichier, FILE_WRITE);
      if (fichier) {
        debut = millis();
        //ecriture sur la carte sd des titres des colonnes
        fichier.println("humidite;temperature;temps;tps milliseconde");
        fichier.close();
      } 
      ecriture = true;
      delay(1000);
    }
  }
}

Enregistrement

Le fichier sauvegardé se nomme releveX.txt, à chaque début d’enregistrement, on vient lire le dernier fichier releveX.txt, si il est présent, on incrémente le numéro du fichier.

La lecture se fait simplement en insérant la carte sd dans un lecteur sur un pc et on l’ouvre, on obtient ceci :

humidite;temperature;temps;tps milliseconde
33.70;23.30;0:0;1025
33.70;23.30;0:0;6116
33.80;23.40;0:0;11187
33.70;23.30;0:0;16279
33.70;23.30;0:0;21349
33.60;23.30;0:0;26442
33.60;23.30;0:0;31513
33.70;23.40;0:0;36604
33.70;23.40;0:0;41675

Voilà une petite vidéo (décidément j’ai du mal avec la qualité) :

Voilà, en vous souhaitant une bonne lecture, un bon montage, n’hésitez à faire des remarques pour améliorer ce petit projet, à dire que vous aimez (ou l’inverse mais pas trop) et surtout à partager.

Laisser un commentaire