![]() |
Dernière révision : mars 2025 |
![]() |
![]() |
![]() |
![]() |
![]() | ![]() |
Sommaire Introduction L’électronique et l’informatique ont profondément modifié notre société. C’est certainement la révolution industrielle la plus rapide de l’histoire de l’humanité. Aujourd'hui, les systèmes embarqués sont omniprésents dans notre vie quotidienne et nous emmènent vers un monde de plus en plus connecté, avec ses avantages et ses inconvénients... L’auteur ne pourra en aucun cas être tenu responsable des dommages qui résulteraient de l’utilisation des informations publiées sur ce site, sous licence Creative Commons BY-NC-SA. Toute reproduction ou modification d'un document, même partielle, est autorisée à condition que son origine et le nom de l'auteur soient clairement indiqués (BY), qu'il soit utilisé à des fins non commerciales (NC), que son mode de diffusion soit identique au document initial (SA), et que cela ne porte pas atteinte à l’auteur. Ce document présente un projet utilisant une carte Arduino, en espérant toujours être le plus clair et précis possible. Malgré tout le soin apporté à la rédaction, l'auteur vous remercie de bien vouloir le contacter si vous relevez la moindre erreur ou omission, et vous souhaite une agréable lecture. Objectif Mettre à jour la date et l'heure (module DS3231), définir et gérer les dates et les heures de M/A pour 4 relais. Niveau ![]() Matériel utilisé
Programme (sketch) // mettre à jour la date et l'heure (module DS3231), // définir et gérer les dates et les heures de M/A pour 4 relais #include <Wire.h> #include <EEPROM.h> #define R1 4 #define R2 5 #define R3 6 #define R4 7 #define texte_erreur "Erreur sur la saisie !" #define texte_date " (JJ/MM/AAAA) : " #define texte_heure " (HH:MM:SS) : " #define texte_dm "Date de marche pour le relais " #define texte_hm "Heure de marche pour le relais " #define texte_da "Date d'arrêt pour le relais " #define texte_ha "Heure d'arrêt pour le relais " #define texte_saisie_dm "Entrez la date de marche pour le relais " #define texte_saisie_hm "Entrez l'heure de marche pour le relais " #define texte_saisie_da "Entrez la date d'arrêt pour le relais " #define texte_saisie_ha "Entrez l'heure d'arrêt pour le relais " unsigned char date_ds3231[11],heure_ds3231[9]; unsigned char date_mr1[11],heure_mr1[9],date_ar1[11],heure_ar1[9]; unsigned char date_mr2[11],heure_mr2[9],date_ar2[11],heure_ar2[9]; unsigned char date_mr3[11],heure_mr3[9],date_ar3[11],heure_ar3[9]; unsigned char date_mr4[11],heure_mr4[9],date_ar4[11],heure_ar4[9]; void delayMilliseconds(unsigned temps) { unsigned i=0; while (i<temps) { yield(); delayMicroseconds(1000); i++; } } void reset_mc() { __asm__ __volatile__ ("jmp 0"); //__NVIC_SystemReset(); // Uno R4 //rstc_start_software_reset(RSTC); // Due //ESP.restart(); } void lire_ds3231() { unsigned char date_heure[7],i=0; Wire.beginTransmission(0x68); // adresse I2C du circuit DS3231 (104) Wire.write(0x00); // adresse du premier registre à lire Wire.endTransmission(); // ne pas déplacer (instruction à mettre après le dernier "write") ! Wire.requestFrom(0x68,7); while (Wire.available()>0) date_heure[i++]=Wire.read(); // jour du mois date_ds3231[0]=(date_heure[4]>>4)+48; date_ds3231[1]=(date_heure[4]&0x0F)+48; date_ds3231[2]='/'; // mois date_ds3231[3]=(date_heure[5]>>4)+48; date_ds3231[4]=(date_heure[5]&0x0F)+48; date_ds3231[5]='/'; // année date_ds3231[6]='2'; date_ds3231[7]='0'; date_ds3231[8]=(date_heure[6]>>4)+48; date_ds3231[9]=(date_heure[6]&0x0F)+48; date_ds3231[10]=0; // heures heure_ds3231[0]=(date_heure[2]>>4)+48; heure_ds3231[1]=(date_heure[2]&0x0F)+48; heure_ds3231[2]=':'; // minutes heure_ds3231[3]=(date_heure[1]>>4)+48; heure_ds3231[4]=(date_heure[1]&0x0F)+48; heure_ds3231[5]=':'; // secondes heure_ds3231[6]=(date_heure[0]>>4)+48; heure_ds3231[7]=(date_heure[0]&0x0F)+48; heure_ds3231[8]=0; } void maj_date() { unsigned char car=0,jour=0,valeur; Serial.write("Entrez le jour de la semaine (1 = lundi, 7 = dimanche) : "); while (car!=13) if (Serial.available()>0) { car=Serial.read(); if (car!=13) jour=car; } Serial.write(jour); Serial.write(13); Serial.write(10); Serial.write(13); Serial.write(10); if ((jour<49) || (jour>55)) { Serial.write(texte_erreur); Serial.write(13); Serial.write(10); delayMilliseconds(1000); reset_mc(); } Serial.write("Entrez la date"); saisir_date(date_ds3231); // écrire la date Wire.beginTransmission(0x68); // adresse I2C du circuit ds3231 (104) Wire.write(0x03); // adresse du premier registre à écrire Wire.write(jour-48); // jour de la semaine // jour du mois valeur=date_ds3231[0]-48; valeur<<=4; valeur+=date_ds3231[1]-48; Wire.write(valeur); // mois valeur=date_ds3231[3]-48; valeur<<=4; valeur+=date_ds3231[4]-48; Wire.write(valeur); // année valeur=date_ds3231[8]-48; valeur<<=4; valeur+=date_ds3231[9]-48; Wire.write(valeur); Wire.endTransmission(); } void maj_heure() { unsigned char valeur; Serial.write("Entrez l'heure"); saisir_heure(heure_ds3231); // écrire l'heure Wire.beginTransmission(0x68); // adresse I2C du circuit ds3231 (104) Wire.write(0x00); // adresse du premier registre à écrire // secondes valeur=heure_ds3231[6]-48; valeur<<=4; valeur+=heure_ds3231[7]-48; Wire.write(valeur); // minutes valeur=heure_ds3231[3]-48; valeur<<=4; valeur+=heure_ds3231[4]-48; Wire.write(valeur); // heures valeur=heure_ds3231[0]-48; valeur<<=4; valeur+=heure_ds3231[1]-48; Wire.write(valeur); Wire.endTransmission(); } void saisir_date(unsigned char *ptr) { unsigned char car=0,i=0; Serial.write(texte_date); while (car!=13) if (Serial.available()>0) { car=Serial.read(); if ((car!=13) && (i<10)) ptr[i++]=car; } ptr[i]=0; Serial.write(ptr,strlen(ptr)); Serial.write(13); Serial.write(10); Serial.write(13); Serial.write(10); if (strlen(ptr)<10) { Serial.write(texte_erreur); Serial.write(13); Serial.write(10); delayMilliseconds(1000); reset_mc(); } } void saisir_heure(unsigned char *ptr) { unsigned char car=0,i=0; Serial.write(texte_heure); while (car!=13) if (Serial.available()>0) { car=Serial.read(); if ((car!=13) && (i<8)) ptr[i++]=car; } ptr[i]=0; Serial.write(ptr,strlen(ptr)); Serial.write(13); Serial.write(10); Serial.write(13); Serial.write(10); if (strlen(ptr)<8) { Serial.write(texte_erreur); Serial.write(13); Serial.write(10); delayMilliseconds(1000); reset_mc(); } } void lire_eeprom(unsigned char num_relais) { unsigned char *ptr_dm,*ptr_hm,*ptr_da,*ptr_ha,i=0,car=0,saisie=0; int adr_eeprom; switch (num_relais) { case 0 : ptr_dm=&date_mr1[0]; ptr_hm=&heure_mr1[0]; ptr_da=&date_ar1[0]; ptr_ha=&heure_ar1[0]; break; case 1 : ptr_dm=&date_mr2[0]; ptr_hm=&heure_mr2[0]; ptr_da=&date_ar2[0]; ptr_ha=&heure_ar2[0]; break; case 2 : ptr_dm=&date_mr3[0]; ptr_hm=&heure_mr3[0]; ptr_da=&date_ar3[0]; ptr_ha=&heure_ar3[0]; break; case 3 : ptr_dm=&date_mr4[0]; ptr_hm=&heure_mr4[0]; ptr_da=&date_ar4[0]; ptr_ha=&heure_ar4[0]; } adr_eeprom=(num_relais*36)+1; // date de marche while (i<10) ptr_dm[i++]=EEPROM[adr_eeprom++]; ptr_dm[10]=0; Serial.write(texte_dm); Serial.write(num_relais+49); Serial.write(texte_date); Serial.write(ptr_dm,strlen(ptr_dm)); Serial.write(13); Serial.write(10); Serial.write(13); Serial.write(10); // heure de marche i=0; while (i<8) ptr_hm[i++]=EEPROM[adr_eeprom++]; ptr_hm[8]=0; Serial.write(texte_hm); Serial.write(num_relais+49); Serial.write(texte_heure); Serial.write(ptr_hm,strlen(ptr_hm)); Serial.write(13); Serial.write(10); Serial.write(13); Serial.write(10); // date d'arrêt i=0; while (i<10) ptr_da[i++]=EEPROM[adr_eeprom++]; ptr_da[10]=0; Serial.write(texte_da); Serial.write(num_relais+49); Serial.write(texte_date); Serial.write(ptr_da,strlen(ptr_da)); Serial.write(13); Serial.write(10); Serial.write(13); Serial.write(10); // heure d'arrêt i=0; while (i<8) ptr_ha[i++]=EEPROM[adr_eeprom++]; ptr_ha[8]=0; Serial.write(texte_ha); Serial.write(num_relais+49); Serial.write(texte_heure); Serial.write(ptr_ha,strlen(ptr_ha)); Serial.write(13); Serial.write(10); Serial.write(13); Serial.write(10); Serial.write("Modifier les paramètres (o/N) ? "); while (car!=13) if (Serial.available()>0) { car=Serial.read(); if (car!=13) saisie=car; } Serial.write(saisie); Serial.write(13); Serial.write(10); Serial.write(13); Serial.write(10); if (tolower(saisie)=='o') modif_par(num_relais); } void modif_par(unsigned char num_relais) { unsigned char *ptr_dm,*ptr_hm,*ptr_da,*ptr_ha,i=0; int adr_eeprom; switch (num_relais) { case 0 : ptr_dm=&date_mr1[0]; ptr_hm=&heure_mr1[0]; ptr_da=&date_ar1[0]; ptr_ha=&heure_ar1[0]; break; case 1 : ptr_dm=&date_mr2[0]; ptr_hm=&heure_mr2[0]; ptr_da=&date_ar2[0]; ptr_ha=&heure_ar2[0]; break; case 2 : ptr_dm=&date_mr3[0]; ptr_hm=&heure_mr3[0]; ptr_da=&date_ar3[0]; ptr_ha=&heure_ar3[0]; break; case 3 : ptr_dm=&date_mr4[0]; ptr_hm=&heure_mr4[0]; ptr_da=&date_ar4[0]; ptr_ha=&heure_ar4[0]; } // date de marche Serial.write(texte_saisie_dm); Serial.write(num_relais+49); saisir_date(ptr_dm); // heure de marche Serial.write(texte_saisie_hm); Serial.write(num_relais+49); saisir_heure(ptr_hm); // date d'arrêt Serial.write(texte_saisie_da); Serial.write(num_relais+49); saisir_date(ptr_da); // heure d'arrêt Serial.write(texte_saisie_ha); Serial.write(num_relais+49); saisir_heure(ptr_ha); // enregistrer les paramètres dans l'EEPROM adr_eeprom=(num_relais*36)+1; while (i<10) EEPROM.update(adr_eeprom++,ptr_dm[i++]); i=0; while (i<8) EEPROM.update(adr_eeprom++,ptr_hm[i++]); i=0; while (i<10) EEPROM.update(adr_eeprom++,ptr_da[i++]); i=0; while (i<8) EEPROM.update(adr_eeprom++,ptr_ha[i++]); } void setup() { unsigned char car=0,saisie1=0,saisie2=0,valeur,num_relais=0; pinMode(R1,OUTPUT); digitalWrite(R1,HIGH); pinMode(R2,OUTPUT); digitalWrite(R2,HIGH); pinMode(R3,OUTPUT); digitalWrite(R3,HIGH); pinMode(R4,OUTPUT); digitalWrite(R4,HIGH); Wire.begin(); Serial.begin(9600); while (Serial.available()>0) Serial.read(); Serial.write(13); Serial.write(10); lire_ds3231(); Serial.write("Nous sommes le "); Serial.write(date_ds3231,strlen(date_ds3231)); Serial.write(", modifier (o/N) ? "); while (car!=13) if (Serial.available()>0) { car=Serial.read(); if (car!=13) saisie1=car; } Serial.write(saisie1); Serial.write(13); Serial.write(10); Serial.write(13); Serial.write(10); saisie1=tolower(saisie1); if (saisie1=='o') maj_date(); lire_ds3231(); Serial.write("Il est "); Serial.write(heure_ds3231,strlen(heure_ds3231)); Serial.write(", modifier (o/N) ? "); car=0; while (car!=13) if (Serial.available()>0) { car=Serial.read(); if (car!=13) saisie2=car; } Serial.write(saisie2); Serial.write(13); Serial.write(10); Serial.write(13); Serial.write(10); saisie2=tolower(saisie2); if (saisie2=='o') maj_heure(); if ((saisie1=='o') || (saisie2=='o')) { lire_ds3231(); Serial.write("Nous sommes le "); Serial.write(date_ds3231,strlen(date_ds3231)); Serial.write(", il est "); Serial.write(heure_ds3231,strlen(heure_ds3231)); } // charger les paramètres depuis l'EEPROM valeur=EEPROM[0]; if (valeur==1) while (num_relais<4) lire_eeprom(num_relais++); else { // EEPROM.update(int adresse, octet) : lire, puis écrire si l'octet est différent // EEPROM.put(int adresse, variable) : écrire une donnée de type quelconque (utilise EEPROM.update) // EEPROM.get(int adresse, variable) : lire une donnée de type quelconque EEPROM.update(0,1); while (num_relais<4) modif_par(num_relais++); } } void loop() { int test_date,test_heure; lire_ds3231(); // gérer la date et l'heure de marche pour le relais 1 test_date=strcmp(date_ds3231,date_mr1); if (test_date==0) { test_heure=strcmp(heure_ds3231,heure_mr1); if (test_heure==0) digitalWrite(R1,LOW); } // gérer la date et l'heure d'arrêt pour le relais 1 test_date=strcmp(date_ds3231,date_ar1); if (test_date==0) { test_heure=strcmp(heure_ds3231,heure_ar1); if (test_heure==0) digitalWrite(R1,HIGH); } // gérer la date et l'heure de marche pour le relais 2 test_date=strcmp(date_ds3231,date_mr2); if (test_date==0) { test_heure=strcmp(heure_ds3231,heure_mr2); if (test_heure==0) digitalWrite(R2,LOW); } // gérer la date et l'heure d'arrêt pour le relais 2 test_date=strcmp(date_ds3231,date_ar2); if (test_date==0) { test_heure=strcmp(heure_ds3231,heure_ar2); if (test_heure==0) digitalWrite(R2,HIGH); } // gérer la date et l'heure de marche pour le relais 3 test_date=strcmp(date_ds3231,date_mr3); if (test_date==0) { test_heure=strcmp(heure_ds3231,heure_mr3); if (test_heure==0) digitalWrite(R3,LOW); } // gérer la date et l'heure d'arrêt pour le relais 3 test_date=strcmp(date_ds3231,date_ar3); if (test_date==0) { test_heure=strcmp(heure_ds3231,heure_ar3); if (test_heure==0) digitalWrite(R3,HIGH); } // gérer la date et l'heure de marche pour le relais 4 test_date=strcmp(date_ds3231,date_mr4); if (test_date==0) { test_heure=strcmp(heure_ds3231,heure_mr4); if (test_heure==0) digitalWrite(R4,LOW); } // gérer la date et l'heure d'arrêt pour le relais 4 test_date=strcmp(date_ds3231,date_ar4); if (test_date==0) { test_heure=strcmp(heure_ds3231,heure_ar4); if (test_heure==0) digitalWrite(R4,HIGH); } } |
Haut de page |
![]() |
![]() |
![]() |