/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
**** PROGRAMME de MESURE du TEMPS de MARCHE ******
avec mémorisation en EEPROM
a la mise sous tension rappel du temps précédent sauvegardé en EEPROM
lors de l'arret du signal Marche sauvegarde du temps actuel en EEPROM
au retour du signal Marche rechargement valeur sauvegardé etc ......
version mesure du temps par interruption
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
// Include necessary libraries
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
// Définir un objet (lcd1) de type LiquidCrystal_I2C
LiquidCrystal_I2C lcd1 (0x27, 16, 2); // adresse I2C du LCD1 : 0x27 sur 2 lignes de 16 chars
// Define pin for switch
#define SWITCH_PIN 2
bool memSWITCH ; // memoire etat precedent SWITCH
// Define variables for time
int Milliseconde = 0;
int Seconde = 0;
int Minute = 0;
int Heure = 0;
char str[20]; // chaine de 20 caractères pour affichage Temps
// Define variable for storing EEPROM address
int address = 0;
void setup() {
// Initialize serial communication
Serial.begin(9600);
// Set switch pin as input
pinMode(SWITCH_PIN, INPUT); // ! faire un pulldown materiel pour implantation réelle
memSWITCH = LOW; // reset memoire pour front montant
lcd1.init(); // Initialiser l'écran LCD
lcd1.backlight(); // Allumer l'éclairage de l'écran
lcd1.clear(); // Effacer le LCD
lcd1.setCursor(0, 0); // Placer le curseur à la position caractère, ligne
lcd1.print("Temps de Marche"); // Afficher un msg
// Rechargement valeur temps sauvegardées en EEPROM
Heure = EEPROM.read(address);
Minute = EEPROM.read(address + 1);
// ======================================
// Pour une implantation réelle
// d'abord initialisez une fois l'EPROM a 0h 0mn dans le setup d'un autre programme
// avant de charger le code de ce programme
// sinon l'EPROM est remplie de 255 par défaut
// #include <EEPROM.h>
// int zero=0;
// EEPROM.write(address, zero);
// EEPROM.write(address + 1, zero);
// ======================================
// 4 lignes programme suivantes pour simulaton seulement ++++++++++++++++
// !!!! a supprimer pour implantation réelle !!!
Heure = 0 ;
Minute = 0 ;
EEPROM.write(address, Heure);
EEPROM.write(address + 1, Minute);
// fin de pour simulaton seulement ++++++++++++++++++++++++++++++++++++++
// ===========Init Interruption ============================
TCCR1A = 0; // set entire TCCR1A register to 0 //set timer1 interrupt at 1kHz // 1 ms
TCCR1B = 0; // same for TCCR1B
TCNT1 = 0; // set timer count for 1khz increments
OCR1A = 1999; // = (16*10^6) / (1000*8) - 1
//had to use 16 bit timer1 for this bc 1999>255, but could switch to timers 0 or 2 with larger prescaler
// turn on CTC mode
TCCR1B |= (1 << WGM12); // Set CS11 bit for 8 prescaler
TCCR1B |= (1 << CS11); // enable timer compare interrupt
TIMSK1 |= (1 << OCIE1A);
// ==========================================================
}
void loop() {
// ===============AFFICHAGE TEMPS =============================
sprintf(str, "%2u h %2u mn ", Heure, Minute); // use sprintf() to compose the string str
lcd1.setCursor(3, 1); // Placer le curseur à la position caractère, ligne
lcd1.print(str); //affiche Temps (str) sur LCD
// =============================================================
// Si Front montant sur SWITCH alors rechargement valeur sauvegardé en EEPROM
if (digitalRead(SWITCH_PIN) == HIGH & memSWITCH == LOW) {
Heure = EEPROM.read(address);
Minute = EEPROM.read(address + 1);
}
// If SWITCH is closed ( = en marche)
if (digitalRead(SWITCH_PIN) == HIGH ) {
Serial.print("Temps de marche: ");
Serial.print(Heure);
Serial.print(" h ");
Serial.print(Minute);
Serial.println(" mn");
}
// If SWITCH is open ( = pas en marche)
if (digitalRead(SWITCH_PIN) == LOW) {
//Save current time to EEPROM
EEPROM.write(address, Heure);
EEPROM.write(address + 1, Minute);
}
memSWITCH = digitalRead(SWITCH_PIN) ; //mise a jour mémoire SWITCH
}
// ===== Routine d'interruption =====
ISR(TIMER1_COMPA_vect) {
if (digitalRead(SWITCH_PIN) == HIGH) {
Milliseconde = Milliseconde + 1;
}
if (Milliseconde > 999) {
Milliseconde = 0; Seconde = Seconde + 1;
if (Seconde > 59) {
Seconde = 0;
Minute = Minute + 1;
}
if (Minute > 59) {
Minute = 0;
Heure = Heure + 1;
}
}
}
// ===================================