![]() |
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 Définir et gérer les dates et les heures de M/A pour 2 relais, définir et gérer les températures de M/A pour 2 relais, afficher l'heure (module DS3231) et la température (module BME280) sur 4 afficheurs 7 segments (module TM1637). Niveau ![]() Matériel utilisé
Programme (sketch) // définir et gérer les dates et les heures de M/A pour 2 relais, // définir et gérer les températures de M/A pour 2 relais, // afficher l'heure (module DS3231) et la température (module BME280) sur 4 afficheurs 7 segments (module TM1637) #include <Wire.h> #include <SparkFunBME280.h> #include <TM1637Display.h> #include <EEPROM.h> #define CLK 3 #define DIO 2 #define R1 7 #define R2 6 #define R3 5 #define R4 4 #define texte_dm "Date (JJ/MM/AAAA) de marche pour le relais " #define texte_hm "Heure (HH:MM) de marche pour le relais " #define texte_da "Date (JJ/MM/AAAA) d'arrêt pour le relais " #define texte_ha "Heure (HH:MM) d'arrêt pour le relais " #define texte_tm "Température (10 à 30 °C) de marche pour le relais " #define texte_ta "Température (10 à 30 °C) d'arrêt pour le relais " #define texte_saisie_dm "Entrez la date (JJ/MM/AAAA) de marche pour le relais " #define texte_saisie_hm "Entrez l'heure (HH:MM) de marche pour le relais " #define texte_saisie_da "Entrez la date (JJ/MM/AAAA) d'arrêt pour le relais " #define texte_saisie_ha "Entrez l'heure (HH:MM) d'arrêt pour le relais " #define texte_saisie_tm "Entrez la température (10 à 30 °C) de marche pour le relais " #define texte_saisie_ta "Entrez la température (10 à 30 °C) d'arrêt pour le relais " #define texte_erreur "Erreur sur la saisie !" BME280 bme280; TM1637Display aff7seg(CLK,DIO); const unsigned char degre_celcius[]={SEG_A|SEG_B|SEG_F|SEG_G,SEG_A|SEG_D|SEG_E|SEG_F}; unsigned char date_ds3231[11],heure_ds3231[9]; unsigned char date_mr1[11],heure_mr1[6],date_ar1[11],heure_ar1[6]; unsigned char date_mr2[11],heure_mr2[6],date_ar2[11],heure_ar2[6]; unsigned char tab_temp[3]; int temp_mr3,temp_ar3,temp_mr4,temp_ar4; 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 setup() { unsigned char valeur,i=0,car=0,saisie=0; int adr_eeprom=1; 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(); bme280.settings.I2CAddress=0x76; // 0x77 si SDO = 1 bme280.settings.runMode=3; bme280.settings.tStandby=5; // une mesure par seconde bme280.settings.filter=0; bme280.settings.tempOverSample=1; bme280.settings.pressOverSample=1; bme280.settings.humidOverSample=1; bme280.begin(); aff7seg.setBrightness(3); // 0 à 7 aff7seg.clear(); Serial.begin(9600); while (Serial.available()>0) Serial.read(); Serial.write(13); Serial.write(10); // charger les paramètres depuis l'EEPROM valeur=EEPROM[0]; if (valeur==1) { // date de marche pour le relais 1 Serial.write(texte_dm); Serial.write("1 : "); while (i<10) date_mr1[i++]=EEPROM[adr_eeprom++]; date_mr1[i]=0; Serial.write(date_mr1,strlen(date_mr1)); Serial.write(13); Serial.write(10); // heure de marche pour le relais 1 Serial.write(texte_hm); Serial.write("1 : "); i=0; while (i<5) heure_mr1[i++]=EEPROM[adr_eeprom++]; heure_mr1[i]=0; Serial.write(heure_mr1,strlen(heure_mr1)); Serial.write(13); Serial.write(10); // date d'arrêt pour le relais 1 Serial.write(texte_da); Serial.write("1 : "); i=0; while (i<10) date_ar1[i++]=EEPROM[adr_eeprom++]; date_ar1[i]=0; Serial.write(date_ar1,strlen(date_ar1)); Serial.write(13); Serial.write(10); // heure d'arrêt pour le relais 1 Serial.write(texte_ha); Serial.write("1 : "); i=0; while (i<5) heure_ar1[i++]=EEPROM[adr_eeprom++]; heure_ar1[i]=0; Serial.write(heure_ar1,strlen(heure_ar1)); Serial.write(13); Serial.write(10); Serial.write(13); Serial.write(10); // date de marche pour le relais 2 Serial.write(texte_dm); Serial.write("2 : "); i=0; while (i<10) date_mr2[i++]=EEPROM[adr_eeprom++]; date_mr2[i]=0; Serial.write(date_mr2,strlen(date_mr2)); Serial.write(13); Serial.write(10); // heure de marche pour le relais 2 Serial.write(texte_hm); Serial.write("2 : "); i=0; while (i<5) heure_mr2[i++]=EEPROM[adr_eeprom++]; heure_mr2[i]=0; Serial.write(heure_mr2,strlen(heure_mr2)); Serial.write(13); Serial.write(10); // date d'arrêt pour le relais 2 Serial.write(texte_da); Serial.write("2 : "); i=0; while (i<10) date_ar2[i++]=EEPROM[adr_eeprom++]; date_ar2[i]=0; Serial.write(date_ar2,strlen(date_ar2)); Serial.write(13); Serial.write(10); // heure d'arrêt pour le relais 2 Serial.write(texte_ha); Serial.write("2 : "); i=0; while (i<5) heure_ar2[i++]=EEPROM[adr_eeprom++]; heure_ar2[i]=0; Serial.write(heure_ar2,strlen(heure_ar2)); Serial.write(13); Serial.write(10); Serial.write(13); Serial.write(10); // température de marche pour le relais 3 Serial.write(texte_tm); Serial.write("3 : "); i=0; while (i<2) tab_temp[i++]=EEPROM[adr_eeprom++]; tab_temp[i]=0; temp_mr3=atoi(tab_temp); Serial.write(tab_temp,strlen(tab_temp)); Serial.write(13); Serial.write(10); // température d'arrêt pour le relais 3 Serial.write(texte_ta); Serial.write("3 : "); i=0; while (i<2) tab_temp[i++]=EEPROM[adr_eeprom++]; tab_temp[i]=0; temp_ar3=atoi(tab_temp); Serial.write(tab_temp,strlen(tab_temp)); Serial.write(13); Serial.write(10); Serial.write(13); Serial.write(10); // température de marche pour le relais 4 Serial.write(texte_tm); Serial.write("4 : "); i=0; while (i<2) tab_temp[i++]=EEPROM[adr_eeprom++]; tab_temp[i]=0; temp_mr4=atoi(tab_temp); Serial.write(tab_temp,strlen(tab_temp)); Serial.write(13); Serial.write(10); // température d'arrêt pour le relais 4 Serial.write(texte_ta); Serial.write("4 : "); i=0; while (i<2) tab_temp[i++]=EEPROM[adr_eeprom++]; tab_temp[i]=0; temp_ar4=atoi(tab_temp); Serial.write(tab_temp,strlen(tab_temp)); 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); saisie=tolower(saisie); if (saisie=='o') { Serial.write(13); Serial.write(10); car=0; i=0; } else return; } // définir la date de marche pour le relais 1 Serial.write(texte_saisie_dm); Serial.write("1 : "); while (car!=13) if (Serial.available()>0) { car=Serial.read(); if ((car!=13) && (i<10)) date_mr1[i++]=car; } date_mr1[i]=0; Serial.write(date_mr1,strlen(date_mr1)); Serial.write(13); Serial.write(10); if (strlen(date_mr1)<10) { Serial.write(13); Serial.write(10); Serial.write(texte_erreur); Serial.write(13); Serial.write(10); delayMilliseconds(1000); reset_mc(); } // définir l'heure de marche pour le relais 1 Serial.write(texte_saisie_hm); Serial.write("1 : "); car=0; i=0; while (car!=13) if (Serial.available()>0) { car=Serial.read(); if ((car!=13) && (i<5)) heure_mr1[i++]=car; } heure_mr1[i]=0; Serial.write(heure_mr1,strlen(heure_mr1)); Serial.write(13); Serial.write(10); if (strlen(heure_mr1)<5) { Serial.write(13); Serial.write(10); Serial.write(texte_erreur); Serial.write(13); Serial.write(10); delayMilliseconds(1000); reset_mc(); } // définir la date d'arrêt pour le relais 1 Serial.write(texte_saisie_da); Serial.write("1 : "); car=0; i=0; while (car!=13) if (Serial.available()>0) { car=Serial.read(); if ((car!=13) && (i<10)) date_ar1[i++]=car; } date_ar1[i]=0; Serial.write(date_ar1,strlen(date_ar1)); Serial.write(13); Serial.write(10); if (strlen(date_ar1)<10) { Serial.write(13); Serial.write(10); Serial.write(texte_erreur); Serial.write(13); Serial.write(10); delayMilliseconds(1000); reset_mc(); } // définir l'heure d'arrêt pour le relais 1 Serial.write(texte_saisie_ha); Serial.write("1 : "); car=0; i=0; while (car!=13) if (Serial.available()>0) { car=Serial.read(); if ((car!=13) && (i<5)) heure_ar1[i++]=car; } heure_ar1[i]=0; Serial.write(heure_ar1,strlen(heure_ar1)); Serial.write(13); Serial.write(10); Serial.write(13); Serial.write(10); if (strlen(heure_ar1)<5) { Serial.write(texte_erreur); Serial.write(13); Serial.write(10); delayMilliseconds(1000); reset_mc(); } // définir la date de marche pour le relais 2 Serial.write(texte_saisie_dm); Serial.write("2 : "); car=0; i=0; while (car!=13) if (Serial.available()>0) { car=Serial.read(); if ((car!=13) && (i<10)) date_mr2[i++]=car; } date_mr2[i]=0; Serial.write(date_mr2,strlen(date_mr2)); Serial.write(13); Serial.write(10); if (strlen(date_mr2)<10) { Serial.write(13); Serial.write(10); Serial.write(texte_erreur); Serial.write(13); Serial.write(10); delayMilliseconds(1000); reset_mc(); } // définir l'heure de marche pour le relais 2 Serial.write(texte_saisie_hm); Serial.write("2 : "); car=0; i=0; while (car!=13) if (Serial.available()>0) { car=Serial.read(); if ((car!=13) && (i<5)) heure_mr2[i++]=car; } heure_mr2[i]=0; Serial.write(heure_mr2,strlen(heure_mr2)); Serial.write(13); Serial.write(10); if (strlen(heure_mr2)<5) { Serial.write(13); Serial.write(10); Serial.write(texte_erreur); Serial.write(13); Serial.write(10); delayMilliseconds(1000); reset_mc(); } // définir la date d'arrêt pour le relais 2 Serial.write(texte_saisie_da); Serial.write("2 : "); car=0; i=0; while (car!=13) if (Serial.available()>0) { car=Serial.read(); if ((car!=13) && (i<10)) date_ar2[i++]=car; } date_ar2[i]=0; Serial.write(date_ar2,strlen(date_ar2)); Serial.write(13); Serial.write(10); if (strlen(date_ar2)<10) { Serial.write(13); Serial.write(10); Serial.write(texte_erreur); Serial.write(13); Serial.write(10); delayMilliseconds(1000); reset_mc(); } // définir l'heure d'arrêt pour le relais 2 Serial.write(texte_saisie_ha); Serial.write("2 : "); car=0; i=0; while (car!=13) if (Serial.available()>0) { car=Serial.read(); if ((car!=13) && (i<5)) heure_ar2[i++]=car; } heure_ar2[i]=0; Serial.write(heure_ar2,strlen(heure_ar2)); Serial.write(13); Serial.write(10); Serial.write(13); Serial.write(10); if (strlen(heure_ar2)<5) { Serial.write(texte_erreur); Serial.write(13); Serial.write(10); delayMilliseconds(1000); reset_mc(); } // définir la température de marche pour le relais 3 Serial.write(texte_saisie_tm); Serial.write("3 : "); car=0; i=0; while (car!=13) if (Serial.available()>0) { car=Serial.read(); if ((car!=13) && (i<2)) tab_temp[i++]=car; } tab_temp[i]=0; Serial.write(tab_temp,strlen(tab_temp)); Serial.write(13); Serial.write(10); temp_mr3=atoi(tab_temp); if ((temp_mr3<10) || (temp_mr3>30)) { Serial.write(13); Serial.write(10); Serial.write(texte_erreur); Serial.write(13); Serial.write(10); delayMilliseconds(1000); reset_mc(); } // définir la température d'arrêt pour le relais 3 Serial.write(texte_saisie_ta); Serial.write("3 : "); car=0; i=0; while (car!=13) if (Serial.available()>0) { car=Serial.read(); if ((car!=13) && (i<2)) tab_temp[i++]=car; } tab_temp[i]=0; Serial.write(tab_temp,strlen(tab_temp)); Serial.write(13); Serial.write(10); Serial.write(13); Serial.write(10); temp_ar3=atoi(tab_temp); if ((temp_ar3<10) || (temp_ar3>30)) { Serial.write(texte_erreur); Serial.write(13); Serial.write(10); delayMilliseconds(1000); reset_mc(); } // définir la température de marche pour le relais 4 Serial.write(texte_saisie_tm); Serial.write("4 : "); car=0; i=0; while (car!=13) if (Serial.available()>0) { car=Serial.read(); if ((car!=13) && (i<2)) tab_temp[i++]=car; } tab_temp[i]=0; Serial.write(tab_temp,strlen(tab_temp)); Serial.write(13); Serial.write(10); temp_mr4=atoi(tab_temp); if ((temp_mr4<10) || (temp_mr4>30)) { Serial.write(13); Serial.write(10); Serial.write(texte_erreur); Serial.write(13); Serial.write(10); delayMilliseconds(1000); reset_mc(); } // définir la température d'arrêt pour le relais 4 Serial.write(texte_saisie_ta); Serial.write("4 : "); car=0; i=0; while (car!=13) if (Serial.available()>0) { car=Serial.read(); if ((car!=13) && (i<2)) tab_temp[i++]=car; } tab_temp[i]=0; Serial.write(tab_temp,strlen(tab_temp)); Serial.write(13); Serial.write(10); Serial.write(13); Serial.write(10); temp_ar4=atoi(tab_temp); if ((temp_ar4<10) || (temp_ar4>30)) { Serial.write(texte_erreur); Serial.write(13); Serial.write(10); delayMilliseconds(1000); reset_mc(); } Serial.write("Enregistrer les paramètres dans l'EEPROM (o/N) ? "); car=0; saisie=0; while (car!=13) if (Serial.available()>0) { car=Serial.read(); if (car!=13) saisie=car; } Serial.write(saisie); Serial.write(13); Serial.write(10); saisie=tolower(saisie); if (saisie=='o') { EEPROM.update(0,1); adr_eeprom=1; i=0; while (i<10) EEPROM.update(adr_eeprom++,date_mr1[i++]); i=0; while (i<5) EEPROM.update(adr_eeprom++,heure_mr1[i++]); i=0; while (i<10) EEPROM.update(adr_eeprom++,date_ar1[i++]); i=0; while (i<5) EEPROM.update(adr_eeprom++,heure_ar1[i++]); i=0; while (i<10) EEPROM.update(adr_eeprom++,date_mr2[i++]); i=0; while (i<5) EEPROM.update(adr_eeprom++,heure_mr2[i++]); i=0; while (i<10) EEPROM.update(adr_eeprom++,date_ar2[i++]); i=0; while (i<5) EEPROM.update(adr_eeprom++,heure_ar2[i++]); i=0; itoa(temp_mr3,tab_temp,10); while (i<2) EEPROM.update(adr_eeprom++,tab_temp[i++]); i=0; itoa(temp_ar3,tab_temp,10); while (i<2) EEPROM.update(adr_eeprom++,tab_temp[i++]); i=0; itoa(temp_mr4,tab_temp,10); while (i<2) EEPROM.update(adr_eeprom++,tab_temp[i++]); i=0; itoa(temp_ar4,tab_temp,10); while (i<2) EEPROM.update(adr_eeprom++,tab_temp[i++]); } } void loop() { int test_date,test_heure,temperature,heures,minutes; lire_ds3231(); heure_ds3231[5]=0; // 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); } temperature=bme280.readTempC(); if (temperature<=temp_mr3) digitalWrite(R3,LOW); if (temperature>=temp_ar3) digitalWrite(R3,HIGH); if (temperature<=temp_mr4) digitalWrite(R4,LOW); if (temperature>=temp_ar4) digitalWrite(R4,HIGH); heure_ds3231[2]=0; heures=atoi(heure_ds3231); heure_ds3231[0]=heure_ds3231[3]; heure_ds3231[1]=heure_ds3231[4]; minutes=atoi(heure_ds3231); aff7seg.showNumberDecEx(heures,64,false,2,0); aff7seg.showNumberDec(minutes,true,2,2); delayMilliseconds(2000); aff7seg.showNumberDec(temperature,false,2,0); aff7seg.setSegments(degre_celcius,2,2); delayMilliseconds(2000); } |
Haut de page |
![]() |
![]() |
![]() |