Horloge Arduino avec indicateur LED. Horloge LED bricolage


La photo montre un prototype que j'ai assemblé pour déboguer le programme qui gérera l'ensemble de cette installation. Le deuxième arduino nano dans le coin supérieur droit de la planche à pain n'appartient pas au projet et dépasse comme ça, vous n'avez pas besoin d'y prêter attention.

Un peu sur le principe de fonctionnement : Arduino prend les données de la minuterie DS323, les traite, détermine le niveau de lumière à l'aide d'une photorésistance, puis envoie le tout au MAX7219, et celui-ci, à son tour, éclaire les segments requis avec la luminosité requise. De plus, à l’aide de trois boutons, vous pouvez régler l’année, le mois, le jour et l’heure comme vous le souhaitez. Sur la photo, les indicateurs affichent l'heure et la température, qui proviennent d'un capteur de température numérique.

La principale difficulté dans mon cas est que les indicateurs de 2,7 pouces ont une anode commune et qu'ils ont dû, d'une part, se lier d'amitié avec le max7219, qui est conçu pour les indicateurs avec une cathode commune, et d'autre part, résoudre le problème avec leur alimentation, car ils ont besoin de 7,2 volts pour la lueur, ce que le max7219 seul ne peut pas fournir. Après avoir demandé de l'aide sur un forum, j'ai reçu une réponse.

Solution dans la capture d'écran :


Un microcircuit est attaché aux sorties des segments du max7219, qui inverse le signal, et un circuit de trois transistors est attaché à chaque sortie, qui doit être connecté à la cathode commune de l'écran, qui inverse également son signal et augmente le tension. Ainsi, nous avons la possibilité de connecter des écrans avec une anode commune et une tension d'alimentation supérieure à 5 volts au max7219

J'ai branché un indicateur pour le test, tout fonctionne, rien ne fume

Commençons à collectionner.

J'ai décidé de diviser le circuit en 2 parties en raison du grand nombre de cavaliers dans la version séparée par mes pattes tordues, où tout était sur une seule carte. L'horloge sera composée d'une unité d'affichage et d'une unité d'alimentation et de contrôle. Il a été décidé de récupérer ces derniers en premier. Je demande aux esthètes et aux radioamateurs expérimentés de ne pas s'évanouir à cause du traitement cruel des pièces. Je n'ai aucune envie d'acheter une imprimante pour le bien de LUT, donc je le fais à l'ancienne - je m'entraîne sur un morceau de papier, je perce des trous selon un modèle, je trace des chemins avec un marqueur, puis je grave.

Le principe de fixation des indicateurs est resté le même que sur.

Nous marquons la position des indicateurs et des composants à l'aide d'un gabarit en plexiglas conçu pour plus de commodité.

Processus de balisage







Ensuite, à l'aide d'un gabarit, nous perçons des trous aux bons endroits et essayons tous les composants. Tout s'adapte parfaitement.

Nous dessinons des chemins et gravons.




se baigner dans du chlorure ferrique

Prêt!
tableau de contrôle:


panneau d'indication :


Le tableau de commande s'est avéré excellent, la piste sur le tableau d'affichage n'a pas été rongée de manière critique, elle peut être réparée, il est temps de souder. Cette fois, j'ai perdu ma virginité SMD et inclus des composants 0805 dans le circuit. Au minimum, les premières résistances et condensateurs ont été soudés. Je pense que je vais m'améliorer, ce sera plus facile.
Pour la soudure, j'ai utilisé le flux que j'ai acheté. Souder avec est un plaisir, maintenant j'utilise de la colophane alcoolisée uniquement pour l'étamage.

Voici les planches terminées. La carte de commande dispose d'un siège pour un Arduino nano, d'une horloge, ainsi que de sorties pour la connexion à la carte d'affichage et aux capteurs (une photorésistance pour la luminosité automatique et un thermomètre numérique ds18s20) et une alimentation avec tension de sortie réglable (pour les grands appareils à sept segments) et pour alimenter l'horloge et l'Arduino, sur la carte d'affichage se trouvent des prises de montage pour les écrans, des prises pour max2719 et uln2003a, une solution pour alimenter quatre grands appareils à sept segments et un tas de cavaliers.




tableau de commande arrière

Tableau d'affichage arrière :

Installation smd épouvantable :


Lancement

Après avoir soudé tous les câbles, boutons et capteurs, il est temps de tout allumer. Le premier lancement a révélé plusieurs problèmes. Le dernier grand indicateur ne s'allumait pas et le reste brillait faiblement. J'ai résolu le premier problème en soudant la patte du transistor SMD et le second en ajustant la tension produite par le LM317.
C'EST VIVANT!

Après avoir réalisé de nombreux prototypes Arduino sur une maquette, j'ai décidé de créer quelque chose d'utile que je pourrais utiliser à la maison. Et quoi de plus utile qu'une montre lumineuse, qui, pour une raison quelconque, n'est plus produite depuis 2010 ? J'ai commencé à assembler une montre numérique en recherchant les pièces nécessaires. L'un des critères permettant de collecter rapidement les composants nécessaires était la disponibilité des pièces dans les magasins locaux et auprès des fabricants de Chine et de Malaisie.

Horloge temps réel Arduino (RTC) avec affichages à 7 segments

Lors de l'assemblage de la montre, plusieurs options sont apparues pour régler l'heure exacte. D'abord: régler l'heure sur Arduino , en le gardant alimenté tout le temps. Mais cette méthode n'est pas très pratique, car à chaque fois que vous aurez besoin de régler l'heure, vous devrez mettre l'Arduino sous tension.

La deuxième option était l'idée connexion de 7 segments DIRIGÉ - indicateurs pour le module GPS . Étant donné que le signal GPS donne une heure très précise, cette option devrait résoudre le problème et ne nécessiterait pas de régler l'horloge à chaque fois qu'elle était allumée. J'ai pris mon navigateur de poche Garmin GPS 60 C, je l'ai sérialisé dans l'Arduino et j'ai chargé plusieurs bibliothèques GPS, obtenant ainsi un signal horaire très précis.

Le problème avec la méthode GPS s'est avéré être que comme j'habite au centre de la ville, une jungle de béton avec des immeubles de grande hauteur impénétrables entoure ma maison, et il serait nécessaire de placer une antenne GPS externe à l'extérieur de la fenêtre pour pouvoir pour recevoir un signal GPS d'un ciel clair. Sans couverture satellite, aucun appareil GPS n'est capable de recevoir un signal temporisé. Soit l'horloge devait être sur la fenêtre, soit il fallait retirer l'antenne GPS et y poser un câble de 7 mètres.

La troisième méthode de réglage de l’horloge s’est avérée la meilleure. Cela réside dans le travail Arduino avec horloge temps réel DS1307 (RTC). Ils sont alimentés par une pile bouton de 3 volts, qui conserve les paramètres lorsque l'appareil est éteint et lorsque le microcontrôleur est déconnecté.

Je me suis rendu au "paradis de l'électronique" local situé au centre-ville pour tenter ma chance et trouver les composants nécessaires. À ma grande surprise, j'y ai trouvé toutes les pièces nécessaires pour assembler une montre numérique.

Les pièces requises sont :

  1. Carte Arduino pour le prototypage et le chargement du croquis dans le microcontrôleur ;
  2. Microcontrôleur ATmega328P pour le fonctionnement de l'horloge ;
  3. quatre indicateurs LED rouges à 7 segments (ou d'autres couleurs plus froides que vous pouvez trouver sur votre marché local) ;
  4. horloge temps réel DS1307 ;
  5. résonateur à quartz à 32,768 kHz ;
  6. support pour pile bouton CR2025 ou CR2032 ;
  7. quatre puces de registre à décalage 74HC595 pour piloter des indicateurs LED à 7 segments ;
  8. résistances 220 Ohm 0,25 W chacune ;
  9. connecteurs à broches à une rangée ;
  10. supports pour circuits intégrés (CI);
  11. fils de connexion.

Si vous n'avez pas les compétences nécessaires pour fabriquer des circuits imprimés, je vous recommande d'utiliser planche à pain soudée (plaque de textolite avec de nombreux trous pour y fixer des composants par soudure, appelée à tort circuit imprimé) et soudez-y toutes les prises IC des microcircuits et les connecteurs à broches. Grâce à ces contacts à dégagement rapide, toutes les LED et CI à 7 segments peuvent être facilement remplacés si nécessaire.

La taille de la carte de prototypage étant très limitée, nous n'avons pu y placer que des indicateurs LED de 35 mm, car il devait encore y avoir de la place pour un support de pile bouton. J'aimerais installer des indicateurs à 7 segments beaucoup plus gros, mais les plus gros nécessitent une tension accrue, supérieure à 5 V, et il fallait déjà compliquer le circuit avec des circuits à double puissance. Je ne veux pas avoir affaire à un stabilisateur pour deux tensions de sortie, il vaut mieux se concentrer sur une version plus simple d'une horloge numérique.

Condensateurs de blocage en céramique 100 nF sur la broche d'alimentation Vcc de chaque registre 74HC595 sont ajoutés pour éviter tout problème d'interférence basse fréquence.

L'horloge numérique assemblée utilise seulement 5 broches Arduino :

  • 3 sorties numériques pour registres à décalage 74HC595 ;
  • 2 sorties analogiques pour horloge en temps réel connectées via une connexion I2C.

L'avantage d'une horloge numérique assemblée sur Arduino par rapport à une horloge d'usine est que vous pouvez facilement ajouter toutes les fonctions qui peuvent leur être utiles.

Voici quelques idées pour modifier votre montre :

  1. Affichage alterné des heures/minutes et des minutes/secondes ;
  2. Jouer une mélodie toutes les heures ;
  3. Installation du capteur LM35 et utilisation de la montre comme thermomètre ;
  4. Fonction réveil matinal ;
  5. Même le contrôle d'autres appareils électriques à l'aide d'un relais électromécanique qui s'allume en fonction d'événements définis dans le temps ou de lectures de capteurs connectés.

Étant donné que les quatre indicateurs sont assez grands et lumineux, ils peuvent également être utilisés pour afficher des informations sur les lettres.

Après avoir soudé le premier chiffre de la LED à cathode commune à 7 segments au registre à décalage 74HC595, le premier problème est apparu. J'ai utilisé une seule résistance de 220 ohms connectée à la cathode commune de la LED pour économiser les résistances, et j'ai constaté que lorsque le chiffre 8 était allumé, tous les segments s'éclairaient très faiblement. C'est bien pour un prototype, mais ne convient pas pour une montre numérique en direct. Ce serait très ennuyeux d'avoir une montre avec des chiffres qui brillent différemment. J'ai donc dû couper des fils individuels et obtenir davantage de résistances de 220 ohms pour les connecter à chacun des sept segments LED.

Le deuxième problème était que j'avais oublié d'allouer de l'espace pour que deux LED de 5 mm fassent office d'indicateur clignotant des secondes. Et l'indicateur du troisième chiffre était déjà soudé.

Comme cela demande trop de travail de souder un indicateur et de fixer toutes les résistances aux fils, j'ai décidé de créer une carte distante avec deux LED comme indicateurs de secondes. Je vais trouver un moyen de placer deux points entre les chiffres des heures et des minutes ! Sur la photo ci-dessous, je photographie simplement la LED de la broche 13 qui clignote à intervalles de 500 ms.

  • Il y a des codes .
  • Esquisse finale

Voici quelques photos de l'appareil assemblé et fonctionnel. Maintenant, j'ai juste besoin de quelque chose comme de l'acrylique pour sécuriser la planche à pain et cacher l'horloge Arduino dans le boîtier global.

Cette horloge est alimentée par une carte déportée Arduino dans la version avec câble FTDI et prise DC.

L'assemblage de l'horloge Arduino est terminé après l'installation du capteur d'humidité et de température DHT11.

Capteur de température et d'humidité fait maison DHT11 et DHT22 - connexion à Arduino Horloge GPS sur Arduino

Il existe de nombreuses façons d'assembler une montre électronique de vos propres mains : les schémas sont largement présentés dans la littérature et sur Internet. La plupart des implémentations modernes sont basées sur des microcontrôleurs. La mise en œuvre de tels projets nécessite souvent des compétences pratiques approfondies et des connaissances théoriques dans le domaine de l'électronique : la capacité d'utiliser des logiciels spécialisés, de créer des circuits imprimés à la maison à l'aide d'une gravure au chlorure ferrique et d'une bonne soudure. Vous devez également disposer d’une variété d’outils et de fournitures.

Cependant, il existe un moyen simple et abordable d'assembler une montre électronique de vos propres mains à la maison : utiliser la plateforme Arduino. Il s'agit d'un complexe logiciel et matériel spécialement conçu pour enseigner les bases de la programmation et de l'électronique. Avec l'aide d'Arduino, n'importe qui, même sans formation préalable particulière, peut construire une horloge électronique de ses propres mains : des schémas de circuit, des programmes d'ingénierie et même un fer à souder ne sont pas nécessaires !

La connexion de tous les composants électroniques est effectuée sur une planche à pain à contact spécial (« sans soudure »), ce qui élimine le risque de brûlures, coupures et autres blessures. Vous pouvez donc travailler avec le concepteur Arduino avec des enfants. Une manière visuelle de présenter un schéma de circuit vous aidera à éviter de commettre des erreurs lors de l'assemblage de l'appareil.

Étape 1. Liste des composants

Pour assembler une montre simple sur des matrices LED vous n'aurez besoin que de quelques composants bon marché :

  • Plateforme Arduino. Les modèles les plus simples feront l'affaire - ou Micro ;
  • planche à pain de contact ;
  • fils de connexion pour planche à pain;
  • Module d'horloge en temps réel Adafruit DS3231 ;
  • Module matriciel LED 32x8 MAX7219 ;
  • deux boutons.

Vous aurez également besoin d'un ordinateur personnel et d'un câble USB-mini-USB pour charger le programme de contrôle en mémoire. C'est tout : un fer à souder, des décapants, des couteaux de montage et autres outils professionnels ne sont pas nécessaires : toutes les opérations sont effectuées à la main. Peut-être que dans certains cas, il est plus pratique d'utiliser une pince à épiler, mais vous pouvez vous en passer.


Étape 2. Assemblage du circuit électronique

Le circuit d'une horloge électronique avec affichage LED utilisant Arduino semblera assez simple même pour les radioamateurs inexpérimentés. Seuls quelques fils sont nécessaires pour l'assemblage. Tableau de connexion :

Module Arduino → Matrice LED 32x8 MAX7219

Module Arduino → Horloge temps réel Adafruit DS3231

Module Arduino → boutons

D2 - bouton 1

D3 - bouton 2

La deuxième broche des boutons est connectée à GND.

Il vous suffit de faire attention et de vous rappeler comment les trous de contact sur la planche à pain sont connectés les uns aux autres. Le schéma suivant illustre la méthode de connexion interne des trous de contact :


Deux rangées (1 et 4) des deux côtés sont connectées horizontalement - elles sont généralement utilisées comme ligne électrique +5 V et masse GND. Tous les contacts internes (2 et 3) sont fermés verticalement. Dans ce cas, le circuit imprimé est divisé verticalement et horizontalement en deux parties symétriques indépendantes l'une de l'autre. Cela permet, par exemple, d'assembler deux appareils différents sur une même carte.

Le schéma d'une horloge électronique avec indication LED, ainsi que la disposition des éléments sur le circuit imprimé, sont présentés dans l'illustration :

Vérifiez soigneusement que toutes les connexions sont conformes au schéma présenté. Assurez-vous également que les conducteurs sont bien fixés dans les trous de contact du circuit imprimé.


Étape 3. Micrologiciel Arduino

Une fois l'assemblage et le test du circuit terminés, vous pouvez commencer à charger le programme de contrôle (ou « firmware ») dans la mémoire Arduino.


Pour ce faire, vous devez installer l'environnement de développement officiel gratuit - . Vous aurez également besoin du code source du projet, que vous pouvez télécharger ci-dessous dans l'archive avec toutes les bibliothèques et un croquis, et si vous avez juste besoin d'un croquis, vous pouvez le copier séparément :

//include les bibliothèques : #include "LedControl.h" #include // Bibliothèque de polices #include // Horloge DS1307 #include "RTClib.h" // Horloge DS1307 #include // Bibliothèque de boutons par Alexander Brevig // Configuration de la matrice LED // la broche 12 est connectée au DataIn sur l'écran // la broche 11 est connectée au CLK sur l'écran // la broche 10 est connectée à LOAD sur l'écran LedControl lc = LedContrôle(6, 5, 4, 4); // définit les 3 broches sur 12, 11 et 10, puis définit 4 affichages (le maximum est de 8 affichages) // intensité d'octet des variables globales = 7 ; // Intensité/luminosité par défaut (0-15) byte clock_mode = 0 ; // Mode horloge par défaut. Par défaut = 0 (basic_mode) bool random_mode = 0 ; // Définir le mode aléatoire - change le type d'affichage toutes les quelques heures. Par défaut = 0 (off) octet old_mode = clock_mode ; // Stocke le mode d'horloge précédent, donc si nous allons à ce jour ou autre, nous savons à quel mode revenir après. booléen ampères = 0 ; // Définir une heure sur 12 ou 24 heures. 0 = 24 heures. 1 = octet de 12 heures change_mode_time = 0 ; // Conserve l'heure à laquelle le mode d'horloge changera ensuite s'il est en mode aléatoire. délai long non signé = 500 ; // On attend toujours un peu entre les mises à jour du display int rtc; // Contient la sortie de l'horloge en temps réel char jours = ( "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ); //tableau de jours - utilisé dans les modes slide, basic_mode et jumble (le DS1307 génère 1 à 7 valeurs pour le jour de la semaine) char dayfull = ( "Dimanche", "Lundi", "Mardi", "Mer", "Jeudi" ", "Vendredi", "Samedi" ); char suffixe = ("st", "nd", "rd", "th" ); // tableau de suffixes de date, utilisé dans les modes slide, basic_mode et jumble. e,g, 1st 2nd ... // définir des constantes #define NUM_DISPLAY_MODES 3 // Modes d'affichage des nombres (avec zéro comme premier mode) #define NUM_SETTINGS_MODES 4 // Modes de paramètres des nombres = 6 (avec zéro comme premier mode) # définir SLIDE_DELAY 20 // Le temps en millisecondes pour l'effet de diapositive par caractère en mode diapositive. Augmentez cette valeur pour un effet plus lent #define cls clear_display // Effacer l'affichage RTC_DS1307 ds1307; // Créer un objet RTC Button boutonA = Button(2, BUTTON_PULLUP); // Configuration du bouton A (en utilisant la bibliothèque de boutons) Button ButtonB = Button(3, BUTTON_PULLUP); // Configurer le bouton B (à l'aide de la bibliothèque de boutons) void setup() ( digitalWrite(2, HIGH); // activer la résistance pullup pour le bouton sur la broche 2 digitalWrite(3, HIGH); // activer la résistance pullup pour le bouton sur la broche 3 digitalWrite(4, HIGH); // activer la résistance pullup pour le bouton sur la broche 4 Serial.begin(9600); //démarrer la série //initialiser les 4 panneaux matriciels //nous avons déjà défini le nombre d'appareils lors de la création le LedControl int devices = lc.getDeviceCount(); //nous devons initialiser tous les appareils dans une boucle pour (int adresse = 0; adresse< devices; address++) { /*The MAX72XX is in power-saving mode on startup*/ lc.shutdown(3-address, false); /* Set the brightness to a medium values */ lc.setIntensity(3-address, intensity); /* and clear the display */ lc.clearDisplay(3-address); } //Setup DS1307 RTC #ifdef AVR Wire.begin(); #else Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino #endif ds1307.begin(); //start RTC Clock if (! ds1307.isrunning()) { Serial.println("RTC is NOT running!"); ds1307.adjust(DateTime(__DATE__, __TIME__)); // sets the RTC to the date & time this sketch was compiled } //Show software version & hello message printver(); //enable red led digitalWrite(13, HIGH); } void loop() { //run the clock with whatever mode is set by clock_mode - the default is set at top of code. switch (clock_mode){ case 0: basic_mode(); break; case 1: small_mode(); break; case 2: slide(); break; case 3: word_clock(); break; case 4: setup_menu(); break; } } //plot a point on the display void plot (byte x, byte y, byte val) { //select which matrix depending on the x coord byte address; if (x >= 0 &&x<= 7) { address = 3; } if (x >= 8 &&x<= 15) { address = 2; x = x - 8; } if (x >= 16 &&x<= 23) { address = 1; x = x - 16; } if (x >= 24 &&x<= 31) { address = 0; x = x - 24; } if (val == 1) { lc.setLed(address, y, x, true); } else { lc.setLed(address, y, x, false); } } //clear screen void clear_display() { for (byte address = 0; address < 4; address++) { lc.clearDisplay(address); } } //fade screen down void fade_down() { //fade from global intensity to 1 for (byte i = intensity; i >0 ; i--) ( pour (adresse d'octet = 0 ; adresse< 4; address++) { lc.setIntensity(address, i); } delay(30); //change this to change fade down speed } clear_display(); //clear display completely (off) //reset intentsity to global val for (byte address = 0; address < 4; address++) { lc.setIntensity(address, intensity); } } //power up led test & display software version number void printver() { byte i = 0; char ver_a = "MADE"; char ver_b = "IN"; char ver_c = "RUSSIA"; //test all leds. for (byte x = 0; x <= 32; x++) { for (byte y = 0; y <= 7; y++) { plot(x, y, 1); } } delay(300); fade_down(); while (ver_a[i]) { puttinychar((i * 4), 1, ver_a[i]); delay(35); i++; } delay(500); fade_down(); i = 0; while (ver_b[i]) { puttinychar((i * 4), 1, ver_b[i]); delay(35); i++; } delay(500); fade_down(); i = 0; while (ver_c[i]) { puttinychar((i * 4), 1, ver_c[i]); delay(35); i++; } delay(500); fade_down(); } // puttinychar // Copy a 3x5 character glyph from the myfont data structure to display memory, with its upper left at the given coordinate // This is unoptimized and simply uses plot() to draw each dot. void puttinychar(byte x, byte y, char c) { byte dots; if (c >= "A" &&c<= "Z" || (c >= "un" && c<= "z")) { c &= 0x1F; // A-Z maps to 1-26 } else if (c >= "0" &&c<= "9") { c = (c - "0") + 32; } else if (c == " ") { c = 0; // space } else if (c == ".") { c = 27; // full stop } else if (c == ":") { c = 28; // colon } else if (c == "\"") { c = 29; // single quote mark } else if (c == "!") { c = 30; // single quote mark } else if (c == "?") { c = 31; // single quote mark } for (byte col = 0; col < 3; col++) { dots = pgm_read_byte_near(&mytinyfont[c]); for (char row = 0; row < 5; row++) { if (dots & (16 >> ligne)) plot(x + col, y + ligne, 1); sinon plot(x + col, y + ligne, 0); ) ) ) void putnormalchar(octet x, octet y, char c) ( points d'octet; // if (c >= "A" && c<= "Z" || (c >= "un" && c<= "z")) { // c &= 0x1F; // A-Z maps to 1-26 // } if (c >= "A" &&c<= "Z") { c &= 0x1F; // A-Z maps to 1-26 } else if (c >= "un" && c<= "z") { c = (c - "a") + 41; // A-Z maps to 41-67 } else if (c >= "0" &&c<= "9") { c = (c - "0") + 31; } else if (c == " ") { c = 0; // space } else if (c == ".") { c = 27; // full stop } else if (c == "\"") { c = 28; // single quote mark } else if (c == ":") { c = 29; // clock_mode selector arrow } else if (c == ">") ( c = 30; // flèche de sélection clock_mode ) sinon si (c >= -80 && c<= -67) { c *= -1; } for (char col = 0; col < 5; col++) { dots = pgm_read_byte_near(&myfont[c]); for (char row = 0; row < 7; row++) { //check coords are on screen before trying to plot //if ((x >= 0) && (x<= 31) && (y >= 0) && (y<= 7)){ if (dots & (64 >> row)) ( // seulement 7 lignes. plot(x + col, y + row, 1); ) else ( plot(x + col, y + row, 0); ) //) ) ) ) //small_mode //affiche l'heure en petits caractères 3x5 avec les secondes display void small_mode() ( char textchar; // les 16 caractères sur l'affichage byte mins = 100; //mins byte secs = rtc; //secondes byte old_secs = secs; / /contient l'ancienne valeur des secondes - depuis la dernière mise à jour des secondes ou affichage - utilisé pour vérifier si les secondes ont changé cls(); //exécute la boucle principale de l'horloge tant que run_mode renvoie true while (run_mode()) ( get_time(); / /vérifier la pression sur le bouton if (buttonA.uniquePress()) ( switch_mode(); return; ) if (buttonB.uniquePress()) ( display_date(); return; ) //si les secondes ont changé, mettez-les à jour sur l'affichage secs = rtc; if (secs != old_secs) ( //secs char buffer; itoa(secs, buffer, 10); //fix - sinon si num a un zéro non significatif, par exemple "03" secondes, itoa couvre cela en caractères avec un espace "3". si (secondes< 10) { buffer = buffer; buffer = "0"; } puttinychar(20, 1, ":"); //seconds colon puttinychar(24, 1, buffer); //seconds puttinychar(28, 1, buffer); //seconds old_secs = secs; } //if minute changes change time if (mins != rtc) { //reset these for comparison next time mins = rtc; byte hours = rtc; if (hours > < 1) { hours = hours + ampm * 12; } //byte dow = rtc; // the DS1307 outputs 0 - 6 where 0 = Sunday0 - 6 where 0 = Sunday. //byte date = rtc; //set characters char buffer; itoa(hours, buffer, 10); //fix - as otherwise if num has leading zero, e.g. "03" hours, itoa coverts this to chars with space "3 ". if (hours < 10) { buffer = buffer; //if we are in 12 hour mode blank the leading zero. if (ampm) { buffer = " "; } else { buffer = "0"; } } //set hours chars textchar = buffer; textchar = buffer; textchar = ":"; itoa (mins, buffer, 10); if (mins < 10) { buffer = buffer; buffer = "0"; } //set mins characters textchar = buffer; textchar = buffer; //do seconds textchar = ":"; buffer; secs = rtc; itoa(secs, buffer, 10); //fix - as otherwise if num has leading zero, e.g. "03" secs, itoa coverts this to chars with space "3 ". if (secs < 10) { buffer = buffer; buffer = "0"; } //set seconds textchar = buffer; textchar = buffer; byte x = 0; byte y = 0; //print each char for (byte x = 0; x < 6 ; x++) { puttinychar(x * 4, 1, textchar[x]); } } delay(50); } fade_down(); } // basic_mode() // show the time in 5x7 characters void basic_mode() { cls(); char buffer; //for int to char conversion to turn rtc values into chars we can print on screen byte offset = 0; //used to offset the x postition of the digits and centre the display when we are in 12 hour mode and the clock shows only 3 digits. e.g. 3:21 byte x, y; //used to draw a clear box over the left hand "1" of the display when we roll from 12:59 ->1h00 du matin en mode 12 heures. //effectuer une conversion 12/24 heures si ampm est défini sur 1 octet heures = rtc ; si (heures > 12) ( heures = heures - ampm * 12; ) si (heures< 1) { hours = hours + ampm * 12; } //do offset conversion if (ampm && hours < 10) { offset = 2; } //set the next minute we show the date at //set_next_date(); // initially set mins to value 100 - so it wll never equal rtc on the first loop of the clock, meaning we draw the clock display when we enter the function byte secs = 100; byte mins = 100; int count = 0; //run clock main loop as long as run_mode returns true while (run_mode()) { //get the time from the clock chip get_time(); //check for button press if (buttonA.uniquePress()) { switch_mode(); return; } if (buttonB.uniquePress()) { display_date(); return; } //check whether it"s time to automatically display the date //check_show_date(); //draw the flashing: as on if the secs have changed. if (secs != rtc) { //update secs with new value secs = rtc; //draw: plot (15 - offset, 2, 1); //top point plot (15 - offset, 5, 1); //bottom point count = 400; } //if count has run out, turn off the: if (count == 0) { plot (15 - offset, 2, 0); //top point plot (15 - offset, 5, 0); //bottom point } else { count--; } //re draw the display if button pressed or if mins != rtc i.e. if the time has changed from what we had stored in mins, (also trigggered on first entering function when mins is 100) if (mins != rtc) { //update mins and hours with the new values mins = rtc; hours = rtc; //adjust hours of ampm set to 12 hour mode if (hours >12) ( heures = heures - ampm * 12; ) si (heures< 1) { hours = hours + ampm * 12; } itoa(hours, buffer, 10); //if hours < 10 the num e.g. "3" hours, itoa coverts this to chars with space "3 " which we dont want if (hours < 10) { buffer = buffer; buffer = "0"; } //print hours //if we in 12 hour mode and hours < 10, then don"t print the leading zero, and set the offset so we centre the display with 3 digits. if (ampm && hours < 10) { offset = 2; //if the time is 1:00am clear the entire display as the offset changes at this time and we need to blank out the old 12:59 if ((hours == 1 && mins == 0)) { cls(); } } else { //else no offset and print hours tens digit offset = 0; //if the time is 10:00am clear the entire display as the offset changes at this time and we need to blank out the old 9:59 if (hours == 10 && mins == 0) { cls(); } putnormalchar(1, 0, buffer); } //print hours ones digit putnormalchar(7 - offset, 0, buffer); //print mins //add leading zero if mins < 10 itoa (mins, buffer, 10); if (mins < 10) { buffer = buffer; buffer = "0"; } //print mins tens and ones digits putnormalchar(19 - offset, 0, buffer); putnormalchar(25 - offset, 0, buffer); } } fade_down(); } //like basic_mode but with slide effect void slide() { byte digits_old = {99, 99, 99, 99}; //old values we store time in. Set to somthing that will never match the time initially so all digits get drawn wnen the mode starts byte digits_new; //new digits time will slide to reveal byte digits_x_pos = {25, 19, 7, 1}; //x pos for which to draw each digit at char old_char; //used when we use itoa to transpose the current digit (type byte) into a char to pass to the animation function char new_char; //used when we use itoa to transpose the new digit (type byte) into a char to pass to the animation function //old_chars - stores the 5 day and date suffix chars on the display. e.g. "mon" and "st". We feed these into the slide animation as the current char when these chars are updated. //We sent them as A initially, which are used when the clocl enters the mode and no last chars are stored. //char old_chars = "AAAAA"; //plot the clock colon on the display cls(); putnormalchar(13, 0, ":"); byte old_secs = rtc; //store seconds in old_secs. We compare secs and old secs. WHen they are different we redraw the display //run clock main loop as long as run_mode returns true while (run_mode()) { get_time(); //check for button press if (buttonA.uniquePress()) { switch_mode(); return; } if (buttonB.uniquePress()) { display_date(); return; } //if secs have changed then update the display if (rtc != old_secs) { old_secs = rtc; //do 12/24 hour conversion if ampm set to 1 byte hours = rtc; if (hours >12) ( heures = heures - ampm * 12; ) si (heures< 1) { hours = hours + ampm * 12; } //split all date and time into individual digits - stick in digits_new array //rtc = secs //array pos and digit stored //digits_new = (rtc%10); //0 - secs ones //digits_new = ((rtc/10)%10); //1 - secs tens //rtc = mins digits_new = (rtc % 10); //2 - mins ones digits_new = ((rtc / 10) % 10); //3 - mins tens //rtc = hours digits_new = (hours % 10); //4 - hour ones digits_new = ((hours / 10) % 10); //5 - hour tens //rtc = date //digits_new = (rtc%10); //6 - date ones //digits_new = ((rtc/10)%10); //7 - date tens //draw initial screen of all chars. After this we just draw the changes. //compare digits 0 to 3 (mins and hours) for (byte i = 0; i <= 3; i++) { //see if digit has changed... if (digits_old[i] != digits_new[i]) { //run 9 step animation sequence for each in turn for (byte seq = 0; seq <= 8 ; seq++) { //convert digit to string itoa(digits_old[i], old_char, 10); itoa(digits_new[i], new_char, 10); //if set to 12 hour mode and we"re on digit 2 (hours tens mode) then check to see if this is a zero. If it is, blank it instead so we get 2.00pm not 02.00pm if (ampm && i == 3) { if (digits_new == 0) { new_char = " "; } if (digits_old == 0) { old_char = " "; } } //draw the animation frame for each digit slideanim(digits_x_pos[i], 0, seq, old_char, new_char); delay(SLIDE_DELAY); } } } /* //compare date digit 6 (ones) and (7) tens - if either of these change we need to update the date line. We compare date tens as say from Jan 31 ->01 février, alors le chiffre des uns ne change pas si ((digits_old != digits_new) || (digits_old != digits_new)) ( //change le jour affiché. La boucle ci-dessous parcourt tour à tour chacun des 3 caractères, par exemple "MON" pour (octet day_char = 0 ; day_char<=2 ; day_char++){ //run the anim sequence for each char for (byte seq = 0; seq <=8 ; seq++){ //the day (0 - 6) Read this number into the days char array. the seconds number in the array 0-2 gets the 3 chars of the day name, e.g. m o n slideanim(6*day_char,8,seq,old_chars,days); //6 x day_char gives us the x pos for the char delay(SLIDE_DELAY); } //save the old day chars into the old_chars array at array pos 0-2. We use this next time we change the day and feed it to the animation as the current char. The updated char is fed in as the new char. old_chars = days; } //change the date tens digit (if needed) and ones digit. (the date ones digit wil alwaus change, but putting this in the "if" loop makes it a bit neater code wise.) for (byte i = 7; i >= 6 ; i--)( if (digits_old[i] != digits_new[i]) ( for (byte seq = 0; seq<=8 ; seq++){ itoa(digits_old[i],old_char,10); itoa(digits_new[i],new_char,10); slideanim(digits_x_pos[i],8,seq,old_char,new_char); delay(SLIDE_DELAY); } } } //print the day suffix "nd" "rd" "th" etc. First work out date 2 letter suffix - eg st, nd, rd, th byte s = 3; //the pos to read our suffix array from. byte date = rtc; if(date == 1 || date == 21 || date == 31) { s = 0; } else if (date == 2 || date == 22) { s = 1; } else if (date == 3 || date == 23) { s = 2; } for (byte suffix_char = 0; suffix_char <=1 ; suffix_char++){ for (byte seq = 0; seq <=8 ; seq++){ slideanim((suffix_char*6)+36,8,seq,old_chars,suffix[s]); // we pass in the old_char array char as the current char and the suffix array as the new char delay(SLIDE_DELAY); } //save the suffic char in the old chars array at array pos 3 and 5. We use these chars next time we change the suffix and feed it to the animation as the current char. The updated char is fed in as the new char. old_chars = suffix[s]; } }//end do date line */ //save digita array tol old for comparison next loop for (byte i = 0; i <= 3; i++) { digits_old[i] = digits_new[i]; } }//secs/oldsecs }//while loop fade_down(); } //called by slide //this draws the animation of one char sliding on and the other sliding off. There are 8 steps in the animation, we call the function to draw one of the steps from 0-7 //inputs are are char x and y, animation frame sequence (0-7) and the current and new chars being drawn. void slideanim(byte x, byte y, byte sequence, char current_c, char new_c) { // To slide one char off and another on we need 9 steps or frames in sequence... // seq# 0123456 <-rows of the display // | ||||||| // seq0 0123456 START - all rows of the display 0-6 show the current characters rows 0-6 // seq1 012345 current char moves down one row on the display. We only see it"s rows 0-5. There are at display positions 1-6 There is a blank row inserted at the top // seq2 6 01234 current char moves down 2 rows. we now only see rows 0-4 at display rows 2-6 on the display. Row 1 of the display is blank. Row 0 shows row 6 of the new char // seq3 56 0123 // seq4 456 012 half old / half new char // seq5 3456 01 // seq6 23456 0 // seq7 123456 // seq8 0123456 END - all rows show the new char //from above we can see... //currentchar runs 0-6 then 0-5 then 0-4 all the way to 0. starting Y position increases by 1 row each time. //new char runs 6 then 5-6 then 4-6 then 3-6. starting Y position increases by 1 row each time. //if sequence number is below 7, we need to draw the current char if (sequence < 7) { byte dots; // if (current_c >= "A" && || (current_c >= "a" && current_c<= "z")) { // current_c &= 0x1F; // A-Z maps to 1-26 // } if (current_c >= "A" && courant_c<= "Z") { current_c &= 0x1F; // A-Z maps to 1-26 } else if (current_c >= "a" && courant_c<= "z") { current_c = (current_c - "a") + 41; // A-Z maps to 41-67 } else if (current_c >= "0" && courant_c<= "9") { current_c = (current_c - "0") + 31; } else if (current_c == " ") { current_c = 0; // space } else if (current_c == ".") { current_c = 27; // full stop } else if (current_c == "\"") { current_c = 28; // single quote mark } else if (current_c == ":") { current_c = 29; //colon } else if (current_c == ">") ( current_c = 30; // flèche de sélection clock_mode ) byte curr_char_row_max = 7 - séquence; // le nombre maximum de lignes à dessiner est 6 - numéro de séquence octet start_y = séquence; // la position y pour commencer à - est la même que numéro de séquence. Nous ajoutons ceci à chaque boucle // traçons chaque ligne jusqu'au maximum de ligne (calculé à partir du numéro de séquence) pour (octet curr_char_row = 0; curr_char_row<= curr_char_row_max; curr_char_row++) { for (byte col = 0; col < 5; col++) { dots = pgm_read_byte_near(&myfont); if (dots & (64 >> curr_char_row)) plot(x + col, y + start_y, 1); //plot mené sur else plot(x + col, y + start_y, 0); //sinon, le tracé s'éteint ) start_y++;//ajoute un à y pour dessiner la ligne suivante un vers le bas ) ) //dessine une ligne vide entre les caractères si la séquence est comprise entre 1 et 7. Si nous ne faisons pas cela, nous obtenons les restes des caractères actuels, dernière position restante sur l'écran si (séquence >= 1 && séquence<= 8) { for (byte col = 0; col < 5; col++) { plot(x + col, y + (sequence - 1), 0); //the y position to draw the line is equivalent to the sequence number - 1 } } //if sequence is above 2, we also need to start drawing the new char if (sequence >= 2) ( //calculer les points d'octets de caractères ; //if (new_c >= "A" && new_c<= "Z" || (new_c >= "a" && nouveau_c<= "z")) { // new_c &= 0x1F; // A-Z maps to 1-26 //} if (new_c >= "A" && nouveau_c<= "Z") { new_c &= 0x1F; // A-Z maps to 1-26 } else if (new_c >= "a" && nouveau_c<= "z") { new_c = (new_c - "a") + 41; // A-Z maps to 41-67 } else if (new_c >= "0" && nouveau_c<= "9") { new_c = (new_c - "0") + 31; } else if (new_c == " ") { new_c = 0; // space } else if (new_c == ".") { new_c = 27; // full stop } else if (new_c == "\"") { new_c = 28; // single quote mark } else if (new_c == ":") { new_c = 29; // clock_mode selector arrow } else if (new_c == ">") ( new_c = 30; // flèche de sélection clock_mode ) byte newcharrowmin = 6 - (séquence - 2); // numéro de ligne minimum à dessiner pour un nouveau caractère - cela génère une sortie de 6 à 0 lorsqu'il est alimenté avec les numéros de séquence 2-8 . Il s'agit de la ligne minimale à dessiner pour le nouvel octet de caractère start_y = 0 ; //la position y à laquelle commencer - est la même que le numéro de séquence. nous l'augmentons à chaque ligne //traçons chaque ligne à partir du minimum de ligne (calculé par le numéro de séquence ) jusqu'à 6 pour (octet newcharrow = newcharrowmin; newcharrow<= 6; newcharrow++) { for (byte col = 0; col < 5; col++) { dots = pgm_read_byte_near(&myfont); if (dots & (64 >> newcharrow)) plot(x + col, y + start_y, 1); //plot mené sur else plot(x + col, y + start_y, 0); //sinon, le tracé est désactivé) start_y++;//ajoutez-en un à y pour que nous dessinions la ligne suivante vers le bas) ) ) //imprime une horloge en utilisant des mots plutôt que des nombres void word_clock() ( cls(); char number = ( "one ", "deux", "trois", "quatre", "cinq", "six", "sept", "huit", "neuf", "dix", "onze", "douze", "treize", "quatorze", "quinze", "seize", "dix-sept", "dix-huit", "dix-neuf" ); char numbertens = ( "dix", "vingt", "trente", "quarante", "cinquante" ); //potentiellement 3 lignes pour afficher char str_a; char str_b; char str_c; //byte hours_y, mins_y; //heures et minutes et positions pour les lignes d'heures et de minutes byte hours = rtc; if (hours > 12) ( hours = hours - ampm * 12; ) si (heures< 1) { hours = hours + ampm * 12; } get_time(); //get the time from the clock chip byte old_mins = 100; //store mins in old_mins. We compare mins and old mins & when they are different we redraw the display. Set this to 100 initially so display is drawn when mode starts. byte mins; //run clock main loop as long as run_mode returns true while (run_mode()) { //check for button press if (buttonA.uniquePress()) { switch_mode(); return; } if (buttonB.uniquePress()) { display_date(); } get_time(); //get the time from the clock chip mins = rtc; //get mins //if mins is different from old_mins - redraw display if (mins != old_mins) { //update old_mins with current mins value old_mins = mins; //reset these for comparison next time mins = rtc; hours = rtc; //make hours into 12 hour format if (hours >12) ( heures = heures - 12; ) if (heures == 0) ( heures = 12; ) //diviser la valeur des minutes en deux chiffres distincts int minsdigit = rtc % 10; octet minsdigitten = (rtc / 10) % 10 ; //si minutes<= 10 , then top line has to read "minsdigti past" and bottom line reads hours if (mins < 10) { strcpy (str_a, numbers); strcpy (str_b, "PAST"); strcpy (str_c, numbers); } //if mins = 10, cant use minsdigit as above, so soecial case to print 10 past /n hour. if (mins == 10) { strcpy (str_a, numbers); strcpy (str_b, " PAST"); strcpy (str_c, numbers); } //if time is not on the hour - i.e. both mins digits are not zero, //then make first line read "hours" and 2 & 3rd lines read "minstens" "mins" e.g. "three /n twenty /n one" else if (minsdigitten != 0 && minsdigit != 0) { strcpy (str_a, numbers); //if mins is in the teens, use teens from the numbers array for the 2nd line, e.g. "fifteen" //if (mins >= 11 && minutes<= 19) { if (mins <= 19) { strcpy (str_b, numbers); } else { strcpy (str_b, numberstens); strcpy (str_c, numbers); } } // if mins digit is zero, don"t print it. read read "hours" "minstens" e.g. "three /n twenty" else if (minsdigitten != 0 && minsdigit == 0) { strcpy (str_a, numbers); strcpy (str_b, numberstens); strcpy (str_c, ""); } //if both mins are zero, i.e. it is on the hour, the top line reads "hours" and bottom line reads "o"clock" else if (minsdigitten == 0 && minsdigit == 0) { strcpy (str_a, numbers); strcpy (str_b, "O"CLOCK"); strcpy (str_c, ""); } }//end worknig out time //run in a loop //print line a "twelve" byte len = 0; while (str_a) { len++; }; //get length of message byte offset_top = (31 - ((len - 1) * 4)) / 2; // //plot hours line byte i = 0; while (str_a[i]) { puttinychar((i * 4) + offset_top, 1, str_a[i]); i++; } //hold display but check for button presses int counter = 1000; while (counter >0)( //vérifier la pression sur le bouton if (buttonA.uniquePress()) ( switch_mode(); return; ) if (buttonB.uniquePress()) ( display_date(); ) delay(1); counter--; ) fade_down (); //imprimer la ligne b len = 0; while (str_b) ( len++; ); //obtenir la longueur du message offset_top = (31 - ((len - 1) * 4)) / 2; je = 0 ; while (str_b[i]) ( puttinychar((i * 4) + offset_top, 1, str_b[i]); i++; ) //maintenir l'affichage mais vérifier les pressions sur les boutons counter = 1000; while (compteur > 0)( if (buttonA.uniquePress()) ( switch_mode(); return; ) if (buttonB.uniquePress()) ( display_date(); ) delay(1); counter--; ) fade_down() ; // affiche la ligne c si elle existe. longueur = 0 ; while (str_c) ( len++; ); //obtenir la longueur du message offset_top = (31 - ((len - 1) * 4)) / 2; je = 0 ; while (str_c[i]) ( puttinychar((i * 4) + offset_top, 1, str_c[i]); i++; ) counter = 1000; while (counter > 0)( //vérifier la pression sur le bouton if (buttonA.uniquePress()) ( switch_mode(); return; ) if (buttonB.uniquePress()) ( display_date(); ) delay(1); counter- -; ) fade_down(); //maintenir l'affichage vide mais vérifier les pressions sur les boutons avant de recommencer. compteur = 1000 ; while (counter > 0)( //vérifier la pression sur le bouton if (buttonA.uniquePress()) ( switch_mode(); return; ) if (buttonB.uniquePress()) ( display_date(); ) delay(1); counter- -; ) ) fade_down(); ) /// défilement du message - non utilisé actuellement - trop lent. void scroll() ( char message = ("Bonjour "); cls(); byte p = 6; //position actuelle dans la chaîne byte chara = (0, 1, 2, 3, 4, 5); //chars from string int x = (0, 6, 12, 18, 24, 30); //xpos pour chaque octet de caractère y = 0; //y pos // clear_buffer(); while (message[p] != "\ 0") ( //dessine les 6 caractères pour (octet c = 0; c< 6; c++) { putnormalchar(x[c],y,message[ chara[c] ]); //draw a line of pixels turned off after each char,otherwise the gaps between the chars have pixels left in them from the previous char for (byte yy = 0 ; yy < 8; yy ++) { plot(x[c] + 5, yy, 0); } //take one off each chars position x[c] = x[c] - 1; } //reset a char if it"s gone off screen for (byte i = 0; i <= 5; i++) { if (x[i] < -5) { x[i] = 31; chara[i] = p; p++; } } } } //display_date - print the day of week, date and month with a flashing cursor effect void display_date() { cls(); //read the date from the DS1307 byte dow = rtc; // day of week 0 = Sunday byte date = rtc; byte month = rtc - 1; //array of month names to print on the display. Some are shortened as we only have 8 characters across to play with char monthnames = { "January", "February", "March", "April", "May", "June", "July", "August", "Sept", "October", "November", "December" }; //print the day name //get length of text in pixels, that way we can centre it on the display by divindin the remaining pixels b2 and using that as an offset byte len = 0; while(daysfull) { len++; }; byte offset = (31 - ((len-1)*4)) / 2; //our offset to centre up the text //print the name int i = 0; while(daysfull[i]) { puttinychar((i*4) + offset , 1, daysfull[i]); i++; } delay(1000); fade_down(); cls(); // print date numerals char buffer; itoa(date,buffer,10); offset = 10; //offset to centre text if 3 chars - e.g. 3rd // first work out date 2 letter suffix - eg st, nd, rd, th etc // char suffix={"st", "nd", "rd", "th" }; is defined at top of code byte s = 3; if(date == 1 || date == 21 || date == 31) { s = 0; } else if (date == 2 || date == 22) { s = 1; } else if (date == 3 || date == 23) { s = 2; } //print the 1st date number puttinychar(0+offset, 1, buffer); //if date is under 10 - then we only have 1 digit so set positions of sufix etc one character nearer byte suffixposx = 4; //if date over 9 then print second number and set xpos of suffix to be 1 char further away if (date >9)( suffixposx = 8; puttinychar(4+offset, 1, buffer); offset = 8; //décalage pour centrer le texte si 4 caractères ) //imprimer les 2 caractères du suffixe puttinychar(suffixposx+offset, 1, suffix[s ]); puttinychar(suffixposx+4+offset, 1, suffixe[s]); retard (1000); fade_down(); //imprimer le nom du mois //obtenir la longueur du texte en pixels, de cette façon nous pouvons le centrer sur l'écran en divisant les pixels restants b2 et en l'utilisant comme décalage len ​​= 0 ; while(noms des mois) ( len++; ); décalage = (31 - ((len-1)*4)) / 2; //notre décalage pour centrer le texte i = 0; while(noms de mois[i]) ( puttinychar((i*4) +offset, 1, noms de mois[i]); i++; ) delay(1000); fade_down(); ) //afficher le menu pour changer le mode d'horloge void switch_mode() ( //se souvenir du mode dans lequel nous nous trouvons. Nous utilisons cette valeur si nous passons en mode paramètres, afin que nous puissions revenir du mode paramètres (6) au mode dans lequel nous étions in. old_mode = clock_mode; char* modes = ( "Basic", "Small", "Slide", "Words", "Setup" ); octet next_clock_mode; octet firstrun = 1; //boucle en attente du bouton (délai d'expiration après 35 boucles pour revenir au mode X) for (int count = 0; count< 35 ; count++) { //if user hits button, change the clock_mode if (buttonA.uniquePress() || firstrun == 1) { count = 0; cls(); if (firstrun == 0) { clock_mode++; } if (clock_mode >NUM_DISPLAY_MODES + 1) ( clock_mode = 0; ) //imprimer la flèche et le nom du mode d'horloge actuel sur la première ligne et imprimer le nom du mode d'horloge suivant sur la ligne deux char str_top ; //strcpy (str_top, "-"); strcpy(str_top, modes); next_clock_mode = clock_mode + 1 ; if (next_clock_mode > NUM_DISPLAY_MODES + 1) ( next_clock_mode = 0; ) octet i = 0; while (str_top[i]) ( putnormalchar(i * 6, 0, str_top[i]); i++; ) firstrun = 0; ) retard(50); ) ) //exécute la boucle principale de l'horloge tant que run_mode renvoie l'octet vrai run_mode() ( //si le mode aléatoire est activé... vérifie l'heure à laquelle nous changeons de mode. if (random_mode) ( //si la valeur de l'heure en mode changement time = hours. then reurn false = c'est-à-dire quitter le mode. if (change_mode_time == rtc) ( //définir le prochain mode d'horloge aléatoire et l'heure pour le modifier set_next_random(); //quitter le mode actuel. return 0; ) ) / /else return 1 - continuer à fonctionner dans ce mode return 1; ) //définir l'heure suivante où l'horloge changera de mode lorsque le mode aléatoire est activé void set_next_random() ( //définir l'heure suivante où le mode de l'horloge changera - heure actuelle plus 1 à 4 heures get_time(); change_mode_time = rtc + random (1, 5); //si change_mode_time est maintenant supérieur à 23, alors réglez-le entre 1 et 3 heures du matin si (change_mode_time > 23) ( change_mode_time = random (1 , 4); ) //définir le nouveau mode d'horloge clock_mode = random(0, NUM_DISPLAY_MODES + 1); //sélectionner un nouveau mode d'horloge aléatoire) //afficher le menu pour modifier les paramètres de l'horloge void setup_menu() ( char* set_modes = ( "Rndom", "24 Hr", "Set", "Brght", "Exit"); if (ampm == 0) ( set_modes = ("12 Hr"); ) octet settings_mode = 0; octet next_setting_mode ; octet de première exécution = 1 ; //boucle en attente du bouton (délai d'attente après 35 boucles pour revenir au mode X) for(int count=0; count< 35 ; count++) { //if user hits button, change the clock_mode if(buttonA.uniquePress() || firstrun == 1){ count = 0; cls(); if (firstrun == 0) { setting_mode++; } if (setting_mode >NUM_SETTINGS_MODES) (setting_mode = 0;) //imprimer la flèche et le nom du mode d'horloge actuel sur la première ligne et imprimer le nom du mode d'horloge suivant sur la ligne deux char str_top ; strcpy(str_top, set_modes); next_setting_mode = paramètre_mode + 1 ; if (next_setting_mode > NUM_SETTINGS_MODES) ( next_setting_mode = 0; ) octet i = 0; while(str_top[i]) ( putnormalchar(i*6, 0, str_top[i]); i++; ) firstrun = 0; ) retard(50); ) //sélectionnez le commutateur de mode (setting_mode)( cas 0 : set_random(); break; cas 1 : set_ampm(); break; cas 2 : set_time(); break; cas 3 : set_intensity(); break; cas 4 : //quitte le saut de menu ; ) //change l'horloge du mode 6 (paramètres) à celui dans lequel elle se trouvait avant clock_mode=old_mode; ) //basculer le mode aléatoire - choisissez un mode d'horloge différent toutes les quelques heures void set_random())( cls(); char text_a = "Off"; char text_b = "On"; byte i = 0; //si le mode aléatoire est on , désactivez-le if (random_mode)( //désactivez le mode aléatoire random_mode = 0; //affiche un message à l'écran while(text_a[i]) ( putnormalchar((i*6), 0, text_a[i] ) ; i++; ) ) else ( //activer le mode aléatoire. random_mode = 1; //définir le mode heure changera set_next_random(); //imprimer un message à l'écran while(text_b[i]) ( putnormalchar((i * 6), 0, text_b[i]); i++; ) ) delay(1500); //laisse le message pendant environ une seconde) //définit l'horloge sur 12 ou 24 heures void set_ampm() ( // AM/ Mode PM ou horloge 24 heures - inversez le bit (fait de 0 en 1, ou de 1 en 0 pour le mode ampm) ampm = (ampm ^ 1); cls(); ) //changer l'intensité de l'écran void set_intensity() ( cls() ; octet i = 0; char text = "Bright"; while(text[i]) ( puttinychar((i*4)+4, 0, text[i]); i++; ) //attendre la saisie du bouton while ( ! boutonA.uniquePress()) ( barre de niveau (0,6,(intensité*2)+2,2); //afficher le niveau d'intensité sous forme de barre while (buttonB.isPressed()) ( if(intensity == 15) ( intensité = 0; cls (); ) else ( intensité++; ) //imprimer la nouvelle valeur i = 0; while(text[i]) ( puttinychar((i*4)+4, 0, text[i]); i++; ) //afficher le niveau d'intensité sous forme de barre de niveau (0,6,(intensité*2)+ 2,2); //modifier le réglage de la luminosité sur les écrans pour (adresse d'octet = 0 ; adresse< 4; address++) { lc.setIntensity(address, intensity); } delay(150); } } } // display a horizontal bar on the screen at offset xposr by ypos with height and width of xbar, ybar void levelbar (byte xpos, byte ypos, byte xbar, byte ybar) { for (byte x = 0; x < xbar; x++) { for (byte y = 0; y <= ybar; y++) { plot(x+xpos, y+ypos, 1); } } } //set time and date routine void set_time() { cls(); //fill settings with current clock values read from clock get_time(); byte set_min = rtc; byte set_hr = rtc; byte set_date = rtc; byte set_mnth = rtc; int set_yr = rtc; //Set function - we pass in: which "set" message to show at top, current value, reset value, and rollover limit. set_date = set_value(2, set_date, 1, 31); set_mnth = set_value(3, set_mnth, 1, 12); set_yr = set_value(4, set_yr, 2013, 2099); set_hr = set_value(1, set_hr, 0, 23); set_min = set_value(0, set_min, 0, 59); ds1307.adjust(DateTime(set_yr, set_mnth, set_date, set_hr, set_min)); cls(); } //used to set min, hr, date, month, year values. pass //message = which "set" message to print, //current value = current value of property we are setting //reset_value = what to reset value to if to rolls over. E.g. mins roll from 60 to 0, months from 12 to 1 //rollover limit = when value rolls over int set_value(byte message, int current_value, int reset_value, int rollover_limit){ cls(); char messages = { "Set Mins", "Set Hour", "Set Day", "Set Mnth", "Set Year"}; //Print "set xyz" top line byte i = 0; while(messages[i]) { puttinychar(i*4 , 1, messages[i]); i++; } delay(2000); cls(); //print digits bottom line char buffer = " "; itoa(current_value,buffer,10); puttinychar(0 , 1, buffer); puttinychar(4 , 1, buffer); puttinychar(8 , 1, buffer); puttinychar(12, 1, buffer); delay(300); //wait for button input while (!buttonA.uniquePress()) { while (buttonB.isPressed()){ if(current_value < rollover_limit) { current_value++; } else { current_value = reset_value; } //print the new value itoa(current_value, buffer ,10); puttinychar(0 , 1, buffer); puttinychar(4 , 1, buffer); puttinychar(8 , 1, buffer); puttinychar(12, 1, buffer); delay(150); } } return current_value; } void get_time() { //get time DateTime now = ds1307.now(); //save time to array rtc = now.year(); rtc = now.month(); rtc = now.day(); rtc = now.dayOfWeek(); //returns 0-6 where 0 = Sunday rtc = now.hour(); rtc = now.minute(); rtc = now.second(); //flash arduino led on pin 13 every second //if ((rtc % 2) == 0) { // digitalWrite(13, HIGH); //} //else { // digitalWrite(13, LOW); //} //print the time to the serial port - useful for debuging RTC issues /* Serial.print(rtc); Serial.print(":"); Serial.print(rtc); Serial.print(":"); Serial.println(rtc); */ }

Désormais, pour terminer les travaux sur l'appareil, il vous suffit d'effectuer un certain nombre d'opérations simples :


La compilation du code du programme et son chargement ultérieur dans la mémoire du microcontrôleur prendront un certain temps, généralement pas plus d'une minute. La réussite de l'opération sera signalée dans la console Arduino IDE. Après quoi il ne reste plus qu'à redémarrer l'Arduino à l'aide du bouton Reset de l'appareil - une simple horloge sur matrices LED est prête !

Horloge prête sur Arduino

L'horloge est réglée à l'aide de deux boutons. L'appareil prend en charge les formats horaires 12 et 24 heures, affiche la date et le jour de la semaine et affiche l'heure avec ou sans secondes. Il est également possible de modifier la luminosité des LED.


Vous souhaiterez probablement ajouter plus de fonctionnalités à l'avenir (par exemple, un thermomètre) ou installer l'appareil dans un corps de votre propre conception - de bons résultats peuvent être obtenus en fabriquant sur des machines de découpe laser. Mais maintenant, vous pouvez dire en toute sécurité que vous avez assemblé de vos propres mains une montre électronique à part entière !

Ainsi, après une courte pause technique, nous poursuivons notre connaissance de la famille ARDUINO MK. Dans cette leçon, nous allons essayer de réaliser une horloge qui fonctionne à partir du générateur interne du MK (avec un générateur externe il y aura l'une des leçons suivantes) et affiche des informations sur l'indicateur LCD de type 1602 (ce qui signifie 16 caractères en 2 lignes, il existe aussi le type 1604 - 16 caractères sur 4 lignes, vous avez déjà compris que les 2 premiers chiffres indiquent le nombre de caractères indicateurs et les seconds indiquent le nombre de lignes). Ne retardons pas l'introduction, mettons-nous au travail.

Pour le projet nous aurons besoin de :

  1. Arduino Uno
  2. Indicateur LCD 1602
  3. Planche à pain
  4. Fils
  5. Résistance ajustable 10 kOhm

Pour ceux qui sont particulièrement paresseux, je vous conseille d'aller en bas de page et de télécharger le croquis fini ; pour ceux qui veulent apprendre à réaliser des croquis par eux-mêmes, je décrirai plus en détail toutes les étapes du projet . Pour travailler correctement et rapidement sur un projet, un algorithme de travail est nécessaire. Il est préférable d’esquisser presque n’importe quel projet sur papier, puis de suivre l’algorithme étape par étape. Nous ferons exactement la même chose. Créons donc un algorithme. Nous avons plusieurs conditions, écrivons-les par ordre croissant :

  1. Les secondes fonctionnent dans la plage de 0 à 59 dans un cycle avec un intervalle de secondes (cela est compréhensible).
  2. Les minutes fonctionnent dans la plage de 0 à 59 dans un cycle, la commutation se produit lorsque la valeur des secondes atteint 0.
  3. L'horloge fonctionne dans la plage de 0 à 24 (ici, vous pouvez choisir de l'afficher dans un style étranger de 0 à 12 avec les valeurs AM et PM, selon votre préférence) dans un cycle, la commutation se produit lorsque la valeur des minutes atteint 0.
  4. Afficher toutes les informations nécessaires sur l'écran (par exemple, vous pouvez décider de ne pas afficher les secondes mais simplement de faire un point clignotant entre les heures et les minutes)

Nous assemblons nos montres selon ce schéma :

Connexion de l'indicateur LCD 1602 à ARDUINO

Conseils de montage. L'indicateur 1602 provient généralement de Chine sous une forme « nue », c'est-à-dire aucune broche n'est soudée, je vous conseille d'utiliser à ces fins des prises d'ordinateur à double rangée de cartes mères, une broche de la prise est insérée dans 1602, la deuxième broche est derrière le bord de la carte, soudez les deux broches à une broche - ceci augmente la résistance mécanique et électrique. Ce schéma n'indique pas le schéma de connexion du rétroéclairage ; ce sont les 2 broches suivantes à droite de D7. Vous pouvez les connecter à l'alimentation 3,3 V de l'ARDUINO, vous pouvez effectuer un allumage/décoloration en douceur si vous connectez la broche positive (elle est étiquetée comme A-anode) à la sortie ARDUINO et contrôlez l'alimentation via cette broche, ceci est une tâche secondaire, pour l'instant connectez simplement la broche Et sur 1602 à 3,3V sur ARDUINO, et la broche K 1602 à GND ARDUINO.

Commençons maintenant à concevoir la montre. Nous lançons le shell ARDUINO sur l'ordinateur. Essayons de jouer avec 1602 pour vérifier les bonnes connexions du circuit. Allons-y Fichier-Exemples-LiqidCrystal et sélectionnez l'un des fichiers. Nous téléchargeons le croquis sur ARDUINO et regardons ce qui se passe. Si à la place des symboles vous voyez des carrés noirs, resserrez la résistance de trimmer, il s'agit d'un régulateur de contraste (faites de même si rien ne s'affiche du tout). Les informations doivent être affichées correctement et il ne doit tout simplement pas y avoir de « trucs fous ». S'ils apparaissent, vérifiez le schéma de connexion, où il a été mal assemblé. Vous pouvez immédiatement voir dans les croquis comment accéder à l'indicateur LCD et être étonné de la facilité de travailler avec lui ! Si tout fonctionne correctement pour vous, passons directement à la programmation.

Décidons que notre minuterie fonctionnera sans l'opérateur de retard comme indiqué. On rentre donc le code suivant :




#inclure

// Les variables changeront :


vide installation () {
lcd.begin(16, 2);

vide boucle ()
{

if (currentMillis - previousMillis >= intervalle) (


Ce code fonctionnera déjà mais n'affichera rien. 1 sera ajouté à la variable s chaque seconde. nous avons déjà obtenu l'intervalle exact de 1 seconde ! Maintenant, en suivant l'algorithme, nous avons besoin d'une limite de la variable entre 0 et 59. Faisons-le.

si(s>
{


}

Ajoutez ce code au programme. D'après la description, tout est clair - si la valeur de s est supérieure à 59, alors nous lui attribuons 0 et ajoutons 1 minute à la variable m. À l'heure actuelle, nous disposons d'une minuterie entièrement fonctionnelle et d'un compteur de minutes infini (jusqu'à 32 768 - la valeur maximale du type entier). Vous devez maintenant calculer les minutes de la même manière. Nous écrivons ce qui suit :

if (m>59) // si m les valeurs sont supérieures à 59
{


}

Ajoutez des lignes au programme. Cela devrait déjà ressembler à ceci :

int h, m, s ; // variables pour les heures, minutes, secondes
booléen z ; // variable pour afficher le point
// connecte la bibliothèque d'indicateurs
#inclure

// initialise la bibliothèque avec les numéros des broches de l'interface
Écran LCD LiquidCrystal (12, 11, 5, 4, 3, 2);

// Les variables changeront :
int ledState = FAIBLE ; // ledState utilisé pour définir la LED
non signé long précédentMillis = 0; // stockera la dernière fois que la LED a été mise à jour
intervalle long const = 1000 ; // intervalle auquel clignoter (millisecondes)

vide installation () {
lcd.begin(16, 2);

vide boucle ()
{

Courant long non signéMillis = millis();

if (currentMillis - previousMillis >= intervalle) (
// enregistre la dernière fois que vous avez clignoté la LED
précédentMillis = courantMillis;
s++; // en ajoute un, équivalent à écrire s=s+1;

// section de comptage des secondes

if (s>59) // si la valeur de s est supérieure à 59
{
s=0 ; // attribue la valeur 0 à la variable s
m++; // ajoute 1 à la variable m responsable des minutes
}

// section de comptage des minutes

si(m>
{
m = 0 ; // attribue la valeur 0 à la variable m
h++; // ajoute 1 à la variable h responsable de l'horloge
}

En principe, tout est clair. Il ne reste plus qu'à traiter l'horloge. Faisons-le. Nous ajoutons après la section de décompte des minutes :

si(h>
{

}

Ça y est, la montre est prête ! Remplissez le croquis et l'horloge fonctionnera comme il se doit ! J'attire votre attention sur le fait qu'ils compteront au format 24 heures. Essayez de créer vous-même un format de 12 heures. Il ne reste plus qu'à afficher les informations sur l'indicateur LCD. Il existe 2 façons d’écrire du code pour générer des informations.

  1. Calculez certaines données et affichez-les immédiatement
  2. Calculez toutes les données et affichez-les toutes en même temps.

À ce stade, vous déciderez vous-même du chemin que vous emprunterez. Si vous suivez le premier chemin, vous devez alors écrire l'affichage des informations immédiatement dans les sections de calcul, si vous suivez le deuxième chemin, vous écrivez un bloc après tous les calculs. Prenons la deuxième voie parce que... c'est plus préférable et plus logique (même si, pour être honnête, mon croquis de test a été écrit le long du premier chemin). Ainsi, pour transférer des données vers l'indicateur 1602, seules 2 commandes sont utilisées :

lcd.setCursor(3, 0); // définit le curseur sur le 3ème caractère de la 0ème ligne (le comptage des lignes et des caractères commence à 0)
lcd.print(0); // imprimer (imprimer- imprimer, apprendre l'anglais) 0

Il existe également la commande lcd.clear ; ce qui veut dire écran clair mais nous n'avons pas besoin de l'utiliser ici.

Nous commençons à afficher des informations. Commençons par les secondes (vous pouvez commencer avec n'importe quelle valeur, faites ce qui vous convient). Placez le curseur sur la ligne 0 en position 6 et affichez la valeur des secondes. Pourquoi en 6ème position demandez-vous ? Imaginons ce qui suit : le format d'affichage de l'horloge est de 2 caractères (heures), un séparateur (disons :), 2 caractères (minutes), un séparateur (:) et, enfin, des secondes. On compte à partir de la position zéro : 0+2+1+2+1=6. Puisque le comptage commence à 0, on soustrait un des données (zéro est aussi un nombre), on obtient 6-1=5. C'est le temps qu'il faut pour afficher les heures et les minutes avec des délimiteurs, la position suivante est la deuxième position et elle est égale à 5+1=6. Un peu déroutant mais j'écrirai ce qui suit hh:mm:ss et calculez les coordonnées en commençant par 0. C'est ainsi que les coordonnées sont calculées sur les indicateurs de la famille 16xx. Dans ces conditions, l'horloge sera affichée dans le coin supérieur gauche, vous pourrez modifier l'emplacement à votre guise, vous pourrez même saisir une variable et, en la sélectionnant, sélectionner la position d'affichage dont vous avez besoin. Bon, écrivons ces lignes :

lcd.setCursor(6, 0); // définit le curseur sur le 6ème caractère de la 0ème ligne (le comptage des lignes commence à 0)

Le programme ressemblera à ceci :

int h, m, s ; // variables pour les heures, minutes, secondes
booléen z ; // variable pour afficher le point
// connecte la bibliothèque d'indicateurs
#inclure

// initialise la bibliothèque avec les numéros des broches de l'interface
Écran LCD LiquidCrystal (12, 11, 5, 4, 3, 2);

// Les variables changeront :
int ledState = FAIBLE ; // ledState utilisé pour définir la LED
non signé long précédentMillis = 0; // stockera la dernière fois que la LED a été mise à jour
intervalle long const = 1000 ; // intervalle auquel clignoter (millisecondes)

vide installation () {
lcd.begin(16, 2);

vide boucle ()
{

Courant long non signéMillis = millis();

if (currentMillis - previousMillis >= intervalle) (
// enregistre la dernière fois que vous avez clignoté la LED
précédentMillis = courantMillis;
s++; // en ajoute un, équivalent à écrire s=s+1;

// section de comptage des secondes

if (s>59) // si la valeur de s est supérieure à 59
{
s=0 ; // attribue la valeur 0 à la variable s
m++; // ajoute 1 à la variable m responsable des minutes
}

// section de comptage des minutes

if (m>59) // si la valeur de m est supérieure à 59
{
m = 0 ; // attribue la valeur 0 à la variable m
h++; // ajoute 1 à la variable h responsable de l'horloge
}

// section de comptage des heures

if (h>23) // si la valeur de h est supérieure à 23
{
h = 0 ; // attribue la valeur 0 à la variable h
}

// section de sortie d'informations

lcd.setCursor(6, 0);
lcd.print(s); // affiche les données de la variable s

Remplissez le croquis et... les secondes ont commencé à apparaître !!! Faites juste attention, en comptant de 0 à 59, tout va bien, mais dès que la minute suivante commence, des dizaines de secondes commencent à changer au lieu d'unités de secondes, c'est-à-dire L'heure ne s'affiche pas correctement. Voyons cela. Nous avons donné au programme une position stricte 6,0 , et il affiche les données exactement à cette position sans écraser ce qui se trouve après cette position. Quittez 2. Appliquez lcd.clear ou décrivez correctement l'affichage, d'autant plus qu'avec la première option, il sera assez difficile de s'habituer aux chiffres sautants des secondes (plus tard les minutes et les heures). Écrivons un gestionnaire d'affichage correct. Quelles seront les conditions de ce traitement ? Pensons-y. Si les secondes sont inférieures à 10, alors on écrit leur valeur en 7ème position (6+1=7) et en 6ème position on écrit 0, si supérieure ou égale à 10, on écrit en 6ème position. C'est assez simple. La condition ressemblera à ceci :

si (s<10) //если секунд меньше 10
{

lcd.print(0); //imprimer 0


}
autre
{


}

Collez plutôt ce code

lcd.setCursor(6, 0); // définit le curseur sur le 7ème caractère de la 0ème ligne (le comptage des lignes commence à 0)
lcd.print(s); // affiche les données de la variable s

et nous sommes contents du résultat déjà obtenu ! Tout s'affiche correctement ! De plus, un séparateur « : » est apparu avant les secondes ! De la même manière, nous écrivons un gestionnaire pour les minutes et les heures avec les coordonnées du curseur correspondantes. Cela pourrait ressembler à ceci pendant quelques minutes :

Si (m<10)
{
lcd.setCursor(3, 0);
lcd.print(0);
lcd.setCursor(4, 0);
lcd.print(m);
}
autre
{
lcd.setCursor(3, 0);
lcd.print(m);
}

et ainsi de suite pendant des heures :

Si (h<10)
{
lcd.setCursor(0, 0);
lcd.print(0);
lcd.setCursor(1, 0);
lcd.print(h);
}
autre
{
lcd.setCursor(0, 0);
lcd.print(h);
}

Notre programme prendra la forme suivante :

int h, m, s ; // variables pour les heures, minutes, secondes
booléen z ; // variable pour afficher le point
// connecte la bibliothèque d'indicateurs
#inclure

// initialise la bibliothèque avec les numéros des broches de l'interface
Écran LCD LiquidCrystal (12, 11, 5, 4, 3, 2);

// Les variables changeront :
int ledState = FAIBLE ; // ledState utilisé pour définir la LED
non signé long précédentMillis = 0; // stockera la dernière fois que la LED a été mise à jour
intervalle long const = 1000 ; // intervalle auquel clignoter (millisecondes)

vide installation () {
lcd.begin(16, 2);

vide boucle ()
{

Courant long non signéMillis = millis();

if (currentMillis - previousMillis >= intervalle) (
// enregistre la dernière fois que vous avez clignoté la LED
précédentMillis = courantMillis;
s++; // en ajoute un, équivalent à écrire s=s+1;

// section de comptage des secondes

if (s>59) // si la valeur de s est supérieure à 59
{
s=0 ; // attribue la valeur 0 à la variable s
m++; // ajoute 1 à la variable m responsable des minutes
}

// section de comptage des minutes

if (m>59) // si la valeur de m est supérieure à 59
{
m = 0 ; // attribue la valeur 0 à la variable m
h++; // ajoute 1 à la variable h responsable de l'horloge
}

// section de comptage des heures

if (h>23) // si la valeur de h est supérieure à 23
{
h = 0 ; // attribue la valeur 0 à la variable h
}

// section de sortie d'informations

// secondes de sortie

si (s<10) //если секунд меньше 10
{
lcd.setCursor(6, 0); // curseur en position 6, ligne 0
lcd.print(0); //imprimer 0
lcd.setCursor(7, 0); //curseur en position 7 de la ligne 0
lcd.print(s); // affiche la valeur de la variable s
}
autre
{
lcd.setCursor(6, 0); //sinon le curseur est en 6ème position de la 0ème ligne
lcd.print(s); // affiche la valeur de la variable s
}
lcd.setCursor(5, 0); // curseur en position 5, ligne 0
lcd.print(':'); // affiche le séparateur entre les secondes et les minutes

// minutes de sortie

si (m<10)
{
lcd.setCursor(3, 0);
lcd.print(0);
lcd.setCursor(4, 0);
lcd.print(m);
}
autre
{
lcd.setCursor(3, 0);
lcd.print(m);
}
lcd.setCursor(2, 0); // curseur en position 2 de la ligne 0
lcd.print(':'); // affiche le séparateur entre les minutes et les heures

// horloge de sortie

si (h<10)
{
lcd.setCursor(0, 0);
lcd.print(0);
lcd.setCursor(1, 0);
lcd.print(h);
}
autre
{
lcd.setCursor(0, 0);
lcd.print(h);
}

L’intégralité du code tient dans un peu plus de 3 kilo-octets ! La plupart d'entre eux ont été consommés par la bibliothèque pour l'indicateur LCD. Précisons d'emblée que ce code n'est que le corps du programme, il faut également ajouter une fonction de réglage de l'heure. De plus, vous pouvez ajouter une photorésistance et éclaircir le rétroéclairage de l'écran. Vous pouvez ajouter une fonction d'entrée d'alarme et travailler avec le son. Vous pouvez également afficher la température ambiante, la date, etc... De manière générale, cet indicateur doté des capteurs appropriés peut faire de cette montre un appareil unique ! Le seul inconvénient de cet appareil est qu'en cas de panne de courant, vous devrez régler à nouveau l'horloge. Par conséquent, dans un avenir proche, je décrirai comment travailler avec le module RTC. Lorsque vous travaillez avec lui, même en cas de coupure de courant, lorsque la tension est appliquée, l'horloge fonctionnera comme si de rien n'était. Pour une version moins chère de l'horloge, vous pouvez utiliser arduino pro mini, c'est le même contrôleur qui n'a pas de connecteur USB mais coûte plusieurs fois moins cher et est de très petite taille. Vous pouvez également utiliser l'arduino nano, le même pro mais avec un connecteur USB. Jusqu'au prochain cours. Merci à tous pour votre attention.

PS*. À propos, la procédure d'affichage des valeurs peut être écrite comme une fonction distincte et lui transmettre les valeurs nécessaires. Essayez ceci et comparez la quantité de mémoire occupée. Visez toujours le plus petit volume possible.