Table des matières:

Horloge texte à défilement Arduino : 3 étapes
Horloge texte à défilement Arduino : 3 étapes

Vidéo: Horloge texte à défilement Arduino : 3 étapes

Vidéo: Horloge texte à défilement Arduino : 3 étapes
Vidéo: Débuter l'électronique et Arduino: Leçon 12, interface homme-machine de l'horloge 2024, Novembre
Anonim
Horloge texte à défilement Arduino
Horloge texte à défilement Arduino

Le but de ce projet est de créer une horloge à texte défilant qui affiche l'heure telle qu'elle est prononcée (par exemple, « il est minuit »).

Il s'agit d'un projet rapide - nous vous en donnons assez pour commencer avec le matériel et le croquis, et vous pourrez ensuite aller plus loin en fonction de vos besoins.

Étape 1: Matériel

Matériel
Matériel

Vous aurez besoin de trois éléments principaux -

  • une carte compatible Arduino Uno
  • un circuit ou un module d'horloge en temps réel utilisant un CI DS1307 ou DS3231
  • et un écran LED monochrome de style P10

Vous voudrez peut-être une alimentation externe, mais nous y reviendrons plus tard.

La première étape consiste à adapter votre horloge temps réel. Cliquez ici pour le tutoriel si vous avez besoin d'aide pour cela.

A présent, j'espère que vous vous demandez "comment régler l'heure ?".

Il y a deux réponses à cette question. Si vous utilisez le DS3231, définissez-le simplement dans le croquis (voir ci-dessous) car la précision est très bonne, il vous suffit de télécharger le croquis avec la nouvelle heure deux fois par an pour couvrir l'heure d'été.

Sinon, ajoutez une interface utilisateur simple - quelques boutons pourraient le faire. Enfin, il vous suffit de mettre le matériel au dos du DMD. Il y a beaucoup de possibilités pour répondre à vos propres besoins, une solution simple peut être d'aligner la carte de commande afin que vous puissiez accéder facilement à la prise USB - puis de la coller avec du Sugru.

En ce qui concerne l'alimentation de l'horloge, vous pouvez utiliser UN écran LED à partir de l'Arduino, et il fonctionne à une bonne luminosité pour une utilisation en intérieur. Si vous voulez que le DMD fonctionne à pleine luminosité, vous devez utiliser une alimentation CC 5V 4A séparée. Si vous utilisez deux DMD, cela passe à 8A, et ainsi de suite. Connectez simplement l'alimentation externe aux bornes d'un DMD (connectez le deuxième ou plusieurs DMD à ces bornes).

Si vous n'avez pas envie de couper l'extrémité de votre câble d'alimentation, utilisez une prise de courant continu.

Étape 2: L'esquisse Arduino

Vous devrez installer les deux bibliothèques Arduino suivantes – TimerOne et DMD. Ensuite, téléchargez le croquis:

// pour RTC#include "Wire.h" #define DS1307_I2C_ADDRESS 0x68 // le DS1307 RTC est 0x68

// pour l'affichage LED

#include "SPI.h" #include "DMD.h" #include "TimerOne.h" #include "SystemFont5x7.h" #include "Arial_black_16.h" #define DISPLAYS_ACROSS 1 // vous pourriez avoir plus d'un DMD dans un ligne #define DISPLAYS_DOWN 1 DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);

Chaîne finalString; // utilisé pour contenir la dernière phrase à afficher sur DMD

void ScanDMD() // requis pour DMD

{ dmd.scanDisplayBySPI(); }

void setup()

{ // pour DMD Timer1.initialize (5000); Timer1.attachInterrupt(ScanDMD); dmd.clearScreen(true);

// pour RTC

Fil.begin(); // lance l'octet de bus I2C seconde, minute, heure, dayOfWeek, dayOfMonth, mois, année; // modifiez les variables et décommentez le setDateDs1307 pour définir l'heure // puis commentez à nouveau la fonction et téléchargez à nouveau le croquis second = 0; minute = 13; heure = 23; jourDeSemaine = 4; jourDuMois = 19; mois = 5; année = 13; // setDateDs1307(seconde, minute, heure, jour de semaine, jour de mois, mois, année); }

// fonctions RTC habituelles

// Convertir les nombres décimaux normaux en octet décimal codé en binaire decToBcd(byte val) { return ((val/10*16) + (val%10)); }

// Convertir les nombres décimaux codés binaires en nombres décimaux normaux

byte bcdToDec(byte val) { return ((val/16*10) + (val%16)); }

void setDateDs1307(octet seconde, // 0-59

octet minute, // 0-59 octets heure, // 1-23 octets dayOfWeek, // 1-7 octets dayOfMonth, // 1-28/29/octet mois, // 1-12 octets année) // 0- 99 { Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0); Wire.write(decToBcd(second)); // 0 au bit 7 démarre l'horloge Wire.write(decToBcd(minute)); Wire.write(decToBcd(hour)); Wire.write(decToBcd(dayOfWeek)); Wire.write(decToBcd(dayOfMonth)); Wire.write(decToBcd(mois)); Wire.write(decToBcd(year)); Wire.write(000100000); // envoie 0x10 (hex) 00010000 (binaire) au registre de contrôle - active l'onde carrée Wire.endTransmission(); }

// Obtient la date et l'heure du ds1307

void getDateDs1307(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) { // Réinitialise le pointeur de registre Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0); Wire.endTransmission();

Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

// Certains d'entre eux ont besoin de masques car certains bits sont des bits de contrôle

*second = bcdToDec(Wire.read() & 0x7f); *minute = bcdToDec(Wire.read()); *heure = bcdToDec(Wire.read() & 0x3f); // Besoin de changer cela si 12 heures am/pm *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *mois = bcdToDec(Wire.read()); *année = bcdToDec(Wire.read()); }

void drawText(String oldString)

{ dmd.clearScreen(true); dmd.selectFont(Arial_Black_16); char nouvelleChaîne[256]; int sLength = oldString.length(); oldString.toCharArray(newString, sLength+1); dmd.drawMarquee(newString, sLength, (32*DISPLAYS_ACROSS)-1, 0); début long=millis(); minuterie longue = démarrage; minuterie longue2=démarrer; booléen ret=false; while(!ret){ if ((timer+20) < millis()) { ret=dmd.stepMarquee(-1, 0); minuteur=millis(); } } }

void createTextTime(int hh, int mm)

// cela mélange toutes les données temporelles en une seule phrase { finalString=" "; // efface la phrase pour les cas particuliers (ci-dessous) finalString=finalString+"C'est ";

// maintenant ajouter l'heure

if (hh==1 || hh==13) { chaîne_finale=chaîne_finale+"un "; } if (hh==2 || hh==14) { chaîne finale=chaîne finale+"deux"; } if (hh==3 || hh==15) { chaîne finale=chaîne finale+"trois"; } if (hh==4 || hh==16) { chaîne finale=chaîne finale+"quatre"; } if (hh==5 || hh==17) { chaîne finale=chaîne finale+"cinq"; } if (hh==6 || hh==18) { chaîne_finale=chaîne_finale+"six"; } if (hh==7 || hh==19) { chaîne finale=chaîne finale+"sept"; } if (hh==8 || hh==20) { chaîne_finale=chaîne_finale+"huit"; } if (hh==9 || hh==21) { chaîne_finale=chaîne_finale+"neuf"; } if (hh==10 || hh==22) { chaîne_finale=chaîne_finale+"ten"; } if (hh==11 || hh==23) { chaîne_finale=chaîne_finale+"onze"; }

// maintenant ajouter les minutes

switch(mm){ case 1: chaîne finale=chaîne finale+"oh one"; Pause; cas 2: chaîne finale=chaîne finale+"oh deux"; Pause; cas 3: chaîne finale=chaîne finale+"oh trois"; Pause; cas 4: finalString=finalString+"oh quatre"; Pause; cas 5: chaîne finale=chaîne finale+"oh cinq"; Pause; cas 6: chaîne finale=chaîne finale+"oh six"; Pause; cas 7: chaîne finale=chaîne finale+"oh sept"; Pause; cas 8: chaîne finale=chaîne finale+"oh huit"; Pause; cas 9: chaîne finale=chaîne finale+"oh neuf"; Pause; cas 10: chaîne finale=chaîne finale+"ten"; Pause; cas 11: chaîne finale=chaîne finale+"onze"; Pause; cas 12: chaîne finale=chaîne finale+"douze"; Pause; cas 13: chaîne finale=chaîne finale+"treize"; Pause; cas 14: chaîne finale=chaîne finale+"quatorze"; Pause; cas 15: chaîne_finale=chaîne_finale+"quinze "; Pause; cas 16: chaîne finale=chaîne finale+"seize"; Pause; cas 17: chaîne finale=chaîne finale+"dix-sept "; Pause; cas 18: chaîne finale=chaîne finale+" dix-huit "; Pause; cas 19: chaîne finale=chaîne finale+ " dix-neuf "; Pause; cas 20: chaîne finale=chaîne finale+ "vingt "; Pause; cas 21: chaîne finale=chaîne finale+"vingt et un"; Pause; cas 22: chaîne finale=chaîne finale+ "vingt-deux "; Pause; cas 23: chaîne finale=chaîne finale+"vingt-trois"; Pause; cas 24: chaîne finale=chaîne finale+"vingt-quatre"; Pause; cas 25: chaîne finale=chaîne finale+"vingt-cinq"; Pause; cas 26: chaîne finale=chaîne finale+"vingt-six"; Pause; cas 27: chaîne finale=chaîne finale+"vingt-sept"; Pause; cas 28: chaîne finale=chaîne finale+"vingt-huit"; Pause; cas 29: chaîne finale=chaîne finale+"vingt-neuf"; Pause; cas 30: chaîne finale=chaîne finale+ "trente "; Pause; cas 31: chaîne finale=chaîne finale+"trente et un"; Pause; cas 32: chaîne finale=chaîne finale+"trente-deux"; Pause; cas 33: chaîne finale=chaîne finale+ "trente trois "; Pause; cas 34: chaîne finale=chaîne finale+"trente quatre"; Pause; cas 35: chaîne finale=chaîne finale+ "trente cinq "; Pause; cas 36: chaîne finale=chaîne finale+"trente six"; Pause; cas 37: chaîne finale=chaîne finale+"trente-sept"; Pause; cas 38: chaîne finale=chaîne finale+"trente huit"; Pause; cas 39: chaîne finale=chaîne finale+ "trente neuf "; Pause; cas 40: chaîne finale=chaîne finale+ "quarante "; Pause; case 41: chaîne finale=chaîne finale+"quarante et un"; Pause; cas 42: chaîne finale=chaîne finale+ "quarante-deux "; Pause; cas 43: chaîne finale=chaîne finale+"quarante-trois"; Pause; cas 44: chaîne finale=chaîne finale+ "quarante quatre "; Pause; cas 45: chaîne finale=chaîne finale+ "quarante cinq "; Pause; cas 46: chaîne finale=chaîne finale+ "quarante six "; Pause; case 47: chaîne finale=chaîne finale+ « quarante sept »; Pause; case 48: chaîne finale=chaîne finale+ "quarante huit "; Pause; cas 49: chaîne finale=chaîne finale+ "quarante neuf "; Pause; cas 50: chaîne finale=chaîne finale+ "cinquante "; Pause; cas 51: chaîne finale=chaîne finale+"cinquante et un "; Pause; cas 52: chaîne finale=chaîne finale+ "cinquante-deux "; Pause; cas 53: chaîne finale=chaîne finale+ "cinquante-trois "; Pause; cas 54: chaîne finale=chaîne finale+ "cinquante quatre "; Pause; cas 55: chaîne finale=chaîne finale+ "cinquante cinq "; Pause; cas 56: chaîne finale=chaîne finale+ "cinquante six "; Pause; cas 57: chaîne finale=chaîne finale+ "cinquante-sept "; Pause; cas 58: chaîne finale=chaîne finale+ "cinquante huit "; Pause; cas 59: chaîne finale=chaîne finale+ "cinquante neuf "; Pause; }

// midi ?

if (hh==12 && mm==0) { chaîne_finale=chaîne_finale+"midi"; } // minuit? if (hh==00 && mm==0) { chaîne_finale=chaîne_finale+"minuit"; }

}

boucle vide()

{ // récupère l'heure à partir de l'octet RTC seconde, minute, heure, dayOfWeek, dayOfMonth, month, year; getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

// convertit l'heure en chaîne de phrase

createTextTime(heure, minute);

// maintenant envoyer le texte au DMD

drawText(finalString); }

L'esquisse a les fonctions habituelles pour définir et récupérer l'heure des circuits intégrés d'horloge en temps réel DS1307/3232, et comme d'habitude avec toutes nos horloges, vous pouvez entrer les informations de temps dans les variables dans void setup(), puis décommenter setDateDs1307(), téléchargez le croquis, commentez à nouveau setDateDs1307, puis téléchargez à nouveau le croquis. Répétez ce processus pour réinitialiser l'heure si vous n'avez pas ajouté d'interface utilisateur matérielle.

Étape 3:

Une fois l'heure récupérée dans void loop(), elle est passée à la fonction createTextTime(). Cette fonction crée la chaîne de texte à afficher en commençant par « C'est », puis détermine les mots à suivre en fonction de l'heure actuelle. Enfin, la fonction drawText() convertit la chaîne contenant le texte à afficher en une variable caractère qui peut être passée au DMD.

Conseillé: