datalogger SD : choisir intervalles de mesures ?

Bonjour,

suite datalogger mesure temperature avec 2 ds18b20 avec un shield sdcard+ds1307 sur UNOr3
j'ai ajouté un bouton pour choisir intervalle de mesures parmi 3 : 5, 20, 60 minutes
avec allumage de led correspondant
la lecture de l'etat du bouton se fait par interruption
pour le test j'ai utilisé des delais mesures tres courts 10, 20 et 40 secondes
je voulais avoir votre avis sur le code qui est un mix de trucs trouvés sur le net
surtout la partie bouton et choix du delai

/* 
basé sur http://electroniqueamateur.blogspot.com/2016/10/utilisation-du-data-logging-shield.html
    flash 56% sram 64%
*/
#include <OneWire.h>        // pour le ds18b20
#include <SD.h>             // pour le lecteur de carte SD
#include <Wire.h>   
#include "RTClib.h"         // rtc adafruit V
#include <DallasTemperature.h>
#include <SPI.h>  // pins 10 11 12 13 

#define error_led 5
#define led_5M 6  //(delai mesure = 300) // 5 minutes cas particulier
#define led_20M 7  //(delai mesure = 1200)// 20 min
#define led_60M 8  //(delai mesure = 3600)  // 1h
#define button_pin 2 // pin poussoir autre pin a gnd interruption0
// antirebond defini en software ou un 100nf en parrallele sur le bouton ?
volatile int but_count; // compteur nombre d'appuis utilisé dans ISR

#define ONE_WIRE_BUS_PIN 3 // The pin that we are using for sensors

// Nombre de secondes entres chaque prise de mesure
//int DELAI_MESURES =20; // pour test
int DELAI_MESURES =1200;  // valeur par defaut qui sera changee par l'appui sur bp
//  si panne d'alimentation le delai entre mesures reviendra a defaut
//  il faudrait enregistrer en eeprom la valeur chosie avec une initialisation qui irait rechercher
// la derniere valeur enregistree delai mesures apres avoir détecté une panne de courant

RTC_DS1307 RTC; // objet Real Time Clock
DateTime now;
long tempsInitial = 0; // nombre de secondes entre le 1 jan 2000 et le début du script
long derniereMesure = 0; // moment de la plus récente prise de mesure

const int chipSelect = 10;  // chipSelect de la carte SD pin 10
File Logfile;  //fichier 

OneWire oneWire(ONE_WIRE_BUS_PIN);     // Setup oneWire
DallasTemperature sensors(&oneWire);   //  oneWire to Dallas Temperature.

DeviceAddress Probe01 = { 0x28, 0xAA, 0xCD, 0x79, 0x40, 0x14, 0x01, 0xC0 }; //salon
DeviceAddress Probe02 = { 0x28, 0xAA, 0x51, 0x56, 0x40, 0x14, 0x01, 0xBC }; //etage

void setup()

{
      //Serial.begin(9600);
     pinMode(error_led , OUTPUT);
     pinMode(led_5M , OUTPUT);
     pinMode(led_20M , OUTPUT);
     pinMode(led_60M , OUTPUT);
     pinMode(button_pin , INPUT_PULLUP);
     
    digitalWrite(error_led,LOW);   // leds éteintes au setup
    digitalWrite(led_5M,LOW);
    digitalWrite(led_20M,LOW);  
    digitalWrite(led_60M,LOW);
    
    //Serial.println();
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    //Serial.println("echec de l'initialisation de la carte SD");
    digitalWrite(error_led,HIGH); // allume led si defaut ou pas de carte
    return;
                             }
    //Serial.println("Initialisation de la carte SD reussie."); // 
      
  // initialisation de l'horloge temps réel (RTC)
  Wire.begin(); 
  RTC.begin();
  sensors.begin();    
  // set the resolution to 9 bit (Can be 9 to 12 bits .. lower is faster)
  sensors.setResolution(Probe01, 9);
  sensors.setResolution(Probe02, 9);
  now = RTC.now();
  tempsInitial =  now.unixtime();
  derniereMesure = now.unixtime()-DELAI_MESURES;
Logfile=SD.open("dtatemp.txt",FILE_WRITE); //en txt pour conversion point decimal temp en virgule dans excel
Logfile.println();
Logfile.println(" Date/Time; SALON; ETAGE");    //Print headers(not saved yet)
Logfile.close();                               //Print saved

     but_count=0;
  // création d'une interruption sur l'entrée button
  attachInterrupt(digitalPinToInterrupt(button_pin), setInterval, RISING);
  // button en pullup passe a LOW en appui et retourne HIGH quand on relache
  //  donc RISING  front MONTANT
  // PAS  d' antirebonb ? 
  digitalWrite(led_20M,HIGH);  // vu que la valeur par defaut est 1200 on allume la led 20 minutes   
      } // end setup


//--fonction lect Temp Variable------------//
void printTemperature(DeviceAddress deviceAddress)
{
   float tempC = sensors.getTempC(deviceAddress);
   Logfile.print(tempC, 1);  // 1 decimale
   //Logfile.print(" C"); // inutile dans excel
   Logfile.print(" ");
}

 void setInterval()   // fonction ISR
{
  but_count++;
  if (but_count>2) 
    but_count = 0;
 
switch (but_count) {
            case 0:
                digitalWrite(led_5M, HIGH);
                digitalWrite(led_20M, LOW);
                digitalWrite(led_60M, LOW);
                DELAI_MESURES=300;
                //DELAI_MESURES=10;// test
                break;
            case 1:
                 digitalWrite(led_5M, LOW);
                digitalWrite(led_20M, HIGH);
                digitalWrite(led_60M, LOW);
                DELAI_MESURES=1200;
                //DELAI_MESURES=20;// test
                break;
            case 2:
                digitalWrite(led_5M, LOW);
                digitalWrite(led_20M, LOW);
                digitalWrite(led_60M, HIGH);
                DELAI_MESURES=3600;
                //DELAI_MESURES=40;// test
                break;
                      } 
                   }  // end isr

void loop()
{

  // on mesure les données pertinentes
   DateTime now = RTC.now();        // Clock call
  now = RTC.now();  // quelle heure est-il?
  
  if ((now.unixtime()-derniereMesure)< DELAI_MESURES) 
  return; // on retourne où ?
  
  derniereMesure = now.unixtime();

  // Écriture du fichier
  Logfile=SD.open("dtatemp.txt",FILE_WRITE);
  //Logfile.print(now.unixtime()-tempsInitial); // 
  
  Logfile.println();  
  if (now.day() < 10) Logfile.print("0");      // date
  Logfile.print(now.day(), DEC);
  Logfile.print("/");
  if (now.month() < 10) Logfile.print("0");
  Logfile.print(now.month(), DEC);
  Logfile.print("/");
  Logfile.print(now.year(), DEC);
  Logfile.print("; ");  //separateur excel
  
  if (now.hour() < 10) Logfile.print("0");      // heure
  Logfile.print(now.hour(), DEC);
  Logfile.print(":");
  if (now.minute() < 10) Logfile.print("0");
  Logfile.print(now.minute(), DEC);
  Logfile.print(":");
 /* if (now.second() < 10) Logfile.print("0");
  Logfile.print(now.second(), DEC);  // nul besoin d'enregistrer les secondes
        //sauf si delai mesures inferieur a la minute pour le test par exemple    
  Logfile.print(";  ");
  */
  
  sensors.requestTemperatures();    
  printTemperature(Probe01);      // temp salon
  Logfile.print("; "); 
  printTemperature(Probe02); // temp etage

  Logfile.close();  // sauvegarde sd

    }   //endloop

je ne change pas l'intervalle de mesure toutes les 5 minutes, c'est quand je l'utilise pour des mesures dans des environnements différents
le seul truc qui m'embete c'est quand il n'est plus alimenté cause panne secteur, ce qui arrive un peu trop souvent à mon goût, il redémarrera avec la valeur que j'ai mis par défaut

merci

fichier txt de test "rapide" : j'ai mis un interligne aux endroits où j'ai appuyé sur le bouton pour changer l'intervalle, le delai mesure s'emmele un peu pour des intervalles inférieures a la minute c'est un peu normal changement à la volée...

Date/Time; SALON; ETAGE

19/01/2021; 16:49:15; 22.0 ; 21.0
19/01/2021; 16:49:35; 22.0 ; 21.0
19/01/2021; 16:49:55; 22.0 ; 21.0
19/01/2021; 16:50:15; 22.0 ; 21.0
19/01/2021; 16:50:35; 22.0 ; 21.0
19/01/2021; 16:50:55; 22.0 ; 21.0
19/01/2021; 16:51:15; 22.0 ; 21.0

19/01/2021; 16:51:29; 22.0 ; 21.0
19/01/2021; 16:52:09; 22.0 ; 21.0

19/01/2021; 16:52:38; 22.0 ; 21.0
19/01/2021; 16:52:48; 22.0 ; 21.0
19/01/2021; 16:52:58; 22.0 ; 21.0
19/01/2021; 16:53:08; 22.0 ; 21.0
19/01/2021; 16:53:18; 22.0 ; 21.0
19/01/2021; 16:53:28; 22.0 ; 21.0
19/01/2021; 16:53:38; 22.0 ; 21.0
19/01/2021; 16:53:48; 22.0 ; 21.0
19/01/2021; 16:54:08; 22.0 ; 21.0
19/01/2021; 16:54:28; 22.0 ; 21.0
19/01/2021; 16:54:48; 22.0 ; 21.0
19/01/2021; 16:55:08; 22.0 ; 20.5
19/01/2021; 16:55:28; 22.0 ; 21.0
19/01/2021; 16:55:48; 22.0 ; 20.5
19/01/2021; 16:56:08; 22.0 ; 21.0
19/01/2021; 16:56:28; 22.0 ; 21.0
19/01/2021; 16:56:48; 22.0 ; 21.0
19/01/2021; 16:57:08; 22.0 ; 20.5
19/01/2021; 16:57:28; 22.0 ; 20.5
19/01/2021; 16:57:48; 22.0 ; 21.0
19/01/2021; 16:58:08; 22.0 ; 21.0
19/01/2021; 16:58:28; 22.0 ; 21.0
19/01/2021; 16:58:48; 22.0 ; 21.0
19/01/2021; 16:59:08; 22.0 ; 21.0
19/01/2021; 16:59:28; 22.0 ; 21.0
19/01/2021; 16:59:48; 22.0 ; 21.0
19/01/2021; 17:00:28; 22.0 ; 21.0
on passe de 20 sec a 40
19/01/2021; 17:01:08; 22.0 ; 20.5
19/01/2021; 17:01:48; 22.0 ; 20.5
19/01/2021; 17:02:28; 22.0 ; 20.5
19/01/2021; 17:03:08; 22.0 ; 20.5
19/01/2021; 17:03:48; 22.0 ; 20.5

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.