/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
**** 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 avec millis
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
// Librairies
#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
int inputPin = 2; // borne entrée (borne W ! 14V AC)
int currInput = 0; // Mem état courant entrée
int prevInput = 0; // Mem état precedent entrée
int outputPin = 13; // borne sortie
bool memory = 0; // Mémoire Marche
bool auxMemory; // Mémoire auxiliaire Marche (Front Montant)
// Define variables for Temporisation
unsigned long prevTime = 0; // Define previous time
unsigned long currTime = 0; // Define current time
unsigned long Tempo = 1000; // Define Temporisation value
// Define variables for time measure
int Seconde = 0;
int Minute = 0;
int Heure = 0;
unsigned long previousMillis = 0;
unsigned long currentMillis;
const long interval = 1000; // Update time every 1 second
char str[20]; // chaine de 20 caractères pour affichage Temps
int address = 0; // Define variable for storing EEPROM address
void setup() {
Serial.begin(9600); // Initialize serial communication
pinMode(inputPin, INPUT); // ! faire un pulldown materiel pour implantation réelle
pinMode(outputPin, OUTPUT); // pour Test
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 le msg sur LCD
// Rechargement valeur temps sauvegardées en EEPROM au reset de la carte
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 = 1 ;
Minute = 25 ;
EEPROM.write(address, Heure);
EEPROM.write(address + 1, Minute);
// fin de pour simulaton seulement ++++++++++++++++++++++++++++++++++++++
}
void loop() {
currInput = digitalRead(inputPin); // Read current input state
currTime = millis(); // Update current time
if (prevInput == 0 && currInput == 1) { // Check if input has changed from 0 to 1
memory = 1; // Set memory to 1
digitalWrite(outputPin, HIGH); // Set output to 1
prevTime = currTime; // Update previous time
}
if (currTime - prevTime >= Tempo && currInput == 0) { // Check if Temporisation has passed
memory = 0; // Set memory to 0
digitalWrite(outputPin, LOW); // Set output to 0
}
// oooooooooooooooooooooooooooooooooooooooooooooooooooooo
// Si Front montant sur memory alors rechargement valeur sauvegardé en EEPROM
if (memory == HIGH & auxMemory == LOW) {
Heure = EEPROM.read(address);
Minute = EEPROM.read(address + 1);
}
currentMillis = millis();
if (currentMillis - previousMillis >= interval) { // chaque seconde
previousMillis = currentMillis; // mise a jour temps courant
updateClock(); // appel fonction calcul temps
}
// If Memory is high ( = en marche)
if (memory == HIGH ) {
Serial.print("Temps de marche: ");
Serial.print(Heure);
Serial.print(" h ");
Serial.print(Minute);
Serial.println(" mn");
}
// If memory is low ( = pas en marche)
if (memory == LOW) {
//Save current time to EEPROM
EEPROM.write(address, Heure);
EEPROM.write(address + 1, Minute);
}
// =============== AFFICHAGE TEMPS LCD ========================
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
// =============================================================
prevInput = currInput; // Update previous input state
auxMemory = memory ; //mise a jour mémoire et auxmemoire
}
// ===== Routine mesure temps =====
void updateClock() {
if (memory == HIGH) {
Seconde = Seconde + 1;
if (Seconde > 59) {
Seconde = 0;
Minute = Minute + 1;
}
if (Minute > 59) {
Minute = 0;
Heure = Heure + 1;
}
}
}
// ===================================ON
OFF