Go Down

Topic: Projet de compte a rebours  (Read 274 times) previous topic - next topic

emorej

Bonjour à tous,

Tout abord, veuillez me pardonner si je ne parle pas encore trop bien la langue, mais je "bidouille" sur des Arduino que depuis 1 mois.

Prochainement, j'aimerais faire un compte à rebours un peu particulier pour des animation de type "escape room"

Voici le projet comme je le vois (pas toujours simple dans ma tête) :

Une horloge circulaire avec une seule aiguille qui marquerai les secondes, (1tour 60 sec.) sur le tour du cadran, 60 LED (1LED par minute), quatre boutons : Play/pause/stop, +5min., -5min., reset. et un buzzer

L'idée : le "maitre du jeu" détermine un temps (ex : 20 minutes = 4 x "+5min" = 20 LED allumées) il déclenche le (de)compteur et à chaque tour, une led s'éteint.

Quand il reste 5 LED une alerte ( bip bip bip bip bip)

Pendant le jeu, il à possibilité d'allumé ou d'éteindre 5 LED et de continuer ainsi le jeu

Si toutes les LED sont éteintes une alerte (biiiiiiiiiiiiiip)

Voila ou j'en suis pour le moment XD, Je pense utiliser un mega, un moteur pas à pas pour l'aiguille...et puis on verra lol

Je sollicite le forum pour savoir par ou commencer, voir si vous avez des idées, des suggestion pour éviter des pièges...etc

Je vous remercie d'avance,

Jérôme


trimarco232

Bonjour Jérome,
tu n'as pas forcément besoin d'un mega, car il existe des modules spécialisés dans la commande de multiple Leds. De plus, à ce stade, on ne sait pas quelle est la taille et la puissance de chaque Led, donc il est possible que le mega ne puisse pas donner le courant total nécessaire
ma suggestion c'est de commencer par une maquette avec un nombre de leds limité, et d'avancer pas à pas dans ton projet

emorej

Hello, 
merci pour ta réponse,
Pour la taille des LED ce sera des 5mm la puissance...heuuuuu c'est pas marqué sur le paquet lol ;D
Mais effectivement je pensais bien que les 60 allumées ça serai tendu.
Si je prends un module avec un HT16K33 est-ce que je peux alimenter avec une autre source que l'arduino (je pense que oui) après pour le code, j'en suis a chipoter avec une matrice 8x8 et j'imagine que c'est une direction possible pour "piloter" mon horloge...pour l'aiguille, j'arrive a faire tourné le moteur pas à pas en 60sec.  ;D  rien de bien transcendant dans cela mais ça au moins je sais le faire lol.

trimarco232

Bonjour,
normalement tu prévois une seule alim 5 volts pour tous tes modules et ton arduino

lesept

#4
Feb 10, 2018, 07:15 pm Last Edit: Feb 10, 2018, 07:19 pm by lesept
Bonjour
Je suis justement sur un projet qui a une partie qui ressemble un peu au tien. Le matériel :
Un shield NodeMCU
Un NodeMCU 0.9
Une bande 60 LEDs WS2812B
et une alimentation 5V.

L'objectif est de faire une horloge, mais la partie qui affiche les secondes est celle qui t'intéresse.
Pour les LED, j'utilise la bibliothèque FastLED, qui est une peu complexe à apprivoiser mais très puissante ensuite. Le NodeMCU me permet de mettre à l'heure par internet et de commander des animations avec Cayenne. Mais tu n'as pas besoin de tout ça...

En début de programme, les définitions :
Code: [Select]
#define FASTLED_ESP8266_NODEMCU_PIN_ORDER
#include "FastLED.h"
// Fastled constants
#define DATA_PIN    2        // data pin : D2 (pas GPIO4 grace au define ligne 1)
#define COLOR_ORDER GRB
#define NUM_LEDS    60       // number of LEDs in the strip
#define LED_TYPE    WS2812B
#define BRIGHTNESS  64
// this creates an LED array to hold the values for each led in your strip
CRGB leds[NUM_LEDS];
long TlastHorloge;
byte heures = 0;
byte minutes = 0;


Dans le setup les déclarations:
Code: [Select]
void setup() {
  Serial.begin(115200);
  // Déclaration du ruban de leds
  FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.setCorrection( TypicalLEDStrip );
  FastLED.setBrightness( BRIGHTNESS );
  FastLED.clear();
  FastLED.show();
  TlastHorloge = millis();
  int  periode_horloge  = 1000; // Mise à jour de l'horloge : 1 seconde
}


et dans la loop, il suffit de mettre les LED à jour chaque seconde, en mesurant le temps avec millis()

Code: [Select]
  if (millis() - TlastHorloge >= periode_horloge) {
    TlastHorloge = millis();
    avanceHeure();
    MaJ_horloge();
    FastLED.show();
  }


avec

Code: [Select]
void MaJ_horloge () {
  int num_secm1;
  byte num_heures = ((heures + fuseau + dst) * 5 + int(minutes / 12) + offset) % 60;
  byte num_minutes = (minutes + offset) % 60;
  num_secondes = (secondes + offset) % 60;
  if (num_secondes == 0) {
    num_secm1 = 59;
  }
  else
  {
    num_secm1 = (num_secondes - 1) % 60;
  }
  int num_secp1 = (num_secondes + 1) % 60;
  leds[num_secondes] = CRGB::Blue;
  leds[num_heures] = CRGB::Red;
  leds[num_minutes] = CRGB::Green;
}


et

Code: [Select]
void avanceHeure () {
  // Avance l'heure
  secondes += 1;
  if (secondes == 60) {
    secondes = 0;
    minutes += 1;
    if (minutes == 60) {
      minutes = 0;
      heures += 1;
      heures = heures % 12;
    }
  }
 }


Il ne faut pas tout prendre, ça ne marchera pas, et il y en a trop car tu n'as besoin je pense que des secondes (pas des heures et des minutes). Mais tu as le minimum dont tu peux t'inspirer.


Bonne continuation !

emorej

Wauw merci pour les infos ;-) je vois cela et je reviens certainement vers vous :-p

lesept

#6
Feb 13, 2018, 04:43 pm Last Edit: Feb 13, 2018, 04:45 pm by lesept
Je précise que les variables num_secm1 et num_secp1 servent car j'affiche les secondes sur 3 LED, mais ce n'est pas nécessaire, c'est juste un choix. Si tu ne le fais pas, tu peux ôter les lignes qui utilisent ces variables, sinon, il faut ajouter près de
Code: [Select]
leds[num_secondes] = CRGB::Blue;
des lignes similaires qui attribuent une couleur aux leds[num_secm1] et leds[num_secp1]

Go Up