Go Down

Topic: Horloge Géante (Read 14446 times) previous topic - next topic

ASSM

Bonjour

J'aimerais construire une horloge géante a base de ruban leds WS2812.

Chaque segment comporte 4 leds et il y aura deux leds entre les heures et les minutes pour le clignotement des secondes.(cela fera un total de 114 leds)

Suivant le code ci-dessous il fonctionne parfaitement avec des segments de 1 led.

Comment puis je le modifier pour pouvoir l'adapter a ma situation.

Pour pouvoir faire clignoter les deux leds des secondes j'arrive a modifier le code mais pas pour le restant.

Merci d'avance et dans l'attente de vos réponses.

hbachetti

#1
May 21, 2018, 09:28 pm Last Edit: May 21, 2018, 09:30 pm by hbachetti
Salut

Si cela fonctionne avec une LED, cela doit fonctionner avec 4, si la tension est suffisante.
Suivant la couleur des LEDS, leur tension de fonctionnement (Forward Voltage) est différente :
Rouge 1.6V jusqu'à 3V pour du blanc.

As-tu suffisamment de tension d'alimentation ?

@+
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

ASSM

Bonsoir

Se n'est pas un problème d'alimentation mais le programme est prévu pour faire fonctionner 29leds alors que je veux le faire en 114 leds.(j'ai une alim de PC modifiée)

Je ne sais pas comment modifier le programme pour lui dire d'allumer 4 leds par segment plutôt que une led par segment.

Cordialement.

hbachetti

A ce stade un schéma de ce que tu as fait s'impose, avec les tensions d'alimentation.

@+


Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

ASSM

#4
May 21, 2018, 09:54 pm Last Edit: May 21, 2018, 10:19 pm by ASSM
je vais modifié ma boucle for pour remplacer la valeur 6 par la valeur 27

jfs

#5
May 21, 2018, 10:05 pm Last Edit: May 21, 2018, 10:05 pm by jfs
Je te donne 1/2 heure pour corriger ton message.... lis les messages épinglés.
Pas d'aide par MP !!!

Concernant le fonctionnement du forum tout se trouve dans les messages épinglés en tête de page.

Artouste

Je te donne 1/2 heure pour corriger ton message.... lis les messages épinglés.
:smiley-mr-green:

TIC . TAC
TIC , TAC

jfs

Pas d'aide par MP !!!

Concernant le fonctionnement du forum tout se trouve dans les messages épinglés en tête de page.

jfs

Fallait mettre le code entre les balises.... pas le virer complétement  :smiley-mr-green:
Pas d'aide par MP !!!

Concernant le fonctionnement du forum tout se trouve dans les messages épinglés en tête de page.

ASSM

Bonjour

J'ai modifié le code est il correct ?

Code: [Select]

#include <DS3232RTC.h>
#include <Time.h>
#include <Wire.h>
#include "FastLED.h"
#define NUM_LEDS 114 // Number of LED controles (remember I have 3 leds / controler
#define COLOR_ORDER BRG  // Define color order for your strip
#define DATA_PIN 6  // Data pin for led comunication

CRGB leds[NUM_LEDS]; // Define LEDs strip
byte digits[10][7] = {{0,1,1,1,1,1,1},  // Digit 0
                     {0,1,0,0,0,0,1},   // Digit 1
                     {1,1,1,0,1,1,0},   // Digit 2
                     {1,1,1,0,0,1,1},   // Digit 3
                     {1,1,0,1,0,0,1},   // Digit 4
                     {1,0,1,1,0,1,1},   // Digit 5
                     {1,0,1,1,1,1,1},   // Digit 6
                     {0,1,1,0,0,0,1},   // Digit 7
                     {1,1,1,1,1,1,1},   // Digit 8
                     {1,1,1,1,0,1,1}};  // Digit 9 | 2D Array for numbers on 7 segment
bool Dot = true;  //Dot state
bool DST = false; //DST state
int ledColor = 0x0000FF; // Color used (in hex)
void setup(){
//  Serial.begin(9600);
//  Wire.begin();
  LEDS.addLeds<WS2811, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); // Set LED strip type
  LEDS.setBrightness(255); // Set initial brightness
  pinMode(2, INPUT_PULLUP); // Define DST adjust button pin
  pinMode(4, INPUT_PULLUP); // Define Minutes adjust button pin
  pinMode(5, INPUT_PULLUP); // Define Hours adjust button pin
}
// Get time in a single number, if hours will be a single digit then time will be displayed 155 instead of 0155
int GetTime(){
  tmElements_t Now;
  RTC.read(Now);
  //time_t Now = RTC.Now();// Getting the current Time and storing it into a DateTime object
  int hour=Now.Hour;
  int minutes=Now.Minute;
  int second =Now.Second;
  if (second % 2==0) {Dot = false;}
    else {Dot = true;};
  return (hour*100+minutes);
  };

// Check Light sensor and set brightness accordingly
void BrightnessCheck(){
  const byte sensorPin = 3; // light sensor pin
  const byte brightnessLow = 5; // Low brightness value
  const byte brightnessHigh = 255; // High brightness value
  int sensorValue = digitalRead(sensorPin); // Read sensor
  if (sensorValue == 0) {LEDS.setBrightness(brightnessHigh);}
  else {LEDS.setBrightness(brightnessLow);} 
  };
 
// Convert time to array needet for display
void TimeToArray(){
  int Now = GetTime();  // Get time
  int cursor = 0;
 
//  Serial.print("Time is: ");Serial.println(Now);
  if (DST){   // if DST is true then add one hour
   Now+=100;
//   Serial.print("DST is ON, time set to : ");Serial.println(Now);
  };
  if (Dot){leds[56]=ledColor;
           leds[57]=ledColor;}
      else {leds[56]=0x000000;
            leds[57]=0x000000;
    };
  for(int i=1;i<=4;i++){
    int digit = Now % 10; // get last digit in time
    if (i==1){
//      Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");
      cursor =86;
      for(int k=0; k<=27;k++){
//        Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
//      Serial.println();
      }
    else if (i==2){
//      Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");
      cursor -=58;
      for(int k=0; k<=27;k++){
//        Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
//      Serial.println();
      }
    else if (i==3){
//      Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" ");
      cursor =28;
      for(int k=0; k<=27;k++){
//        Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
//      Serial.println();
      }
    else if (i==4){
//      Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" ");
      cursor =0;
      for(int k=0; k<=27;k++){
//        Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
//      Serial.println();
      }
    Now /= 10;
  };
};
void DSTcheck(){
   int buttonDST = digitalRead(2);
//   Serial.print("DST is: ");Serial.println(DST);
   if (buttonDST == LOW){
    if (DST){
      DST=false;
//      Serial.print("Switching DST to: ");Serial.println(DST);
      }
      else if (!DST){
        DST=true;
//        Serial.print("Switching DST to: ");Serial.println(DST);
      };
   delay(500);   
   };
  }

void TimeAdjust(){
  int buttonH = digitalRead(5);
  int buttonM = digitalRead(4);
  if (buttonH == LOW || buttonM == LOW){
    delay(500);
    tmElements_t Now;
    RTC.read(Now);
    int hour=Now.Hour;
    int minutes=Now.Minute;
    int second =Now.Second;
      if (buttonH == LOW){
        if (Now.Hour== 23){Now.Hour=0;}
          else {Now.Hour += 1;};
        }else {
          if (Now.Minute== 59){Now.Minute=0;}
          else {Now.Minute += 1;};
          };
    RTC.write(Now);
    }
  }
void loop()  // Main loop
{
  BrightnessCheck(); // Check brightness
  DSTcheck(); // Check DST
  TimeAdjust(); // Check to se if time is geting modified
  TimeToArray(); // Get leds array with required configuration
  FastLED.show(); // Display leds array
}


ASSM

#10
May 22, 2018, 08:27 am Last Edit: May 22, 2018, 08:36 am by ASSM
Voici le schéma de cablage et le prototype

Le tout est alimenté en 5 Volts par une alimentation de PC
(le problème n'est pas un soucis de tension car lorsque je fait un test des 114 leds j'arrive a les allumer toutes en meme temps)




Cordialement

lesept

Je ne comprends pas vos histoires de tensions. Les LEDs WS2812 doivent recevoir une tension de 5V, c'est le courant consommé qui va varier en fonction de la luminosité et de la couleur.

Une LED consomme au maximum 60mA, 114 LEDs vont consommer au maximum 6.84A. C'est vraiment le maximum, si tu mets la luminosité à fond (LEDS.setBrightness(255); ) et toutes les LEDs allumées et blanches en même temps.

Donc il faut choisir une alimentation qui délivre cette intensité ou plus. Quelle intensité peut fournir ton alim de PC ?

Dans ton code, il faut définir la broche DATA_PIN en OUTPUT
La broche sensorPin (3) n'est pas définie en INPUT dans le setup

Tu peux alléger ton code car cette suite d'instructions se retrouve à plusieurs endroits :
Code: [Select]
      for(int k=0; k<=27;k++){
//        Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
//      Serial.println();

Tu peux en faire une fonction :
Code: [Select]
void setLEDS()
{
      for(int k=0; k<=27;k++){
//        Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
//      Serial.println();
}
et remplacer chaque bloc par l'appel de la fonction
Code: [Select]
setLEDS();

Si je comprends bien (entre les lignes car tu n'expliques pas vraiment), tu affiches des chiffres genre 'HH:MM' (heures:minutes) et chaque chiffre est une matrice de 4x7. Ca donne 4*7*4+2 = 114 LEDs. Le compte y est.

Les matrices sont définies ici:
Code: [Select]
byte digits[10][7] = {{0,1,1,1,1,1,1},  // Digit 0
                     {0,1,0,0,0,0,1},   // Digit 1
                     {1,1,1,0,1,1,0},   // Digit 2
                     {1,1,1,0,0,1,1},   // Digit 3
                     {1,1,0,1,0,0,1},   // Digit 4
                     {1,0,1,1,0,1,1},   // Digit 5
                     {1,0,1,1,1,1,1},   // Digit 6
                     {0,1,1,0,0,0,1},   // Digit 7
                     {1,1,1,1,1,1,1},   // Digit 8
                     {1,1,1,1,0,1,1}};  // Digit 9 | 2D Array for numbers on 7 segment

mais je n'arrive pas à comprendre comment elles sont définies. Il doit manquer des choses ici ou alors, il faut m'expliquer comment afficher un chiffre avec ça...
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

ASSM

#12
May 23, 2018, 08:10 am Last Edit: May 23, 2018, 08:28 am by ASSM
Bonjour

je viens de m'apercevoir que ma matrice n'est pas bonne elle est pour 1 led par segment.

(lesept) tu as bien cerné ma demande et en effet je n'ai pas forcément été claire mais comme tu as expliqué c'est exactement ce que je veux faire une horloge avec affichage 'HH:MM' avec le clignotement de deux leds pour les secondes.

j'ai modifié le code et je ferais un test ce soir en réel.

Code: [Select]
#include <DS3232RTC.h>
#include <Time.h>
#include <Wire.h>
#include "FastLED.h"
#define NUM_LEDS 114
#define COLOR_ORDER BRG  // Define color order for your strip
#define DATA_PIN 6  // Data pin for led comunication

CRGB leds[NUM_LEDS]; // Define LEDs strip
byte digits[10][28] = {
{0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, //0
{0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0}, //1
{1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0}, //2
{1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0}, //3
{1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1}, //4
{1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1}, //5
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1}, //6
{0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0}, //7
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, //8
{1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, //9 | 2D Array for numbers on 7 segment
};
bool Dot = true;  //Dot state
bool DST = false; //DST state
int ledColor = 0x0000FF; // Color used (in hex)
void setup(){
//  Serial.begin(9600);
//  Wire.begin();
LEDS.addLeds<WS2811, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); // Set LED strip type
LEDS.setBrightness(255); // Set initial brightness
pinMode(2, INPUT_PULLUP); // Define DST adjust button pin
pinMode(4, INPUT_PULLUP); // Define Minutes adjust button pin
pinMode(5, INPUT_PULLUP); // Define Hours adjust button pin
}
// Get time in a single number, if hours will be a single digit then time will be displayed 155 instead of 0155
int GetTime(){
tmElements_t Now;
RTC.read(Now);
//time_t Now = RTC.Now();// Getting the current Time and storing it into a DateTime object
int hour=Now.Hour;
int minutes=Now.Minute;
int second =Now.Second;
if (second % 2==0) {Dot = false;}
  else {Dot = true;};
return (hour*100+minutes);
};

// Check Light sensor and set brightness accordingly
void BrightnessCheck(){
const byte sensorPin = 3; // light sensor pin
const byte brightnessLow = 5; // Low brightness value
const byte brightnessHigh = 255; // High brightness value
int sensorValue = digitalRead(sensorPin); // Read sensor
if (sensorValue == 0) {LEDS.setBrightness(brightnessHigh);}
else {LEDS.setBrightness(brightnessLow);} 
};

// Convert time to array needet for display
void TimeToArray(){
int Now = GetTime();  // Get time
int cursor = 0;

//  Serial.print("Time is: ");Serial.println(Now);
if (DST){   // if DST is true then add one hour
 Now+=100;
//   Serial.print("DST is ON, time set to : ");Serial.println(Now);
};
if (Dot){leds[56]=ledColor;
         leds[57]=ledColor;}
    else {leds[56]=0x000000;
          leds[57]=0x000000;
  };
for(int i=1;i<=4;i++){
  int digit = Now % 10; // get last digit in time
  if (i==1){
//      Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");
    cursor =86;
    for(int k=0; k<=27;k++){
//        Serial.print(digits[digit][k]);
      if (digits[digit][k]== 1){leds[cursor]=ledColor;}
       else if (digits[digit][k]==0){leds[cursor]=0x000000;};
       cursor ++;
      };
//      Serial.println();
    }
  else if (i==2){
//      Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");
    cursor -=58;
    for(int k=0; k<=27;k++){
//        Serial.print(digits[digit][k]);
      if (digits[digit][k]== 1){leds[cursor]=ledColor;}
       else if (digits[digit][k]==0){leds[cursor]=0x000000;};
       cursor ++;
      };
//      Serial.println();
    }
  else if (i==3){
//      Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" ");
    cursor =28;
    for(int k=0; k<=27;k++){
//        Serial.print(digits[digit][k]);
      if (digits[digit][k]== 1){leds[cursor]=ledColor;}
       else if (digits[digit][k]==0){leds[cursor]=0x000000;};
       cursor ++;
      };
//      Serial.println();
    }
  else if (i==4){
//      Serial.print("Digit1 is : ");Serial.print(digit);Serial.print(" ");
    cursor =0;
    for(int k=0; k<=27;k++){
//        Serial.print(digits[digit][k]);
      if (digits[digit][k]== 1){leds[cursor]=ledColor;}
       else if (digits[digit][k]==0){leds[cursor]=0x000000;};
       cursor ++;
      };
//      Serial.println();
    }
  Now /= 10;
};
};
void DSTcheck(){
 int buttonDST = digitalRead(2);
//   Serial.print("DST is: ");Serial.println(DST);
 if (buttonDST == LOW){
  if (DST){
    DST=false;
//      Serial.print("Switching DST to: ");Serial.println(DST);
    }
    else if (!DST){
      DST=true;
//        Serial.print("Switching DST to: ");Serial.println(DST);
    };
 delay(500);   
 };
}

void TimeAdjust(){
int buttonH = digitalRead(5);
int buttonM = digitalRead(4);
if (buttonH == LOW || buttonM == LOW){
  delay(500);
  tmElements_t Now;
  RTC.read(Now);
  int hour=Now.Hour;
  int minutes=Now.Minute;
  int second =Now.Second;
    if (buttonH == LOW){
      if (Now.Hour== 23){Now.Hour=0;}
        else {Now.Hour += 1;};
      }else {
        if (Now.Minute== 59){Now.Minute=0;}
        else {Now.Minute += 1;};
        };
  RTC.write(Now);
  }
}
void loop()  // Main loop
{
BrightnessCheck(); // Check brightness
DSTcheck(); // Check DST
TimeAdjust(); // Check to se if time is geting modified
TimeToArray(); // Get leds array with required configuration
FastLED.show(); // Display leds array
}

hbachetti

Je sens que le TIC TAC va recommencer.

@+
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

ASSM

Pourquoi lorsque je veux insérer un code il faut d'abord que je poste le message et après je le modifie pour le mettre entre les balises ?

Go Up