granteeric

horloge modifier

Apr 26th, 2023
1,124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Arduino 17.00 KB | None | 0 0
  1. //ma modification du code
  2.  
  3. #include "Wire.h"
  4. #include <RTClib.h>
  5. #include <Adafruit_NeoPixel.h>
  6. //#include "pitches.h"  // copiez le fichier pitches.h dans le répertoire où réside votre projet Arduino, puis redémarrez le logiciel Arduino
  7.  
  8. //declaration des Pins
  9. #define BP_REGLAGE_HEURE 7 // bouton-poussoir de réglage de l'heure
  10. #define BP_INC_MINUTE 2    // bouton-poussoir d'incrémentation des minutes
  11. #define BP_INC_HEURE 3     // bouton-poussoir d'incrémentation de l'heure
  12. #define BP_MARCHE_ARRET 4  // bouton-poussoir marche/arrêt du carillon
  13. #define DHD_DIAL_PIN 8     // broche de commande du cadran de l'horloge
  14. #define STRIP_LITOPHANIES 5  // broche de commande de la bande de lithophanies
  15. #define STRIP_HEURES 11    // broche de commande de la bande d'heures
  16. #define STRIP_MINUTES 9    // broche de commande de la bande de minutes
  17. #define STRIP_SECONDES 6   // broche de commande de la bande de secondes
  18. #define TONE_PIN 10        // broche de commande du buzzer
  19.  
  20. #define DS3231_ADDRESS 0x68 //adresse par défaut du module 3231 RTC
  21. #define BRIGHTNESS 12 //définit la luminosité maximale - un nombre plus élevé est plus lumineux. Si le nombre est trop élevé, il dépassera la consommation actuelle d'Arduino
  22.  
  23. #define CHIME_QUARTER 0
  24. #define CHIME_HALF 5
  25. #define CHIME_THREE_QUARTER 15
  26. #define CHIME_HOUR 30
  27. #define CHIME_END 50
  28.  
  29. //configuration pour le carillon de l'heure et de la demi-heure de Westminster
  30. unsigned int melody[50] =
  31. {
  32.   // 0
  33.   NOTE_GS4, NOTE_FS4, NOTE_E4, NOTE_B3, 0,
  34.   // 5
  35.   NOTE_E4, NOTE_GS4, NOTE_FS4, NOTE_B3, 0, NOTE_E4, NOTE_FS4, NOTE_GS4, NOTE_E4, 0,
  36.   // 15
  37.   NOTE_GS4, NOTE_E4, NOTE_FS4, NOTE_B3, 0, NOTE_B3, NOTE_FS4, NOTE_GS4, NOTE_E4, 0, NOTE_GS4, NOTE_FS4, NOTE_E4, NOTE_B3, 0,
  38.   // 30
  39.   NOTE_E4, NOTE_GS4, NOTE_FS4, NOTE_B3, 0, NOTE_E4, NOTE_FS4, NOTE_GS4, NOTE_E4, 0, NOTE_GS4, NOTE_E4, NOTE_FS4, NOTE_B3, 0, NOTE_B3, NOTE_FS4, NOTE_GS4, NOTE_E4, 0 // 49
  40. };
  41.  
  42. int noteDurations[50] =
  43. {
  44.   4, 4, 4, 2, 8,
  45.   4, 4, 4, 2, 8, 4, 4, 4, 2, 8,
  46.   4, 4, 4, 2, 8, 4, 4, 4, 2, 8, 4, 4, 4, 2, 8,
  47.   4, 4, 4, 2, 8, 4, 4, 4, 2, 8, 4, 4, 4, 2, 8, 4, 4, 4, 2, 8
  48. };
  49.  
  50. bool chime_hour {false};
  51. bool chime_15 {false};
  52. bool chime_30 {false};
  53. bool chime_45 {false};
  54. bool chime_active {true}; //Initialise la variable utilisée pour indiquer si le carillon est activé ou désactivé
  55.  
  56. byte one = 0x01; //variable utilisée pour indiquer le réglage de l'heure pour les minutes dans DS3231
  57. byte two = 0x02; //variable utilisée pour indiquer le réglage de l'heure pour les minutes dans DS3231
  58.  
  59. byte hourval{0}, hourpos{0}, minuteval{0}, secondval{0}; // contient l'heure réelle
  60. byte pixelColorRed{0}, pixelColorGreen{0}, pixelColorBlue{0}; //contient les valeurs de couleur pour NeoPixels
  61.  
  62. byte hourval_set{0};   // détient l'heure définie
  63. byte minuteval_set{0}; // maintient l'heure réglée en minutes
  64.  
  65.  
  66. RTC_DS3231 RTC; // Établir l'objet horloge
  67. DateTime Clock; // Maintient l'heure actuelle de l'horloge
  68.  
  69. Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(60, 6, NEO_GRB + NEO_KHZ800); // objet de bande pour les secondes 60 neopixels contrôlés sur la broche 6
  70. Adafruit_NeoPixel strip2 = Adafruit_NeoPixel(60, 9, NEO_GRB + NEO_KHZ800); // objet de bande pour les minutes 60 neopixels contrôlés sur la broche 9
  71. Adafruit_NeoPixel strip3 = Adafruit_NeoPixel(36, 11, NEO_GRB + NEO_KHZ800); // objet de bande pour les heures 36 neopixels contrôlés sur la broche 11
  72. Adafruit_NeoPixel strip4 = Adafruit_NeoPixel(120, 5, NEO_GRB + NEO_KHZ800); // objet de bande pour les lithophanies 120 neopixels contrôlés sur la broche 5
  73.  
  74. #define STRIP1_OFF strip1.Color(0, 0, 0)
  75. #define STRIP2_OFF strip2.Color(0, 0, 0)
  76. #define STRIP3_OFF strip3.Color(0, 0, 0)
  77.  
  78. #define STRIP1_RED strip1.Color(255, 0, 0)
  79. //#define STRIP2_RED strip2.Color(255, 0, 0)
  80. //#define STRIP3_RED strip3.Color(255, 0, 0)
  81.  
  82. //#define STRIP1_GREEN strip1.Color(0, 255, 0)
  83. #define STRIP2_GREEN strip2.Color(0, 255, 0)
  84. //#define STRIP3_GREEN strip2.Color(0, 255, 0)
  85.  
  86. //#define STRIP1_BLUE strip1.Color(0, 0, 255)
  87. //#define STRIP2_BLUE strip2.Color(0, 0, 255)
  88. #define STRIP3_BLUE strip3.Color(0, 0, 255)
  89.  
  90. // ou
  91.  
  92. const uint32_t red = strip1.Color(255, 0, 0);   //définit la couleur rouge NeoPixel sur la bande 1 pour les secondes
  93. const uint32_t green = strip2.Color(0, 255, 0); //définit la couleur Vert NeoPixel sur la bande 2 pour les minutes
  94. const uint32_t blue = strip3.Color(0, 0, 255);  //définit la couleur NeoPixel Bleu sur la bande 2 pour les heures
  95. const uint32_t of = strip1.Color(0, 0, 0);     //définit NeoPixel Pas de couleur pour la bande 1
  96. const uint32_t off = strip2.Color(0, 0, 0);     //définit NeoPixel Pas de couleur pour la bande 2
  97. const uint32_t offf = strip3.Color(0, 0, 0);     //définit NeoPixel Pas de couleur pour la bande 3
  98.  
  99.  
  100. //prototype de fonction
  101. void set_lights();
  102. void play_chime(const int& startPos,const int& endPos);
  103. void change_hours();
  104. void change_minutes();
  105. void setDateTime_hours();
  106. void setDateTime_minutes();
  107. void clearPixels();
  108. byte decToBcd(byte val);
  109. byte bcdToDec(byte val);
  110.  
  111.  
  112.  
  113. void setup()
  114. {
  115.     pinMode(BP_REGLAGE_HEURE, INPUT_PULLUP); // déclarer la broche 7 comme une entrée avec des pullups internes (fil rouge - bouton-poussoir de réglage de l'heure):
  116.     pinMode(BP_INC_MINUTE, INPUT_PULLUP); // déclarer la broche 2 comme une entrée avec des pullups internes (fil bleu - bouton-poussoir d'incrémentation des minutes):
  117.     pinMode(BP_INC_HEURE, INPUT_PULLUP); // déclarer la broche 3 comme une entrée avec des pullups internes (fil vert - bouton-poussoir d'incrémentation de l'heure):
  118.     pinMode(BP_MARCHE_ARRET, INPUT_PULLUP); // déclarer la broche 4 comme une entrée avec des pullups internes (fil blanc - bouton-poussoir marche/arrêt du carillon) :
  119.     pinMode(DHD_DIAL_PIN, OUTPUT);       // déclarer la broche 8 comme une sortie (DHD Dial Crystal LED):
  120.     pinMode(STRIP_LITOPHANIES, OUTPUT);       // déclarer la broche 5 comme une sortie (NeoPixel Control Pin des lithophanies):
  121.     pinMode(STRIP_SECONDES, OUTPUT);       // déclarer la broche 6 comme une sortie (NeoPixel Control Pin des secondes):
  122.     pinMode(STRIP_MINUTES, OUTPUT);       // déclarer la broche 9 comme une sortie (NeoPixel Control Pin des minutes):
  123.     pinMode(STRIP_HEURES, OUTPUT);       // déclarer la broche 11 comme une sortie (NeoPixel Control Pin des heures):
  124.     pinMode(TONE_PIN, OUTPUT);
  125.     digitalWrite(TONE_PIN, LOW);
  126.  
  127.     Wire.begin();
  128.     RTC.begin();              // commence l'horloge
  129.     Serial.begin(9600);       // définit le numéro de série pour le débogage du programme
  130.     delay(100);
  131.   //     RTC.adjust(DateHeure(__DATE__, __HEURE__)); // Exécutez ceci pour régler l'heure sur l'heure du PC lors de la mise sous tension d'Arduino - activer uniquement pour le débogage et le dépannage
  132.  
  133.  
  134.     strip1.setBrightness(BRIGHTNESS); // définit le niveau de luminosité défini en haut du programme pour la bande 1
  135.     strip2.setBrightness(BRIGHTNESS); // définit le niveau de luminosité défini en haut du programme pour la bande 2
  136.     strip3.setBrightness(BRIGHTNESS); // définit le niveau de luminosité défini en haut du programme pour la bande 3
  137.     strip4.setBrightness(BRIGHTNESS); // définit le niveau de luminosité défini en haut du programme pour la bande 4
  138. }
  139.  
  140.  
  141. void loop()
  142. {
  143.  
  144.   int button_Set_Time = digitalRead(BP_REGLAGE_HEURE);    // Lire le bouton-poussoir de réglage de l'heure
  145.   int button_Minute_Inc = digitalRead(BP_INC_MINUTE);  // Lire le bouton-poussoir d'incrémentation des minutes
  146.   int button_Hour_Inc = digitalRead(BP_INC_HEURE);    // Lire le bouton-poussoir d'incrémentation de l'heure
  147.   int button_Set_Chime = digitalRead(BP_MARCHE_ARRET);   // Lire le bouton poussoir marche/arrêt du carillon
  148.  
  149.   // Obtenir l'heure actuelle du module d'horloge en temps réel
  150.   Clock = RTC.now();           // obtenir l'heure RTC
  151.  
  152.   secondval = Clock.second();  // obtient les secondes
  153.   minuteval = Clock.minute();  // obtenir des minutes
  154.   hourval = Clock.hour();      // obtenir des heures
  155.  
  156. // Ceci est ici pour le débogage en série si nécessaire
  157.    // Serial.print("set time: "); Serial.print(button_Set_Time); Serial.print('\n');
  158.    // Serial.print("heure : "); Serial.print(bouton_Heure_Inc); Serial.print('\n');
  159.    // Serial.print("minute: "); Serial.print(bouton_Minute_Inc); Serial.print('\n');
  160.    // Serial.print("carillon : "); Serial.print(button_Set_Chime); Serial.print('\n');
  161.    // Série.print('\n');
  162.  
  163.   if (hourval > 11) hourval -= 12;             // si hourval> 11 then hourval -= hourval - 12 cela en fait juste une horloge de 12 heures
  164.   hourpos = hourval;
  165.   hourpos = ((hourpos * 36)/12 )+(minuteval/20);   //détermine le point bleu à éclairer par exemple 3:30 est (3 * 60 + 30) / 19.85 = 10.57 donc le pixel est 10 est illuminé puisque Arduino tronque le reste
  166.  
  167.  
  168.   // peut être defini pour chaque bande par un nombre de 1 a 255
  169.  
  170.   // Définit les valeurs initiales pour chaque bade
  171.   strip1.setPixelColor(secondval, STRIP1_RED);
  172.   strip2.setPixelColor(minuteval, STRIP2_GREEN);
  173.   strip3.setPixelColor(hourpos, STRIP3_BLUE);
  174.   strip4.setPixelColor(hourpos, STRIP3_BLUE);  //pas sur pour hourpos pour stip4
  175.  
  176.   strip1.show();
  177.   strip2.show();
  178.   strip3.show();
  179.   strip4.show();
  180.  
  181.   //Vérifiez si les secondes sont juste passées à 0. Si c'est le cas, éteignez les LED des secondes de l'horloge et recommencez
  182.   if (secondval == 0)
  183.   {
  184.     switch (minuteval)
  185.     {
  186.       case 0:
  187.         chime_hour = true;
  188.         break;
  189.       case 15:
  190.         chime_15 = true;
  191.         break;
  192.       case 30:
  193.         chime_30 = true;
  194.         break;
  195.       case 45:
  196.         chime_45 = true;
  197.         break;
  198.       default:
  199.         break;
  200.     }
  201.  
  202.     strip1.setPixelColor(0, STRIP1_RED);
  203.     for (int i = 1; i < 60; i++)
  204.     {
  205.       strip1.setPixelColor(i, STRIP1_OFF);
  206.     }
  207.  
  208.     strip1.show();
  209.   }
  210.  
  211.   set_lights();
  212.   delay(20);
  213.  
  214.   // Jouez à Westminster à l'heure si le carillon est réglé et allumez également la LED
  215.   if (chime_hour && chime_active )
  216.   {
  217.     int limit = hourval;
  218.  
  219.     play_chime(CHIME_HOUR, CHIME_END);
  220. //    delay(1000);
  221.  
  222.     // Sonne l'heure.
  223.     // Zéro est vraiment midi.
  224.     if (limit == 0) limit = 12;
  225.  
  226.  
  227.     for (int i = 0; i < limit; i++)
  228.     {
  229.       unsigned long noteDuration = 1000UL;  //en float pour que la multiplication fonctionne
  230.       tone(TONE_PIN, NOTE_E3, noteDuration);
  231.       set_lights();
  232.       int pauseBetweenNotes = int(noteDuration * 1.30f); // pour distinguer les notes, fixez un temps minimum entre elles.
  233.      
  234.       delay(pauseBetweenNotes); //attention Bloquant pendant la durée de la note le programme ne peut rien faire d'autre
  235.       noTone(TONE_PIN); // arrête la tonalité :
  236.     }
  237.  
  238.     chime_hour = false;
  239.   }
  240.  
  241.   //turn the LED off at 1 minute since it is turned on when the hour changes if the time is set
  242.   if (minuteval == 1) digitalWrite(DHD_DIAL_PIN, LOW);
  243.  
  244.   //Jouez à Westminster au quart d'heure si le carillon est réglé et allumez également la LED
  245. //  if (chime_15 == true && chime_active == true) en dessous c'est la meme chose
  246.   if (chime_15 && chime_active )
  247.   {
  248.     play_chime(CHIME_QUARTER, CHIME_HALF);
  249.     chime_15 = false;
  250.   }
  251.  
  252.   //éteint la LED à 16 minutes puisqu'elle s'allume au changement de 1/4 d'heure si l'heure est réglée
  253.   if (minuteval == 16) digitalWrite(DHD_DIAL_PIN, LOW);
  254.  
  255.  
  256.   //Jouez la dernière moitié de Westminster à l'heure si le carillon est réglé et allumez la LED
  257.   if ( chime_30 && chime_active )
  258.   {
  259.     play_chime(CHIME_HALF, CHIME_THREE_QUARTER);
  260.     chime_30 = false;
  261.   }
  262.  
  263.   //éteint la LED à 31 minutes puisqu'elle s'allume à 30 minutes si le carillon est réglé
  264.   if (minuteval == 31) digitalWrite(DHD_DIAL_PIN, LOW);
  265.  
  266.   //Jouez à Westminster aux 3/4 d'heure si le carillon est réglé et allumez également la LED
  267.   if (chime_45 && chime_active )
  268.   {
  269.     play_chime(CHIME_THREE_QUARTER, CHIME_HOUR);
  270.     chime_45 = false;
  271.   }
  272.  
  273.   //éteint la LED à 46 minutes puisqu'elle s'allume au changement de 3/4 d'heure si l'heure est réglée
  274.   if (minuteval == 46) digitalWrite(DHD_DIAL_PIN, LOW);
  275.  
  276.   //Vérifier les boutons poussoirs
  277.   //vérifier si le bouton régler l'heure et changer les heures est enfoncé
  278.   if (!button_Set_Time && !button_Hour_Inc && button_Minute_Inc && button_Set_Chime )
  279.   {
  280.     clearPixels();
  281.     change_hours();
  282.     delay(300);
  283.   }
  284.  
  285.   //vérifier si le bouton régler l'heure et changer les minutes est enfoncé
  286.   if (!button_Set_Time && button_Hour_Inc  && !button_Minute_Inc && button_Set_Chime)
  287.   {
  288.     clearPixels();
  289.     change_minutes();
  290.     delay(150);
  291.   }
  292.  
  293.   //vérifier si le bouton Définir le carillon est enfoncé et que le carillon n'est pas actuellement actif
  294.   if (button_Set_Time  && button_Hour_Inc  && button_Minute_Inc && !button_Set_Chime && !chime_active )
  295.   {
  296.     delay (500);
  297.     chime_active = true;
  298.     chime_hour = false;
  299.     chime_15 = false;
  300.     chime_30 = false;
  301.     chime_45 = false;
  302.     tone(TONE_PIN, NOTE_G6, 125);
  303.     delay(130);
  304.     tone(TONE_PIN, NOTE_C7, 125);
  305.     delay(130);
  306.     tone(TONE_PIN, NOTE_G7, 125);
  307.     delay(125);
  308.     noTone(TONE_PIN);
  309.     delay (1000);
  310.   }
  311.  
  312.  
  313.   //vérifier si le bouton Set Chime est enfoncé et si le carillon est actuellement actif
  314.   if (button_Set_Time && button_Hour_Inc  && button_Minute_Inc && !button_Set_Chime && chime_active )
  315.   {
  316.     delay (500);
  317.     chime_active = false;
  318.     chime_hour = false;
  319.     chime_15 = false;
  320.     chime_30 = false;
  321.     chime_45 = false;
  322.     tone(TONE_PIN, NOTE_A3, 125);
  323.     delay(130);
  324.     tone(TONE_PIN, NOTE_A2, 200);
  325.     delay(205);
  326.     tone(TONE_PIN, NOTE_A1, 150);
  327.     delay(155);
  328.     noTone(TONE_PIN);
  329.     delay (1000);
  330.   }
  331. }//fin de la boucle loop
  332.  
  333. // Régler les lumières
  334. void set_lights()
  335. {
  336.     //deja declarer en global
  337. /*
  338.   uint32_t red = strip1.Color(255, 0, 0);   //définit la couleur rouge NeoPixel
  339.   uint32_t green = strip2.Color(0, 255, 0); //définit la couleur Vert NeoPixel
  340.   uint32_t blue = strip3.Color(0, 0, 255);  //définit la couleur NeoPixel Blue
  341.   uint32_t of = strip1.Color(0, 0, 0);     //définit NeoPixel Pas de couleur pour la bande 1
  342.   uint32_t off = strip2.Color(0, 0, 0);     //définit NeoPixel Pas de couleur pour la bande 2
  343.   uint32_t offf = strip3.Color(0, 0, 0);     //définit NeoPixel Pas de couleur pour la bande 3
  344. */
  345.  
  346.  
  347.  // Obtenir l'heure actuelle du module d'horloge en temps réel
  348.   Clock = RTC.now();           // get the RTC time
  349.   secondval = Clock.second();  // obtient les secondes
  350.   minuteval = Clock.minute();  // obtenir des minutes
  351.  
  352.   for (int i = 0; i < secondval; i++){
  353.     strip1.setPixelColor(i, STRIP1_RED);
  354.     strip1.setPixelColor(i, STRIP1_OFF);
  355.  
  356.     //strip1.setPixelColor(i, red);
  357.     //strip1.setPixelColor(i, of);
  358.   }
  359.  
  360.   strip2.setPixelColor(minuteval, STRIP2_GREEN);
  361.   strip2.setPixelColor(minuteval-1, STRIP2_OFF);
  362.  
  363.   strip3.setPixelColor(hourpos, STRIP3_BLUE);
  364.   strip3.setPixelColor(hourpos-1,STRIP3_OFF);
  365.  
  366.   strip1.show();
  367.   strip2.show();
  368.   strip3.show();
  369. }
  370.  
  371.  
  372. void play_chime(const int& startPos, const int& endPos)
  373. {
  374.   digitalWrite(DHD_DIAL_PIN, HIGH);                      //allume la LED
  375.   // itération sur les notes de la mélodie :
  376.   for (int thisNote = startPos; thisNote < endPos; thisNote++)
  377.   {
  378.     // pour calculer la durée de la note, prenez une seconde
  379.     // divisé par le type de note.
  380.     //par exemple. noire = 1000/4, croche = 1000/8, etc.
  381.     unsigned long noteDuration = 1000UL / noteDurations[thisNote];
  382.     tone(TONE_PIN, melody[thisNote], noteDuration);
  383.     set_lights();
  384.     int pauseBetweenNotes = int(noteDuration * 1.30f); // pour distinguer les notes, fixez un temps minimum entre elles.
  385.     delay(pauseBetweenNotes);
  386.     noTone(TONE_PIN); // arrête la tonalité :
  387.   }
  388.  
  389.   set_lights();
  390.  
  391. }
  392.  
  393.  
  394. //Modifier les heures d'horloge
  395. void change_hours()
  396. {
  397.     if (hourval_set < 24)  hourval_set = hourval_set + 1;
  398.     else hourval_set = 0;
  399.     setDateTime_hours();
  400. }
  401.  
  402.  
  403. //Modifier les minutes de l'horloge
  404. void change_minutes()
  405. {
  406.     if (minuteval_set < 60) minuteval_set = minuteval_set + 1;
  407.     else minuteval_set = 0;
  408.     setDateTime_minutes();
  409. }
  410.  
  411. //Modifier les heures d'horloge dans le DS3231
  412. void setDateTime_hours()
  413. {
  414.   Wire.beginTransmission(DS3231_ADDRESS);
  415.   Wire.write(two); //stop Oscillator
  416.   Wire.write(decToBcd(hourval_set));
  417.   Wire.endTransmission();
  418. }
  419.  
  420.  
  421. //Modifier les minutes d'horloge dans le DS3231
  422. void setDateTime_minutes()
  423. {
  424.   Wire.beginTransmission(DS3231_ADDRESS);
  425.   Wire.write(one); //stop Oscillator
  426.   Wire.write(decToBcd(minuteval_set));
  427.   Wire.endTransmission();
  428. }
  429.  
  430.  
  431. //Éteignez les NeoPixels - Cela se produit chaque fois que les secondes passent à zéro.
  432. void clearPixels()
  433. {
  434.   for (int i = 0; i < 60; i++)
  435.      strip1.setPixelColor(i, STRIP1_OFF);
  436.  
  437.     strip1.show();
  438.     delay(10);
  439. }
  440.  
  441.  
  442. // Convert normal decimal numbers to binary coded decimal - used for DS1307
  443. byte decToBcd(byte val){  return ( (val / 10 * 16) + (val % 10) ); }
  444.  
  445. // Convert binary coded decimal to normal decimal numbers - used for DS1307
  446. byte bcdToDec(byte val){  return ( (val / 16 * 10) + (val % 16) ); }
Advertisement
Add Comment
Please, Sign In to add comment