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