Enregistrement d'un horaire en fonction d'une température

Bonjour la communauté ,

En utilisant le module DS 3231 RTC et un module de mesure de température, je voudrais enregistrer l’heure à laquelle la température est comprise entre 20 et 30 ° c dans la journée.

Je ne sais pas comment faire pour prendre l’heure du module, des idées ?

Merci à vous

As tu regardé les exemples fournis avec avec les différentes librairies pour le DS3231 ?

Avant de prendre l'heure, il faut la régler.

Comme tu ne précise pas ton niveau, tu peux voir un exemple donné par le simulateur wokwi
Si cela te parait trop compliqué, n'hésite pas à poser des questions.

1 Like

la question manque de précisions :
quelle carte arduino ? quel module de temperature ?
enregistrer sur quel support ? eeprom interne, externe, sd,
ce sont LES heures:min:sec auxquelles la temp >20<30 que faire si temp est 19 puis repasse a 20 plusieurs fois par jour, et si temp est 31 ?

exemple didactique :

#include <RTClib.h>
RTC_DS3231 rtc;
int temp;
void setup () {
  Serial.begin(57600);
}
void loop() {
if ( temp>=20 && temp <31  )  {
 DateTime now = rtc.now();

 Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
                                        }
}

c'est juste pour récupérer l'heure, la mesure de la temperature n'est pas implantée

1 Like

Merci de mettre le code entre balise en utilisant l'icône <CODE/>

J'ai déjà installé et réglé la librairie " RTClib.h ".
J'utilise un arduino uno R3.
Module DHT11 pour la T° c.
J'enregistre les données sur un microSD card adapter.

Les T° que je vise en réalité sont entre 22 et 28 ° c, 20 ° c a 30 ° c c'est justement pour pallier au fluctuation de T° c .
C'est un projet que je me lance pour mieux appréhender et interagir avec les modules DS 3231 RTC et micro sd card adapter.

Du coup ton problème se pose sur quoi exactement.

Tu n'a pas trouver dans les exemples de la librairie ou l'exemple wokwi que j'ai donné, qu'il fallait utiliser la fonction "now"?
Ou tu as un problème plus complexe ?

1 Like

Merci pour les infos terwal , ça mal bien aidé.

Pour le moment j'essai de faire la communication entre le dht 11 et le micro sd card mais je n'arrive pas à faire remonter la température.

Je vous copy le code :

#include <SPI.h> //for the SD card module, ok
#include <SD.h> // for the SD card, ok
#include <DHT.h>
#define Type DHT11

int sensePin =2;
DHT HT (sensePin,Type);
float humidity;
float tempC;
int dt = 5000;

const int chipSelect = 10; // pin de la carte SD pour enregistrer les infos

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

int Vresistor = A0; // Potentiometer is connected with the Analog pin A0
int Vrdata; // A variable used to store the Potentiometer value

void setup() {
  //initializing Serial monitor
  Serial.begin(9600); // Baud rate
  HT.begin ();
  delay (dt);

    
  // setup for the SD card, toujours ainsi
  Serial.print("Initializing SD card...");

  
  if(!SD.begin(chipSelect)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
    
  //open file
  myFile=SD.open("DATA.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("Logging Variable sensePin Values");
  }

  myFile.close();
}



void LoggingsensePin() {
 
  tempC = digitalRead(sensePin); // sensePin
  Serial.println(tempC); // print it on the Serial monitor for debugging purposes. You can Commnent this line.
  myFile = SD.open("DATA.txt", FILE_WRITE); // opens the fils DATA, which is the text file, for writing the Pot value.
  if (myFile) {
    
    myFile.print("Mesure température : ");
    myFile.print(",");
    myFile.print(tempC);
    myFile.println();
  }
  myFile.close();
}

void loop() {
  
  LoggingsensePin();
  delay(dt);
  
 humidity=HT.readHumidity();
  tempC=HT.readTemperature();
 

  Serial.print ("Humidity: ");
  Serial.print (humidity);
  Serial.print (" Temperature  ");
  Serial.print (tempC);
  Serial.print (" C ");
  delay (dt);
 

  
}

Je sèche complet :slight_smile:

C'est à dire, rien se s'affiche sur le moniteur série ?

Les valeurs s'Affiche sur le moniteur série mais j'ai rien lorsque je lis la carte sd sur l'ordinateur.

ok, c'est donc que SD.open("DATA.txt") n'arrive pas à écrire dans ton fichier
Tu n'a même pas "File opened ok" ?



voila ce que j'ai.

Les valeurs s'affiche sur mon moniteur série mais rien sur la carte sd.

Il y a plusieurs "Logging Variable sensePin Values", est-tu sûre que le dernier correspond à la dernière exécution de ton programme ?
surtout que sur ton moniteur on voit uniquement deux affichages des données, alors qu'il y en a plein dans ton fichier.

Quel est la taille de ton fichier ?
Pourquoi dans ton fichier tu n'a pas systématiquement un retour chariot ?
Peut tu effacer ton fichier et faire un test avec deux prise de température ?

Bonjour mememto

image
Ton programme écris très bien la température mesurée, sur la carte SD, tu lis un port digital, certainement "en l'air" et qui donne toujours 1, le coupable est ici :wink:
tempC = digitalRead(sensePin); // sensePin

J'ai attribué une valeur bidon à tempC soit 34.12 et ça donne:

Logging Variable sensePin Values
Mesure temp?rature : ,34.12
Mesure temp?rature : ,34.12
Mesure temp?rature : ,34.12
Mesure temp?rature : ,34.12
Mesure temp?rature : ,34.12
Mesure temp?rature : ,34.12

Cordialement
jpbbricole

Je ne suis pas sûr le moniteur série ne correspond pas au fichier.
Je suppose que c'est d'ancien enregistrement.

Pour répondre à tes question terwal :
oui je suis certain que cela corresponds a la dernière exécution de mon programme.

Mon fichier utilise 14506 octets (44%) de l'espace de stockage.

Je ne savais pas ce qu'était un "retour chariot" avant que tu m'en parle, c'est pour ça que je ne l'ai pas utilisé.

J'ai pourtant bien assigné le dht 11 (int sensePin) au port digital 2. J'ai aussi créer la variable tempC qui prendra la valeur lu par un digitalRead du sensePin.

Ensuite j'importe (myFile.print(tempC):wink: la valeur lu par l'arduino sur le fichier "DATA" qui est au préalable ouvert par un "myFile=SD.open("DATA.txt", FILE_WRITE);"

ça me semble correct.

Je ne sais pas comment appliquer ce que tu m'a dit #jpbbricole

Bonjour mememto

Oui, ça c'est juste :wink:
Pour l'affichage dans le moniteur, c'est juste, aussi:
tempC=HT.readTemperature();

Pour l'écriture sur la carte SD, un peu moins :woozy_face:
tempC = digitalRead(sensePin); // sensePin
En faisant ça, le résultat ne peut être que 0 ou 1.

A+
Cordialement
jpbbricole

Punaise ça marche enfin !!!

Voici mon erreur :
Je pensais pouvoir utiliser la variable "tempC" pour écrire la température dans le fichier DATA mais c'est faux. Cela marche uniquement pour le "Serial.print du moniteur série.

La valeur température se cache derrière HT.readTemperature() !

Donc avec myFile.print (HT.readTemperature()) ça fonctionne.

Merci, vous m'avez aidé !

Non ce n'est pas faux, comme te l'a indiqué @jpbbricole si tu fait tempC = DigitalRead, tempC ne peut avoir que la valeur 0 ou 1.

si tu n'avait pas fait tempc = digitalRead, ta variable aurait eut la valeur que tu lui avait affecté avec "tempC=HT.readTemperature();"

Du coup je n'ai pas regardé en détaille ton programme, comment cela ce fait-il que dans le moniteur série tu ais que deux lignes de température, pour une trentaine de "Mesure température"?

Je me suis planté au début dans l'affichage du moniteur série, j'ai pas fait de Serial.println.

 // write timestamp
    DateTime now = rtc.now();
    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);


J'ai trouvé ce genre de code avec la formule "now" dont tu parlait terwal.
Je vais l'adapter a mon projet