Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* ================================================================================================== */
- // KRONOS 1.1
- // Ollivier JULLIEN août 2020
- // 100% libre de droit
- // (en cas de copie, merci de citer l'auteur... il a travaillé dur pour vous le donner ;) )
- // Merci à Serge DUCATEZ
- /* ================================================================================================== */
- // à voir => chaînes formatées
- /* ================================================================================================== */
- // Calendrier / Pendule / thermomètre / hygromètre
- // Affichage multimode sur ecran LCD 1 couleur (bleu) 20x4
- //
- // RTC 1603 (RTC) Horloge en temps réel DFR0151
- // https://wiki.dfrobot.com/Gravity__I2C_DS1307_RTC_Module_SKU__DFR0151
- //
- // SHT15 (Capteur humidité / hygrométrie) (double I2C / pseudo I2C ??)
- // Capteur de T° et d'humidité Gravity DFR0066
- // https://wiki.dfrobot.com/SHT1x_Humidity_and_Temperature_Sensor__SKU__DFR0066_
- //
- // Module 5 boutons (analogique) DFR0075
- // https://wiki.dfrobot.com/ADKeyboard_Module__SKU__DFR0075_
- //
- // capteur de lumière ambiante SEN0172 (juste parce que j'en ai un)
- // https://wiki.dfrobot.com/LX1972_ambient_light_sensor_SKU_SEN0172
- //
- // Arduino Nano
- //
- // Afficheur LCD I2C 4X20 caractères
- // https://www.gotronic.fr/pj2-sbc-lcd20x4-fr-1440.pdf
- // https://www.gotronic.fr/pj2-pcf8574-3-1516.pdf
- // https://www.gotronic.fr/pj2-lcd2004-1515.pdf
- /* ================================================================================================== */
- /* ================================================================================================== */
- // Ce "truc" possède 4 modes (ecran) d'affichages de la date, l'heure, la température en °C, le taux
- // d'humidité de l'air, dont un avec défilement de la date du jour, et deux autres qui donnent la
- // température en °F.
- // Cette nouvelle version donne aussi l'intensité lumineuse ambiante.
- // De plus j'ai rajouté une animation de la pendule sur l'écran 2, et un nouvel icone "calendrier"
- // sur ce même écran.
- // Elle comporte aussi le clignotement des ":" des horloges.
- //
- // Utilisation
- //
- // Le controle se fait par 5 boutons (Ben oui j'en avais 5 de dispo, c'est l'opulence.
- // BOUTON 1 BLANC
- // O
- // BOUTON 2 ROUGE O O O BOUTON 4 BLEU || AU CENTRE BOUTON 5 BLANC
- // O
- // BOUTON 3 BLANC
- // BOUTON 2 ROUGE passe au mode suivant (et retourne au premier une fois au bout)
- // BOUTON 4 VERT passe au mode précédent (et retourne au dernier une fois au bout)
- // BOUTON 1 BLANC affiches les valeurs maximum de température et d'humidité atteinte depuis qu'il est branché
- // BOUTON 3 BLANC affiches les valeurs minimum de température et d'humidité atteinte depuis qu'il est branché
- // BOUTON 5 BLANC si on vient de mini ou maxi, on affiche le dernier mode selectionné avec ROUGE ou VERT
- //
- // Il faudra un peu modifier le code pour l'utiliser avec des boutons poussoirs différents de ce module
- //
- /* ================================================================================================== */
- // Suite possible / prévue
- /* ================================================================================================== */
- // [x] FAIT : animation pendule sur 3 positions (3 caracteres speciaux), 4 mouvements
- // [x] FAIT : animation des ":" dans les horloges
- // [x] FAIT : ajouter un capteur de lumière ambiante SEN0172 (juste parce que j'en ai un)
- // [x] FAIT : ajouter une icone calendrier
- // [x] FAIT : le centrage automatique des lignes
- // => date ecran 1 / ligne 1 | et | jour ecran 2 / Ligne 2
- // [x] FAIT : Rajouter l'année sur l'écran 1
- // [x] FAIT : Mise à jour de l'heure par l'utilisateur (compliqué, mais...)
- // [x] FAIT : Clignottement du chiffre à modifier en mode réglage
- // [x] FAIT : Libération de RAM et d'espace de stockage
- // [x] FAIT : Défilement message utilisateur (light)
- // [x] FAIT : Réveil : Rajouter une alarme réglable par l'utilisateur
- // [x] FAIT : (le mode peut être évolutif avec snooze, différentes mélodies, ...)
- // [x] FAIT : Pré écoute de la sonnerie lors du réglage du reveil
- // [x] FAIT : Enregistrement des valeurs mini, maxi, valeurs du reveil (EEPROM)
- // Connexion RF433 avec une autre sonde température (pour mode extérieur intérieur)
- // Accents sur le 'u' de août et les 'e' sur février et décembre
- // Peut me servir pour çà :
- // http://www.electronic-engineering.ch/microchip/datasheets/lcd/charset.gif
- // http://fabrice.sincere.pagesperso-orange.fr/cm_electronique/electronique_numerique20/annexe/conversion_decimal_hexa02.pdf
- // ... et peut être de nouveaux modes d'affichage (écrans)
- //
- // J'attends vos idées...
- //
- // REMARQUE : Il semblerait que dans ce code, 'lcd.printByte()' peut être remplacé par 'lcd.write()'
- // mais je ne sais pas si on a encore besoin du #DEFINE suivante... (je regarderai plus tard)
- //
- // #if defined(ARDUINO) && ARDUINO >= 100
- // #define printByte(args) write(args);
- // #else
- // #define printByte(args) print(args,BYTE);
- // #endif
- //
- //----------------------------------------------------------------------------------------------------------
- // IMPORTATION DES BIBLIOTHEQUES |
- //----------------------------------------------------------------------------------------------------------
- #include <Wire.h> // chargement de la bibliothèque de gestion simplifiée du cablage (I2C)
- #include <DS1307.h> // chargement de la bibliothèque de gestion du module RTC (Real Time Clock)
- #include <SHT1x.h> // chargement de la bibliothèque de gestion du module temperature humidité sht15
- #include <LiquidCrystal_I2C.h> // chargement de la bibliothèque de gestion de l'ecran 4x20 I2C
- #include <avr/pgmspace.h> // chargement de la bibliothèque de gestion de 'F' :)
- #include "EEPROM.h"
- LiquidCrystal_I2C lcd(0x27, 20, 4); // instanciation de l'occurence lcd() de l'objet LiquidCrystal_I2C
- #define dataPin 10 // pin digital de connexion data Senseur SHT15
- #define clockPin 11 // pin digital de connexion SCK Senseur SHT15
- SHT1x sht15(dataPin, clockPin); // instanciation de l'occurence sht15() de l'objet SHT1x
- #define pinAnalogLumiere 1
- #define pinBuzzer 6
- //----------------------------------------------------------------------------------------------------------
- // A modifier pour mettre "à l'heure" |
- //----------------------------------------------------------------------------------------------------------
- bool update_mode = 0; // 1 : Mise à jour du temps ; 0 : Affiche l'heure
- //----------------------------------------------------------------------------------------------------------
- //----------------------------------------------------------------------------------------------------------
- // A modifier pour mettre "à l'heure" |
- //----------------------------------------------------------------------------------------------------------
- #define TIME_YR 20 // <= // année sans "20" de 2000 |
- #define TIME_MTH 8 // <= // numéro du mois de l'année |
- #define TIME_DATE 13 // <= // jour du mois |
- #define TIME_DOW 4 // <= // jour de la semaine (lundi : 1; mardi : 2; mercredi : 3; etc) |
- #define TIME_HR 16 // <= // heures |
- #define TIME_MIN 10 // <= // minutes |
- #define TIME_SEC 0 // <= // secondes |
- //----------------------------------------------------------------------------------------------------------
- char* jour[] = {"lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"}; // nom du jour de la semaine
- char* mois[] = {"janvier", "fevrier", "mars", "avril", "mai", "juin", "juillet", "aout", "septembre", "octobre", "novembre", "decembre"}; // nom du mois
- // ???---???--- permet l'affichage des caractères spéciaux ---???---???
- #if defined(ARDUINO) && ARDUINO >= 100
- #define printByte(args) write(args);
- #else
- #define printByte(args) print(args,BYTE);
- #endif
- // ???---???--- ???---???---???---??? ---???---???
- uint8_t repetition[8] = {0x18, 0x14, 0x18, 0x15, 0x03, 0x07, 0x03, 0x01};
- uint8_t sonnerie[8] = {0x01, 0x01, 0x01, 0x01, 0x0F, 0x1F, 0x1F, 0x0E};
- uint8_t pendule[8] = {0x0, 0xe, 0x15, 0x17, 0x11, 0xe, 0x0}; // caractère spécial pendule
- uint8_t goutte[8] = {0x04, 0x04, 0x0A, 0x0A, 0x11, 0x11, 0x11, 0x0E}; // caractère spécial goutte
- uint8_t thermo[8] = {0x04, 0x0A, 0x0B, 0x0A, 0x0F, 0x0E, 0x0F, 0x0E}; // caractère spécial thermomètre
- uint8_t reveilOn[8] = {0x1F, 0x11, 0x15, 0x13, 0x15, 0x15, 0x1F, 0x00}; //caractère spécial lumière
- uint8_t cal[8] = {0x1F, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F}; //caractère spécial calendrier
- // https://maxpromer.github.io/LCD-Character-Creator/
- int rtc[7]; // tableau qui contiendra les valeurs du temps présent
- int anneeActuel;
- int moisActuel;
- int jourSemActuel;
- int jourActuel;
- int heureActuel;
- int minuteActuel;
- int secondeActuel;
- unsigned long cycle; // repère temporel pour l'affichage des secondes ("refresh" ou nouveau Serial.print())
- unsigned long cycleSensor; // repère temporel pour la lecture des senseur de température et humidité
- unsigned long MargeCycleSensor = 30000; // delais entre chaque lecture des senseurs
- float temp_c; // température en celsius
- float temp_f; // température en Fareneit
- float humidite; // taux d'humidité de l'air
- int lumiere;
- float temp_c_max = 0; // température max en celsius
- float temp_c_min = 1000; // température min en celsius
- float temp_f_max = 0; // température max en Fareneit
- float temp_f_min = 1000; // température min en Fareneit
- float hum_max = 0; // taux max d'humidité de l'air
- float hum_min = 101; // taux min d'humidité de l'air
- int modeAff = 0; // mode d'écran à afficher
- int modeAffMem; // mise en memoire du dernier mode ecran affiché
- int longueurLigne; // nombre de caractère à l'écran (à afficher)
- int avance = 0; // position du repère de défilement
- int debutAff; // premier caractère de la ligne affiché
- int finAff; // dernier caratcère de la ligne affiché
- int valLimiteHauteModule[5] = {600, 650, 720, 820, 900}; // valeurs analogiques de basculement d'un bouton à l'autre
- // (j'ai modifié le 3eme je suis passé de 700 à 720)
- const int nombreBoutons = 5; // détermine le nombre de boutons
- const int pinModule5BP = 0;
- int valeurLue; // bouton activé
- int numBouton = -1; // valeur du bouton
- int derniereLue = -1; // ancienne valeur connu des boutons
- int memoireNumBouton = -1;
- int ancienneMemoireNumBouton = -1;
- unsigned long debutPression;
- unsigned long debutEntreDeux;
- unsigned long dureePression;
- unsigned long dureeEntreDeux;
- const int nombreMode = 3; // nombre de mode : 4 (mode : 0)
- int cyclePendule = 1;
- bool etatDeuxPoints = true;
- int positionCentrage;
- // Variables de mise à jour de l'heure -----
- int anneeR;
- int moisR;
- int jourR;
- int jourSemR;
- int heureR;
- int minuteR;
- int secondeR;
- int positionR;
- int positionRmarge;
- bool etatClignoSelect = 0;
- unsigned long cligno;
- // Variables du défilement instructions utilisateur -----
- // Pour la prochaine version, prévoire un affichage séquentiel, plutôt...
- String Chaine = "";
- String ligne = "";
- String texte = "";
- String Chaine20Espaces = " ";
- char myChar;
- int k = 0;
- const char messageUser1[] PROGMEM = "< Prec. / Suiv. > / Rouge + / Bleu - / Vert : Valid. / Long Vert : Annul.";
- const char messageUser2[] PROGMEM = "< NON / Long Vert : Annul. / OUI >";
- // Variables du réveil -----
- int heureReveil = 11;
- int heureReveilReglage = 11;
- int minuteReveil = 47;
- int minuteReveilReglage = 47;
- bool reveilActif = false;
- bool reveilActifReglage = false;
- int positionReglageReveil = 2;
- bool joursReveilActif[7] ={true, true, false, false, false, false, false};
- bool joursReveilActifReglage[7] ={true, true, false, false, false, false, false};
- int positionsCursReglageReveil[14] = {5, 13, 14, 16, 17, 5, 7, 9, 11, 13, 15, 17, 11, 9};
- int positionsCursReglage[11] = {0, 12, 13, 15, 16, 18, 19, 6, 7, 9, 10};
- bool alarmeOn = false;
- unsigned long validiteAlarmeOff = -60000;
- int timerBoucle = 500;
- int timerBoucleAlarme = 900;
- int numeroSonnerie = 1;
- int numeroSonnerieReglage = 1;
- int numeroRepet = 0;
- int numeroRepetReglage = 0;
- int heureMemoireRepet;
- int minuteMemoireRepet;
- bool repetOn = false;
- bool jourActifForce = false;
- bool nouveauJour = false;
- bool ecouteSonnerieTest=false;
- int tourEcoute1 = 0;
- int tourEcoute0 = 0;
- // tableau des valeurs d'initialisation
- int valeurInit[18] = {
- 0, // Réveil On / Off // val 0 ou 1
- 22, // Heures // val : entre 0 et 23
- 33, // Minutes // val : entre 0 et 59
- 1, // Lundi // val 0 ou 1
- 0, // Mardi // val 0 ou 1
- 1, // Mercredi // val 0 ou 1
- 0, // Jeudi // val 0 ou 1
- 1, // Vendredi // val 0 ou 1
- 1, // Samedi // val 0 ou 1
- 0, // Dimanche // val 0 ou 1
- 3, // °C mini // val : entre -40 et 128
- 37, // °F mini // val entre -4 et 262.4
- 7, // % Humidité mini // val entre 0 et 100
- 32, // °C maxi // val entre -40 et 128
- 89, // °F maxi // val entre -4 et 262.4
- 88, // % Humidité maxi // int entre 0 et 100
- 1, // N° de sonnerie // int entre 1 et 4
- 2 // Multiplicateur repet // int entre 0 et 4
- };
- byte valeurLueEEPROM;
- //#define INIT // à décocher pour faire une initialisation
- /* ================================================================================================== */
- // fonctions
- /* ================================================================================================== */
- /* ================================================================================================== */
- // fonction qui surveille l'heure et lancer l'alarme quand il faut
- /* ================================================================================================== */
- void alarmeReveilVerif(){
- if (millis() - validiteAlarmeOff > 60000){
- alarmeOn = false;
- }
- if (reveilActif == true && alarmeOn == false){
- if (joursReveilActif[jourSemActuel-1] == true && heureReveil == heureActuel && minuteReveil == minuteActuel){
- modeAffMem = modeAff;
- modeAff = 10;
- alarmeOn = true;
- validiteAlarmeOff = millis();
- timerBoucle = timerBoucleAlarme;
- }
- }
- }
- /* ================================================================================================== */
- // fonction d'affichage du mode Validation du réglage du réveil
- /* ================================================================================================== */
- void validReglageReveil(){
- // Ligne 1
- lcd.setCursor(0, 0);
- lcd.print(F(" VALIDER REGLAGES ? "));
- // Ligne 2
- lcd.setCursor(0, 1);
- lcd.printByte(3);
- if (reveilActifReglage == true){
- lcd.print(F(" on "));
- } else {
- lcd.print(F("off "));
- }
- lcd.printByte(4);
- if (numeroRepetReglage == 0){
- lcd.print(F("-----"));
- }else{
- if (numeroRepetReglage*5 < 10){
- lcd.print(F(" "));
- }
- lcd.print(numeroRepetReglage*5);
- lcd.print(F(" mn "));
- }
- lcd.print(F(" "));
- lcd.printByte(0);
- if (heureReveilReglage < 10){
- lcd.print(F("0"));
- }
- lcd.print(heureReveilReglage);
- lcd.print(F(":"));
- if (minuteReveilReglage < 10){
- lcd.print(F("0"));
- }
- lcd.print(minuteReveilReglage);
- lcd.setCursor(0, 2);
- lcd.printByte(5);
- lcd.print(F(" "));
- lcd.print(numeroSonnerieReglage);
- lcd.print(F(" "));
- lcd.printByte(6);
- lcd.print(F(" "));
- for (int x = 0; x <= 6; x++){
- String jourCh = jour[x]; // on récupère le jour dans le tableau existant (chaine)
- // mais comme on n'a besoin que du premier caractère :
- char initCh = jourCh[0]; // on extrait le premier caractère
- if (joursReveilActifReglage[x] == true){ // Si le jour est actif (doit sonner)
- initCh = toupper(initCh); // on le passe en majuscule
- }
- jourCh = ""; // on vide notre chaine
- jourCh += initCh; // on y ajoute le caractère ci-dessus
- lcd.print(jourCh); // et on affiche
- if (x <= 5){
- lcd.print(F("|"));
- }
- }
- // Affichage message
- if (k <= ligne.length()){ // remplacer messageUser2 par ligne pour utiliser la fonction
- k++;
- } else {
- k=0;
- }
- texte = ligne.substring(k, k + 20); // remplacer messageUser2 par ligne pour utiliser la fonction
- lcd.setCursor(0, 3);
- lcd.print(texte);
- }
- /* ================================================================================================== */
- // fonction d'affichage du mode Réglage du réveil Ecran 1
- /* ================================================================================================== */
- void showReveilEcran1(){
- // Ligne 1
- lcd.setCursor(0, 0);
- lcd.print(F(" REGLAGES REVEIL 1 "));
- // Ligne 2
- lcd.setCursor(0, 1);
- lcd.print(F(" "));
- lcd.printByte(3);
- if (reveilActifReglage == true){
- lcd.print(F(" on | "));
- } else {
- lcd.print(F(" off | "));
- }
- lcd.printByte(0);
- lcd.print(F(" "));
- if (heureReveilReglage < 10){
- lcd.print(F("0"));
- }
- lcd.print(heureReveilReglage);
- lcd.print(F(":"));
- if (minuteReveilReglage < 10){
- lcd.print(F("0"));
- }
- lcd.print(minuteReveilReglage);
- lcd.print(F(" "));
- // Ligne 3
- lcd.setCursor(0, 2);
- lcd.print(F(" "));
- lcd.printByte(6);
- lcd.print(F(" "));
- for (int x = 0; x <= 6; x++){
- String jourCh = jour[x]; // on récupère le jour dans le tableau existant (chaine)
- // mais comme on n'a besoin que du premier caractère :
- char initCh = jourCh[0]; // on extrait le premier caractère
- if (joursReveilActifReglage[x] == true){ // Si le jour est actif (doit sonner)
- initCh = toupper(initCh); // on le passe en majuscule
- }
- jourCh = ""; // on vide notre chaine
- jourCh += initCh; // on y ajoute le caractère ci-dessus
- lcd.print(jourCh); // et on affiche
- if (x <= 5){
- lcd.print(F("|"));
- }
- }
- // Ligne 4
- // Affichage message
- if (k <= ligne.length()){ // remplacer messageUser2 par ligne pour utiliser la fonction
- k++;
- } else {
- k=0;
- }
- texte = ligne.substring(k, k + 20); // remplacer messageUser2 par ligne pour utiliser la fonction
- lcd.setCursor(0, 3);
- lcd.print(texte);
- // Clignottement de l'élément sélectionné
- if (etatClignoSelect == 1){
- if (positionReglageReveil < 6){
- lcd.setCursor(positionsCursReglageReveil[positionReglageReveil-1],1);
- lcd.print(F(" "));
- if (positionReglageReveil == 1){
- lcd.print(F(" "));
- }
- } else {
- lcd.setCursor(positionsCursReglageReveil[positionReglageReveil-1],2);
- lcd.print(F(" "));
- if (positionReglageReveil >= 13){
- modeAff = 11;
- lcd.clear();
- }
- }
- }
- etatClignoSelect = !etatClignoSelect;
- }
- /* ================================================================================================== */
- // fonction d'affichage du mode Réglage du réveil Ecran 2
- /* ================================================================================================== */
- void showReveilEcran2(){
- // Ligne 1
- lcd.setCursor(0, 0);
- lcd.print(F(" REGLAGES REVEIL 2 "));
- // Ligne 2
- lcd.setCursor(0, 1);
- lcd.print(F(" "));
- lcd.printByte(5);
- lcd.print(F(" "));
- lcd.print(numeroSonnerieReglage);
- // Ligne 3
- lcd.setCursor(0, 2);
- lcd.print(F(" "));
- lcd.printByte(4);
- lcd.print(F(" "));
- if (numeroRepetReglage == 0){
- lcd.print(F("-----"));
- }else{
- if (numeroRepetReglage*5 < 10){
- lcd.print(F(" "));
- }
- lcd.print(numeroRepetReglage*5);
- lcd.print(F(" mn "));
- }
- // Ligne 4
- // Affichage message
- if (k <= ligne.length()){ // remplacer messageUser2 par ligne pour utiliser la fonction
- k++;
- } else {
- k=0;
- }
- texte = ligne.substring(k, k + 20); // remplacer messageUser2 par ligne pour utiliser la fonction
- lcd.setCursor(0, 3);
- lcd.print(texte);
- // Clignottement de l'élément sélectionné
- if (etatClignoSelect == 1){
- if (positionReglageReveil < 13){
- modeAff = 8;
- lcd.clear();
- } else {
- if (positionReglageReveil == 13){
- lcd.setCursor(positionsCursReglageReveil[positionReglageReveil-1],1);
- lcd.print(F(" "));
- } else if (positionReglageReveil == 14){
- lcd.setCursor(positionsCursReglageReveil[positionReglageReveil-1],2);
- lcd.print(F(" "));
- }
- }
- if (ecouteSonnerieTest == true){
- switch (numeroSonnerieReglage) {
- case 1:
- tone(pinBuzzer, 440); // 1
- break;
- case 2:
- tone(pinBuzzer, 440, 450); // 2
- break;
- case 3:
- tone(pinBuzzer, 440, 200); // 3
- delay(300); // 3
- tone(pinBuzzer, 440, 200); // 3
- break;
- case 4:
- tone(pinBuzzer, 440, 150); // 4
- delay(200); // 4
- tone(pinBuzzer, 440, 150); // 4
- delay(200); // 4
- tone(pinBuzzer, 440, 150); // 4
- break;
- }
- tourEcoute1 ++;
- }
- } else {
- if (ecouteSonnerieTest == true){
- switch (numeroSonnerieReglage) {
- case 1:
- noTone(pinBuzzer); // 1
- break;
- case 2:
- tone(pinBuzzer, 440, 450); // 2
- break;
- case 3:
- noTone(pinBuzzer); // 3
- break;
- case 4:
- noTone(pinBuzzer); // 4
- break;
- }
- tourEcoute0 ++;
- }
- }
- if (tourEcoute0 >= 4 && tourEcoute0 >= 4){
- ecouteSonnerieTest = false;
- }
- etatClignoSelect = !etatClignoSelect;
- }
- /* ================================================================================================== */
- // fonction d'affichage du mode Alarme du réveil
- /* ================================================================================================== */
- void showAlarme(){
- if (etatClignoSelect == 1){
- lcd.setCursor(0, 0);
- lcd.print(F(" ALARME ! "));
- lcd.setCursor(0, 1);
- lcd.print(F(" "));
- lcd.write(242);
- lcd.print(F(" "));
- lcd.write(242);
- lcd.print(F(" "));
- lcd.setCursor(0, 2);
- lcd.print(F(" (______) "));
- lcd.setCursor(0, 3);
- lcd.print(F(" C'est maintenant ! "));
- switch (numeroSonnerie) {
- case 1:
- tone(pinBuzzer, 440); // 1
- break;
- case 2:
- tone(pinBuzzer, 440, 450); // 2
- break;
- case 3:
- tone(pinBuzzer, 440, 200); // 3
- delay(300); // 3
- tone(pinBuzzer, 440, 200); // 3
- break;
- case 4:
- tone(pinBuzzer, 440, 150); // 4
- delay(200); // 4
- tone(pinBuzzer, 440, 150); // 4
- delay(200); // 4
- tone(pinBuzzer, 440, 150); // 4
- break;
- }
- } else {
- lcd.setCursor(0, 0);
- lcd.print(Chaine20Espaces);
- lcd.setCursor(0, 1);
- lcd.print(F(" ALARME ! "));
- lcd.setCursor(0, 2);
- lcd.print(F(" C'est maintenant ! "));
- lcd.setCursor(0, 3);
- lcd.print(Chaine20Espaces);
- switch (numeroSonnerie) {
- case 1:
- noTone(pinBuzzer); // 1
- break;
- case 2:
- tone(pinBuzzer, 440, 450); // 2
- break;
- case 3:
- noTone(pinBuzzer); // 3
- break;
- case 4:
- noTone(pinBuzzer); // 4
- break;
- }
- }
- etatClignoSelect = !etatClignoSelect;
- }
- /* ================================================================================================== */
- // fonction qui récupere les instructions défilantes
- /* ================================================================================================== */
- void recupeTexte(const char message[]){
- ligne="";
- Chaine="";
- for (byte j = 0; j < strlen_P(message); j++)
- {
- myChar = pgm_read_byte_near(message + j);
- Chaine = Chaine + myChar;
- }
- ligne = Chaine20Espaces; // Construit la Chaîne de caractères à faire défiler
- ligne = ligne + Chaine;
- ligne = ligne + " ";
- }
- // Affichage de la date sous la forme xx/xx/xxxx
- void affDate() {
- if (jourActuel < 10) {
- lcd.print(F("0"));
- }
- lcd.print(jourActuel);
- lcd.print(F("/"));
- if (moisActuel < 10) {
- lcd.print(F("0"));
- }
- lcd.print(moisActuel);
- lcd.print(F("/"));
- lcd.print(anneeActuel);
- }
- // Affichage de l'heure
- void affHeure() {
- if (heureActuel < 10) {
- lcd.print(F("0"));
- }
- lcd.print( heureActuel);
- if (etatDeuxPoints == false) {
- lcd.print(F(":"));
- } else {
- lcd.print(F(" "));
- }
- if (minuteActuel < 10) {
- lcd.print(F("0"));
- }
- lcd.print( minuteActuel);
- if (etatDeuxPoints == false) {
- lcd.print(F(":"));
- } else {
- lcd.print(F(" "));
- }
- if (secondeActuel < 10) {
- lcd.print(F("0"));
- }
- lcd.print( secondeActuel);
- etatDeuxPoints = !etatDeuxPoints;
- }
- // Affichage de la température en Celsius
- void affCelsius(float cMinMaxActuelle) {
- if (cMinMaxActuelle < 0 && abs(cMinMaxActuelle) >= 10 && abs(cMinMaxActuelle) < 45) {
- lcd.print(F("-"));
- } else if (cMinMaxActuelle < 0 && abs(cMinMaxActuelle) < 10) {
- lcd.print(F(" -"));
- } else if (cMinMaxActuelle >= 0 && cMinMaxActuelle < 10) {
- lcd.print(F(" "));
- } else if (cMinMaxActuelle >= 10 && cMinMaxActuelle < 100) {
- lcd.print(F(" "));
- }
- lcd.print(cMinMaxActuelle, 1);
- lcd.print(F(" "));
- lcd.write(223);
- lcd.print(F("C"));
- }
- void affFahrenheit(float fMinMaxActuelle) {
- if (fMinMaxActuelle < 0 && abs(fMinMaxActuelle) >= 10 && abs(fMinMaxActuelle) < 50) {
- lcd.print(F("-"));
- } else if (fMinMaxActuelle < 0 && abs(fMinMaxActuelle) < 10) {
- lcd.print(F(" -"));
- } else if (fMinMaxActuelle >= 0 && fMinMaxActuelle < 10) {
- lcd.print(F(" "));
- } else if (fMinMaxActuelle >= 10 && fMinMaxActuelle < 100) {
- lcd.print(F(" "));
- }
- lcd.print(fMinMaxActuelle, 1);
- lcd.print(F(" "));
- lcd.write(223);
- lcd.print(F("F"));
- }
- // Affichage du taux d'humidité
- void affHumidite(float hMinMaxActuelle) {
- lcd.print(hMinMaxActuelle, 1);
- lcd.print(F(" %"));
- }
- // Affichage du taux de lumiere
- void affLumiere() {
- lcd.print(lumiere);
- lcd.print(F(" %"));
- }
- /* ================================================================================================== */
- // fonction d'affichage du mode avec défilement
- /* ================================================================================================== */
- void showDefil1() {
- //------------------------------------------------------------------------------------------------------
- // ligne 1
- String ligne1 = String(jour[jourSemActuel - 1]) + " " + String(jourActuel); // 'jour de la semaine' + " " + 'numéro du jour'
- if (jourActuel < 2) { // si le 'numéro du jour' est "1"...
- ligne1 += "er "; // ... on rajoute "er" juste après
- }
- ligne1 += " " + String(mois[moisActuel - 1]) + " " + String(anneeActuel); // " " + 'nom du mois' + " " + 'année' (4 chiffres)
- longueurLigne = ligne1.length(); // longuer de la chaine (nombre de caractère)
- if (avance < 19) { // du tour 0 au tour 18
- debutAff = 0; // premier caractère = 0
- finAff = avance + 1; // dernier caractère = numéro du tour (valeur de 'avance')
- lcd.setCursor((19 - avance), 0); // on positionne le curseur "(a droite - le nombre de tour fait)
- avance += 1; // on avance d'un cran le repere
- } else if (avance >= 19 && avance <= (longueurLigne + 19)) { // du tour 19 au tour longueur + 19 (tant qu'on est pas a la fin de la ligne)
- debutAff = avance - 19; // le premier caractere prend la valeur avance - 19
- finAff = avance + 1; // le dernier caractère prend la valeur avance + 1
- lcd.setCursor(0, 0); // curseur en haut à gauche
- avance += 1; // on avance d'un cran le repere
- } else if (avance > (longueurLigne + 19)) { // si c'est la fin
- lcd.setCursor(0, 0); // curseur en haut à gauche
- avance = 0;
- }
- ligne1 = ligne1.substring(int(debutAff), int(finAff)); // on ne prend que ce qui est à afficher de la ligne
- if (ligne1.length() < 20 && avance > 19) { //
- for (int i = 0; i <= 20 - ligne1.length(); i++) { //
- ligne1 += " "; //on ajoute " " a la fin de la chaine pour que le 0 ne reste pas affiché
- }
- }
- lcd.print(ligne1); // on l'affiche
- //------------------------------------------------------------------------------------------------------
- // Ligne 2 // Construction de la ligne2
- lcd.setCursor(0, 1);
- if (reveilActif == true){
- lcd.printByte(3);
- } else {
- lcd.print(F(" "));
- }
- lcd.print(F(" "));
- lcd.printByte(0);
- lcd.print(F(" "));
- affHeure();
- lcd.print(F(" "));
- lcd.printByte(0);
- if (reveilActif == true){
- lcd.print(F(" "));
- lcd.printByte(3);
- } else {
- lcd.print(F(" "));
- }
- // Ligne 3 // Construction de la ligne3
- lcd.setCursor(0, 2);
- lcd.printByte(2);
- affCelsius(temp_c);
- lcd.print(F(" "));
- affFahrenheit(temp_f);
- lcd.print(F(" "));
- lcd.printByte(2);
- // Ligne 4
- lcd.setCursor(0, 3);
- lcd.printByte(1);
- lcd.print(F(" "));
- affHumidite(humidite);
- lcd.print(F(" "));
- affLumiere();
- lcd.print(F(" "));
- lcd.print(F("*"));
- }
- /* ================================================================================================== */
- // fonction d'affichage des valeurs maxi
- /* ================================================================================================== */
- void showMax() {
- lcd.setCursor(6, 0);
- lcd.print(F("MAXIMUM"));
- lcd.setCursor(0, 1);
- lcd.printByte(2);
- lcd.print(F(" "));
- affCelsius(temp_c_max);
- lcd.print(F(" "));
- lcd.printByte(2);
- lcd.setCursor(0, 2);
- lcd.printByte(2);
- lcd.print(F(" "));
- affFahrenheit(temp_f_max);
- lcd.print(F(" "));
- lcd.printByte(2);
- lcd.setCursor(0, 3);
- lcd.printByte(1);
- lcd.print(F(" "));
- affHumidite(hum_max);
- lcd.print(F(" "));
- lcd.printByte(1);
- }
- /* ================================================================================================== */
- // fonction d'affichage des valeurs mini
- /* ================================================================================================== */
- void showMin() {
- lcd.setCursor(6, 0);
- lcd.print(F("MINIMUM"));
- lcd.setCursor(0, 1);
- lcd.printByte(2);
- lcd.print(F(" "));
- affCelsius(temp_c_min);
- lcd.print(F(" "));
- lcd.printByte(2);
- lcd.setCursor(0, 2);
- lcd.printByte(2);
- lcd.print(F(" "));
- affFahrenheit(temp_f_min);
- lcd.print(F(" "));
- lcd.printByte(2);
- lcd.setCursor(0, 3);
- lcd.printByte(1);
- lcd.print(F(" "));
- affHumidite(hum_max);
- lcd.print(F(" "));
- lcd.printByte(1);
- }
- /* ================================================================================================== */
- // fonction d'affichage de l'ecran (mode) 3
- /* ================================================================================================== */
- void showAll3() {
- lcd.setCursor(0, 0);
- lcd.print(F(" "));
- lcd.printByte(6);
- lcd.print(F(" "));
- affDate();
- lcd.print(F(" "));
- lcd.printByte(6);
- lcd.setCursor(0, 1);
- lcd.printByte(0);
- if (reveilActif == true){
- lcd.print(F(" "));
- lcd.printByte(3);
- } else {
- lcd.print(F(" "));
- }
- lcd.print(F(" "));
- affHeure();
- if (reveilActif == true){
- lcd.print(F(" "));
- lcd.printByte(3);
- } else {
- lcd.print(F(" "));
- }
- lcd.print(F(" "));
- lcd.printByte(0);
- lcd.setCursor(0, 2);
- lcd.printByte(2);
- affCelsius(temp_c);
- lcd.print(F(" "));
- affFahrenheit(temp_f);
- lcd.print(F(" "));
- lcd.printByte(2);
- lcd.setCursor(0, 3);
- lcd.printByte(1);
- lcd.print(F(" "));
- affHumidite(humidite);
- lcd.print(F(" "));
- affLumiere();
- lcd.print(F(" "));
- lcd.print(F("*"));;
- }
- /* ================================================================================================== */
- // fonction d'affichage de l'ecran (mode) 2
- /* ================================================================================================== */
- void showAll2() {
- if (nouveauJour == true){
- lcd.setCursor(0, 0);
- lcd.print(F(" "));
- }
- //-------------------------------- Début de ligne 1 -----
- //-------------------------------- Début du jourSem -----
- String ligne1 = String( jour[jourSemActuel - 1]);
- longueurLigne = ligne1.length() + 10; // + 10 pour ajouter la date les espaces et l'anim
- if (longueurLigne <= 20) {
- positionCentrage = (20 - longueurLigne) / 2;
- lcd.setCursor(positionCentrage, 0);
- } else {
- lcd.setCursor(0, 0);
- }
- lcd.print(jour[jourSemActuel - 1]);
- //-------------------------------- Fin du jourSem -------
- lcd.print(F(" "));
- //-------------------------------- Début de la date -----
- affDate();
- //-------------------------------- Fin de la date -------
- //-------------------------------- Fin de ligne 1 ------- --
- //-------------------------------- Début de ligne 2 ----- --
- lcd.setCursor(4, 1);
- //-------------------------------- Début de l'heure -----
- lcd.printByte(0);
- lcd.print(" ");
- affHeure();
- if (reveilActif == true){
- lcd.print(F(" "));
- lcd.printByte(3);
- } else {
- lcd.print(F(" "));
- }
- //-------------------------------- Fin de l'heure -------
- //-------------------------------- Fin de ligne 2 ------- --
- lcd.setCursor(0, 2);
- lcd.printByte(2);
- affCelsius(temp_c);
- lcd.print(F(" - "));
- lcd.printByte(1);
- lcd.print(F(" "));
- affHumidite(humidite);
- lcd.setCursor(0, 3);
- lcd.printByte(2);
- affFahrenheit(temp_f);
- lcd.print(F(" - "));
- lcd.print(F("*"));;
- lcd.print(F(" "));
- affLumiere();
- }
- /* ================================================================================================== */
- // fonction d'affichage de l'ecran (mode) 1
- /* ================================================================================================== */
- void showAll1() { // fonction qui affiche l'heure
- String ligne1 = String(jour[jourSemActuel - 1]) + " " + String(jourActuel);
- if (jourActuel < 2) {
- ligne1 += "er"; // on rajouter "er" apres le numero du jour si on est le 1er du mois
- }
- ligne1 += " " + String(mois[moisActuel - 1]);
- longueurLigne = ligne1.length();
- if (longueurLigne <= 20) {
- positionCentrage = (20 - longueurLigne) / 2;
- lcd.setCursor(positionCentrage, 0);
- } else {
- lcd.setCursor(0, 0);
- }
- lcd.print(ligne1);
- lcd.setCursor(0, 1);
- lcd.printByte(0);
- lcd.print(F(" : "));
- affHeure();
- lcd.print(F(" "));
- lcd.print(F("("));
- lcd.print(anneeActuel);
- lcd.print(F(")"));
- if (reveilActif == true){
- lcd.printByte(3);
- } else {
- lcd.print(F(" "));
- }
- lcd.setCursor(0, 2);
- lcd.printByte(2);
- lcd.print(F(" :"));
- affCelsius(temp_c);
- lcd.print(F(" "));
- affFahrenheit(temp_f);
- lcd.setCursor(0, 3);
- lcd.printByte(1);
- lcd.print(F(" : "));
- affHumidite(humidite);
- lcd.print(F(" "));
- lcd.print(F("*"));;
- lcd.print(F(" : "));
- affLumiere();
- }
- void showNow () {
- lcd.setCursor(0, 0);
- lcd.print(F("REGLAGE DATE / HEURE"));
- lcd.setCursor(0, 1);
- lcd.print(jour[jourSemR-1]);
- lcd.print(F(" "));
- lcd.setCursor(12, 1);
- if (jourR < 10){
- lcd.print(F("0"));
- }
- lcd.print(jourR);
- lcd.print(F("/"));
- if (moisR < 10){
- lcd.print(F("0"));
- }
- lcd.print(moisR);
- lcd.print(F("/"));
- lcd.print(anneeR-2000);
- lcd.setCursor(5, 2);
- lcd.print(F("|"));
- if (heureR < 10) {
- lcd.print(F("0"));
- }
- lcd.print(heureR);
- lcd.print(F(":"));
- if (minuteR < 10) {
- lcd.print(F("0"));
- }
- lcd.print(minuteR);
- lcd.print(F("|"));
- lcd.print(F("oo"));
- lcd.print(F("|"));
- // ------------------------------------------------------------------
- if (etatClignoSelect == 1){
- if (positionR < 8){
- lcd.setCursor(positionsCursReglage[positionR-1],1);
- lcd.print(F(" "));
- if (positionR == 1){
- lcd.print(F(" "));
- }
- } else {
- lcd.setCursor(positionsCursReglage[positionR-1],2);
- lcd.print(F(" "));
- }
- }
- etatClignoSelect = !etatClignoSelect;
- // -------------------------------------------------------------------
- if (k <= ligne.length()){
- k++;
- } else {
- k=0;
- }
- texte = ligne.substring(k, k + 20);
- lcd.setCursor(0, 3);
- lcd.print(texte);
- }
- /* ================================================================================================== */
- // fonction qui valide les réglages de la date et de l'heure
- /* ================================================================================================== */
- void affValidRegl() {
- lcd.setCursor(0, 0);
- lcd.print(F("VALIDER CE REGLAGE ?"));
- lcd.setCursor(0, 1);
- lcd.print(jour[jourSemR-1]);
- lcd.print(F(" "));
- if (jourR < 10){
- lcd.print(F("0"));
- }
- lcd.setCursor(12, 1);
- lcd.print(jourR);
- lcd.print(F("/"));
- if (moisR < 10){
- lcd.print(F("0"));
- }
- lcd.print(moisR);
- lcd.print(F("/"));
- lcd.print(anneeR-2000);
- lcd.setCursor(6, 2);
- if (heureR < 10) {
- lcd.print(F("0"));
- }
- lcd.print(heureR);
- lcd.print(F(":"));
- if (minuteR < 10) {
- lcd.print(F("0"));
- }
- lcd.print(minuteR);
- lcd.print(F(":"));
- lcd.print(F("oo"));
- if (k <= ligne.length()){ // remplacer messageUser2 par ligne pour utiliser la fonction
- k++;
- } else {
- k=0;
- }
- texte = ligne.substring(k, k + 20); // remplacer messageUser2 par ligne pour utiliser la fonction
- lcd.setCursor(0, 3);
- lcd.print(texte);
- }
- /* ================================================================================================== */
- // fonction qui transforme les valeurs reçues du module 5 BP en numero de bouton
- /* ================================================================================================== */
- int recupNumBouton (unsigned int lecture) {
- int boucleLecture;
- for (boucleLecture = 0; boucleLecture < nombreBoutons; boucleLecture ++) {
- if (lecture < valLimiteHauteModule[boucleLecture]) {
- return boucleLecture;
- }
- }
- if (boucleLecture >= nombreBoutons) {
- boucleLecture = -1;
- }
- return boucleLecture;
- }
- void recupereRTC (){
- RTC.get(rtc, true); {
- anneeActuel = rtc[6];
- moisActuel = rtc[5];
- jourActuel = rtc[4];
- jourSemActuel = rtc[3];
- heureActuel = rtc[2];
- minuteActuel = rtc[1];
- secondeActuel = rtc[0];
- }
- }
- /* ================================================================================================== */
- /* ================================================================================================== */
- // SETUP
- /* ================================================================================================== */
- void setup() {
- lcd.init(); // initialisation de l'écran
- Wire.begin(); // lancement connexion simplifiée
- lcd.backlight(); // éclairage de l'écran
- lcd.createChar(0, pendule); // creation du caractère spécial Pendule etat1
- lcd.createChar(1, goutte); // création du caractère spécial goutte
- lcd.createChar(2, thermo); // création du caractère spécial thermometre
- lcd.createChar(3, reveilOn); // création du caractère spécial lumière
- lcd.createChar(4, repetition); // creation du caractère spécial Repet
- lcd.createChar(5, sonnerie); // creation du caractère spécial Pendule etat1
- lcd.createChar(6, cal); // création du caractère spécial agenda
- pinMode(pinBuzzer, OUTPUT);
- cycle = millis();
- cycleSensor = millis() + MargeCycleSensor;
- #if defined(INIT)
- // INIT
- for (int i = 0; i < 18; i++) {
- switch (i){
- case 0: // Reveil On / Off
- EEPROM.update(i, valeurInit[0]);
- break;
- case 1: // heures
- EEPROM.update(i, valeurInit[1]);
- break;
- case 2: // minutes
- EEPROM.update(i, valeurInit[2]);
- break;
- case 3: // lundi
- EEPROM.update(i, valeurInit[3]);
- break;
- case 4: // mardi
- EEPROM.update(i, valeurInit[4]);
- break;
- case 5: // mercredi
- EEPROM.update(i, valeurInit[5]);
- break;
- case 6: // jeudi
- EEPROM.update(i, valeurInit[6]);
- break;
- case 7: // vendredi
- EEPROM.update(i, valeurInit[7]);
- break;
- case 8: // samedi
- EEPROM.update(i, valeurInit[8]);
- break;
- case 9: // dimanche // ENREGISTREMENT CORRECTION
- EEPROM.update(i, valeurInit[9]); // j'ai fait exprès de faire une erreur dans l'INIT
- break; // une valeur supp à 1 pour une valeur bool
- case 10: // °C mini
- EEPROM.update(i, valeurInit[10]);
- break;
- case 11: //
- EEPROM.update(i, valeurInit[11]);
- break;
- case 12:
- EEPROM.update(i, valeurInit[12]);
- break;
- case 13:
- EEPROM.update(i, valeurInit[13]);
- break;
- case 14:
- EEPROM.update(i, valeurInit[14]);
- break;
- case 15:
- EEPROM.update(i, valeurInit[15]);
- break;
- case 16:
- EEPROM.update(i, valeurInit[16]);
- break;
- case 17:
- EEPROM.update(i, valeurInit[17]);
- break;
- }
- }
- #else
- // RECUP
- for (int i = 0; i < 18; i++) {
- valeurLueEEPROM = EEPROM.read(i);
- switch (i){
- case 0:
- if (valeurLueEEPROM == 0){
- reveilActif = false;
- } else if (valeurLueEEPROM == 1){
- reveilActif = true;
- } else {
- reveilActif = false;
- EEPROM.update(i, 0);
- }
- break;
- case 1:
- heureReveil = valeurLueEEPROM;
- break;
- case 2:
- minuteReveil = valeurLueEEPROM;
- break;
- case 3:
- if (valeurLueEEPROM == 0){
- joursReveilActif[0] = false;
- } else if (valeurLueEEPROM == 1){
- joursReveilActif[0] = true;
- } else {
- joursReveilActif[0] = false;
- EEPROM.update(i, 0);
- }
- break;
- case 4:
- if (valeurLueEEPROM == 0){
- joursReveilActif[1] = false;
- } else if (valeurLueEEPROM == 1){
- joursReveilActif[1] = true;
- } else {
- joursReveilActif[1] = false;
- EEPROM.update(i, 0);
- }
- break;
- case 5:
- if (valeurLueEEPROM == 0){
- joursReveilActif[2] = false;
- } else if (valeurLueEEPROM == 1){
- joursReveilActif[2] = true;
- } else {
- joursReveilActif[2] = false;
- EEPROM.update(i, 0);
- }
- break;
- case 6:
- if (valeurLueEEPROM == 0){
- joursReveilActif[3] = false;
- } else if (valeurLueEEPROM == 1){
- joursReveilActif[3] = true;
- } else {
- joursReveilActif[3] = false;
- EEPROM.update(i, 0);
- }
- break;
- case 7:
- if (valeurLueEEPROM == 0){
- joursReveilActif[4] = false;
- } else if (valeurLueEEPROM == 1){
- joursReveilActif[4] = true;
- } else {
- joursReveilActif[4] = false;
- EEPROM.update(i, 0);
- }
- break;
- case 8:
- if (valeurLueEEPROM == 0){
- joursReveilActif[5] = false;
- } else if (valeurLueEEPROM == 1){
- joursReveilActif[5] = true;
- } else {
- joursReveilActif[5] = false;
- EEPROM.update(i, 0);
- }
- break;
- case 9:
- if (valeurLueEEPROM == 0){
- joursReveilActif[6] = false;
- } else if (valeurLueEEPROM == 1){
- joursReveilActif[6] = true;
- } else {
- joursReveilActif[6] = false;
- EEPROM.update(i, 0);
- }
- break;
- case 10:
- temp_c_min = valeurLueEEPROM;
- break;
- case 11:
- temp_f_min = valeurLueEEPROM;
- break;
- case 12:
- hum_min = valeurLueEEPROM;
- break;
- case 13:
- temp_c_max = valeurLueEEPROM;
- break;
- case 14:
- temp_f_max = valeurLueEEPROM;
- break;
- case 15:
- hum_max = valeurLueEEPROM;
- break;
- case 16:
- if (valeurLueEEPROM > 0 && valeurLueEEPROM <= 4){
- numeroSonnerie = valeurLueEEPROM;
- } else {
- numeroSonnerie = 1;
- EEPROM.update(i, 1);
- }
- break;
- case 17:
- if (numeroRepet < 4){
- numeroRepet = valeurLueEEPROM;
- } else { // if (numeroRepet >= 4) [valeur incorrecte]
- numeroRepet = 1;
- EEPROM.update(i, 1);
- }
- break;
- }
- }
- #endif
- }
- /* ================================================================================================== */
- /* ================================================================================================== */
- // LOOP
- /* ================================================================================================== */
- void loop() {
- // 0. on prend les valeurs de la pendule
- recupereRTC ();
- alarmeReveilVerif();
- if (heureActuel == 0 && secondeActuel < 1){
- nouveauJour = true;
- } else {
- nouveauJour = false;
- }
- // 1. on prend les valeurs lumière, température et humidité des capteur
- if (millis() - cycleSensor >= MargeCycleSensor && update_mode == 0) {
- lumiere = map(analogRead(pinAnalogLumiere), 0, 1023, 0, 100);
- cycleSensor = millis();
- temp_c = sht15.readTemperatureC();
- temp_f = sht15.readTemperatureF();
- humidite = sht15.readHumidity();
- // 2. on met a jour les valeurs min et max si nécessaire
- if (temp_c > temp_c_max) { // si la température mesurée est supérieure à la température max enregistrée
- temp_c_max = temp_c; // alors la température mesurée devient la température max
- EEPROM.update(13, temp_c_max);
- }
- if (temp_c < temp_c_min) { // (voir ci dessus et remplacer "max" par "min")
- temp_c_min = temp_c; //
- EEPROM.update(10, temp_c_min);
- }
- if (temp_f > temp_f_max) { // meme principe que ci dessus : "voir ci-dessus et remplacer
- temp_f_max = temp_f; //
- EEPROM.update(14, temp_f_max);
- }
- if (temp_f < temp_f_min) { // (pareil...)
- temp_f_min = temp_f; //
- EEPROM.update(11, temp_f_min);
- }
- if (humidite > hum_max) { // ...
- hum_max = humidite; //
- EEPROM.update(16, hum_max);
- }
- if (humidite < hum_min) { //
- hum_min = humidite; //
- EEPROM.update(12, hum_min);
- }
- }
- // 3. on met à jour l'affichage toutes les secondes
- // c'est ici que seront gérés les modes d'affichage contrôlé par un module 5 BP
- valeurLue = analogRead(pinModule5BP);
- delay(50);
- valeurLue = analogRead(pinModule5BP);
- numBouton = recupNumBouton(valeurLue);
- // ===================================================================================================================
- // =========================== Navigation ============================================================================
- // ===================================================================================================================
- // Si on vient d'enfoncer le bouton ----------------------------------------------------------------------------------
- if (numBouton != derniereLue && numBouton != -1) {
- dureeEntreDeux = (millis() - debutEntreDeux);
- debutPression = millis();
- derniereLue = numBouton;
- ancienneMemoireNumBouton = memoireNumBouton;
- memoireNumBouton = numBouton;
- // Si on vient de relâchcer le bouton ---------------------------------------------------------------------------------
- } else if (numBouton != derniereLue && numBouton == -1) {
- debutEntreDeux = millis();
- dureePression = millis() - debutPression;
- derniereLue = numBouton;
- if (dureeEntreDeux > 350) {
- // =========================== Clic court ================================================================================
- if (dureePression < 500 ) {
- // =========================== Mode Afficahe =============================================================================
- if (update_mode == 0) {
- switch (memoireNumBouton) {
- // Bouton 0 --------------------------------------------------------------------------------------------------------------
- case 0: // cle = 0; bouton 1 "haut"
- // ---------- Ecran d'affichage quelconque -------------------------------------------------------------------------------
- if (modeAff <= 3) { // si on vient d'un mode affichage "horloge"
- modeAffMem = modeAff; // on garde cette valeur en memoire
- modeAff = (nombreMode + 1); // 3
- lcd.clear(); // efface ecran
- // ---------- Ecran de réglage du réveil --------------------------------------------------------------------------------
- } else if (modeAff == 8 || modeAff == 11) {
- if (positionReglageReveil == 1){
- reveilActifReglage = !reveilActifReglage;
- } else if (positionReglageReveil == 14){
- if (numeroRepetReglage < 4){
- numeroRepetReglage += 1;
- }
- } else if (positionReglageReveil == 2){
- if (heureReveilReglage < 14){
- heureReveilReglage += 10;
- }
- } else if (positionReglageReveil == 3){
- if (heureReveilReglage < 23){
- heureReveilReglage++;
- }
- } else if (positionReglageReveil == 4){
- if (minuteReveilReglage < 49){
- minuteReveilReglage += 10;
- }
- } else if (positionReglageReveil == 5){
- if (minuteReveilReglage < 59){
- minuteReveilReglage ++;
- }
- } else if (positionReglageReveil == 13){
- if (numeroSonnerieReglage < 4){
- numeroSonnerieReglage ++;
- ecouteSonnerieTest = true;
- tourEcoute1 = 0;
- tourEcoute0 = 0;
- }
- } else if (positionReglageReveil > 5 && positionReglageReveil < 13){
- joursReveilActifReglage[positionReglageReveil-6] = !joursReveilActifReglage[positionReglageReveil-6];
- }
- // ---------- Ecran d'alarme (que si repet actif) ------------------------------------------------------------------------
- } else if (modeAff == 10 && numeroRepet > 0){
- timerBoucle = 500;
- if (repetOn == false){
- heureMemoireRepet = heureReveil;
- minuteMemoireRepet = minuteReveil;
- }
- minuteReveil += numeroRepet*5;
- modeAff = modeAffMem;
- noTone(pinBuzzer);
- if (minuteReveil >= 60){
- minuteReveil -= 60;
- heureReveil +=1;
- if (heureReveil >= 24){
- heureReveil = 0;
- if (joursReveilActif[(jourSemActuel + 2)] == false){
- joursReveilActif[(jourSemActuel + 2)] == true;
- jourActifForce = true;
- }
- }
- }
- repetOn = true;
- }
- break; // stop => etape suivante
- // Bouton 1 --------------------------------------------------------------------------------------------------------------
- case 1: // cle = 1; bouton 2 "gauche"
- if (modeAff <= 3){
- if (modeAff > 0) { // on vérifie qu'on soit pas au bout
- modeAff -= 1; // on retire 1
- } else { // sinon
- modeAff = nombreMode; // on passe au max
- }
- lcd.clear(); // efface ecran
- // ---------- Ecran de réglage du réveil --------------------------------------------------------------------------------
- } else if (modeAff == 8 || modeAff == 11){
- if (positionReglageReveil > 1){
- positionReglageReveil --;
- } else {
- positionReglageReveil = 14;
- }
- } else if (modeAff == 9){
- positionReglageReveil = 1;
- modeAff=8;
- recupeTexte(messageUser1);
- k = 0;
- }
- break; // stop => etape suivante
- // Bouton 2 --------------------------------------------------------------------------------------------------------------
- case 2: // cle = 2; bouton 3 "bas"
- // ---------- Ecran d'affichage quelconque -------------------------------------------------------------------------------
- if (modeAff <= 3) { // si on vient d'un mode affichage "horloge"
- modeAffMem = modeAff; // on garde cette valeur en memoire
- modeAff = (nombreMode + 2); // 4
- lcd.clear(); // on vide l'ecran pour l'affichage du mode a venir
- // ---------- Ecran de réglage du réveil --------------------------------------------------------------------------------
- } else if (modeAff == 8 || modeAff == 11) {
- if (positionReglageReveil == 1){
- reveilActifReglage = !reveilActifReglage;
- } else if (positionReglageReveil == 14){
- if (numeroRepetReglage > 0){
- numeroRepetReglage -= 1;
- }
- } else if (positionReglageReveil == 2){
- if (heureReveilReglage > 10){
- heureReveilReglage -= 10;
- }
- } else if (positionReglageReveil == 3){
- if (heureReveilReglage > 0){
- heureReveilReglage -= 1;
- }
- } else if (positionReglageReveil == 4){
- if (minuteReveilReglage > 10){
- minuteReveilReglage -= 10;
- }
- } else if (positionReglageReveil == 5){
- if (minuteReveilReglage > 0){
- minuteReveilReglage -=1;
- }
- } else if (positionReglageReveil == 13){
- if (numeroSonnerieReglage > 1){
- numeroSonnerieReglage --;
- ecouteSonnerieTest = true;
- tourEcoute1 = 0;
- tourEcoute0 = 0;
- }
- } else if (positionReglageReveil > 5 && positionReglageReveil < 13){
- joursReveilActifReglage[positionReglageReveil-6] = !joursReveilActifReglage[positionReglageReveil-6];
- }
- }
- break; // stop => etape suivante
- // Bouton 3 --------------------------------------------------------------------------------------------------------------
- case 3: // cle = 3; bouton 4 "droite"
- // ---------- Ecran d'affichage quelconque -------------------------------------------------------------------------------
- if (modeAff <= 3){
- if (modeAff < nombreMode) { // si on est pas au "bout haut" des modes (nombreMode)
- modeAff += 1; // on passe au niveau suivant (+1)
- } else { // sinon
- modeAff = 0; // on remet le mode au "bout bas" des modes (0)
- }
- lcd.clear(); // efface ecran
- }
- // ---------- Ecran de réglage du réveil --------------------------------------------------------------------------------
- if (modeAff == 8 || modeAff == 11){
- if (positionReglageReveil < 14){
- positionReglageReveil ++;
- } else {
- positionReglageReveil = 1;
- }
- // ---------- Ecran de validation du réglage du réveil -------------------------------------------------------------------
- } else if (modeAff == 9){
- reveilActif = reveilActifReglage;
- numeroSonnerie = numeroSonnerieReglage;
- numeroRepet = numeroRepetReglage;
- heureReveil = heureReveilReglage;
- minuteReveil = minuteReveilReglage;
- for (int w = 0; w < 7; w++){
- joursReveilActif[w] = joursReveilActifReglage[w];
- }
- for (int m = 0; m < 18; m++){
- switch (m){
- case 0:
- if (reveilActif == 0){
- EEPROM.update(m, 0);
- } else {
- EEPROM.update(m, 1);
- }
- break;
- case 1:
- EEPROM.update(m, heureReveil);
- break;
- case 2:
- EEPROM.update(m, minuteReveil);
- break;
- case 3:
- if (joursReveilActif[0] == 0){
- EEPROM.update(m, 0);
- } else {
- EEPROM.update(m, 1);
- }
- break;
- case 4:
- if (joursReveilActif[1] == 0){
- EEPROM.update(m, 0);
- } else {
- EEPROM.update(m, 1);
- }
- break;
- case 5:
- if (joursReveilActif[2] == 0){
- EEPROM.update(m, 0);
- } else {
- EEPROM.update(m, 1);
- }
- break;
- case 6:
- if (joursReveilActif[3] == 0){
- EEPROM.update(m, 0);
- } else {
- EEPROM.update(m, 1);
- }
- break;
- case 7:
- if (joursReveilActif[4] == 0){
- EEPROM.update(m, 0);
- } else {
- EEPROM.update(m, 1);
- }
- break;
- case 8:
- if (joursReveilActif[5] == 0){
- EEPROM.update(m, 0);
- } else {
- EEPROM.update(m, 1);
- }
- break;
- case 9:
- if (joursReveilActif[6] == 0){
- EEPROM.update(m, 0);
- } else {
- EEPROM.update(m, 1);
- }
- break;
- case 16:
- EEPROM.update(m, numeroSonnerie);
- break;
- case 17:
- EEPROM.update(m, numeroRepet);
- break;
- }
- }
- timerBoucle = 500;
- positionReglageReveil = 1;
- modeAff = modeAffMem;
- lcd.clear();
- }
- break; // stop => etape suivante
- // Bouton 4 --------------------------------------------------------------------------------------------------------------
- case 4: // pas encore utilisé bouton du milieu
- // ---------- Ecran Mini ou Maxi ----------------------------------------------------------------------------------------
- if (modeAff > nombreMode && modeAff <= (nombreMode + 2)) { // Si on est en mode mini ou maxi
- modeAff = modeAffMem; // on rappelle le mode d'affichage mémorisé
- lcd.clear();
- // ---------- Ecran Réglage reveil ---------------------------------------------------------------------------------------
- } else if (modeAff == 8 || modeAff == 11){
- modeAff = 9;
- recupeTexte(messageUser2);
- k = 0;
- } else if (modeAff == 9){
- modeAff = modeAffMem;
- lcd.clear();
- }
- // ---------- Ecran d'alarme ---------------------------------------------------------------------------------------------
- else if (modeAff == 10){
- modeAff = modeAffMem;
- timerBoucle = 500;
- if (repetOn == true){
- heureReveil = heureMemoireRepet;
- minuteReveil = minuteMemoireRepet;
- repetOn = false;
- }
- if (jourActifForce = true){
- joursReveilActif[(jourSemActuel + 1)] == false;
- }
- noTone(pinBuzzer);
- lcd.clear();
- }
- break; // stop => etape suivante
- }
- // =========================== Mode Réglage =============================================================================
- } else {
- switch (memoireNumBouton) {
- // Bouton 0 --------------------------------------------------------------------------------------------------------------
- case 0:
- // ---------- Ecran de Réglage -------------------------------------------------------------------------------------------
- if (modeAff == 6) {
- switch (positionR) {
- case 1:
- if (jourSemR < 7) {
- jourSemR += 1;
- }
- break;
- case 2:
- if (jourR <= 21) {
- jourR += 10;
- }
- break;
- case 3:
- if (jourR <= 30) {
- jourR += 1;
- }
- break;
- case 4:
- if (moisR <= 2) {
- moisR += 10;
- }
- break;
- case 5:
- if (moisR <= 11) {
- moisR += 1;
- }
- break;
- case 6:
- anneeR += 10;
- break;
- case 7:
- anneeR += 1;
- break;
- case 8:
- if (heureR <= 13) {
- heureR += 10;
- }
- break;
- case 9:
- if (heureR < 23) {
- heureR ++;
- }
- break;
- case 10:
- if (minuteR < 50) {
- minuteR += 10;
- }
- break;
- case 11:
- if (minuteR < 59) {
- minuteR ++;
- }
- break;
- }
- }
- break;
- // Bouton 1 --------------------------------------------------------------------------------------------------------------
- case 1:
- // ---------- Ecran de Réglage -------------------------------------------------------------------------------------------
- if (modeAff == 6) {
- if (positionR > 1) {
- positionR--;
- }
- // ---------- Ecran de validation du réglage ----------------------------------------------------------------------------
- } else if (modeAff == 7) {
- modeAff = 6;
- k = 0;
- recupeTexte(messageUser1);
- lcd.clear();
- }
- break;
- // Bouton 2 --------------------------------------------------------------------------------------------------------------
- case 2:
- // ---------- Ecran de Réglage -------------------------------------------------------------------------------------------
- if (modeAff == 6) {
- switch (positionR) {
- case 1:
- if (jourSemR > 1) {
- jourSemR -= 1;
- }
- break;
- case 2:
- if (jourR > 10) {
- jourR -= 10;
- }
- break;
- case 3:
- if (jourR > 1) {
- jourR -= 1;
- }
- break;
- case 4:
- if (moisR > 10) {
- moisR -= 10;
- }
- break;
- case 5:
- if (moisR > 1) {
- moisR -= 1;
- }
- break;
- case 6:
- if ((anneeR - 2000) > 30){
- anneeR -= 10;
- }
- break;
- case 7:
- if ((anneeR - 2000) > 1){
- anneeR -= 1;
- }
- break;
- case 8:
- if (heureR >= 10) {
- heureR -= 10;
- }
- break;
- case 9:
- if (heureR > 0) {
- heureR --;
- }
- break;
- case 10:
- if (minuteR >= 10) {
- minuteR -= 10;
- }
- break;
- case 11:
- if (minuteR > 0) {
- minuteR --;
- }
- break;
- }
- }
- break;
- // Bouton 3 --------------------------------------------------------------------------------------------------------------
- case 3:
- // ---------- Ecran de Réglage -------------------------------------------------------------------------------------------
- if (modeAff == 6){
- if (positionR < 11) {
- positionR++;
- }
- modeAff = 6;
- //lcd.clear();
- // ---------- Ecran de validation du réglage ----------------------------------------------------------------------------
- } else if (modeAff == 7){
- RTC.stop();
- if (minuteActuel != minuteR){
- RTC.set(DS1307_MIN, minuteR);
- RTC.set(DS1307_SEC, 1);
- }
- if (heureActuel != heureR){
- RTC.set(DS1307_HR, heureR);
- RTC.set(DS1307_SEC, 1);
- }
- if (jourSemActuel != jourSemR){
- RTC.set(DS1307_DOW,jourSemR);
- }
- if (jourActuel != jourR){
- RTC.set(DS1307_DATE,jourR);
- }
- if (moisActuel != moisR){
- RTC.set(DS1307_MTH,moisR);
- }
- if (anneeActuel != anneeR){
- RTC.set(DS1307_YR,anneeR);
- }
- RTC.start();
- update_mode == 0;
- modeAff = modeAffMem;
- lcd.clear();
- }
- break;
- // Bouton 4 --------------------------------------------------------------------------------------------------------------
- case 4:
- // ---------- Ecran de Réglage -------------------------------------------------------------------------------------------
- if (modeAff == 6) {
- modeAff = 7;
- }
- recupeTexte(messageUser2);
- k = 0;
- lcd.clear();
- break;
- }
- }
- // =========================== Clic Long =================================================================================
- } else if (dureePression >= 500) {
- // =========================== Mode Affichage ============================================================================
- if (update_mode == 0) {
- switch (memoireNumBouton) {
- case 0:
- // ---------- Ecran d'affichage quelconque -------------------------------------------------------------------------------
- if (modeAff <= 3) {
- modeAffMem = modeAff;
- reveilActifReglage = reveilActif;
- numeroRepetReglage = numeroRepet;
- heureReveilReglage = heureReveil;
- minuteReveilReglage = minuteReveil;
- numeroSonnerieReglage = numeroSonnerie;
- for (int y = 0; y < 7; y++){
- joursReveilActifReglage[y] = joursReveilActif[y];
- }
- positionReglageReveil = 1;
- }
- modeAff = 8;
- recupeTexte(messageUser1);
- k = 0;
- timerBoucle = 675;
- lcd.clear();
- break;
- // Bouton 4 --------------------------------------------------------------------------------------------------------------
- case 4:
- // ---------- Ecran d'affichage quelconque -------------------------------------------------------------------------------
- if (modeAff <= 3) {
- modeAffMem = modeAff;
- anneeR = anneeActuel;
- moisR = moisActuel;
- jourR = jourActuel;
- jourSemR = jourSemActuel;
- heureR = heureActuel;
- minuteR = minuteActuel;
- secondeR = 0;
- positionR = 1;
- cligno = millis();
- modeAff = 6;
- update_mode = 1;
- recupeTexte(messageUser1);
- k = 0;
- lcd.clear();
- // ---------- Ecran de Réglage du réveil ---------------------------------------------------------------------------------
- } else if (modeAff == 8 || modeAff == 11){
- timerBoucle = 500;
- modeAff = modeAffMem;
- lcd.clear();
- } else if (modeAff == 9){
- modeAff = modeAffMem;
- lcd.clear();
- }
- break;
- }
- // =========================== Mode Réglage ==============================================================================
- } else if (update_mode == 1) {
- switch (memoireNumBouton) {
- // Bouton 4 --------------------------------------------------------------------------------------------------------------
- case 4:
- modeAff = modeAffMem;
- update_mode = 0;
- lcd.clear();
- break;
- }
- }
- }
- // =========================== Double Clic =============================================================================
- if (dureePression < 250 ) {
- if (memoireNumBouton == ancienneMemoireNumBouton) { // Double clic
- /*switch (memoireNumBouton){
- case 4:
- }*/
- }
- }
- }
- }
- // ===================================================================================================================
- // =========================== Affichage =============================================================================
- // ===================================================================================================================
- if (millis() - cycle >= timerBoucle) { // toutes les secondes
- cycle = millis();
- switch (modeAff) {
- case 0:
- //showReveilEcran2();
- showAll1(); // Affichage mode 1
- break;
- case 1:
- showAll2(); // Affichage mode 2
- break;
- case 2:
- showAll3(); // Affichage mode 3
- break;
- case 3:
- showDefil1(); // Affichage mode 4
- break;
- case 4:
- showMax(); // Affichage mode Max
- break;
- case 5:
- showMin(); // Affichage mode Min
- break;
- case 6:
- showNow(); // Affichage mode "Réglage"
- break;
- case 7:
- affValidRegl(); // Affichage mode "Validation Réglage"
- break;
- case 8:
- showReveilEcran1(); // Affiche le mode de raglage du reveil écran 1
- break;
- case 9:
- validReglageReveil(); // Affiche le mode de validation du réglage de reveil
- break;
- case 10:
- showAlarme(); // Affiche le mode de validation du réglage de reveil
- break;
- case 11:
- showReveilEcran2(); // Affiche le mode de raglage du reveil écran 2
- break;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement