Température et humidité code

Bonjour
Mon projet à pour but de laisser à un endroit sur batterie 12V (mais 230V pour l’instant) et de faire un relevé de température et humidité. Pour certains c’est tout simple, pour moi pas du tout :-)!

Après recherches j’ai réussi à faire fonctionner ce code:

#include <SPI.h> //for the SD card module
#include <SD.h> // for the SD card
#include <DHT.h> // for the DHT sensor
#include <DHT_U.h>
#include <RTClib.h> // for the RTC
#include <Adafruit_Sensor.h>

//define DHT pin
#define DHTPIN 2     // what pin we're connected to

// uncomment whatever type you're using
#define DHTTYPE DHT11   // DHT 11 
//#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// initialize DHT sensor for normal 16mhz Arduino
DHT dht(DHTPIN, DHTTYPE);

// change this to match your SD shield or module;
// Arduino Ethernet shield and modules: pin 4
// Data loggin SD shields and modules: pin 10
// Sparkfun SD shield: pin 8
const int chipSelect = 4; 

// Create a file to store the data
File myFile;

// RTC
RTC_DS1307 rtc;

void setup() {
  //initializing the DHT sensor
  dht.begin();

  //initializing Serial monitor
  Serial.begin(9600);
  
  // setup for the RTC
  while(!Serial); // for Leonardo/Micro/Zero
    if(! rtc.begin()) {
      Serial.println("Couldn't find RTC");
      while (1);
    }
    else {
      // following line sets the RTC to the date & time this sketch was compiled
      rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    }
    if(! rtc.isrunning()) {
      Serial.println("RTC is NOT running!");
    }
    
  // setup for the SD card
  Serial.print("Initializing SD card...");

  if(!SD.begin(chipSelect)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
    
  //open file
  myFile=SD.open("MDATA.txt", FILE_WRITE);

  // if the file opened ok, write to it:
  if (myFile) {
    Serial.println("File opened ok");
    // print the headings for our data
    //myFile.println("Date,Time,Temperature ºC");
  }
  myFile.close();
}

void loggingTime() {
  DateTime now = rtc.now();
  myFile = SD.open("MDATA.txt", FILE_WRITE);
  if (myFile) {
    myFile.print(now.year(), DEC);
    myFile.print('/');
    myFile.print(now.month(), DEC);
    myFile.print('/');
    myFile.print(now.day(), DEC);
    myFile.print(',');
    myFile.print(now.hour(), DEC);
    myFile.print(':');
    myFile.print(now.minute(), DEC);
    myFile.print(':');
    myFile.print(now.second(), DEC);
    myFile.print(",");
  }
  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.print(" ");
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.print(" ");
  myFile.close();
  delay(1000);  
}

void loggingTemperature() {
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  // Read temperature as Celsius
  float t = dht.readTemperature();
  float h = dht.readHumidity();
  // Read temperature as Fahrenheit
  //float f = dht.readTemperature(true);
  
  // Check if any reads failed and exit early (to try again).
  if  (isnan(t) /*|| isnan(f)*/) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  
  //debugging purposes
  //Serial.print("Temperature: "); 
  Serial.print(t);
  Serial.print(" ");
  //Serial.print(" *C");
  //Serial.print("humidite: "); 
  Serial.print(h);
  Serial.println(" %");
  
  //Serial.print(f);
  //Serial.println(" *F\t"); 
  
  myFile = SD.open("MDATA.txt", FILE_WRITE);
  if (myFile) {
    Serial.println("OK");//OK
    myFile.print(t);
    myFile.print(",");
    myFile.print(h);
    myFile.println("%");
    //myFile.println(",");
  }
  myFile.close();
}

void loop() {
  loggingTime();
  loggingTemperature();
  delay(3600000);
}

Le hic est qu’il s’arrête aléatoirement… des fois à 2 semaines, des fois à 3. Je n’ai aucun message d’erreur m’indiquant la raison.

Pouvez vous m’aider à ce sujet?

Merci,D.

Vous êtes conscient que si vous fermez et rouvrez la console série ça reboot l’arduino ?

Capturez plus d’informations sur les problèmes potentiels d’écriture sur la carte SD (est-ce que le open fonctionne à tous les coups ?)

Si vous ne gardez pas le console ouverte et attachée à votre code pendant les 2/3 semaines, écrivez plutôt si possible les messages d’erreur sur la carte SD ou un code décrivant l’erreur en eeprom.

Êtes vous sûr de L’alimentation continue ?

Rien à ajouter de plus pour le code et le principe à ce qu'à écrit J-M-L.

Juste une remarque sur le choix des composants DHT11 et DS1307.

Surtout pour le moment tu ne changes rien tant que ton programme ne fonctionne pas parfaitement. Surtout pas de fuite en avant.

Quand le programme sera fonctionnel je te conseille de remplacer le DHT11 par un DHT22 et le DS1307 par un DS3231. Les composants que je te propose utilisent le même code et les mêmes bibliothèques. Le DHT22 donne des résultats bien plus précis sur une gamme de mesure plus étendue principalement sur l'humidité. Le DS3231 a une dérive insignifiante alors que le DS1307 devra être remis à l'heure régulièrement. C'est incompréhensible que dans les tuto et sites d'initiation on utilise encore ces deux références.

Le montage devant rester en place sur une longue période, je te conseille aussi de remplacer la probable carte UNO par une nano ou une pro-mini qui utilisent le même microcontrôleur. Avec ces cartes et une plaquette de circuit imprimé pastillé que l'on trouve facilement on peut souder les fils ce qui est plus sécurisant pour une installation autonome devant rester en place longtemps.

Si j'en parle maintenant c'est pour que tu ai le temps de te renseigner et d'approvisionner à petit prix (les composants Ebay ou Ali sont pas chers mais arrivent parfois en barque à rames). Termine le développement avec le matériel actuel et construit l'équipement définitif avec des composants neuf qui n'auront subit aucun des outrages qu'il est impossible d'éviter en phase de mise au point.

Ha mince... J M L, je ne savais pas non. Bon, je vais chercher un meilleure code ou lire les instructions pour éviter le reboot à chaque fois de l'Arduino. Dis siri... non je rigole.

Pour ce qui est du matériel même, j'y penserai aussi. Chaque chose en son temps, d'abord faire fonctionner correctement le bout d'code et ensuite le mato's.

Merci les gars!

Cf Un vieux document sur la désactivation du reboot automatique

Bonsoir,
Mon piochage et collage de différents me mène à ce code

#include <SPI.h> //for the SD card module
#include <SD.h> // for the SD card
#include <DHT.h> // for the DHT sensor
#include <DHT_U.h>
#include <RTClib.h> // for the RTC
#include <Adafruit_Sensor.h>

//define DHT pin
#define DHTPIN 2     // what pin we're connected to

// uncomment whatever type you're using
#define DHTTYPE DHT11   // DHT 11 
//#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// initialize DHT sensor for normal 16mhz Arduino
DHT dht(DHTPIN, DHTTYPE);

// change this to match your SD shield or module;
// Arduino Ethernet shield and modules: pin 4
// Data loggin SD shields and modules: pin 10
// Sparkfun SD shield: pin 8
const int chipSelect = 4; 

// Create a file to store the data
File myFile;

// RTC
RTC_DS1307 rtc;

void setup() {
  //initializing the DHT sensor
  dht.begin();

  //initializing Serial monitor
  Serial.begin(9600);
  
  // setup for the RTC
  while(!Serial); // for Leonardo/Micro/Zero
    if(! rtc.begin()) {
      Serial.println("Couldn't find RTC");
      while (1);
    }
    else {
      // following line sets the RTC to the date & time this sketch was compiled
      rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    }
    if(! rtc.isrunning()) {
      Serial.println("RTC is NOT running!");
    }
    
  // setup for the SD card
  Serial.print("Initializing SD card...");

  if(!SD.begin(chipSelect)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
    
  //open file
  myFile=SD.open("MDATA.txt", FILE_WRITE);

  // if the file opened ok, write to it:
  if (myFile) {
    Serial.println("File opened ok");
    // print the headings for our data
    //myFile.println("Date,Time,Temperature ºC");
  }
  myFile.close();
}

void loggingTime() {
  DateTime now = rtc.now();
  myFile = SD.open("MDATA.txt", FILE_WRITE);
  if (myFile) {
    myFile.print(now.year(), DEC);
    myFile.print('/');
    myFile.print(now.month(), DEC);
    myFile.print('/');
    myFile.print(now.day(), DEC);
    myFile.print(',');
    myFile.print(now.hour(), DEC);
    myFile.print(':');
    myFile.print(now.minute(), DEC);
    myFile.print(':');
    myFile.print(now.second(), DEC);
    myFile.print(",");
  }
  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.print(" ");
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  //Serial.print(':');
  //Serial.print(now.second(), DEC);
  //Serial.print(" ");
  myFile.close();
  //delay(1000);  
}

void loggingTemperature() {
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  // Read temperature as Celsius
  float t = dht.readTemperature();
  float h = dht.readHumidity();
  // Read temperature as Fahrenheit
  //float f = dht.readTemperature(true);
  
  // Check if any reads failed and exit early (to try again).
  if  (isnan(t) /*|| isnan(f)*/) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  
  //debugging purposes
  //Serial.print("Temperature: "); 
  Serial.print(t);
  Serial.print(" ");
  //Serial.print(" *C");
  //Serial.print("humidite: "); 
  Serial.print(h);
  Serial.println(" %");
  
  //Serial.print(f);
  //Serial.println(" *F\t"); 
  
  myFile = SD.open("MDATA.txt", FILE_WRITE);
  if (myFile) {
    Serial.println("OK");//OK
    myFile.print(t);
    myFile.print(",");
    myFile.print(h);
    myFile.println("%");
    //myFile.println(",");
  }
  myFile.close();
}

void loop() {
  loggingTime();
  loggingTemperature();
  delay(3600000);
}

je pense qu’il y a moyen de simplifier… mais quand je coupe les messages d’erreurs apparaissent. C’est peut-être anodin pour certains experts, mais je crois qu’il y a moyen de faire mieux. N’est-ce pas :-).

Pourriez-vous m’aider?

Merci,

D.

à chaque reboot de votre arduino vous allez remettre la date à la date de compilation du code avec cette ligne…    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));Autant c’est une option si vous compilez et téléchargez instantanément, autant lors d’un reboot de la carte 10 jours plus tard parce que vous ouvrez la console série, ça ne va pas être top…

Déplacez lesmyFile.close();à la fin du

if (myFile) {
  ...
  myFile.close(); // LE METTRE ICI
}

parce qu’on ne ferme pas un fichier qui n’a pas pu s’ouvrir.

Ne gardez pas les trucs commentés qui ne servent à rien

Pouvez vous rajouter une LED branchée sur une pin, par exemple la pin 3 avec sa résistance de limitation de courant
Pin 3 <—> R 220Ω <—> LED ANODE (LED) LED CATHODE <----> GND

const byte ledPin = 3; // Pin 3 <---> R 220Ω  <---> LED ANODE (LED) LED CATHODE <----> GND

void setup() {
  pinMode(ledPin, OUTPUT); // LED témoin d'activité
...

et modifiez la loop de la façon suivante pour qu’il n’y ait plus délai

void loop() {
  static uint32_t logChrono = (uint32_t) - 3600001;
  if (millis() - logChrono >= 3600000ul) {
    loggingTime();
    loggingTemperature();
    logChrono = millis();
  }

  static uint32_t blinkChrono;
  if (millis() - blinkChrono >= 1000ul) {
    digitalWrite(ledPin, digitalRead(ledPin) == LOW ? HIGH : LOW);
    blinkChrono = millis();
  }
}

votre LED va ainsi clignoter, ce qui vous permettra de voir si votre Arduino est plantée où s’il tourne.

J-M-L: à chaque reboot de votre arduino vous allez remettre la date à la date de compilation du code avec cette ligne...

    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

Oui, il faut supprimer cette ligne. Pour ma part, j'ai fait un petit sketch qui ne contient (quasiment) que cette ligne (dans setup() ) Pour mettre à l'heure ma RTC, je le compile et le téléverse dans la foulée. Ensuite la RTC reste à l'heure (tant que sa pile vit)

Bonsoir et merci pour votre aide!

Je recommence l e post, car je ne sais pour quelle raison un partie a été supprimée (entre-autre ma formule de politesse)

Donc

Voici le résultat:

#include <SPI.h>
#include <SD.h> 
#include <DHT.h>
#include <DHT_U.h>
#include <RTClib.h> 
#include <Adafruit_Sensor.h>
#define DHTPIN 2    


#define DHTTYPE DHT11   // DHT 11 
//#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

DHT dht(DHTPIN, DHTTYPE);
const int chipSelect = 4; 
const byte ledPin = 3; // Pin 3 <---> R 220Ω  <---> LED ANODE (LED) LED CATHODE <----> GND
File myFile;
RTC_DS1307 rtc;

void setup() {
dht.begin();
pinMode(ledPin, OUTPUT); 
  Serial.begin(9600);
  while(!Serial); 
    if(! rtc.begin()) {
      Serial.println("Couldn't find RTC");
      while (1);
    }
    else if(! rtc.isrunning()) {
      Serial.println("RTC is NOT running!");
    }
  Serial.print("Initializing SD card...");
  if(!SD.begin(chipSelect)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  myFile=SD.open("MDATA.txt", FILE_WRITE);
  if (myFile) {
    Serial.println("File opened ok");
  }
}

void loggingTime() {
  DateTime now = rtc.now();
  myFile = SD.open("MDATA.txt", FILE_WRITE);
  if (myFile) {
    myFile.print(now.year(), DEC);
    myFile.print('/');
    myFile.print(now.month(), DEC);
    myFile.print('/');
    myFile.print(now.day(), DEC);
    myFile.print(',');
    myFile.print(now.hour(), DEC);
    myFile.print(':');
    myFile.print(now.minute(), DEC);
    myFile.print(':');
    myFile.print(now.second(), DEC);
    myFile.print(",");
  }
  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.print(" ");
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
}

void loggingTemperature() {
  float t = dht.readTemperature();
  float h = dht.readHumidity();
  if  (isnan(t) /*|| isnan(f)*/) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  Serial.print(t);
  Serial.print(" ");
  Serial.print(h);
  Serial.println(" %");
  myFile = SD.open("MDATA.txt", FILE_WRITE);
  if (myFile) {
    Serial.println("OK");//OK
    myFile.print(t);
    myFile.print(",");
    myFile.print(h);
    myFile.println("%");
    //myFile.println(",");
  }
  myFile.close();
}

void loop() {
static uint32_t logChrono = (uint32_t) - 3600001;
  if (millis() - logChrono >= 3600000ul) {
    loggingTime();
    loggingTemperature();
    logChrono = millis();
  }

  static uint32_t blinkChrono;
  if (millis() - blinkChrono >= 1000ul) {
    digitalWrite(ledPin, digitalRead(ledPin) == LOW ? HIGH : LOW);
    blinkChrono = millis();
  }

}
void setup() {
dht.begin();
pinMode(ledPin, OUTPUT); 
  Serial.begin(9600);
  while(!Serial); 
    if(! rtc.begin()) {
      Serial.println("Couldn't find RTC");
      while (1);
    }
    //else {
      // following line sets the RTC to the date & time this sketch was compiled
      //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    //}
    if(! rtc.isrunning()) {
      Serial.println("RTC is NOT running!");
    }
  Serial.print("Initializing SD card...");
  if(!SD.begin(chipSelect)) {
    Serial.println("initialization failed!");
    return;

est ce que je peux mettre ça:

void setup() {
dht.begin();
pinMode(ledPin, OUTPUT); 
  Serial.begin(9600);
  while(!Serial); 
    if(! rtc.begin()) {
      Serial.println("Couldn't find RTC");
      while (1);
    }
    else if(! rtc.isrunning()) {
      Serial.println("RTC is NOT running!");
    }
  Serial.print("Initializing SD card...");
  if(!SD.begin(chipSelect)) {
    Serial.println("initialization failed!");
    return;

et est ce que je peux écrire ça, si je veux que la led ne se mette en high qu'une fraction de seconde et éteinte plus longtemps?

oid loop() {
static uint32_t logChrono = (uint32_t) - 3600001;
  if (millis() - logChrono >= 3600000ul) {
    loggingTime();
    loggingTemperature();
    logChrono = millis();
  }

    static uint32_t blinkChrono;
  if  (millis() - blinkChrono >= 1000ul) {
    //digitalWrite(ledPin, digitalRead(ledPin) == LOW ? HIGH : LOW);
    digitalWrite(ledPin, HIGH);
    delay(1000);
    digitalWrite(ledPin, LOW);
    delay(5000);
    blinkChrono = millis();
  }

}

neo1828: et est ce que je peux écrire ça, si je veux que la led ne se mette en high qu'une fraction de seconde et éteinte plus longtemps?

...
    delay(1000);
...
    delay(5000);
...

si vous mettez des delay vous bloquez la loop 6 secondes... pas génial... Il faut utiliser la technique de millis mais tester une fois avec 1s et une fois avec 5s en fonction de l’état de la LED

Sinon vous avez toujours les myFile.close(); en dehors du if

Ainsi?

Déso j'essaye hein... mais je suis pas du tout convaincu de ma réponse :)

  static uint32_t blinkChrono;
  if  (millis() - blinkChrono >= 1000ul) {
  //digitalWrite(ledPin, digitalRead(ledPin) == LOW ? HIGH : LOW);
  digitalWrite(ledPin,HIGH);
  else if  (millis() - blinkChrono >= 5000ul) {
  digitalWrite(ledPin, LOW);
  blinkChrono = millis();
  }

non... essayez de faire tourner votre truc à la main.. si la différence est plus grande que 1000 vous rentrez dans le premier if et donc vous ne testerez jamais le second if. de plus le test doit se faire en fonction de l'état de la LED.

essayez un truc de ce genre (tapé ici)

  static uint32_t blinkChrono;
  static bool ledOn = false;
  if (millis() - blinkChrono >= (ledOn ? 1000ul : 5000ul)) { // on teste avec 1s ou 5s en fonction de l'état de la LED
    if (ledOn) digitalWrite(ledPin, LOW);
    else digitalWrite(ledPin, HIGH);
    ledOn = !ledOn; // on note qu'on a inversé l'état de la LED
    blinkChrono = millis();
  }

Salut,

mon dernier post n’est apparemment pas passé… je retente le postage :slight_smile:

pour que ça puisse service à d’autres, voici donc le code terminé. Merci à vous pour votre aide.

#include <SPI.h>
#include <SD.h> 
#include <DHT.h>
#include <DHT_U.h>
#include <RTClib.h> 
#include <Adafruit_Sensor.h>
#define DHTPIN 2    


#define DHTTYPE DHT11   // DHT 11 
//#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

DHT dht(DHTPIN, DHTTYPE);
const int chipSelect = 4; 
const byte ledPin = 3; // Pin 3 <---> R 220Ω  <---> LED ANODE (LED) LED CATHODE <----> GND
File myFile;
RTC_DS1307 rtc;

void setup() {
dht.begin();
pinMode(ledPin, OUTPUT); 
  Serial.begin(9600);
  while(!Serial); 
    if(! rtc.begin()) {
      Serial.println("Couldn't find RTC");
      while (1);
    }
    else if(! rtc.isrunning()) {
      Serial.println("RTC is NOT running!");
    }
  Serial.print("Initializing SD card...");
  if(!SD.begin(chipSelect)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  myFile=SD.open("MDATA.txt", FILE_WRITE);
  if (myFile) {
    Serial.println("File opened ok");
  }
}

void loggingTime() {
  DateTime now = rtc.now();
  myFile = SD.open("MDATA.txt", FILE_WRITE);
  if (myFile) {
    myFile.print(now.year(), DEC);
    myFile.print('/');
    myFile.print(now.month(), DEC);
    myFile.print('/');
    myFile.print(now.day(), DEC);
    myFile.print(',');
    myFile.print(now.hour(), DEC);
    myFile.print(':');
    myFile.print(now.minute(), DEC);
    myFile.print(':');
    myFile.print(now.second(), DEC);
    myFile.print(",");
  }
  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.print(" ");
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
}

void loggingTemperature() {
  float t = dht.readTemperature();
  float h = dht.readHumidity();
  if  (isnan(t) /*|| isnan(f)*/) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  Serial.print(t);
  Serial.print(" ");
  Serial.print(h);
  Serial.println(" %");
  myFile = SD.open("MDATA.txt", FILE_WRITE);
  if (myFile) {
    Serial.println("OK");//OK
    myFile.print(t);
    myFile.print(",");
    myFile.print(h);
    myFile.println("%");
    //myFile.println(",");
  }
}

void loop() {
static uint32_t logChrono = (uint32_t) - 3600001;
  if (millis() - logChrono >= 3600000ul) {
    loggingTime();
    loggingTemperature();
    logChrono = millis();
  }
  static uint32_t blinkChrono;
  static bool ledOn = false;
  if (millis() - blinkChrono >= (ledOn ? 100ul : 10000ul)) { 
    if (ledOn) digitalWrite(ledPin, LOW);
    else digitalWrite(ledPin, HIGH);
    ledOn = !ledOn; 
    blinkChrono = millis();
  }

}