Ceci est une version archivée de SerParT1 à 2020-12-05 20:08:53

Partie 1 :

Enregistrer des données de températures et d'humidité sur une carte SD avec le temps absolu.


0. Principe

La sonde de température DS18B20 est un capteur de température numérique qui utilise le protocole de communication One Wire. OneWire est un bus de données numérique qui ne nécessite qu’un seul fil. Le bus OneWire permet d’adresser jusqu’à 100 appareils avec un seul fil.

1. Branchements

  • Brancher le capteur de température DS18B20 sur une braid board
  • rouge => 5v ; noir => masse ; jaune =>pin 10
  • Brancher une résistance de 4,7 kohm entre le VCC et le data.

2. Définir l'adresse OneWire

  • La première chose à faire est d'installer les librairies One wire et Dallas température
  • Attention la version 3.9 de dallas température comporte des erreurs. La version 3.8 fonctionne correctement.
  • Dans arduino IDE entrer :
    • /* DS18B20_address_reporter
      this sketch looks for one-wire devices and
      prints their ID address (8 bytes)
      to Serial Monitor, in a format that is useful in Arduino sketches
      */
      
      #include 
      #define onewirepin 10 // DATA pin of DS18B20 wired to pin 10 of Arduino
      
      OneWire ds(onewirepin);
      
      void setup(void) {
      Serial.begin(115200);
      reportOneWireDevices();
      }
      
      void reportOneWireDevices(void) {
      byte i;
      byte present = 0;
      byte data[12];
      byte addr[8];
      
      Serial.println ("DS18B20 address reporter");
      Serial.print ("Looking for 1-Wire devices…\n\r");
      while (ds.search(addr)) {
      Serial.print ("\n\rFound \’1-Wire\’ device with address:\n\r");
      for( i = 0; i < 8; i++) {
      Serial.print("0x");
      if (addr[i] < 16) {
      Serial.print ('0');
      }
      Serial.print(addr[i], HEX);
      if (i < 7) {
      Serial.print (", ");
      }
      }
      
      if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.print ("CRC is not valid!\n");
      return;
      }
      }
      Serial.print ("\n\r\n\rThat’s it.\r\n");
      ds.reset_search ();
      return;
      }
      
      void loop(void) {
      // empty nothing to do here
      }
  • Par rapport à l'original, j'ai adapté le "Serial.begin(115200)"
  • Ouvrir le moniteur série et le régler sur le baudrate 115200
  • Noter l'adresse OneWire indiqué. Cela se présente tel que :
    • 0x28, 0xFF, 0x41, 0xB2, 0x90, 0x16, 0x04, 0xF5

3. Le code pour lire la température sur un capteur

  • Puis en ouvrant une nouvelles console sur l'IDE, entrer le nouveau code qui permettra de renvoyer les données du capteur sur le moniteur serie :
    • /* DS18B20_sensor
      based on a sketch by Rik Kretzinger
      this sketch reads temperature from one DS18B20 sensor
      and reports to Serial Monitor
      public domain
      */
      
      #include 
      #include 
      #define onewirepin 10
      
      OneWire oneWire(onewirepin);
      DallasTemperature sensors(&oneWire);
      
      // find the DeviceAddress of your DS18B20 with the sketch DS18B20_address_reporter
      // then replace the 8-byte ID below with the reported one
      
      DeviceAddress Probe = { 0x28, 0xFF, 0x41, 0xB2, 0x90, 0x16, 0x04, 0xF5 };
      
       
      
      void setup(){
      Serial.begin (115200);
      Serial.print ("Initializing Temperature Control Library Version ");
      Serial.println (DALLASTEMPLIBVERSION);
      
      sensors.begin (); // Initialize the sensor and set resolution level
      sensors.setResolution(Probe, 10);
      
      delay(1000);
      Serial.println();
      Serial.print ("Number of Devices found on bus = ");
      Serial.println (sensors.getDeviceCount());
      Serial.print ("Getting temperatures… ");
      Serial.println ();
      }
      
      void loop()
      {
      
      sensors.requestTemperatures(); // Command all devices on bus to read temperature
      
      Serial.print("Temperature is: ");
      printTemperature(Probe);
      Serial.println();
      delay(1000);
      
      }
      
      void printTemperature(DeviceAddress deviceAddress)
      {
      
      float tempC = sensors.getTempC(deviceAddress);
      
      if (tempC == -127.00)
      {
      Serial.print ("Error getting temperature ");
      }
      else
      {
      Serial.print ("C: ");
      Serial.print (tempC);
      Serial.print (" F: ");
      Serial.print(DallasTemperature::toFahrenheit(tempC));
      }
  • Une fois exécuté ce script renverra la température une fois que le moniteur série sera ouvert.

Liens connexes


1. Le code

  • J'ai mixé les codes de l'affichage LCD et de la lecture de la température sur un unique code
    • /* DS18B20_sensor
      based on a sketch by Rik Kretzinger
      this sketch reads temperature from one DS18B20 sensor
      and reports to Serial Monitor
      public domain
      */
      
      #include 
      #include 
      #define onewirepin 10
      #include  // initialize the library with the numbers of the interface pins – The numbers
      //are the pin connected in sequence from RS to DB7, c'est pour l'écran
      LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
      
      OneWire oneWire(onewirepin);
      DallasTemperature sensors(&oneWire);
      
      // find the DeviceAddress of your DS18B20 with the sketch DS18B20_address_reporter
      // then replace the 8-byte ID below with the reported one
      
      DeviceAddress Probe = { 0x28, 0xFF, 0x41, 0xB2, 0x90, 0x16, 0x04, 0xF5 };
      
       
      
      void setup(){
      Serial.begin (115200);
      Serial.print ("Initializing Temperature Control Library Version ");
      Serial.println (DALLASTEMPLIBVERSION);
      
      sensors.begin (); // Initialize the sensor and set resolution level
      sensors.setResolution(Probe, 10);
      
      delay(1000);
      Serial.println();
      Serial.print ("Number of Devices found on bus = ");
      Serial.println (sensors.getDeviceCount());
      Serial.print ("Getting temperatures… ");
      Serial.println ();
      
      // set up the LCD’s number of columns and rows:
      lcd.begin(16, 2);
      // Print a message to the LCD
      lcd.print("Temperature");
      }
      
      void loop()
      {
      
      sensors.requestTemperatures(); // Command all devices on bus to read temperature
      
      Serial.print("Temperature is: ");
      printTemperature(Probe);
      Serial.println();
      delay(1000);
      
      }
      
      void printTemperature(DeviceAddress deviceAddress)
      {
      
      float tempC = sensors.getTempC(deviceAddress);
      
      if (tempC == -127.00)
      {
      Serial.print ("Error getting temperature ");
      lcd.setCursor(0, 1);
      lcd.print ("Reading Error");
      }
      else
      {
      Serial.print ("C: ");
      Serial.print (tempC);
      Serial.print (" F: ");
      Serial.print(DallasTemperature::toFahrenheit(tempC));
      // set the cursor to column 0, line 1
      // (note: line 1 is the second row, since counting begins with 0):
      lcd.setCursor(0, 1);
      // print the number of seconds since reset:
      lcd.print(tempC);
      lcd.print(" Celsius");
      }
      }

0. Principe

La sonde de température DS18B20 est un capteur de température numérique qui utilise le protocole de communication One Wire. OneWire est un bus de données numérique qui ne nécessite qu’un seul fil. Le bus OneWire permet d’adresser jusqu’à 100 appareils avec un seul fil.
Le protocole qui suit présente comment lire deux capteurs. En adaptant le code il est possible de lire jusqu'à 100 capteurs et pas uniquement des capteurs de température mais tout autre capteur suivant le protocole OneWire .

1. Le code

  • A la différence du code précédent on va plutôt utiliser la fonction "uint8_t sensor1[8]" pour assigner l'adresse du capteur.
  • Avant toute chose, il est nécessaire de lancer le code de l'étape 2 permettant de définir l'adresse OneWire .
  • Noter les adresses renvoyées et les coller derrière les fonctions "uint8_t sensor1[8]" au début de codes qui viennent.
  • Le code suivant permets d'afficher dans le moniteur série la température mesurées par les capteurs
    • /* DS18B20_sensor
      based on a sketch by Rik Kretzinger
      Modified by Guillaume Leguen
      this sketch reads temperature from 2 DS18B20 sensors
      and reports to Serial Monitor
      cc-by-sa Guillaume Leguen
      */
      
      #include 
      #include 
      #define onewirepin 10 // Cette fonction defini le numéro de port où sont branchés les capteurs
      
      OneWire oneWire(onewirepin);
      DallasTemperature sensors(&oneWire);
      
      // Retrouver les adress OneWire gr^ce au code de recherche des adresses
      
      uint8_t sensor1[8] = { 0x28, 0xFF, 0x41, 0xB2, 0x90, 0x16, 0x04, 0xF5 };
      uint8_t sensor2[8] = { 0x28, 0xFF, 0x49, 0x9A, 0x87, 0x16, 0x03, 0x14 };
       
      
      void setup(){
      Serial.begin (115200); // Adaptez au broadcast de votre moniteur serie
      Serial.print ("Initializing Temperature Control Library Version ");
      Serial.println (DALLASTEMPLIBVERSION);
      
      sensors.begin (); // Initialise le capteur et défini une resolution
      sensors.setResolution(sensor1, 10);
      sensors.setResolution(sensor2, 10);
      
      delay(1000);
      Serial.println();
      Serial.print ("Number of Devices found on bus = ");
      Serial.println (sensors.getDeviceCount());
      Serial.print ("Getting temperatures… ");
      Serial.println ();
      }
      
      void loop()
      {
      
      sensors.requestTemperatures(); // Command all devices on bus to read temperature
      
      Serial.print("Int: ");
      printTemperature(sensor1);
      
      Serial.print("Ext: ");
      printTemperature(sensor2);
      
      Serial.println();
      delay(1000);
      
      }
      
      void printTemperature(DeviceAddress deviceAddress) //Ici on défini la fonction printTemperature appelé plus haut
      {
      
      float tempC = sensors.getTempC(deviceAddress);
      
      if (tempC == -127.00)
      {
      Serial.print ("Error getting temperature ");
      }
      else
      {
      //Serial.print ("C: ");
      Serial.print (tempC);
      Serial.print((char)176); // Caractère du degré
      Serial.print("C | ");
      
      }
      }

  • Puis on peut utiliser le code suivant pour afficher en plus les températures sur un écran LCD.
    • /* DS18B20_sensor_to_LCD_screen
      based on a sketch by Rik Kretzinger
      Modified by Guillaume Leguen
      this sketch reads temperature from 2 DS18B20 sensors
      and reports to Serial Monitor
      cc-by-sa Guillaume Leguen
      */
      
      #include 
      #include 
      #define onewirepin 10 // Cette fonction defini le numéro de port où sont branchés les capteurs
      #include  // initialize the library with the numbers of the interface pins – The numbers
      //are the pin connected in sequence from RS to DB7, c'est pour l'écran
      LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
      
      OneWire oneWire(onewirepin);
      DallasTemperature sensors(&oneWire);
      
      // Retrouver les adress OneWire gr^ce au code de recherche des adresses
      
      uint8_t sensor1[8] = { 0x28, 0xFF, 0x41, 0xB2, 0x90, 0x16, 0x04, 0xF5 };
      uint8_t sensor2[8] = { 0x28, 0xFF, 0x49, 0x9A, 0x87, 0x16, 0x03, 0x14 };
      
       
      
      void setup(){
      Serial.begin (115200);
      Serial.print ("Initializing Temperature Control Library Version ");
      Serial.println (DALLASTEMPLIBVERSION);
      
      sensors.begin (); // Initialise le capteur et défini une resolution
      sensors.setResolution(sensor1, 10);
      sensors.setResolution(sensor2, 10);
      
      delay(1000);
      Serial.println();
      Serial.print ("Number of Devices found on bus = ");
      Serial.println (sensors.getDeviceCount());
      Serial.print ("Getting temperatures… ");
      Serial.println ();
      
      // set up the LCD’s number of columns and rows:
      lcd.begin(16, 2);
      }
      
      void loop()
      {
      
      sensors.requestTemperatures(); // Command all devices on bus to read temperature
      
      Serial.print("In : ");
      lcd.setCursor(0, 0);
      lcd.print ("In : ");
      printTemperature(sensor1);
      Serial.print("Out : ");
      lcd.setCursor(0, 1);
      lcd.print ("Out : ");
      printTemperature(sensor2);
      Serial.println();
      delay(500);
      
      }
      
      void printTemperature(DeviceAddress deviceAddress)
      {
      
      float tempC = sensors.getTempC(deviceAddress);
      
      if (tempC == -127.00)
      {
      Serial.print ("Error getting temperature ");
      lcd.print ("Reading Error");
      }
      else
      {
      Serial.print (tempC);
      Serial.print ((char)176);
      Serial.print ("C | ");
      lcd.print(tempC);
      lcd.print((char)223); // caractère degre
      lcd.print("C  ");
      }
      }

Liens connexes


1.Branchements

  • Miso --> Pin D12
  • Mosi --> Pin D11
  • SCK --> Pin D13
  • CS --> Pin D10

2.Programme

  • Le programme suivant prends les températures de deux capteurs et en stock les données sur un fichier TXT sur une carte SD.
/* DS18B20_sensor_to_LCD_screen
based on a sketch by Rik Kretzinger
Modified by Guillaume Leguen
this sketch reads temperature from 2 DS18B20 sensors
and reports to Serial Monitor
cc-by-sa Guillaume Leguen
*/

#include 
#include 
//#define onewirepin 9 // Cette fonction defini le numéro de port où sont branchés les capteurs
#include  // initialize the library with the numbers of the interface pins – The numbers
#include  // for SD stock
#include  // for SD stock
#include  // for SD stock
#include "DS3231.h" // for SD stock
//are the pin connected in sequence from RS to DB7, c'est pour l'écran
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

int pinSD = 10 ;
int pinSensorsDS = 9 ;
char NomFichier[] = "gui12.txt";

File myFile; //deffine var File

OneWire oneWire(pinSensorsDS);
DallasTemperature sensors(&oneWire);

// Retrouver les adress OneWire grace au code de recherche des adresses

uint8_t sensor1[8] = { 0x28, 0xFF, 0x41, 0xB2, 0x90, 0x16, 0x04, 0xF5 };
uint8_t sensor2[8] = { 0x28, 0xFF, 0x49, 0x9A, 0x87, 0x16, 0x03, 0x14 };


void setup(){
  Serial.begin (115200);
  Wire.begin(); //for DS3231
  while (!Serial) {
   ; // wait for serial port to connect. Needed for native USB port only
   }
  delay(2000);  //afer reset Arduino, 2s to take out SD
  
  Serial.print("Initializing SD card...");
  
  Serial.print ("Initializing Temperature Control Library Version ");
  Serial.print("Initializing SD card...");
  Serial.println (DALLASTEMPLIBVERSION);

  sensors.begin (); // Initialise le capteur et défini une resolution
  sensors.setResolution(sensor1, pinSensorsDS);
  sensors.setResolution(sensor2, pinSensorsDS);

  delay(2000);
  Serial.println();
  Serial.print ("Number of Devices found on bus = ");
  Serial.println (sensors.getDeviceCount());
  Serial.print ("Getting temperatures… ");
  Serial.println ();

  // set up the LCD’s number of columns and rows:
  lcd.begin(16, 2);
  
  if (!SD.begin(pinSD)) {
   Serial.println("initialization failed!");
  }
  else {
   Serial.println("initialization done.");
  }
  
write_header ();
}

void loop()
{
  
  sensors.requestTemperatures(); // Command all devices on bus to read temperature
  Serial.print("In : ");
  lcd.setCursor(0, 0);
  lcd.print ("In : ");
  printTemperature(sensor1);
  Serial.print("Out : ");
  lcd.setCursor(0, 1);
  lcd.print ("Out : ");
  printTemperature(sensor2);
  Serial.println();
  write_data1(sensor1);  //write data
  write_data2(sensor2);
  delay(500);

}

void printTemperature(DeviceAddress deviceAddress)
{

  float tempC = sensors.getTempC(deviceAddress);

  if (tempC == -127.00)
  {
  Serial.print ("Error getting temperature ");
  lcd.print ("Reading Error");
  }
  else
  {
  Serial.print (tempC);
  Serial.print ((char)176);
  Serial.print ("C | ");
  lcd.print(tempC);
  lcd.print((char)223); // caractère degre
  lcd.print("C  ");
  }
}
void write_data1(DeviceAddress deviceAddress)
{
 float tempC = sensors.getTempC(deviceAddress);
  myFile = SD.open(NomFichier, FILE_WRITE);

  // if the file opened okay, write to it:
  if (myFile) {
    myFile.print(tempC);
    myFile.print(";");
    myFile.close();
    Serial.println("Write file successful!"); //print out COM Port
  } else {
    Serial.println("error opening txt");
  }
}

void write_data2(DeviceAddress deviceAddress)
{
 float tempC = sensors.getTempC(deviceAddress);
  myFile = SD.open(NomFichier, FILE_WRITE);

  // if the file opened okay, write to it:
  if (myFile) {
    myFile.print(tempC);
    myFile.println();
    myFile.close();
    Serial.println("Write file successful!"); //print out COM Port
  } else {
    Serial.println("error opening txt");
  }
}

void write_header()
{
  myFile = SD.open(NomFichier, FILE_WRITE);

  // if the file opened okay, write to it:
  if (myFile) {
    myFile.println("Donnees de temperatures");
    myFile.println("Serre de FSP");
    myFile.println("Date");
    myFile.println();
    myFile.println("In;Out");
    myFile.close();
    Serial.println("Write header successful!"); //print out COM Port
  } else {
    Serial.println("error opening txt");
  }
}

  • Les problèmes à lever sont :
    • Créer un nom de fichier en fonction de la date

3.Problèmes rencontrés

Ce programme a été construit en assemblant le script de l'étape précédente avec le code donnée sur engineer2you.blogspot.com . A cause de cet assemblage, j'ai rencontré un soucis lié à une interférence entre les DS18B20 sur le Pin10 et le lecteur de carte SD sur le 9.

  • Le problème à été soumis sur le forum Arduino .
  • Il apparaît que le pin D10 de l'Arduino Nano a une fonction particulière. Elle est la broche SS par défaut du port SPI et si on utilise le SPI elle doit impérativement être en sortie. Si les périphériques SPI utilisent d'autre broches comme select il faut quand même que la broche 10 soit déclarée en sortie mais elle peut néanmoins être utilisée pour une autre fonction.
  • Le problème a été résolu en intervertissant les broches 10 et 9 entre le lecteur de carte et les DS18B20.
  • Ainsi que l'intégration du numéro de pin dans un "int" en début de programme.

Liens connexes

1.Branchements

  • RTC
    • GND
    • VCC --> +5v ou 3,3
    • SCL --> A5
    • SDA --> A4

2.mise à l'heure du RTC

  • Avant toute chose, et ce à la première utilisation du RTC, il est nécéssaire de mettre à l'heure le RTC. Pour cela on téléverse le code suivant en prenant soins de modifier les valeurs de temps à l'heure et à la date souhaité. Notez que le RTC ne se mettra pas seul à l'heure d'hiver. Dans ce cas il peut-être utile de le régler à l'heure UTC.
// Horloge_reglage_heure
// Appel de la bibliothèque
#include 
// Adresse I2C de l'horloge en temps réel
#define ADRESSE_I2C_RTC 0x68
// Indiquez ici l'heure et la date :
byte heure = 00; // 0 à 23
byte minute = 27; // 0 à 59
byte seconde = 0; // 0 à 59
byte numJourSemaine = 5; // dim = 1, sam = 7
byte numJourMois = 27; // 1 à 31
byte mois = 11; // 1 à 12
byte annee = 20; // 0 à 99
void setup(){
Wire.begin();
// Change l'heure et la date de l'horloge en temps réel
Wire.beginTransmission(ADRESSE_I2C_RTC);
Wire.write(0); // Positionner le pointeur de registre sur 00h
Wire.write(decToBcd(seconde));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(heure));
Wire.write(decToBcd(numJourSemaine));
Wire.write(decToBcd(numJourMois));
Wire.write(decToBcd(mois));
Wire.write(decToBcd(annee));
Wire.endTransmission();
}
void loop(){
}
// Convertir les nombres décimaux normaux en décimaux codés binaires
byte decToBcd(byte val){return( (val/10*16) + (val%10));}


3.Programme

  • Le programme qui suit est dérivé de la version précédente ainsi qu du code de engineer2you.blogspot.com . Il intègre en plus les éléments suivants :
    • Lecture de la date et de l'heure grâce au RTC
    • Création d'un nom de fichier à la date (année, mois, jour).
    • Création d'un nouveau LOG au changement de jour
/* Mesurer 2 temperatures et les archiver en carte SD
by Guillaume Leguen
this sketch reads temperature from 2 DS18B20 sensors
and reports to Serial Monitor
cc-by-sa Guillaume Leguen
*/

#include 
#include 
//#define onewirepin 9 // Cette fonction defini le numéro de port où sont branchés les capteurs
#include  // initialize the library with the numbers of the interface pins – The numbers
#include  // for SD stock
#include  // for SD stock
#include  // for SD stock
#include "DS3231.h" // for SD stock
//are the pin connected in sequence from RS to DB7, c'est pour l'écran
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

RTClib RTC;
DS3231 Clock;

int pinSD = 10 ;
int pinSensorsDS = 9 ;
char NomFichier[20];
char NomFichierComp[20];
int Year;
int Month;
int Date;
int Hour;
int Minute;
int Second;
int tempC;
int interval = 1;
int Minute_last;
int Date_last;

File myFile; //deffine var File

OneWire oneWire(pinSensorsDS);
DallasTemperature sensors(&oneWire);

// Retrouver les adress OneWire grace au code de recherche des adresses

uint8_t sensor1[8] = { 0x28, 0xFF, 0x41, 0xB2, 0x90, 0x16, 0x04, 0xF5 };
uint8_t sensor2[8] = { 0x28, 0xFF, 0x49, 0x9A, 0x87, 0x16, 0x03, 0x14 };


void setup(){
  Serial.begin (115200);
  Wire.begin(); //for DS3231 for RTC
  while (!Serial) {
   ; // wait for serial port to connect. Needed for native USB port only
   }
  delay(2000);  //afer reset Arduino, 2s to take out SD
  
  Serial.print("Initializing SD card...");
  
  Serial.print ("Initializing Temperature Control Library Version ");
  Serial.print("Initializing SD card...");
  Serial.println (DALLASTEMPLIBVERSION);

  sensors.begin (); // Initialise le capteur et défini une resolution
  sensors.setResolution(sensor1, pinSensorsDS);
  sensors.setResolution(sensor2, pinSensorsDS);

  delay(2000);
  Serial.println();
  Serial.print ("Number of Devices found on bus = ");
  Serial.println (sensors.getDeviceCount());
  Serial.print ("Getting temperatures… ");
  Serial.println ();

  // set up the LCD’s number of columns and rows:
  lcd.begin(16, 2);
  
  if (!SD.begin(pinSD)) {
   Serial.println("initialization failed!");
  }
  else {
   Serial.println("initialization done.");
  }

  DateTime now = RTC.now();
  Year = now.year();
  Month = now.month();
  Date = now.day();
  Hour = now.hour();
  Minute = now.minute();
  Second = now.second();
  tempC = Clock.getTemperature();
  
  Date_last = Date ;
  sprintf(NomFichier,"%02d%02d%02d%",now.year(),now.month(),now.day()); 
  
write_header ();
Serial.println(NomFichier);
}

void loop()
{
  update_vartime();
  
  sensors.requestTemperatures(); // Command all devices on bus to read temperature
  
  Serial.print(Minute);
  Serial.print("In : ");
  lcd.setCursor(0, 0);
  lcd.print ("In : ");
  printTemperature(sensor1);
  Serial.print("Out : ");
  lcd.setCursor(0, 1);
  lcd.print ("Out : ");
  printTemperature(sensor2);
  Serial.println();
 // write_data1(sensor1);  //write data
 // write_data2(sensor2);
  delay(100);
  
  if ((Minute % interval == 0)&(Minute_last!=Minute))
  {
    write_data1(sensor1);  //write data
    write_data2(sensor2);
    Minute_last = Minute;
  }

}

void printTemperature(DeviceAddress deviceAddress)
{

  float tempC = sensors.getTempC(deviceAddress);

  if (tempC == -127.00)
  {
  Serial.print ("Error getting temperature ");
  lcd.print ("Reading Error");
  }
  else
  {
  Serial.print (tempC);
  Serial.print ((char)176);
  Serial.print ("C | ");
  lcd.print(tempC);
  lcd.print((char)223); // caractère degre
  lcd.print("C  ");
  }
}
void write_data1(DeviceAddress deviceAddress)
{
 float tempC = sensors.getTempC(deviceAddress);
  myFile = SD.open(NomFichier, FILE_WRITE);

  // if the file opened okay, write to it:
  if (myFile) {
    myFile.print(Year);
    myFile.print("/");
    myFile.print(Month);
    myFile.print("/");
    myFile.print(Date);
    myFile.print(";");
    myFile.print(Hour);
    myFile.print(":");
    myFile.print(Minute);
    myFile.print(";");
    myFile.print(tempC);
    myFile.print(";");
    myFile.close();
    Serial.println("Write file successful!"); //print out COM Port
  } else {
    Serial.println("error opening txt");
  }
}

void write_data2(DeviceAddress deviceAddress)
{
 float tempC = sensors.getTempC(deviceAddress);
  myFile = SD.open(NomFichier, FILE_WRITE);

  // if the file opened okay, write to it:
  if (myFile) {
    myFile.print(tempC);
    myFile.println();
    myFile.close();
    Serial.println("Write file successful!"); //print out COM Port
  } else {
    Serial.println("error opening txt");
  }
}

void write_header()
{
  myFile = SD.open(NomFichier, FILE_WRITE);

  // if the file opened okay, write to it:
  if (myFile) {
    myFile.println("Donnees de temperatures");
    myFile.println("Serre de FSP");
    myFile.print(Year);
    myFile.print("/");
    myFile.print(Month);
    myFile.print("/");
    myFile.println(Date);
    myFile.println();
    myFile.println("Date;Time;In;Out");
    myFile.close();
    Serial.println("Write header successful!"); //print out COM Port
  } else {
    Serial.println("error opening txt");
  }
}

void update_vartime()
{
  DateTime now = RTC.now();
  Year = now.year();
  Month = now.month();
  Date = now.day();
  Hour = now.hour();
  Minute = now.minute();
  Second = now.second();
  tempC = Clock.getTemperature();
 
  if((Date % interval == 0)&(Date_last!=Date)) { //permets de créer un nouveau fichier à chaque changement de date.
    sprintf(NomFichier,"%02d%02d%02d%",now.year(),now.month(),now.day()); 
    Serial.print("Changement de date, nouveau fichier : ");
    Serial.println(NomFichier);
    Date_last = Date ;
    write_header ();
  }
}


Liens connexes


0. Matériel

  • Un capteur d'humidité DHT 11

1. Branchements

  • 5v --> 5v
  • Gnd --> Gnd
  • Data --> A3 (ou pin digital disponible).

2. Programme

  • Pour commencer, installer la librairie proposé sur GitHub En créant un dossier "DHT" dans le dossier "librairie". Dans ce dossier créer deux fichiers avec un editeur de texte ("dht.h" et "dht.cpp").
  • Dans ces fichiers coller les codes respectifs disponibles sur le GitHub .
  • Puis j'ai essayé l'exemple disponible pour le DHT 11.
  • Celui-ci fonctionnant, j'ai intégré le code pour la lecture du capteur au code général.
/* Mesurer 2 temperatures et une humidité et les archiver en carte SD
avec affichage sur lcd 16*2
by Guillaume Leguen
this sketch reads temperature from 2 DS18B20 sensors
and reports to Serial Monitor
cc-by-sa Guillaume Leguen
*/

#include 
#include 
//#define onewirepin 9 // Cette fonction defini le numéro de port où sont branchés les capteurs
#include  // initialize the library with the numbers of the interface pins – The numbers
#include  // for SD stock
#include  // for SD stock
#include  // for SD stock
#include "DS3231.h" // for SD stock
#include 

//are the pin connected in sequence from RS to DB7, c'est pour l'écran
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

RTClib RTC;
DS3231 Clock;
dht DHT;

int pinSD = 10 ;
int pinSensorsDS = 9 ;
char NomFichier[20];
char NomFichierComp[20];
int Year;
int Month;
int Date;
int Hour;
int Minute;
int Second;
int tempC;
int interval = 1;
int Minute_last;
int Date_last;
int DHT11_PIN = A3;

File myFile; //deffine var File

OneWire oneWire(pinSensorsDS);
DallasTemperature sensors(&oneWire);

// Retrouver les adress OneWire grace au code de recherche des adresses

uint8_t sensor1[8] = { 0x28, 0xFF, 0x41, 0xB2, 0x90, 0x16, 0x04, 0xF5 };
uint8_t sensor2[8] = { 0x28, 0xFF, 0x49, 0x9A, 0x87, 0x16, 0x03, 0x14 };


void setup()
{
  Serial.begin (115200);
  Wire.begin(); //for DS3231 for RTC
  while (!Serial) {
   ; // wait for serial port to connect. Needed for native USB port only
   }
  delay(2000);  //afer reset Arduino, 2s to take out SD
  
  Serial.print("Initializing SD card...");
  
  Serial.print ("Initializing Temperature Control Library Version ");
  Serial.print("Initializing SD card...");
  Serial.println (DALLASTEMPLIBVERSION);
  Serial.println("DHT TEST PROGRAM ");
  Serial.print("LIBRARY VERSION: ");
  Serial.println(DHT_LIB_VERSION);

  sensors.begin (); // Initialise le capteur et défini une resolution
  sensors.setResolution(sensor1, 12);
  sensors.setResolution(sensor2, 12);

  delay(2000);
  Serial.println();
  Serial.print ("Number of Devices found on bus = ");
  Serial.println (sensors.getDeviceCount());
  Serial.print ("Getting temperatures… ");
  Serial.println ();

  // set up the LCD’s number of columns and rows:
  lcd.begin(16, 2);
  
  if (!SD.begin(pinSD)) {
   Serial.println("initialization failed!");
  }
  else {
   Serial.println("initialization done.");
  }

  DateTime now = RTC.now();
  Year = now.year();
  Month = now.month();
  Date = now.day();
  Hour = now.hour();
  Minute = now.minute();
  Second = now.second();
  tempC = Clock.getTemperature();
  
  Date_last = Date ;
  sprintf(NomFichier,"%02d%02d%02d%",now.year(),now.month(),now.day()); 
  
write_header ();
Serial.println(NomFichier);
}

void loop()
{
  update_vartime();
  
  sensors.requestTemperatures(); // Command all devices on bus to read temperature
  int chk = DHT.read11(DHT11_PIN);
  
  Serial.print(Minute);
  Serial.print("In : ");
  lcd.setCursor(0, 0);
  lcd.print ("I");
  printTemperature(sensor1);
  Serial.print("Out : ");
  lcd.print ("  ");
  lcd.print ("O");
  printTemperature(sensor2);
  lcd.print((char)223); // caractère degre
  lcd.print("C  ");
 // write_data1(sensor1);  //write data
 // write_data2(sensor2);
   // DISPLAY DATA
  Serial.print("H : ");
  Serial.print(DHT.humidity, 1);
  Serial.print(" |");
  Serial.println();
  lcd.setCursor(0, 1);
  lcd.print ("Hum : ");
  lcd.print (DHT.humidity,1);
  lcd.print ("%");
  delay(1000);//Important pour bonne lecture du DHT11
  
  if ((Minute % interval == 0)&(Minute_last!=Minute))
  {
    write_data1(sensor1);  //write data
    write_data2(sensor2);
    write_dataH1();
    Minute_last = Minute;
  }

}

void printTemperature(DeviceAddress deviceAddress)
{

  float tempC = sensors.getTempC(deviceAddress);

  if (tempC == -127.00)
  {
  Serial.print ("Error getting temperature ");
  lcd.print ("Reading Error");
  }
  else
  {
  Serial.print (tempC);
  Serial.print ((char)176);
  Serial.print ("C | ");
  lcd.print(tempC);
  //lcd.print((char)223); // caractère degre
  //lcd.print("C  ");
  }
}


void write_data1(DeviceAddress deviceAddress)
{
 float tempC = sensors.getTempC(deviceAddress);
  myFile = SD.open(NomFichier, FILE_WRITE);

  // if the file opened okay, write to it:
  if (myFile) {
    myFile.print(Year);
    myFile.print("/");
    myFile.print(Month);
    myFile.print("/");
    myFile.print(Date);
    myFile.print(";");
    myFile.print(Hour);
    myFile.print(":");
    myFile.print(Minute);
    myFile.print(";");
    myFile.print(tempC);
    myFile.print(";");
    myFile.close();
    Serial.println("Write file successful!"); //print out COM Port
  } else {
    Serial.println("error opening txt");
  }
}


void write_data2(DeviceAddress deviceAddress)
{
 float tempC = sensors.getTempC(deviceAddress);
  myFile = SD.open(NomFichier, FILE_WRITE);

  // if the file opened okay, write to it:
  if (myFile) {
    myFile.print(tempC);
    myFile.print(";");
    myFile.close();
    Serial.println("Write file successful!"); //print out COM Port
  } else {
    Serial.println("error opening txt");
  }
}

void write_dataH1()
{
 float chk = DHT.read11(DHT11_PIN);
  myFile = SD.open(NomFichier, FILE_WRITE);

  // if the file opened okay, write to it:
  if (myFile) {
    myFile.print(DHT.humidity,1);
    myFile.println();
    myFile.close();
    Serial.println("Write file successful!"); //print out COM Port
  } else {
    Serial.println("error opening txt");
  }
}

void write_header()
{
  myFile = SD.open(NomFichier, FILE_WRITE);

  // if the file opened okay, write to it:
  if (myFile) {
    myFile.println("Donnees de temperatures");
    myFile.println("Serre de FSP");
    myFile.print(Year);
    myFile.print("/");
    myFile.print(Month);
    myFile.print("/");
    myFile.println(Date);
    myFile.println();
    myFile.println("Date;Time;Temp_In;Temp_Out;Humidity");
    myFile.close();
    Serial.println("Write header successful!"); //print out COM Port
  } else {
    Serial.println("error opening txt");
  }
}

void update_vartime()
{
  DateTime now = RTC.now();
  Year = now.year();
  Month = now.month();
  Date = now.day();
  Hour = now.hour();
  Minute = now.minute();
  Second = now.second();
  tempC = Clock.getTemperature();
 
  if((Date % interval == 0)&&(Date_last!=Date)) { //permets de créer un nouveau fichier à chaque changement de date.
    sprintf(NomFichier,"%02d%02d%02d%",now.year(),now.month(),now.day()); 
    Serial.print("Changement de date, nouveau fichier : ");
    Serial.println(NomFichier);
    Date_last = Date ;
    write_header ();
  }

}


3. Problèmes rencontrés

  • Cadence de lecture. Enfin de pouvoir lire le capteur chaque fois, j'ai augmenté le délai à 1000ms.
  • J'ai supprimé la partie du code ressortant les erreurs de lectures. Il reste à comprendre pourquoi cela génait le bon déroulement du code.
  • Il y a eu un problème de lecture "checksum error". Le problème à été élucidé grâce à une question sur le forum Arduino .

4. liens connexes

Un dépot à jour


Montage finale

image Montage_serre_V1_bb.png (0.3MB)
licences : CC-by-sa Modèle fritzing DHT11 made by arduinomodules.info is.