Arduino Forum

International => Français => Topic started by: ASSM on May 21, 2018, 09:17 pm

Title: Horloge Géante
Post by: ASSM on May 21, 2018, 09:17 pm
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.
Title: Re: Horloge Géante
Post by: hbachetti on May 21, 2018, 09:28 pm
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 ?

@+
Title: Re: Horloge Géante
Post by: ASSM on May 21, 2018, 09:37 pm
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.
Title: Re: Horloge Géante
Post by: hbachetti on May 21, 2018, 09:44 pm
A ce stade un schéma de ce que tu as fait s'impose, avec les tensions d'alimentation.

@+


Title: Re: Horloge Géante
Post by: ASSM on May 21, 2018, 09:54 pm
je vais modifié ma boucle for pour remplacer la valeur 6 par la valeur 27
Title: Re: Horloge Géante
Post by: jfs on May 21, 2018, 10:05 pm
Je te donne 1/2 heure pour corriger ton message.... lis les messages épinglés.
Title: Re: Horloge Géante
Post by: Artouste on May 21, 2018, 10:22 pm
Je te donne 1/2 heure pour corriger ton message.... lis les messages épinglés.
:smiley-mr-green:

TIC . TAC
TIC , TAC
Title: Re: Horloge Géante
Post by: jfs on May 21, 2018, 10:23 pm
:smiley-mr-green:

TIC . TAC
TIC , TAC
Sadique...  :D
Title: Re: Horloge Géante
Post by: jfs on May 21, 2018, 10:32 pm
Fallait mettre le code entre les balises.... pas le virer complétement  :smiley-mr-green:
Title: Re: Horloge Géante
Post by: ASSM on May 22, 2018, 08:21 am
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
}

Title: Re: Horloge Géante
Post by: ASSM on May 22, 2018, 08:27 am
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)

(http://D:\Panneau Final Arduino\Horloge Simple\Cablage.PNG)
(http://D:\Panneau Final Arduino\Horloge Simple\Schemas.PNG)

Cordialement
Title: Re: Horloge Géante
Post by: lesept on May 22, 2018, 10:18 am
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...
Title: Re: Horloge Géante
Post by: ASSM on May 23, 2018, 08:10 am
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
}
Title: Re: Horloge Géante
Post by: hbachetti on May 23, 2018, 08:24 am
Je sens que le TIC TAC va recommencer.

@+
Title: Re: Horloge Géante
Post by: ASSM on May 23, 2018, 08:29 am
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 ?
Title: Re: Horloge Géante
Post by: jfs on May 23, 2018, 08:32 am
En haut à gauche de la fenêtre d'édition il y a ce bouton </>

Tu cliques dessus et tu mets ton code dedans lors de l'écriture du message.
Title: Re: Horloge Géante
Post by: ASSM on May 23, 2018, 08:39 am
j'ai le bouton </> que lorsque je modifie le message....
Title: Re: Horloge Géante
Post by: jfs on May 23, 2018, 08:46 am
Encore un des mystères de ce forum....
Title: Re: Horloge Géante
Post by: lesept on May 23, 2018, 10:38 am
Bon, je pars de ton code qui apparaît dans la réponse 12.

La fonction importante est TimeToArray, que j'analyse. Je vais la simplifier puisque certaines lignes apparaissent plusieurs fois.

D'abord, ta variable Now est un int (issu de la fonction GetTime, c'est OK) qui a le même nom qu'une autre variable de type tmelement_t. C'est correct, il n'y a pas de conflit, mais je n'aime pas trop car ça peut prêter à confusion. Je la renomme en CurrentTime.

On ne met pas de ; après une accolade fermante.

Ces lignes :
Code: [Select]
        if (digits[digit][k] == 1) {
          leds[cursor] = ledColor;
        }
        else if (digits[digit][k] == 0) {
          leds[cursor] = 0x000000;
        }
peuvent être remplacées par
Code: [Select]
leds[cursor] = ledColor*digits[digit][k];
Enfin, l'affichage (en fait l'allumage des LEDs correspondant au chiffre à afficher) se fait ici :
Code: [Select]
      for (int k = 0; k <= 27; k++) {
        //        Serial.print(digits[digit][k]);
        leds[cursor] = ledColor * digits[digit][k];
        cursor ++;
      }
Je comprends que cursor représente la première LED du chiffre à afficher : c'est un multiple de 28 pour les heures (HH) et tu ajoutes 2 pour les minutes (MM) pour tenir compte du ":" qui clignote sur deux secondes.
Je pense qu'il faudrait changer la ligne
Code: [Select]
        leds[cursor] = ledColor * digits[digit][k];en
Code: [Select]
        leds[cursor+k] = ledColor * digits[digit][k];tout simplement.
Title: Re: Horloge Géante
Post by: ASSM on May 23, 2018, 04:58 pm
Je viens de suivre tes conseils et viens de modifier le code.

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][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]);
        leds[cursor+k] = ledColor * digits[digit][k];
        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]);
        leds[cursor+k] = ledColor * digits[digit][k];
        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]);
        leds[cursor+k] = ledColor * digits[digit][k];
        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]);
        leds[cursor+k] = ledColor * digits[digit][k];
        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
}


Si je comprend bien je doit supprimer tout les ; après les accolades fermante ?
Title: Re: Horloge Géante
Post by: ASSM on May 23, 2018, 06:09 pm
Bonsoir


Je viens de faire les essais et le programme qui fonctionne est celui suivant.


Un grand Merci a lesept pour ton aide.

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][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 =0;
   for (int k = 0; k <= 27; k++) {
        //        Serial.print(digits[digit][k]);
        leds[cursor+k] = ledColor * digits[digit][k];
        cursor ++;
      }
//      Serial.println();
      }
    else if (i==2){
//      Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");
      cursor =28;
   for (int k = 0; k <= 27; k++) {
        //        Serial.print(digits[digit][k]);
        leds[cursor+k] = ledColor * digits[digit][k];
        cursor ++;
      }
//      Serial.println();
      }
    else if (i==3){
//      Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" ");
      cursor =58;
   for (int k = 0; k <= 27; k++) {
        //        Serial.print(digits[digit][k]);
        leds[cursor+k] = ledColor * digits[digit][k];
        cursor ++;
      }
//      Serial.println();
      }
    else if (i==4){
//      Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" ");
      cursor =86;
   for (int k = 0; k <= 27; k++) {
        //        Serial.print(digits[digit][k]);
        leds[cursor+k] = ledColor * digits[digit][k];
        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
}


Maintenant est il possible de faire un chronomètre en affichant les 'MM:SS' qui va jusqu'à 45 minutes,
en intégrant un Bouton Poussoir pour le Start un Pour le Stop et un Pour la remise à Zéro ?
Bien sur en gardant la meme base.
Title: Re: Horloge Géante
Post by: lesept on May 23, 2018, 07:09 pm
Tout est possible :)
Title: Re: Horloge Géante
Post by: ASSM on May 23, 2018, 07:12 pm
Oui mais je sèche un peu pour savoir comment faire.
Title: Re: Horloge Géante
Post by: lesept on May 23, 2018, 07:28 pm
Tu veux ajouter 3 boutons poussoir ?
Déjà, tu commences par les définir et les initialiser. Voir ici pour un très bon tuto... (https://openclassrooms.com/courses/programmez-vos-premiers-montages-avec-arduino/le-bouton-poussoir) mais tu l'as déjà fait...

Ensuite tu continues comme tu as fait pour l'instant : tu crées une fonction qui s'appelle par exemple CheckBtn qui lit l'état de tes nouveaux boutons.
Si le bouton reset est appuyé : tu mets l'heure à 0.
Pour les autres boutons c'est un peu plus compliqué, car on doit savoir si on est dans l'état "affichage de l'heure" ou dans l'état "chronomètre" : comment vois-tu ça ? Qu'est ce qui dira à l'Arduino qu'il doit faire l'un ou l'autre ?
Title: Re: Horloge Géante
Post by: ASSM on May 23, 2018, 07:54 pm
Je souhaite faire un deuxieme module pour le chronometre donc avec un deuxieme Arduino.
Title: Re: Horloge Géante
Post by: ASSM on May 23, 2018, 08:27 pm
Comme cela j'aurais 4 digits pour l'horloge qui est terminée et 4 autres digits pour le chronomètre 'MM:SS'
qui s'arrêtera a 45:00.

Avec un Bouton Poussoir pour le Start.
Un Bouton Poussoir pour Stop(Pause).
Un Bouton Poussoir pour la remise a zero.

Je vais donc utiliser un deuxieme Nano arduino Une deuxieme RTC Un autre ruban leds de 112 leds et 3 Boutons Poussoirs.

Toute votre aide sera la bienvenue pour etablir ce programme.
Title: Re: Horloge Géante
Post by: lesept on May 23, 2018, 10:55 pm
Il faut réutiliser au maximum les fonctions que tu as déjà dans ton premier code.

Dans le nouveau, la loop doit faire une vérification du temps : chaque seconde, le code doit mettre l'heure à jour. Ça se fait avec millis()

Code: [Select]
if (millis()-dernierTempsChrono > 1000)
{
...
... code pour avancer le chronomètre d'une seconde et afficher le temps passé ...
...
dernierTempsChrono = millis();
}
avec une déclaration en entête du programme
Code: [Select]
unsigned long dernierTempsChrono ;et une initialisation dans le setup
Code: [Select]
dernierTempsChrono  = millis();

Ensuite, après l'accolade du test, il faut vérifier les boutons :

et on va écrire ces fonctions, même si elle sont très simples.

Exemple :
Code: [Select]
void StartChrono () {
   EtatChrono = true;
}
---> Pas dur ! :)

Ensuite, comme on a ajouté cette variable booléenne, il faut la prendre en compte dans le if de tout à l'heure. La mise à jour du temps affiché par le chrono (c'est à dire ajouter une seconde) ne se fait que si EtatChrono est True.
Code: [Select]
if (millis()-dernierTempsChrono > 1000)
{
  if (EtatChrono)
     {
      MiseAJour();
      AfficheHeure();
     }
  dernierTempsChrono = millis();
}
... ensuite test des boutons ... (tu sais faire) et appel des fonctions selon l'état des boutons


La fonction MiseAJour() sera appelée toutes les secondes, puisqu'elle est appelée lorsque la seconde est passée (le if du début). Elle ne fera qu'ajouter une seconde, en vérifiant qu'au passage à 60, les secondes reviennent à 0 et les minutes s'incrémentent.
AfficheHeure c'est la même chose que ta fonction TimeToArray sans la première ligne (GetTime).

Enfin, que se passe t-il à 45:00 ? Le chrono s'arrête ? Se remet à 0 ? Il faut gérer ça. Après l'affichage tu testes si l'heure est supérieure à 4500 et tu agis en conséquence.

J'espère que c'est clair. C'est comme ça que je ferais...
Bon courage !
Title: Re: Horloge Géante
Post by: Waryard on May 24, 2018, 12:27 am
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.
Salut !

J'ai le même projet que toi, mêmes LEDs

(https://i.imgur.com/3jkvLed.jpg)

J'ai commandé 2m avec 60LEDs/m soit 120 LEDs

Au départ, j'avais prévu du 3 LEDs/segment et 30 LEDs en ligne au dessus pour les secondes (1 LED allumée = x Min 02 Sec etc..), au final je songe maintenant à faire du 2 LEDs/segment tellement c'est imposant...

Avec 3 LEDs/seg j'ai comme mesures :
- 52cm de largeur avec 30 LEDs dans une colonne (nombre total de LEDs qui rentrent dans 52cm, un espace vaut autant qu'une LED)
- 16,5cm de hauteur avec 10 LEDs dans une ligne
Mon schema excel sera peut-être plus parlant, cases de couleur = LED, cases blanches =  espace, flèches bleues = soudures

Avec du 2LEDs/seg tout est réduit d'un tiers
- 35cm de largeur avec 20LEDs dans une colonne
- 11cm de hauteur avec 8LEDs dans une ligne

J'ai passé un temps fou sur un code de 500 lignes avec au choix sync de l'heure par serveur NTP sur ESP8266, SoftRTC ou HardRTC (ou SoftRTC + NTP à la fréquence choisie pour éviter la perte), lorsqu'il sera fonctionnel je le posterai

Par contre, je ne comprends pas pourquoi tu t'embête avec une alim de PC, j'ai mesuré mes 120 LEDs allumées toutes en blanc (RGB en même temps), 0,95 A à 1,1 A au total grand max !
Du coup pour les tests je les alimente directement avec l'USB de mon PC, puis en définitif avec un chargeur de portable 2 A
(A savoir que j'ai réalisé la mesure sur un chargeur 5v 4A (OnePlus 5T), les LEDs éclairaient au max et ne consommaient pas plus d'1,1 A) donc vu qu'en affichant l'heure je ne dépasse jamais 700mA un chargeur 2A sera amplement suffisant...

[EDIT] Impossible d'attacher mon xlsx, je le poste en capture d'écran :

(https://i.imgur.com/ptGasxB.jpg)
Title: Re: Horloge Géante
Post by: ASSM on May 24, 2018, 08:53 am
Bonjour

Merci à lesept pour ton explication je vais travailler dessus.

Pour répondre a Waryard j'utilise une alimentation de PC tout simplement car j'en ai d'avance et au final c'est un projet pour un panneau d'affichage de football qui comprend :

-un module horloge 'HH:MM' (114 leds)

-un module chronomètre 'MM:SS'(avec un start ,un Stop ,un Reset) et qui s'arrête et se fige sur 45:00 en fin de période. (112 leds)

Sur le module chronomètre il sera possible de choisir entre une période de 45:00 ou 15:00 (en cas de prolongation)

-un module compteur de point (de 0 à 99) pour l'équipe locale (98 leds pour ce module)
-un module compteur de point (de 0 à 99) pour l'équipe visiteuse  (98 leds pour ce module)
Sur les modules compteur il y aura (un BP pour incrémenter ,un BP pour décrémenter ,un BP pour le reset)

le panneau d'affichage comprendra au total 422 leds

Cela me permettra aussi de récupérer le 3.3V de l'alim PC pour pouvoir alimenter en permanence la sauvegarde du RTC a la place de la pile cr3022 qui risquerai de se décharger trop rapidement.

Le panneau d'affichage sera utilisé surtout le weekend.

Bien Sur il y aura une photo de la réalisation finie(il ne reste plus que le code du chrono et pour le score)
Title: Re: Horloge Géante
Post by: ASSM on May 25, 2018, 11:46 am
Bonjour

Je viens de trouver ce code sur internet pour mon chronomètre.

il faudrait pouvoir l'adapter pour qu'il puisse s'arrêter a '45:00'.

Avoir le choix par un interrupteur du choix de la période ('45:00' ou '15:00')

Enlever la fonction du buzzer.

Simplement avoir la fonction (Start ,Stop ,Reset)

Voici le code en pièce jointe.


Si je pouvais avoir un peu d'aide.(voir beaucoup)
Title: Re: Horloge Géante
Post by: lesept on May 25, 2018, 12:07 pm
Ça me semble être une usine à gaz pour pas grand chose. Il utilise la bibli TaskScheduler qui simule du multitasking : je ne la connais pas, donc difficile pour moi d'aider ici.
Title: Re: Horloge Géante
Post by: ASSM on May 25, 2018, 12:17 pm
Mince alors

je me demande comment je vais pouvoir réellement faire ce programme pour pouvoir finir ce panneau d'affichage.

je bloque énormément.
Title: Re: Horloge Géante
Post by: ASSM on May 25, 2018, 01:25 pm
Bonjour

Lesept si tu pouvais m'expliquer un peu plus dans le détail par rapport au post 26 comment je dois faire.

En espérant avoir été assez claire dans mes descriptions.
Title: Re: Horloge Géante
Post by: lesept on May 25, 2018, 02:10 pm
Voici un début :

Code: [Select]
#include <DS3232RTC.h>
#include <Time.h>
#include <Wire.h>
#include "FastLED.h"
#define NUM_LEDS 114 // Number of LED controls (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
#define BP_START 7 // Pin bouton Start
#define BP_STOP   8 // Pin bouton Stop
#define BP_RESET 9 // Pin bouton Reset
#define INTER 10   // Pin inter 15 / 45

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
int ledColor = 0x0000FF; // Color used (in hex)
int Heure = 0;
bool EtatChrono = false;  // Chrono arrêté
int HeureMax = 4500;

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(BP_START, INPUT_PULLUP); // bouton START
  pinMode(BP_STOP, INPUT_PULLUP); // bouton STOP
  pinMode(BP_RESET, INPUT_PULLUP); // bouton RESET
  pinMode(INTER, INPUT_PULLUP); // inter 15 / 45
}

// 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 cursor = 0;
  int Secondes = Heure % 100;
  int Now = Heure;

  Dot = true;
  if (Secondes % 2 == 1) Dot = false;
  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 = 0;
      for (int k = 0; k <= 27; k++) {
        //        Serial.print(digits[digit][k]);
        leds[cursor + k] = ledColor * digits[digit][k];
        cursor ++;
      }
      //      Serial.println();
    }
    else if (i == 2) {
      //      Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");
      cursor = 28;
      for (int k = 0; k <= 27; k++) {
        //        Serial.print(digits[digit][k]);
        leds[cursor + k] = ledColor * digits[digit][k];
        cursor ++;
      }
      //      Serial.println();
    }
    else if (i == 3) {
      //      Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" ");
      cursor = 58;
      for (int k = 0; k <= 27; k++) {
        //        Serial.print(digits[digit][k]);
        leds[cursor + k] = ledColor * digits[digit][k];
        cursor ++;
      }
      //      Serial.println();
    }
    else if (i == 4) {
      //      Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" ");
      cursor = 86;
      for (int k = 0; k <= 27; k++) {
        //        Serial.print(digits[digit][k]);
        leds[cursor + k] = ledColor * digits[digit][k];
        cursor ++;
      }
      //      Serial.println();
    }
    Now /= 10;
  }
}

void MiseAJour()
{
  Heure += 1;
  if (Heure % 100 == 60) Heure = Heure + 40;
}

void LectureBoutons()
{
  int EtatBPStart = digitalRead(BP_START);
  int EtatBPStop = digitalRead(BP_STOP);
  int EtatBPReset = digitalRead(BP_RESET);
  int EtatInter = digitalRead(INTER);
  if (EtatBPStart) StartChrono ();
  if (EtatBPStop) StopChrono ();
  if (EtatBPReset) ResetChrono ();
  HeureMax = 4500;
  if (EtatInter) HeureMax = 1500;
}

void loop()  // Main loop
{
  LectureBoutons();
  if (EtatChrono)
  {
    unsigned long dernierTempsChrono;
    if (millis() - dernierTempsChrono >= 1000)
    {
      MiseAJour();
      TimeToArray();
      dernierTempsChrono += 1000;
    }
  }
  FastLED.show(); // Display leds array
  if (Heure >= HeureMax) EtatChrono = false;
}

void StartChrono () {
  EtatChrono = true;
}

void StopChrono () {
  EtatChrono = false;
}

void ResetChrono () {
  EtatChrono = false;
  Heure = 0;
}
Ça compile chez moi, mais est-ce que ça marche ? Je te laisse voir...
Title: Re: Horloge Géante
Post by: ASSM on May 25, 2018, 02:26 pm
Merci lesept....

j'essaye ce soir ou demain matin en réel et je ferais un retour...
Title: Re: Horloge Géante
Post by: ASSM on May 25, 2018, 07:02 pm
Bonsoir

lesept J'ai essayé le code mais rien ne se passe…..

il n'y a même pas une led qui s'allume.
Title: Re: Horloge Géante
Post by: lesept on May 25, 2018, 07:31 pm
Le précédent fonctionnait correctement ?
Je l'ai fait à tout vitesse : peux-tu décommenter tous les Serial.print et Serial.println et me dire ce qu'il affiche sur la console ?

Ajoute
Code: [Select]
Serial.print(" Mise a jour : heure = ");
Serial.println(Heure);

à la fin de la fonction MiseAJour.

Au passage, cette ligne est inutile :
Code: [Select]
#include <DS3232RTC.h>
Les deux suivantes aussi je pense...

Tu as bien branché les boutons et les LEDs selon ces définitions ?
Code: [Select]
#define DATA_PIN 6  // Data pin for led comunication
#define BP_START 7 // Pin bouton Start
#define BP_STOP   8 // Pin bouton Stop
#define BP_RESET 9 // Pin bouton Reset
#define INTER 10   // Pin inter 15 / 45
Title: Re: Horloge Géante
Post by: ASSM on May 25, 2018, 07:43 pm
Bonsoir

le programme pour l'horloge fonctionne parfaitement.

J'ai branche les leds au pin 6 de la carte en insérant une resistance de 470 ohms
le bouton start d'un coté au pin 7 de la carte et de l'autre au gnd(comme pour l'horloge)


Comment faire pour decommenter tout les serial print?
Title: Re: Horloge Géante
Post by: lesept on May 25, 2018, 07:58 pm
Tu enlèves les //
Title: Re: Horloge Géante
Post by: ASSM on May 25, 2018, 08:08 pm
J'ai enlevé les // devant tout les serialprint

et ajouter le code comme cela

Code: [Select]

void MiseAJour()
{
  Heure += 1;
  if (Heure % 100 == 60) Heure = Heure + 40;
  Serial.print(" Mise a jour : heure = ");
  Serial.println(Heure);
}



mais après je fait quoi ?
Title: Re: Horloge Géante
Post by: lesept on May 25, 2018, 08:09 pm
Tu l'exécute et tu me dis ce qu'affiche la console
Title: Re: Horloge Géante
Post by: ASSM on May 25, 2018, 08:23 pm
J'ai televersé sur la carte et a la fin j'ai avrdude done thank you
Title: Re: Horloge Géante
Post by: lesept on May 25, 2018, 08:48 pm
Pour afficher la console, il y a un bouton en haut à droite de la fenêtre, je ne sais plus à quoi il ressemble. Cherche sur internet si besoin, la je ne peux pas, je suis sur mon téléphone donc assez limité.
Ça ouvre donc une nouvelle fenêtre qui va afficher du texte, c'est ce texte qui m'intéresse...
Title: Re: Horloge Géante
Post by: lesept on May 26, 2018, 12:02 am
En fin du setup, tu peux ajouter:
Code: [Select]
      TimeToArray();
     FastLED.show();
Title: Re: Horloge Géante
Post by: ASSM on May 26, 2018, 12:13 am
Bonsoir

j'ai essayé de mettre ce code pour vérifier la console et j'ai bien le mot "bonjour" qui s'affiche dans la console

void setup()
{
  Serial.begin(9600);
  Serial.print("Bonjour !");
}

void loop()
{
  // Vide, rien à répéter.
}

avec le programme du chronometre rien ne s'affiche dans la console.
Title: Re: Horloge Géante
Post by: ASSM on May 26, 2018, 12:37 am
Voici se que la console affiche :

Digit 4 is : 0 0000111111111111111111111111
Digit 3 is : 0 0000111111111111111111111111
Digit 2 is : 0 000011111111111111Digit 4 is : 0 0000111111111111111111111111
Digit 3 is : 0 0000111111111111111111111111
Digit 2 is : 0 000011111111111111Digit 4 is : 0 0000111111111111111111111111
Digit 3 is : 0 0000111111111111111111111111

Ainsi de suite en boucle
Title: Re: Horloge Géante
Post by: lesept on May 26, 2018, 12:56 pm
Il n'affiche pas Mise a jour : heure = xxxx ?
Ces textes s'affichent bien toutes les secondes, pas en continu ?

Au passage, à la fin de la fonction StartChrono, il faut ajouter
Code: [Select]
dernierTempsChrono = millis();

Après cette modif, peux-tu poster le code tel qu'il est et ce qu'affiche la console ? Merci
Title: Re: Horloge Géante
Post by: ASSM on May 26, 2018, 01:31 pm
si je rajoute le code

dernierTempsChrono = millis();

sa me met que se n'est pas declaré dans le scope
Title: Re: Horloge Géante
Post by: ASSM on May 26, 2018, 01:38 pm
le code actuel est

Code: [Select]

#include <DS3232RTC.h>
#include <Time.h>
#include <Wire.h>
#include "FastLED.h"
#define NUM_LEDS 114 // Number of LED controls (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
#define BP_START 7 // Pin bouton Start
#define BP_STOP   8 // Pin bouton Stop
#define BP_RESET 9 // Pin bouton Reset
#define INTER 10   // Pin inter 15 / 45

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
int ledColor = 0x0000FF; // Color used (in hex)
int Heure = 0;
bool EtatChrono = false;  // Chrono arrêté
int HeureMax = 4500;

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(BP_START, INPUT_PULLUP); // bouton START
  pinMode(BP_STOP, INPUT_PULLUP); // bouton STOP
  pinMode(BP_RESET, INPUT_PULLUP); // bouton RESET
  pinMode(INTER, INPUT_PULLUP); // inter 15 / 45
  TimeToArray();
  FastLED.show();

}

// 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 cursor = 0;
  int Secondes = Heure % 100;
  int Now = Heure;

  Dot = true;
  if (Secondes % 2 == 1) Dot = false;
  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 = 0;
      for (int k = 0; k <= 27; k++) {
                Serial.print(digits[digit][k]);
        leds[cursor + k] = ledColor * digits[digit][k];
        cursor ++;
      }
            Serial.println();
    }
    else if (i == 2) {
            Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");
      cursor = 28;
      for (int k = 0; k <= 27; k++) {
                Serial.print(digits[digit][k]);
        leds[cursor + k] = ledColor * digits[digit][k];
        cursor ++;
      }
            Serial.println();
    }
    else if (i == 3) {
            Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" ");
      cursor = 58;
      for (int k = 0; k <= 27; k++) {
                Serial.print(digits[digit][k]);
        leds[cursor + k] = ledColor * digits[digit][k];
        cursor ++;
      }
            Serial.println();
    }
    else if (i == 4) {
            Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" ");
      cursor = 86;
      for (int k = 0; k <= 27; k++) {
                Serial.print(digits[digit][k]);
        leds[cursor + k] = ledColor * digits[digit][k];
        cursor ++;
      }
            Serial.println();
    }
    Now /= 10;
  }
}

void MiseAJour()
{
  Heure += 1;
  if (Heure % 100 == 60) Heure = Heure + 40;
  Serial.print(" Mise a jour : heure = ");
  Serial.println(Heure);
}

void LectureBoutons()
{
  int EtatBPStart = digitalRead(BP_START);
  int EtatBPStop = digitalRead(BP_STOP);
  int EtatBPReset = digitalRead(BP_RESET);
  int EtatInter = digitalRead(INTER);
  if (EtatBPStart) StartChrono ();
  if (EtatBPStop) StopChrono ();
  if (EtatBPReset) ResetChrono ();
  HeureMax = 4500;
  if (EtatInter) HeureMax = 1500;
}

void loop()  // Main loop
{
  LectureBoutons();
  if (EtatChrono)
  {
    unsigned long dernierTempsChrono;
    if (millis() - dernierTempsChrono >= 1000)
    {
      MiseAJour();
      TimeToArray();
      dernierTempsChrono += 1000;
    }
  }
  FastLED.show(); // Display leds array
  if (Heure >= HeureMax) EtatChrono = false;
}

void StartChrono () {
  EtatChrono = true;
}

void StopChrono () {
  EtatChrono = false;
}

void ResetChrono () {
  EtatChrono = false;
  Heure = 0;
}
Title: Re: Horloge Géante
Post by: lesept on May 26, 2018, 01:42 pm
Merci
pour que ça compile, il faut déplacer le ligne
Code: [Select]
   unsigned long dernierTempsChrono;
dans l'entête, après int HeureMax par exemple

Au passage, commente les lignes
Code: [Select]
                Serial.print(digits[digit][k]);c'est à dire que tu mets // en début de ces lignes
ça évitera trop de texte qui ne sert pas
Title: Re: Horloge Géante
Post by: ASSM on May 26, 2018, 02:40 pm
le code compile et dans la console sur une ligne sa ecrit:

Dig⸮T⸮tDig⸮T⸮tDig⸮T⸮tDigitDigitDig⸮T⸮tDig⸮T⸮⸮⸮⸮⸮⸮⸮⸮⸮tDig⸮T⸮tDigitDigitDig⸮T⸮tDig⸮T⸮⸮⸮⸮⸮⸮⸮⸮⸮tDig⸮T⸮tDig⸮T⸮tDig⸮T⸮tDig⸮T⸮tDig⸮T⸮⸮⸮⸮⸮⸮⸮⸮⸮tDig⸮T⸮tDigitDigitDig⸮T⸮tDig⸮T⸮⸮⸮⸮⸮⸮⸮⸮⸮tDig⸮T⸮tDigitDig⸮T⸮tDig⸮T⸮tDig⸮T⸮tDig⸮T⸮tDig⸮T⸮tDig⸮T⸮⸮⸮⸮⸮tDig⸮T⸮tDigitDig⸮T⸮tDig⸮T⸮tDigitDig⸮T⸮tDig⸮T⸮tDigitDig⸮T⸮tDig⸮T⸮⸮⸮⸮⸮tDig⸮T⸮tDig⸮T⸮tDig⸮T⸮tDig⸮T⸮tDig⸮T⸮tDigitDigitDig⸮T⸮tDig⸮T⸮⸮⸮⸮⸮⸮⸮⸮⸮tDig⸮T⸮tDigitDigitDig⸮T⸮tDig⸮T⸮⸮⸮⸮⸮tDig⸮T⸮tDig⸮T⸮tDig⸮T⸮tDig⸮T⸮tDig⸮T⸮⸮⸮⸮⸮⸮⸮⸮⸮

Ainsi de suite
Title: Re: Horloge Géante
Post by: lesept on May 26, 2018, 08:20 pm
Tu as bien sélectionné 9600 en bas de la console ?
Title: Re: Horloge Géante
Post by: lesept on May 27, 2018, 01:09 am
J"ai fini par avancer : ça marche chez moi sauf pour les boutons que je n'ai pas connectés. Donc s'il y a encore un problème, ça vient des boutons. Notamment, je n'ai pas géré les rebonds. Si on veut être précis, il ne faut pas utiliser un delay (je vais me renseigner sur e point) et faire plutôt une gestion matérielle. Là je ne suis pas très au courant, il faudra demander sur le forum.

Voici le code :
Code: [Select]
#include "FastLED.h"
#define NUM_LEDS 114 // Number of LED controls (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
#define BP_START 7 // Pin bouton Start
#define BP_STOP   8 // Pin bouton Stop
#define BP_RESET 9 // Pin bouton Reset
#define INTER 10   // Pin inter 15 / 45

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
int ledColor = 0x0000FF; // Color used (in hex)
int Heure = 0;
bool EtatChrono = false;  // Chrono arrêté
int HeureMax = 4500;
unsigned long dernierTempsChrono;

void setup() {
  Serial.begin(115200);
  LEDS.addLeds<WS2811, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); // Set LED strip type
  LEDS.setBrightness(255); // Set initial brightness
  pinMode(BP_START, INPUT_PULLUP); // bouton START
  pinMode(BP_STOP, INPUT_PULLUP); // bouton STOP
  pinMode(BP_RESET, INPUT_PULLUP); // bouton RESET
  pinMode(INTER, INPUT_PULLUP); // inter 15 / 45
  TimeToArray();
  FastLED.show();
  dernierTempsChrono = millis();
}

// 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 cursor = 0;
  int Secondes = Heure % 100;
  int Now = Heure;

  Dot = true;
  if (Secondes % 2 == 1) Dot = false;
  if (Dot) {
    leds[56] = ledColor;
    leds[57] = ledColor;
  }
  else {
    leds[56] = 0x000000;
    leds[57] = 0x000000;
  }

  for (int i = 1; i < 5; i++) {
    int digit = Now % 10; // get last digit in time
    cursor = (i - 1) * 28;
    if (i > 2) cursor += 2;
    Serial.print (" "); Serial.print(digit);
    for (int k = 0; k < 28; k++) {
      leds[cursor + k] = ledColor * digits[digit][k];
    }
    Now /= 10;
  }
  Serial.println();
}

void MiseAJour()
{
  Heure += 1;
  if (Heure % 100 == 60) Heure = Heure + 40;
  Serial.print("Heure = "); Serial.print(Heure); Serial.print (" :");
}

void LectureBoutons()
{
  if (digitalRead(BP_START)) StartChrono ();
  if (digitalRead(BP_STOP))  StopChrono ();
  if (digitalRead(BP_RESET)) ResetChrono ();
  HeureMax = 4500;
  if (digitalRead(INTER)) HeureMax = 1500;
}

void loop()  // Main loop
{
  LectureBoutons();
  if (EtatChrono)
  {
    if (millis() - dernierTempsChrono >= 1000)
    {
      MiseAJour();
      TimeToArray();
      dernierTempsChrono += 1000;
      FastLED.show(); // Display leds array
    }
  }
  if (Heure >= HeureMax) EtatChrono = false;
}

void StartChrono () {
  EtatChrono = true;
  dernierTempsChrono = millis();
}

void StopChrono () {
  EtatChrono = false;
}

void ResetChrono () {
  EtatChrono = false;
  Heure = 0;
}


Il faut que tu règles la console à 115200 (tout en bas, liste déroulante). Le code attend que tu appuies sur le bouton Start pour lancer le chrono. Bouton stop pour l'arrêter et start pour le relancer. Reset remet à 0 et attend start pour lancer le chrono.
Enfin, l'interrupteur permet de choisir entre 15 et 45 minutes.

Dis-moi si ça marche ...
A+
Title: Re: Horloge Géante
Post by: ASSM on May 27, 2018, 09:53 pm
Bonsoir lesept

je te ferais un retour demain soir ou mardi.

Merci
Title: Re: Horloge Géante
Post by: ASSM on May 28, 2018, 06:53 pm
Bonsoir lesept

j'ai fait l'essais pour le chronomètre il affiche bien'00:00'

mais impossible de le lancer ?

j'ai verifié a plusieurs fois mon câblage et se n'est pas un problème d'affichage.
Title: Re: Horloge Géante
Post by: lesept on May 28, 2018, 07:26 pm
Je n 'ai pas testé les boutons, c'est vrai. On va mettre des serial dans la fonction de lecture des boutons : tu peux tester ça ?

Code: [Select]
void LectureBoutons()
{
  int EtatStart = digitalRead(BP_START);
  int EtatStop = digitalRead(BP_STOP);
  int EtatReset = digitalRead(BP_RESET);
  Serial.print ("Etat des boutons : Start = ");
  Serial.print (EtatStart);
  Serial.print (" Stop = ");
  Serial.print (EtatStop);
  Serial.print (" Reset = ");
  Serial.println (EtatReset);
  if (EtatStart)  StartChrono ();
  if (EtatStop)  StopChrono ();
  if (EtatReset) ResetChrono ();
  HeureMax = 4500;
  if (digitalRead(INTER)) HeureMax = 1500;
}

Et me dire ce qui s'affiche sur la console (115200 bauds). Merci

EDIT : au fait, si tu veux voir le chrono fonctionner (malgré les boutons), tu peux mettre (temporairement)
Code: [Select]
bool EtatChrono = true;  // <-- true au lieu de false
Il devrait marcher (je croise les doigts, je n'ai plus de corbeaux...:) )
Title: Re: Horloge Géante
Post by: ASSM on May 28, 2018, 08:05 pm
Je viens de faire le test et voici l'affichage dans la console:

Etat des boutons : Start = 1 Stop = 1 Reset = 1

le code tourne en boucle

lorsque j'appuie sur l'un des bouton l'état passe a 0 (exemple :Etat des boutons : Start = 0 Stop = 1 Reset = 1)

(j'avais déjà mis la valeur a true pour 'bool EtatChrono = true;' sans succes)
Title: Re: Horloge Géante
Post by: lesept on May 28, 2018, 08:09 pm
Ok, lis ça  (https://openclassrooms.com/courses/programmez-vos-premiers-montages-avec-arduino/le-bouton-poussoir)et en particulier la différence entre pullup et pulldown. J'avais une chance sur 2...

Du coup, il faut changer PULLUP en PULLDOWN dans ces lignes :
Code: [Select]
 pinMode(BP_START, INPUT_PULLUP); // bouton START
  pinMode(BP_STOP, INPUT_PULLUP); // bouton STOP
  pinMode(BP_RESET, INPUT_PULLUP); // bouton RESET
  pinMode(INTER, INPUT_PULLUP); // inter 15 / 45


Sinon ceci :
Code: [Select]
  if (!EtatStart)  StartChrono ();
  if (!EtatStop)  StopChrono ();
  if (!EtatReset) ResetChrono ();
"!" après les if.
Title: Re: Horloge Géante
Post by: ASSM on May 28, 2018, 08:33 pm
j'ai mis le '!' après les if

le chrono se lance tout seul je peux l'arreter si après j'appuie sur start le chrono se relance mais en affichant le temps qui c'est réellement ecoulé (c'est a dire si je l'arrete a '00:20' et que j'attend 20 secondes et que j'appuie sur start il repart a '00:40')

la remise a zero du chrono ne fonctionne pas
Title: Re: Horloge Géante
Post by: ASSM on May 28, 2018, 08:42 pm
si je met PULLDOWN a la place de PULLUP il me met que se n'est pas déclaré dans le scope.
Title: Re: Horloge Géante
Post by: lesept on May 28, 2018, 08:58 pm
si je met PULLDOWN a la place de PULLUP il me met que se n'est pas déclaré dans le scope.
oui c'est pour ça que j'ai proposé l'autre solution
Title: Re: Horloge Géante
Post by: lesept on May 28, 2018, 09:03 pm
j'ai mis le '!' après les if

le chrono se lance tout seul je peux l'arreter si après j'appuie sur start le chrono se relance mais en affichant le temps qui c'est réellement ecoulé (c'est a dire si je l'arrete a '00:20' et que j'attend 20 secondes et que j'appuie sur start il repart a '00:40'
Est ce qu'il affiche Heure = et des chiffres ensuite ?
As tu remis au début du code EtatChrono = false ; ?
Title: Re: Horloge Géante
Post by: ASSM on May 28, 2018, 09:11 pm
j'ai bien remis EtatChrono = false ;

voici ce qu'il affiche

Heure = 1 : 1 0 0 0
Etat des boutons : Start = 0 Stop = 1 Reset = 1
Heure = 2 : 2 0 0 0
Etat des boutons : Start = 0 Stop = 1 Reset = 1
Heure = 3 : 3 0 0 0
Etat des boutons : Start = 0 Stop = 1 Reset = 1
Heure = 4 : 4 0 0 0
Etat des boutons : Start = 0 Stop = 1 Reset = 1
Heure = 5 : 5 0 0 0
Etat des boutons : Start = 0 Stop = 1 Reset = 1
Heure = 6 : 6 0 0 0
Title: Re: Horloge Géante
Post by: ASSM on May 28, 2018, 09:19 pm
si j'appuie sur le bouton reset il fait la meme chose que le bouton stop.
Title: Re: Horloge Géante
Post by: lesept on May 28, 2018, 09:19 pm
Et côté leds ? C'est bon ?
Que se passe t-il si tu appuies sur le bouton stop?
Title: Re: Horloge Géante
Post by: ASSM on May 28, 2018, 09:24 pm
coté affichage les il n'y a aucun soucis
si j'appuie sur stop le compteur s'arrete sur le temps actuel par exemple '00:32' mais continue de compter en mémoire.
exactement la meme chose pour le bouton reset.
Title: Re: Horloge Géante
Post by: lesept on May 28, 2018, 09:29 pm
Bon c'est déjà pas mal, je vais réfléchir au reste.
Title: Re: Horloge Géante
Post by: lesept on May 28, 2018, 09:35 pm
Dans lecture boutons il faut des else devant les deux if du milieu, ceux de stop et de reset
Title: Re: Horloge Géante
Post by: ASSM on May 28, 2018, 09:50 pm
j'ai mis le else devant les deux if mais cela ne change rie sa fait exactement la meme chose

Code: [Select]

void LectureBoutons()
{
  int EtatStart = digitalRead(BP_START);
  int EtatStop = digitalRead(BP_STOP);
  int EtatReset = digitalRead(BP_RESET);
  Serial.print ("Etat des boutons : Start = ");
  Serial.print (EtatStart );
  Serial.print (" Stop = ");
  Serial.print (EtatStop );
  Serial.print (" Reset = ");
  Serial.println (EtatReset );
  if (!EtatStart)  StartChrono ();
 else if (!EtatStop)  StopChrono ();
 else if (!EtatReset) ResetChrono ();
  HeureMax = 4500;
  if (digitalRead(INTER)) HeureMax = 1500;
}

Title: Re: Horloge Géante
Post by: lesept on May 28, 2018, 10:06 pm
Ce sont bien des boutons poussoirs ?
Title: Re: Horloge Géante
Post by: ASSM on May 28, 2018, 10:21 pm
Oui se sont bien des boutons poussoirs
Title: Re: Horloge Géante
Post by: lesept on May 28, 2018, 10:38 pm
Heure = 1 : 1 0 0 0
Etat des boutons : Start = 0 Stop = 1 Reset = 1
Heure = 2 : 2 0 0 0
Etat des boutons : Start = 0 Stop = 1 Reset = 1
Heure = 3 : 3 0 0 0
Etat des boutons : Start = 0 Stop = 1 Reset = 1
Heure = 4 : 4 0 0 0
Etat des boutons : Start = 0 Stop = 1 Reset = 1
Heure = 5 : 5 0 0 0
Etat des boutons : Start = 0 Stop = 1 Reset = 1
Heure = 6 : 6 0 0 0

pour obtenir ça, tu as juste appuyé puis relâché le bouton start?

Il n'a pas écrit heure = 0 avant ?
Title: Re: Horloge Géante
Post by: ASSM on May 28, 2018, 10:41 pm
pour obtenir cela j'ai appuyé et relacher le bouton start et il n'est pas ecrit heure = 0 avant.

par contre si je selectionne 15:00 il s'arrete bien a 15:00 et idem pour 45:00 donc déjà cette partie fonctionne.
Title: Re: Horloge Géante
Post by: lesept on May 28, 2018, 10:55 pm
Bon on y est presque. Le problème c'est que je n'ai pas les boutons pour tester en vrai.
Title: Re: Horloge Géante
Post by: ASSM on May 28, 2018, 10:59 pm
demain soir j'essayerai de mettre un condensateur en parallele des BP pour eviter l'anti rebond.

on ne sait jamais
Title: Re: Horloge Géante
Post by: lesept on May 28, 2018, 11:03 pm
Les 3 boutons sont branchés entre leur broche d'un côté et le GND de l'autre ?

Tu as bien laissé input_pullup dans chaque déclaration ?
Title: Re: Horloge Géante
Post by: lesept on May 28, 2018, 11:08 pm
Peux-tu mettre dans les trois fonctions à la fin un Serial. println avec le nom de la fonction ? Ensuite joue avec les boutons pour voir s'il va bien dans les bonnes fonctions selon le bouton appuyé.
Title: Re: Horloge Géante
Post by: lesept on May 29, 2018, 07:45 am
Hello
Voici une version qui marche chez moi : à toi de tester de ton côté.

Code: [Select]
#include "FastLED.h"
#define NUM_LEDS 114 // Number of LED controls (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
#define BP_START 7 // Pin bouton Start
#define BP_STOP   8 // Pin bouton Stop
#define BP_RESET 9 // Pin bouton Reset
#define INTER 10   // Pin inter 15 / 45

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
int ledColor = 0x0000FF; // Color used (in hex)
int Heure = 0;
bool EtatChrono = false;  // Chrono arrêté
int HeureMax = 4500;
unsigned long dernierTempsChrono;

void setup() {
  Serial.begin(115200);
  LEDS.addLeds<WS2811, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); // Set LED strip type
  LEDS.setBrightness(255); // Set initial brightness
  BrightnessCheck();
  pinMode(BP_START, INPUT_PULLUP); // bouton START
  pinMode(BP_STOP, INPUT_PULLUP); // bouton STOP
  pinMode(BP_RESET, INPUT_PULLUP); // bouton RESET
  pinMode(INTER, INPUT_PULLUP); // inter 15 / 45
  TimeToArray();
  FastLED.show();
  dernierTempsChrono = millis();
}

// 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 cursor = 0;
  int Secondes = Heure % 100;
  int Now = Heure;

  Dot = true;
  if (Secondes % 2 == 1) Dot = false;
  if (Dot) {
    leds[56] = ledColor;
    leds[57] = ledColor;
  }
  else {
    leds[56] = 0x000000;
    leds[57] = 0x000000;
  }

  for (int i = 1; i < 5; i++) {
    int digit = Now % 10; // get last digit in time
    cursor = (i - 1) * 28;
    if (i > 2) cursor += 2;
    Serial.print (" "); Serial.print(digit);
    for (int k = 0; k < 28; k++) {
      leds[cursor + k] = ledColor * digits[digit][k];
    }
    Now /= 10;
  }
  Serial.println();
}

void MiseAJour()
{
  Heure += 1;
  if (Heure % 100 == 60) Heure = Heure + 40;
  Serial.print("Heure = "); Serial.print(Heure); Serial.print (" :");
}

void LectureBoutons()
{
  bool EtatStart = digitalRead(BP_START);
  delay(50);
  bool EtatStop = digitalRead(BP_STOP);
  delay(50);
  bool EtatReset = digitalRead(BP_RESET);
  delay(50);
//  Serial.print ("Etat des boutons : Start = ");
//  Serial.print (EtatStart );
//  Serial.print (" Stop = ");
//  Serial.print (EtatStop );
//  Serial.print (" Reset = ");
//  Serial.println (EtatReset );

  if (!EtatStart)  StartChrono ();
  else if (!EtatStop)  StopChrono ();
  else if (!EtatReset) ResetChrono ();
  HeureMax = 4500;
  if (digitalRead(INTER)) HeureMax = 1500;
}

void loop()  // Main loop
{
  LectureBoutons();
  if (EtatChrono)
  {
    if (millis() - dernierTempsChrono >= 1000)
    {
      MiseAJour();
      TimeToArray();
      dernierTempsChrono += 1000;
      FastLED.show(); // Display leds array
    }
  }
  if (Heure >= HeureMax) EtatChrono = false;
}

void StartChrono () {
  if (!EtatChrono) dernierTempsChrono = millis();
  EtatChrono = true;
}

void StopChrono () {
  EtatChrono = false;
}

void ResetChrono () {
  EtatChrono = false;
  Heure = 0;
  TimeToArray();
}
Title: Re: Horloge Géante
Post by: ASSM on May 29, 2018, 08:03 am
Bonjour

je teste la version ce soir en rentrant.

si je peux encore un peu abuser de tes connaissances il ne reste plus que a faire un dernier module pour compter les points sur deux chiffres (de 0 à 99) avec un BP pour incrémenter un BP pour décrémenter et un BP pour la remise a zéro.
Title: Re: Horloge Géante
Post by: lesept on May 29, 2018, 08:07 am
Deux scores sur deux chiffres séparés par ":" ou bien un seul score sur deux chiffres ?
Deux scores impliquent 6 boutons
Title: Re: Horloge Géante
Post by: ASSM on May 29, 2018, 08:13 am
Un seul score sur deux chiffres (car je doublerais le module pour une question de maintenance)
Title: Re: Horloge Géante
Post by: lesept on May 29, 2018, 08:41 am
ça ne devrait pas être très compliqué, on a déjà tout !
Voici une première tentative :

Code: [Select]
#include "FastLED.h"
#define NUM_LEDS 55 // Number of LED controls (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
#define BP_PLUS  7 // Pin bouton Incrémentation
#define BP_MOINS 8 // Pin bouton Décrémentation
#define BP_RESET 9 // Pin bouton Reset

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
};
int ledColor = 0x0000FF; // Color used (in hex)
int Score = 0;

void setup() {
  Serial.begin(115200);
  LEDS.addLeds<WS2811, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); // Set LED strip type
  LEDS.setBrightness(255); // Set initial brightness
  BrightnessCheck();
  pinMode(BP_PLUS,  INPUT_PULLUP); // bouton PLUS
  pinMode(BP_MOINS, INPUT_PULLUP); // bouton MOINS
  pinMode(BP_RESET, INPUT_PULLUP); // bouton RESET
  AfficheScore();
  FastLED.show();
}

// 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 AfficheScore() {
  int cursor = 0;
  int Now = Score;
  for (int i = 1; i < 3; i++) {
    int digit = Now % 10; // get last digit in time
    cursor = (i - 1) * 28;
    Serial.print (" "); Serial.print(digit);
    for (int k = 0; k < 28; k++) {
      leds[cursor + k] = ledColor * digits[digit][k];
    }
    Now /= 10;
  }
  Serial.println();
}

void loop()
{
  bool EtatPlus = digitalRead(BP_PLUS);
  delay(50);
  bool EtatMoins = digitalRead(BP_MOINS);
  delay(50);
  bool EtatReset = digitalRead(BP_RESET);
  delay(50);
  Serial.print ("Etat des boutons : Plus = ");
  Serial.print (EtatPlus);
  Serial.print (" Moins = ");
  Serial.print (EtatMoins);
  Serial.print (" Reset = ");
  Serial.println (EtatReset);

  if (!EtatPlus) {
    Score++;
    AfficheScore();
  }
  else if (!EtatMoins) {
    Score--;
    AfficheScore();
  }
  else if (!EtatReset) {
    Score = 0;
    AfficheScore();
  }
}
S'il y a des rebonds, tu peux changer les delay(50) en delay(100) voire 150.
Title: Re: Horloge Géante
Post by: ASSM on May 29, 2018, 10:54 am
Merci lesept

je teste tout cela ce soir et je ferais un retour.
Title: Re: Horloge Géante
Post by: ASSM on May 29, 2018, 05:57 pm
Bonsoir lesept

en ce qui concerne le chrono le bouton start fonctionne le bouton stop aussi mais le bouton reset remet bien le chrono a '00:00' que lorsque j'appuie de nouveau sur le bouton start.

pour le compteur de score il affiche bien 'oo' mais il ne s'incrémente pas ni se décrémente pas.
Title: Re: Horloge Géante
Post by: ASSM on May 29, 2018, 06:02 pm
Petite précision pour le compteur de score dans la console tout fonctionne correctement.

c'est a dire si j'appuie sur le BP+ il affiche de '00' a '01' si j'appuie sur le BP- il repasse a '00' si j'appuie deux fois sur le BP+ il passe à '02' et si j'appuie sur le bouton reset il passe a '00'
Title: Re: Horloge Géante
Post by: lesept on May 29, 2018, 06:03 pm
en ce qui concerne le chrono le bouton start fonctionne le bouton stop aussi mais le bouton reset remet bien le chrono a '00:00' que lorsque j'appuie de nouveau sur le bouton start.
Mais il indique bien 0 0 0 0 sur la console ?
Essaye de rajouter à la fin de la fonction ResetChrono
Code: [Select]
FastLED.show();

Au passage, on peut gagner un peu de précision en déplaçant la ligne
Code: [Select]
dernierTempsChrono += 1000;juste avant l'appel de la fonction MiseAJour()
Title: Re: Horloge Géante
Post by: lesept on May 29, 2018, 06:05 pm
Petite précision pour le compteur de score dans la console tout fonctionne correctement.

c'est a dire si j'appuie sur le BP+ il affiche de '00' a '01' si j'appuie sur le BP- il repasse a '00' si j'appuie deux fois sur le BP+ il passe à '02' et si j'appuie sur le bouton reset il passe a '00'
Ben oui, j'ai oublié de faire l'affichage des LEDs. Je vieillis...

Essaye de rajouter à la fin de la fonction AfficheScore
Code: [Select]
FastLED.show();
Title: Re: Horloge Géante
Post by: ASSM on May 29, 2018, 06:16 pm
lesept

pour le compteur de points c'est ok sa fonctionne nickel

et pour le chronomètre c'était la même chose.

Code: [Select]

void ResetChrono () {
  EtatChrono = false;
  Heure = 0;
  TimeToArray();
  FastLED.show();
}


je te remercie énormément pour ta précieuse aide.

il me reste plus a finaliser tout cela et je mettrai une photo du résultat final
Title: Re: Horloge Géante
Post by: lesept on May 29, 2018, 06:19 pm
Plusieurs photos j'espère :) !!
Tu en feras combien au final ?
Title: Re: Horloge Géante
Post by: ASSM on May 29, 2018, 06:32 pm
Je vais faire un seul panneaux d'affichage et je mettrais plusieurs photos avec un descriptif complet du projet et bien sur les codes de chaque module…..
je te remercie encore….
il me reste encore une quinzaine de jours de travail dessus pour que tout sois complètement fini….
Title: Re: Horloge Géante
Post by: lesept on May 29, 2018, 07:59 pm
S'il s'agit d'un panneau d'affichage et que tu doives mettre du texte, tu peux aussi jouer avec des matrices de LEDs comme ça :

(https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSCKItpZz20cytCDUhdneW16rjBoitTg3-MRfk5UBrw06YlQ9yIDA)

(https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSoAuV8y3OzcPlCleq8BUxiHCGiS0yriK4W1jI6kQT5-NOOUcvTsw)
Title: Re: Horloge Géante
Post by: lesept on May 30, 2018, 07:30 am
Une dernière modification dans l'affichage du score. Pour forcer le nombre à rester entre 0 et 99 (sur 2 chiffres), je propose de remplacer :
Code: [Select]
Score++;
par
Code: [Select]
Score = min(Score+1,99);
et
Code: [Select]
Score--;
par
Code: [Select]
Score = max(Score-1,0);
Title: Re: Horloge Géante
Post by: ASSM on Jun 16, 2018, 02:11 pm
bonjour lesept

je suis dans la phase terminale de mon projet mais j'ai un petit soucis avec le chrono:

les unités des secondes s'affichent sur l'afficheur le plus a gauche les dizaines de secondes sur le deuxieme afficheur en partant de la gauche pour les unités des minutes sur le deuxieme afficheur en partant de la droite et pour les dizaines des minutes sur l'afficheur le plus a droite se qui donne :


"SS:MM" au lieu de "MM:SS"

voici le code actuel

Code: [Select]

#include "FastLED.h"
#define NUM_LEDS 114 // Number of LED controls (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
#define BP_START 7 // Pin bouton Start
#define BP_STOP   8 // Pin bouton Stop
#define BP_RESET 9 // Pin bouton Reset
#define INTER 10   // Pin inter 15 / 45

CRGB leds[NUM_LEDS]; // Define LEDs strip
byte digits[10][28] = {
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, //0
  {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 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, 0, 0, 0, 0}, //2
  {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1}, //3
  {1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1}, //4
  {1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 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, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, //6
  {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1}, //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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1}, //9 | 2D Array for numbers on 7 segment
};
bool Dot = true;  //Dot state
int ledColor = 0x0000FF; // Color used (in hex)
int Heure = 0;
bool EtatChrono = false;  // Chrono arrêté
int HeureMax = 4500;
unsigned long dernierTempsChrono;

void setup() {
  Serial.begin(115200);
  LEDS.addLeds<WS2811, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); // Set LED strip type
  LEDS.setBrightness(255); // Set initial brightness
  BrightnessCheck();
  pinMode(BP_START, INPUT_PULLUP); // bouton START
  pinMode(BP_STOP, INPUT_PULLUP); // bouton STOP
  pinMode(BP_RESET, INPUT_PULLUP); // bouton RESET
  pinMode(INTER, INPUT_PULLUP); // inter 15 / 45
  TimeToArray();
  FastLED.show();
  dernierTempsChrono = millis();
}

// 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 cursor = 0;
  int Secondes = Heure % 100;
  int Now = Heure;

  Dot = true;
  if (Secondes % 2 == 1) Dot = false;
  if (Dot) {
    leds[56] = ledColor;
    leds[57] = ledColor;
  }
  else {
    leds[56] = 0x000000;
    leds[57] = 0x000000;
  }

  for (int i = 1; i < 5; i++) {
    int digit = Now % 10; // get last digit in time
    cursor = (i - 1) * 28;
    if (i > 2) cursor += 2;
    Serial.print (" "); Serial.print(digit);
    for (int k = 0; k < 28; k++) {
      leds[cursor + k] = ledColor * digits[digit][k];
    }
    Now /= 10;
  }
  Serial.println();
}

void MiseAJour()
{
  Heure += 1;
  if (Heure % 100 == 60) Heure = Heure + 40;
  Serial.print("Heure = "); Serial.print(Heure); Serial.print (" :");
}

void LectureBoutons()
{
  bool EtatStart = digitalRead(BP_START);
  delay(50);
  bool EtatStop = digitalRead(BP_STOP);
  delay(50);
  bool EtatReset = digitalRead(BP_RESET);
  delay(50);
//  Serial.print ("Etat des boutons : Start = ");
//  Serial.print (EtatStart );
//  Serial.print (" Stop = ");
//  Serial.print (EtatStop );
//  Serial.print (" Reset = ");
//  Serial.println (EtatReset );

  if (!EtatStart)  StartChrono ();
  else if (!EtatStop)  StopChrono ();
  else if (!EtatReset) ResetChrono ();
  HeureMax = 4500;
  if (digitalRead(INTER)) HeureMax = 1500;
}

void loop()  // Main loop
{
  LectureBoutons();
  if (EtatChrono)
  {
    if (millis() - dernierTempsChrono >= 1000)
    {
      dernierTempsChrono += 1000;
      MiseAJour();
      TimeToArray();
      FastLED.show(); // Display leds array
    }
  }
  if (Heure >= HeureMax) EtatChrono = false;
}

void StartChrono () {
  if (!EtatChrono) dernierTempsChrono = millis();
  EtatChrono = true;
}

void StopChrono () {
  EtatChrono = false;
}

void ResetChrono () {
  EtatChrono = false;
  Heure = 0;
  TimeToArray();
  FastLED.show();
}
Title: Re: Horloge Géante
Post by: lesept on Jun 16, 2018, 03:10 pm
C'est sympa aussi comme ça ... ;)

Essaye de changer :
Code: [Select]
cursor = (i - 1) * 28;en
Code: [Select]
cursor = (4 - i) * 28;
Il est possible qu'il faille aussi modifier la ligne suivante (c'est un peu ancien dans ma mémoire), genre if (i<=2)
Title: Re: Horloge Géante
Post by: ASSM on Jun 17, 2018, 12:16 pm
bonjour

j'ai bien modifié la ligne comme tu me la dis lesept.

et cette fois il affiche bien "MM:SS" et il a fallut que je change la ligne d'apres
comme cela:

Code: [Select]

    if (i > 0) cursor += 2;



donc pour les secondes tout fonctionne parfaitement mais par contre pour les minutes les numeros ne s'affichent pas correctement et les deux leds ne clignotent plus en meme temps que les secondes

pareil j'ai remarque que je ne pouvais pas changer la couleurs des leds meme en modifiant la valeur en hexa

par exemple si je met "0xFF0000" pour la couleur rouge et bien rien ne s'affiche il n'y que la valeur "0x0000FF" qui fonctionne et qui devrait allumer les leds en bleu alors qu'elles s'allument en vert...
Title: Re: Horloge Géante
Post by: lesept on Jun 17, 2018, 02:06 pm
Pour la couleur ça peut venir de cette ligne
Code: [Select]
#define COLOR_ORDER BRG  // Define color order for your strip qui définit les codes comme BRG et pas RGB. Les deux permiers codes du 0x123456 serait pour le blue, ensuite le red ensuite le green.
Du coup pour du rouge il faudrait 0x00FF00... et 0x0000FF pour du vert.
Avec FastLED tu peux aussi utiliser des couleurs prédéfinies comme CRGB::Red. Il y a la liste ici (https://github.com/FastLED/FastLED/wiki/Pixel-reference) en bas de la page.

Quote
pour les minutes les numeros ne s'affichent pas correctement et les deux leds ne clignotent plus en meme temps que les secondes
Décris moi ce que tu veux dire par "pas correctement".
Title: Re: Horloge Géante
Post by: ASSM on Jun 17, 2018, 02:19 pm
je veux dire que pour les secondes les chiffres s'affichent correctement mais pas pour les minutes il manque des leds qui s'affichent. et les deux leds du milieu ne clignotent plus.
Title: Re: Horloge Géante
Post by: lesept on Jun 17, 2018, 04:20 pm
Peux-tu me dire ce qui s'affiche sur la console et en même temps ce que tu vois sur ton afficheur à LEDs ? Juste quelques exemples, pas tout... Merci
Title: Re: Horloge Géante
Post by: ASSM on Jun 17, 2018, 09:47 pm
Sur la console cela affiche bien 0000 mais sur l'afficheur il manque des leds pour bien afficher 0000
avant de moodifier la valeur de la deuxieme ligne de code j'avais la meme chose pour les secondes…
en remplacant la valeur a 0 a la place de 2 je n'ai plus eu de probleme pour les secondes
Title: Re: Horloge Géante
Post by: lesept on Jun 17, 2018, 10:41 pm
Ça ne m'aide pas, j'aimerais que tu laisse le temps s'écouler jusqu'à par exemple 01 minutes et 23 secondes ou un temps pour lequel les 4 chiffres sont différents. Là tu stoppes le chrono et tu postes une photo de l'affichage des LEDs. Comme ça je verrai bien ce qui ne va pas. Je pense que c'est un petit réglage à faire mais en aveugle c'est difficile.
Merci
Title: Re: Horloge Géante
Post by: ASSM on Jun 30, 2018, 03:08 pm
Bonjour lesept

J'ai toujours mon soucis de couleur il faut que je mette "CRGB::DarkGreen" pour avoir les leds qui s'allument en rouge.

J'ai toujours le soucis des minutes qui ne fonctionne pas correctement

Sur la photo il devrait y avoir "00:00"

Voir piece jointe

Sur la photo il devrait y avoir "01:23"

Voir piece jointe

Code: [Select]

#include "FastLED.h"
#define NUM_LEDS 114 // Number of LED controls (remember I have 3 leds / controler
#define LED_TYPE WS2812B
#define COLOR_ORDER RGB
#define DATA_PIN 6  // Data pin for led comunication
#define BP_START 7 // Pin bouton Start
#define BP_STOP   8 // Pin bouton Stop
#define BP_RESET 9 // Pin bouton Reset
#define INTER 10   // Pin inter 15 / 45

CRGB leds[NUM_LEDS]; // Define LEDs strip
byte digits[10][28] = {
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, //0
  {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 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, 0, 0, 0, 0}, //2
  {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1}, //3
  {1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1}, //4
  {1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 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, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, //6
  {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1}, //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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1}, //9 | 2D Array for numbers on 7 segment
};
bool Dot = true;  //Dot state
int ledColor = CRGB::DarkGreen; // Color used (in hex)
int Heure = 0;
bool EtatChrono = false;  // Chrono arrêté
int HeureMax = 4500;
unsigned long dernierTempsChrono;

void setup() {
  Serial.begin(115200);
  LEDS.addLeds<WS2812B, DATA_PIN, RGB>(leds, NUM_LEDS);
  LEDS.setBrightness(255); // Set initial brightness
  BrightnessCheck();
  pinMode(BP_START, INPUT_PULLUP); // bouton START
  pinMode(BP_STOP, INPUT_PULLUP); // bouton STOP
  pinMode(BP_RESET, INPUT_PULLUP); // bouton RESET
  pinMode(INTER, INPUT_PULLUP); // inter 15 / 45
  TimeToArray();
  FastLED.show();
  dernierTempsChrono = millis();
}

// Check Light sensor and set brightness accordingly
void BrightnessCheck() {
  const byte sensorPin = 3; // light sensor pin
  const byte brightnessLow = 255; // 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 cursor = 0;
  int Secondes = Heure % 100;
  int Now = Heure;

  Dot = true;
  if (Secondes % 2 == 1) Dot = false;
  if (Dot) {
    leds[56] = ledColor;
    leds[57] = ledColor;
  }
  else {
    leds[56] = 0x000000;
    leds[57] = 0x000000;
  }

  for (int i = 1; i < 5; i++) {
    int digit = Now % 10; // get last digit in time
    cursor = (4 - i) * 28;
    if (i > 0) cursor += 2;
    Serial.print (" "); Serial.print(digit);
    for (int k = 0; k < 28; k++) {
      leds[cursor + k] = ledColor * digits[digit][k];
    }
    Now /= 10;
  }
  Serial.println();
}

void MiseAJour()
{
  Heure += 1;
  if (Heure % 100 == 60) Heure = Heure + 40;
  Serial.print("Heure = "); Serial.print(Heure); Serial.print (" :");
}

void LectureBoutons()
{
  bool EtatStart = digitalRead(BP_START);
  delay(50);
  bool EtatStop = digitalRead(BP_STOP);
  delay(50);
  bool EtatReset = digitalRead(BP_RESET);
  delay(50);
  //  Serial.print ("Etat des boutons : Start = ");
  //  Serial.print (EtatStart );
  //  Serial.print (" Stop = ");
  //  Serial.print (EtatStop );
  //  Serial.print (" Reset = ");
  //  Serial.println (EtatReset );

  if (!EtatStart)  StartChrono ();
  else if (!EtatStop)  StopChrono ();
  else if (!EtatReset) ResetChrono ();
  HeureMax = 4500;
  if (digitalRead(INTER)) HeureMax = 1500;
}

void loop()  // Main loop
{
  LectureBoutons();
  if (EtatChrono)
  {
    if (millis() - dernierTempsChrono >= 1000)
    {
      dernierTempsChrono += 1000;
      MiseAJour();
      TimeToArray();
      FastLED.show(); // Display leds array
    }
  }
  if (Heure >= HeureMax) EtatChrono = false;
}

void StartChrono () {
  if (!EtatChrono) dernierTempsChrono = millis();
  EtatChrono = true;
}

void StopChrono () {
  EtatChrono = false;
}

void ResetChrono () {
  EtatChrono = false;
  Heure = 0;
  TimeToArray();
  FastLED.show();
}
Title: Re: Horloge Géante
Post by: ASSM on Jun 30, 2018, 03:28 pm
Voici l'image pour "01:23"
Title: Re: Horloge Géante
Post by: lesept on Jun 30, 2018, 05:15 pm
Et qu'est ce qui s'affiche sur la console à ce moment là ?

C'est les lignes suivantes qui affichent ce qui m'intéresse :
Code: [Select]
  Serial.print("Heure = "); Serial.print(Heure); Serial.print (" :");
Title: Re: Horloge Géante
Post by: lesept on Jun 30, 2018, 05:22 pm
Tu peux essayer de remplacer la boucle for (i= ... dans TimeToArray par ceci :

Code: [Select]
  for (int i = 3; i >= 0; i--) {
    int digit = Now % 10; // get last digit in time
    cursor = i * 28;
    if (i > 1) cursor += 2;
    Serial.print (" "); Serial.print(digit);
    for (int k = 0; k < 28; k++) {
      leds[cursor + k] = ledColor * digits[digit][k];
    }
    Now /= 10;
  }

Après, si ça ne fonctionne pas, il faut que tu me copie / colle ce qu'affiche la console autour de l'instant 01:23 (un peu avant, un peu après, mettons sur dix secondes). Merci
Title: Re: Horloge Géante
Post by: ASSM on Jul 02, 2018, 10:26 am
Bonjour Lesept

Cette fois tout fonctionne correctement.

C'est parfait.
Title: Re: Horloge Géante
Post by: lesept on Jul 02, 2018, 10:36 am
Super ! Une photo ?
Title: Re: Horloge Géante
Post by: ASSM on Jul 02, 2018, 10:47 am
Je posterais une photo ce soir.....
Title: Re: Horloge Géante
Post by: ASSM on Jul 03, 2018, 09:25 pm
Bonsoir

Voici comme promis une photo du résultat quasiment final.

il ne me reste plus que a mettre le pvc opaque devant les chiffres et de retirer le film de protection bleu.

N'hésitez pas sur les remarques….
Title: Re: Horloge Géante
Post by: lesept on Jul 04, 2018, 10:59 am
C'est superbe, bravo !
Title: Re: Horloge Géante
Post by: ASSM on Jul 22, 2018, 03:50 pm
Bonjour lesept

Le panneau d'affichage est fini et ton idée de pouvoir faire un texte défilant lumineux me plait énormément.

Je voudrais rester dans le meme principe avec des rubans leds sur huits niveaux composé chacun de 60leds.

et je voudrais pouvoir le piloter par bluetooth avec l'application Send_Message.

Aurais tu une idée de la facon que je dois procéder.

Merci d'avance
Title: Re: Horloge Géante
Post by: lesept on Jul 22, 2018, 11:20 pm
Bonsoir

Il faut y réfléchir : veux-tu faire toujours le même message ou un message custom à chaque fois ? Dans le premier cas, on n'a pas besoin de définir l'ensemble de l'alphabet mais seulement les lettres utiles à ton message. Dans le second cas, il vaut mieux définir l'ensemble de l'alphabet, avec éventuellement un peu de ponctuation.

Quelle est cette application Send_message ? Fait-elle partie d'une bibliothèque ? Dis m'en un peu plus là dessus...

As-tu déjà joué avec de bluetooth ? As-tu un module genre HC-05 ?
Title: Re: Horloge Géante
Post by: ASSM on Jul 23, 2018, 09:19 am
Bonjour

Je souhaite faire un message custom à chaque fois.Pour le module bluetooth c'est le HC-06.

En ce qui concerne l'application je n'ai aucune préférence je voudrais simplement qu'elle puisse envoyer le message et que je puisse régler le vitesse de défilement.

Voici deux photos du résultat définitif du panneau d'affichage.

(https://forum.arduino.cc/index.php?action=dlattach;topic=548770.0;attach=267214)
(https://forum.arduino.cc/index.php?action=dlattach;topic=548770.0;attach=267216)
Title: Re: Horloge Géante
Post by: lesept on Jul 23, 2018, 10:05 am
Alors, on part sur 8 rubans de 60 LEDs superposés. Il te faudra donc 8 pins de contrôle et on déclarera 8 rubans. On va faire comme pour les chiffres : définir les pixels allumés pour chaque lettre, mais on va essayer de réduire la place mémoire, car la méthode utilisée pour les chiffres consomme inutilement trop :
Code: [Select]
byte digits[10][28] = {
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, //0
  {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 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, 0, 0, 0, 0}, //2
  {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1}, //3
  {1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1}, //4
  {1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 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, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, //6
  {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1}, //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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1}, //9 | 2D Array for numbers on 7 segment
};

Un byte peut contenir 8 bits, or ici on ne stocke qu'un seul bit par byte donc 8 fois trop (je ne sais pas si c'est très clair ce que je dis...).

Peux-tu chercher sur Internet si tu peux trouver les codes représentant les lettres ? Par exemple, pour le A, une possibilité serait :
(https://forum.arduino.cc/index.php?action=dlattach;topic=548770.0;attach=267224)

Ce qui se coderait par : 0,15,18,34,18,15,0,0. Mais il en existe certainement d'autres plus jolies. J'ai mis 8 colonnes, il en faut peut-être moins...

Ensuite, on déclare un tableau de char qui contiendra le texte à afficher (je suppose qu'on ne prend que les majuscules ?) :
Code: [Select]
char texte[];
L'idéal serait d'en limiter la taille à une valeur maximale (50 caractères par exemple ?). Puis on fera une fonction qui sélectionnera les colonnes à afficher (un buffer) et une autre qui les affichera.

Ça ne devrait pas être trop compliqué. Il y a peut-être des solutions plus simples, voire même des bibliothèques existantes et déjà optimisées, mais je ne les connais pas. Donc, je pars sur cette solution...
Title: Re: Horloge Géante
Post by: ASSM on Jul 23, 2018, 11:16 am
Sur le net ce genre de réalisation les personnes utilisent se petit bout de programme.

Code: [Select]


const uint8_t Font5x7[] PROGMEM = {
0x00,0x00,0x00,0x00,0x00,// 
0x00,0x00,0xfa,0x00,0x00,// !
0x00,0xe0,0x00,0xe0,0x00,// "
0x28,0xfe,0x28,0xfe,0x28,// #
0x24,0x54,0xfe,0x54,0x48,// $
0xc4,0xc8,0x10,0x26,0x46,// %
0x6c,0x92,0xaa,0x44,0x0a,// &
0x00,0xa0,0xc0,0x00,0x00,// '
0x00,0x38,0x44,0x82,0x00,// (
0x00,0x82,0x44,0x38,0x00,// )
0x10,0x54,0x38,0x54,0x10,// *
0x10,0x10,0x7c,0x10,0x10,// +
0x00,0x0a,0x0c,0x00,0x00,// ,
0x10,0x10,0x10,0x10,0x10,// -
0x00,0x06,0x06,0x00,0x00,// .
0x04,0x08,0x10,0x20,0x40,// /
0x7c,0x8a,0x92,0xa2,0x7c,// 0
0x00,0x42,0xfe,0x02,0x00,// 1
0x42,0x86,0x8a,0x92,0x62,// 2
0x84,0x82,0xa2,0xd2,0x8c,// 3
0x18,0x28,0x48,0xfe,0x08,// 4
0xe4,0xa2,0xa2,0xa2,0x9c,// 5
0x3c,0x52,0x92,0x92,0x0c,// 6
0x80,0x8e,0x90,0xa0,0xc0,// 7
0x6c,0x92,0x92,0x92,0x6c,// 8
0x60,0x92,0x92,0x94,0x78,// 9
0x00,0x6c,0x6c,0x00,0x00,// :
0x00,0x6a,0x6c,0x00,0x00,// ;
0x00,0x10,0x28,0x44,0x82,// <
0x28,0x28,0x28,0x28,0x28,// =
0x82,0x44,0x28,0x10,0x00,// >
0x40,0x80,0x8a,0x90,0x60,// ?
0x4c,0x92,0x9e,0x82,0x7c,// @
0x7e,0x88,0x88,0x88,0x7e,// A
0xfe,0x92,0x92,0x92,0x6c,// B
0x7c,0x82,0x82,0x82,0x44,// C
0xfe,0x82,0x82,0x44,0x38,// D
0xfe,0x92,0x92,0x92,0x82,// E
0xfe,0x90,0x90,0x80,0x80,// F
0x7c,0x82,0x82,0x8a,0x4c,// G
0xfe,0x10,0x10,0x10,0xfe,// H
0x00,0x82,0xfe,0x82,0x00,// I
0x04,0x02,0x82,0xfc,0x80,// J
0xfe,0x10,0x28,0x44,0x82,// K
0xfe,0x02,0x02,0x02,0x02,// L
0xfe,0x40,0x20,0x40,0xfe,// M
0xfe,0x20,0x10,0x08,0xfe,// N
0x7c,0x82,0x82,0x82,0x7c,// O
0xfe,0x90,0x90,0x90,0x60,// P
0x7c,0x82,0x8a,0x84,0x7a,// Q
0xfe,0x90,0x98,0x94,0x62,// R
0x62,0x92,0x92,0x92,0x8c,// S
0x80,0x80,0xfe,0x80,0x80,// T
0xfc,0x02,0x02,0x02,0xfc,// U
0xf8,0x04,0x02,0x04,0xf8,// V
0xfe,0x04,0x18,0x04,0xfe,// W
0xc6,0x28,0x10,0x28,0xc6,// X
0xc0,0x20,0x1e,0x20,0xc0,// Y
0x86,0x8a,0x92,0xa2,0xc2,// Z
0x00,0x00,0xfe,0x82,0x82,// [
0x40,0x20,0x10,0x08,0x04,// (backslash)
0x82,0x82,0xfe,0x00,0x00,// ]
0x20,0x40,0x80,0x40,0x20,// ^
0x02,0x02,0x02,0x02,0x02,// _
0x00,0x80,0x40,0x20,0x00,// `
0x04,0x2a,0x2a,0x2a,0x1e,// a
0xfe,0x12,0x22,0x22,0x1c,// b
0x1c,0x22,0x22,0x22,0x04,// c
0x1c,0x22,0x22,0x12,0xfe,// d
0x1c,0x2a,0x2a,0x2a,0x18,// e
0x10,0x7e,0x90,0x80,0x40,// f
0x10,0x28,0x2a,0x2a,0x3c,// g
0xfe,0x10,0x20,0x20,0x1e,// h
0x00,0x22,0xbe,0x02,0x00,// i
0x04,0x02,0x22,0xbc,0x00,// j
0x00,0xfe,0x08,0x14,0x22,// k
0x00,0x82,0xfe,0x02,0x00,// l
0x3e,0x20,0x18,0x20,0x1e,// m
0x3e,0x10,0x20,0x20,0x1e,// n
0x1c,0x22,0x22,0x22,0x1c,// o
0x3e,0x28,0x28,0x28,0x10,// p
0x10,0x28,0x28,0x18,0x3e,// q
0x3e,0x10,0x20,0x20,0x10,// r
0x12,0x2a,0x2a,0x2a,0x04,// s
0x20,0xfc,0x22,0x02,0x04,// t
0x3c,0x02,0x02,0x04,0x3e,// u
0x38,0x04,0x02,0x04,0x38,// v
0x3c,0x02,0x0c,0x02,0x3c,// w
0x22,0x14,0x08,0x14,0x22,// x
0x30,0x0a,0x0a,0x0a,0x3c,// y
0x22,0x26,0x2a,0x32,0x22,// z
0x00,0x10,0x6c,0x82,0x00,// {
0x00,0x00,0xfe,0x00,0x00,// |
0x00,0x82,0x6c,0x10,0x00,// }
0x10,0x10,0x54,0x38,0x10,// ~
0x10,0x38,0x54,0x10,0x10,// 
};

Title: Re: Horloge Géante
Post by: lesept on Jul 23, 2018, 11:25 am
OK, je peux utiliser ça. Les lettres sont grossières mais ça peut le faire.
Title: Re: Horloge Géante
Post by: ASSM on Jul 23, 2018, 11:29 am
Voici un programme trouvé sur le net.
Title: Re: Horloge Géante
Post by: lesept on Jul 23, 2018, 02:02 pm
Trop compliqué pour moi. Voici ce que j'ai préparé :

Code: [Select]
#include "FastLED.h"
#define NUM_LEDS 60 // Nombre de LEDs par ligne
#define COLOR_ORDER BRG  // Color order
#define NumLignes 8
CRGB ligne0[NUM_LEDS]; // <-- C'est la ligne du haut !
CRGB ligne1[NUM_LEDS];
CRGB ligne2[NUM_LEDS];
CRGB ligne3[NUM_LEDS];
CRGB ligne4[NUM_LEDS];
CRGB ligne5[NUM_LEDS];
CRGB ligne6[NUM_LEDS];
CRGB ligne7[NUM_LEDS]; // Et la ligne du bas

char Message[101] = "Itaque tum Scaevola cum in eam ipsam mentionem incidisset, exposuit nobis sermonem Laeli de amicitia"; // Max 100 caractères à afficher
char Texte[NUM_LEDS]; // Le texte affiché à chaque instant
// On laisse un pixel entre chaque lettre affichée (ça peut être modifié)

#define PIXELS 6 // Nombre de pixels par lettre (yc un espace)
// A priori 7 lignes de LEDs suffisent avec cette définition
const uint8_t Font5x7[] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, //
  0x00, 0x00, 0xfa, 0x00, 0x00, // !
  0x00, 0xe0, 0x00, 0xe0, 0x00, // "
  0x28, 0xfe, 0x28, 0xfe, 0x28, // #
  0x24, 0x54, 0xfe, 0x54, 0x48, // $
  0xc4, 0xc8, 0x10, 0x26, 0x46, // %
  0x6c, 0x92, 0xaa, 0x44, 0x0a, // &
  0x00, 0xa0, 0xc0, 0x00, 0x00, // '
  0x00, 0x38, 0x44, 0x82, 0x00, // (
  0x00, 0x82, 0x44, 0x38, 0x00, // )
  0x10, 0x54, 0x38, 0x54, 0x10, // *
  0x10, 0x10, 0x7c, 0x10, 0x10, // +
  0x00, 0x0a, 0x0c, 0x00, 0x00, // ,
  0x10, 0x10, 0x10, 0x10, 0x10, // -
  0x00, 0x06, 0x06, 0x00, 0x00, // .
  0x04, 0x08, 0x10, 0x20, 0x40, // /
  0x7c, 0x8a, 0x92, 0xa2, 0x7c, // 0
  0x00, 0x42, 0xfe, 0x02, 0x00, // 1
  0x42, 0x86, 0x8a, 0x92, 0x62, // 2
  0x84, 0x82, 0xa2, 0xd2, 0x8c, // 3
  0x18, 0x28, 0x48, 0xfe, 0x08, // 4
  0xe4, 0xa2, 0xa2, 0xa2, 0x9c, // 5
  0x3c, 0x52, 0x92, 0x92, 0x0c, // 6
  0x80, 0x8e, 0x90, 0xa0, 0xc0, // 7
  0x6c, 0x92, 0x92, 0x92, 0x6c, // 8
  0x60, 0x92, 0x92, 0x94, 0x78, // 9
  0x00, 0x6c, 0x6c, 0x00, 0x00, // :
  0x00, 0x6a, 0x6c, 0x00, 0x00, // ;
  0x00, 0x10, 0x28, 0x44, 0x82, // <
  0x28, 0x28, 0x28, 0x28, 0x28, // =
  0x82, 0x44, 0x28, 0x10, 0x00, // >
  0x40, 0x80, 0x8a, 0x90, 0x60, // ?
  0x4c, 0x92, 0x9e, 0x82, 0x7c, // @
  0x7e, 0x88, 0x88, 0x88, 0x7e, // A
  0xfe, 0x92, 0x92, 0x92, 0x6c, // B
  0x7c, 0x82, 0x82, 0x82, 0x44, // C
  0xfe, 0x82, 0x82, 0x44, 0x38, // D
  0xfe, 0x92, 0x92, 0x92, 0x82, // E
  0xfe, 0x90, 0x90, 0x80, 0x80, // F
  0x7c, 0x82, 0x82, 0x8a, 0x4c, // G
  0xfe, 0x10, 0x10, 0x10, 0xfe, // H
  0x00, 0x82, 0xfe, 0x82, 0x00, // I
  0x04, 0x02, 0x82, 0xfc, 0x80, // J
  0xfe, 0x10, 0x28, 0x44, 0x82, // K
  0xfe, 0x02, 0x02, 0x02, 0x02, // L
  0xfe, 0x40, 0x20, 0x40, 0xfe, // M
  0xfe, 0x20, 0x10, 0x08, 0xfe, // N
  0x7c, 0x82, 0x82, 0x82, 0x7c, // O
  0xfe, 0x90, 0x90, 0x90, 0x60, // P
  0x7c, 0x82, 0x8a, 0x84, 0x7a, // Q
  0xfe, 0x90, 0x98, 0x94, 0x62, // R
  0x62, 0x92, 0x92, 0x92, 0x8c, // S
  0x80, 0x80, 0xfe, 0x80, 0x80, // T
  0xfc, 0x02, 0x02, 0x02, 0xfc, // U
  0xf8, 0x04, 0x02, 0x04, 0xf8, // V
  0xfe, 0x04, 0x18, 0x04, 0xfe, // W
  0xc6, 0x28, 0x10, 0x28, 0xc6, // X
  0xc0, 0x20, 0x1e, 0x20, 0xc0, // Y
  0x86, 0x8a, 0x92, 0xa2, 0xc2, // Z
  0x00, 0x00, 0xfe, 0x82, 0x82, // [
  0x40, 0x20, 0x10, 0x08, 0x04, // (backslash)
  0x82, 0x82, 0xfe, 0x00, 0x00, // ]
  0x20, 0x40, 0x80, 0x40, 0x20, // ^
  0x02, 0x02, 0x02, 0x02, 0x02, // _
  0x00, 0x80, 0x40, 0x20, 0x00, // `
  0x04, 0x2a, 0x2a, 0x2a, 0x1e, // a
  0xfe, 0x12, 0x22, 0x22, 0x1c, // b
  0x1c, 0x22, 0x22, 0x22, 0x04, // c
  0x1c, 0x22, 0x22, 0x12, 0xfe, // d
  0x1c, 0x2a, 0x2a, 0x2a, 0x18, // e
  0x10, 0x7e, 0x90, 0x80, 0x40, // f
  0x10, 0x28, 0x2a, 0x2a, 0x3c, // g
  0xfe, 0x10, 0x20, 0x20, 0x1e, // h
  0x00, 0x22, 0xbe, 0x02, 0x00, // i
  0x04, 0x02, 0x22, 0xbc, 0x00, // j
  0x00, 0xfe, 0x08, 0x14, 0x22, // k
  0x00, 0x82, 0xfe, 0x02, 0x00, // l
  0x3e, 0x20, 0x18, 0x20, 0x1e, // m
  0x3e, 0x10, 0x20, 0x20, 0x1e, // n
  0x1c, 0x22, 0x22, 0x22, 0x1c, // o
  0x3e, 0x28, 0x28, 0x28, 0x10, // p
  0x10, 0x28, 0x28, 0x18, 0x3e, // q
  0x3e, 0x10, 0x20, 0x20, 0x10, // r
  0x12, 0x2a, 0x2a, 0x2a, 0x04, // s
  0x20, 0xfc, 0x22, 0x02, 0x04, // t
  0x3c, 0x02, 0x02, 0x04, 0x3e, // u
  0x38, 0x04, 0x02, 0x04, 0x38, // v
  0x3c, 0x02, 0x0c, 0x02, 0x3c, // w
  0x22, 0x14, 0x08, 0x14, 0x22, // x
  0x30, 0x0a, 0x0a, 0x0a, 0x3c, // y
  0x22, 0x26, 0x2a, 0x32, 0x22, // z
  0x00, 0x10, 0x6c, 0x82, 0x00, // {
  0x00, 0x00, 0xfe, 0x00, 0x00, // |
  0x00, 0x82, 0x6c, 0x10, 0x00, // }
  0x10, 0x10, 0x54, 0x38, 0x10, // ~
  0x10, 0x38, 0x54, 0x10, 0x10, // 
};

void setup() {
  // Les pins de commande vont de 2 à 9
  LEDS.addLeds<WS2811, 2, COLOR_ORDER>(ligne0, NUM_LEDS);
  LEDS.addLeds<WS2811, 3, COLOR_ORDER>(ligne1, NUM_LEDS);
  LEDS.addLeds<WS2811, 4, COLOR_ORDER>(ligne2, NUM_LEDS);
  LEDS.addLeds<WS2811, 5, COLOR_ORDER>(ligne3, NUM_LEDS);
  LEDS.addLeds<WS2811, 6, COLOR_ORDER>(ligne4, NUM_LEDS);
  LEDS.addLeds<WS2811, 7, COLOR_ORDER>(ligne5, NUM_LEDS);
  LEDS.addLeds<WS2811, 8, COLOR_ORDER>(ligne6, NUM_LEDS);
  LEDS.addLeds<WS2811, 9, COLOR_ORDER>(ligne7, NUM_LEDS);
  LEDS.setBrightness(255);
}

void loop() {
  byte MessLength = sizeof(Message) * PIXELS;
  InitTexte();
  AfficheTexte();
  for (int i = NUM_LEDS + 1; i <= MessLength; i++) {
    DecaleTexte(i);
    AfficheTexte();
  }
}

void InitTexte() {
  // On met dans le texte à afficher les valeurs en hexa
  for (byte i = 0; i < NUM_LEDS; i++) {
    byte NumLettre = i / PIXELS;
    byte Numalpha = Message[NumLettre] - 32;
    byte indice = i % PIXELS; // Position du pixel dans le caractère
    if (indice == PIXELS - 1) Texte[i] = 0; // 1 espace en fin de caractère
    else Texte[i] = Font5x7[(PIXELS - 1) * Numalpha + indice];
  }
}

void DecaleTexte(int Pos) {
  // Décalage de 1 pixel vers la gauche
  for (byte i = 1; i < NUM_LEDS; i++) {
    Texte[i - 1] = Texte[i];
  }
  // Ajout du dernier pixel
  byte NumLettre = Pos / PIXELS + 1;
  byte NumAlpha = Message[NumLettre] - 32;
  byte indice = Pos % PIXELS; // Position du pixel dans le caractère
  if (indice == 0) Texte[NUM_LEDS] = 0;
  else Texte[NUM_LEDS] = Font5x7[(PIXELS - 1) * NumAlpha + indice];
}

void AfficheTexte() {
  int ledColor = 0x0000FF; // Color used (in hex)
  for (byte i = 0; i < NUM_LEDS; i++) {
    ligne0[i] = ledColor * (Texte[i] && 0x10000000);
    ligne1[i] = ledColor * (Texte[i] && 0x01000000);
    ligne2[i] = ledColor * (Texte[i] && 0x00100000);
    ligne3[i] = ledColor * (Texte[i] && 0x00010000);
    ligne4[i] = ledColor * (Texte[i] && 0x00001000);
    ligne5[i] = ledColor * (Texte[i] && 0x00000100);
    ligne6[i] = ledColor * (Texte[i] && 0x00000010);
    ligne7[i] = ledColor * (Texte[i] && 0x00000001);
  }
  FastLED.show();
  delay(500); // <-- Vitesse d'affichage (à ajuster)
}

Ça compile, mais sur un nano ça dit que la mémoire est faible. En effet, je déclare 8 tableaux de 60 couleurs pour les 8 lignes (mais 7 peuvent suffire je pense) et ça prend pas mal de place.

Tu testes ?
Title: Re: Horloge Géante
Post by: ASSM on Jul 23, 2018, 02:08 pm
Merci

je teste tout cela ce soir si possible et je te ferais le retour.
Title: Re: Horloge Géante
Post by: lesept on Jul 23, 2018, 02:23 pm
J'ai cherché un moyen de réduire la mémoire utilisée : en m'inspirant de cette page (https://github.com/FastLED/FastLED/wiki/Multiple-Controller-Examples), voici ce que je propose (version 2 donc) :
Code: [Select]
#include "FastLED.h"
#define NUM_LEDS 60 // Nombre de LEDs par ligne
#define COLOR_ORDER BRG  // Color order
#define NumLignes 8
#define BRIGHTNESS 255
CRGB leds[NUM_LEDS];

char Message[101] = "Itaque tum Scaevola cum in eam ipsam mentionem incidisset, exposuit nobis sermonem Laeli de amicitia"; // Max 100 caractères à afficher
char Texte[NUM_LEDS]; // Le texte affiché à chaque instant
// On laisse un pixel entre chaque lettre affichée (ça peut être modifié)

#define PIXELS 6 // Nombre de pixels par lettre (yc un espace)
// A priori 7 lignes de LEDs suffisent avec cette définition
const uint8_t Font5x7[] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, //
  0x00, 0x00, 0xfa, 0x00, 0x00, // !
  0x00, 0xe0, 0x00, 0xe0, 0x00, // "
  0x28, 0xfe, 0x28, 0xfe, 0x28, // #
  0x24, 0x54, 0xfe, 0x54, 0x48, // $
  0xc4, 0xc8, 0x10, 0x26, 0x46, // %
  0x6c, 0x92, 0xaa, 0x44, 0x0a, // &
  0x00, 0xa0, 0xc0, 0x00, 0x00, // '
  0x00, 0x38, 0x44, 0x82, 0x00, // (
  0x00, 0x82, 0x44, 0x38, 0x00, // )
  0x10, 0x54, 0x38, 0x54, 0x10, // *
  0x10, 0x10, 0x7c, 0x10, 0x10, // +
  0x00, 0x0a, 0x0c, 0x00, 0x00, // ,
  0x10, 0x10, 0x10, 0x10, 0x10, // -
  0x00, 0x06, 0x06, 0x00, 0x00, // .
  0x04, 0x08, 0x10, 0x20, 0x40, // /
  0x7c, 0x8a, 0x92, 0xa2, 0x7c, // 0
  0x00, 0x42, 0xfe, 0x02, 0x00, // 1
  0x42, 0x86, 0x8a, 0x92, 0x62, // 2
  0x84, 0x82, 0xa2, 0xd2, 0x8c, // 3
  0x18, 0x28, 0x48, 0xfe, 0x08, // 4
  0xe4, 0xa2, 0xa2, 0xa2, 0x9c, // 5
  0x3c, 0x52, 0x92, 0x92, 0x0c, // 6
  0x80, 0x8e, 0x90, 0xa0, 0xc0, // 7
  0x6c, 0x92, 0x92, 0x92, 0x6c, // 8
  0x60, 0x92, 0x92, 0x94, 0x78, // 9
  0x00, 0x6c, 0x6c, 0x00, 0x00, // :
  0x00, 0x6a, 0x6c, 0x00, 0x00, // ;
  0x00, 0x10, 0x28, 0x44, 0x82, // <
  0x28, 0x28, 0x28, 0x28, 0x28, // =
  0x82, 0x44, 0x28, 0x10, 0x00, // >
  0x40, 0x80, 0x8a, 0x90, 0x60, // ?
  0x4c, 0x92, 0x9e, 0x82, 0x7c, // @
  0x7e, 0x88, 0x88, 0x88, 0x7e, // A
  0xfe, 0x92, 0x92, 0x92, 0x6c, // B
  0x7c, 0x82, 0x82, 0x82, 0x44, // C
  0xfe, 0x82, 0x82, 0x44, 0x38, // D
  0xfe, 0x92, 0x92, 0x92, 0x82, // E
  0xfe, 0x90, 0x90, 0x80, 0x80, // F
  0x7c, 0x82, 0x82, 0x8a, 0x4c, // G
  0xfe, 0x10, 0x10, 0x10, 0xfe, // H
  0x00, 0x82, 0xfe, 0x82, 0x00, // I
  0x04, 0x02, 0x82, 0xfc, 0x80, // J
  0xfe, 0x10, 0x28, 0x44, 0x82, // K
  0xfe, 0x02, 0x02, 0x02, 0x02, // L
  0xfe, 0x40, 0x20, 0x40, 0xfe, // M
  0xfe, 0x20, 0x10, 0x08, 0xfe, // N
  0x7c, 0x82, 0x82, 0x82, 0x7c, // O
  0xfe, 0x90, 0x90, 0x90, 0x60, // P
  0x7c, 0x82, 0x8a, 0x84, 0x7a, // Q
  0xfe, 0x90, 0x98, 0x94, 0x62, // R
  0x62, 0x92, 0x92, 0x92, 0x8c, // S
  0x80, 0x80, 0xfe, 0x80, 0x80, // T
  0xfc, 0x02, 0x02, 0x02, 0xfc, // U
  0xf8, 0x04, 0x02, 0x04, 0xf8, // V
  0xfe, 0x04, 0x18, 0x04, 0xfe, // W
  0xc6, 0x28, 0x10, 0x28, 0xc6, // X
  0xc0, 0x20, 0x1e, 0x20, 0xc0, // Y
  0x86, 0x8a, 0x92, 0xa2, 0xc2, // Z
  0x00, 0x00, 0xfe, 0x82, 0x82, // [
  0x40, 0x20, 0x10, 0x08, 0x04, // (backslash)
  0x82, 0x82, 0xfe, 0x00, 0x00, // ]
  0x20, 0x40, 0x80, 0x40, 0x20, // ^
  0x02, 0x02, 0x02, 0x02, 0x02, // _
  0x00, 0x80, 0x40, 0x20, 0x00, // `
  0x04, 0x2a, 0x2a, 0x2a, 0x1e, // a
  0xfe, 0x12, 0x22, 0x22, 0x1c, // b
  0x1c, 0x22, 0x22, 0x22, 0x04, // c
  0x1c, 0x22, 0x22, 0x12, 0xfe, // d
  0x1c, 0x2a, 0x2a, 0x2a, 0x18, // e
  0x10, 0x7e, 0x90, 0x80, 0x40, // f
  0x10, 0x28, 0x2a, 0x2a, 0x3c, // g
  0xfe, 0x10, 0x20, 0x20, 0x1e, // h
  0x00, 0x22, 0xbe, 0x02, 0x00, // i
  0x04, 0x02, 0x22, 0xbc, 0x00, // j
  0x00, 0xfe, 0x08, 0x14, 0x22, // k
  0x00, 0x82, 0xfe, 0x02, 0x00, // l
  0x3e, 0x20, 0x18, 0x20, 0x1e, // m
  0x3e, 0x10, 0x20, 0x20, 0x1e, // n
  0x1c, 0x22, 0x22, 0x22, 0x1c, // o
  0x3e, 0x28, 0x28, 0x28, 0x10, // p
  0x10, 0x28, 0x28, 0x18, 0x3e, // q
  0x3e, 0x10, 0x20, 0x20, 0x10, // r
  0x12, 0x2a, 0x2a, 0x2a, 0x04, // s
  0x20, 0xfc, 0x22, 0x02, 0x04, // t
  0x3c, 0x02, 0x02, 0x04, 0x3e, // u
  0x38, 0x04, 0x02, 0x04, 0x38, // v
  0x3c, 0x02, 0x0c, 0x02, 0x3c, // w
  0x22, 0x14, 0x08, 0x14, 0x22, // x
  0x30, 0x0a, 0x0a, 0x0a, 0x3c, // y
  0x22, 0x26, 0x2a, 0x32, 0x22, // z
  0x00, 0x10, 0x6c, 0x82, 0x00, // {
  0x00, 0x00, 0xfe, 0x00, 0x00, // |
  0x00, 0x82, 0x6c, 0x10, 0x00, // }
  0x10, 0x10, 0x54, 0x38, 0x10, // ~
  0x10, 0x38, 0x54, 0x10, 0x10, // 
};

void setup() {
  // Les pins de commande vont de 2 à 9
  FastLED.addLeds<WS2811, 2, COLOR_ORDER>(leds, NUM_LEDS); // <-- C'est la ligne du haut !
  FastLED.addLeds<WS2811, 3, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 4, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 5, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 6, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 7, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 8, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 9, COLOR_ORDER>(leds, NUM_LEDS);
}

void loop() {
  byte MessLength = sizeof(Message) * PIXELS;
  InitTexte();
  AfficheTexte();
  for (int i = NUM_LEDS + 1; i <= MessLength; i++) {
    DecaleTexte(i);
    AfficheTexte();
  }
}

void InitTexte() {
  // On met dans le texte à afficher les valeurs en hexa
  for (byte i = 0; i < NUM_LEDS; i++) {
    byte NumLettre = i / PIXELS;
    byte Numalpha = Message[NumLettre] - 32;
    byte indice = i % PIXELS; // Position du pixel dans le caractère
    if (indice >= 5) Texte[i] = 0; // 1 espace en fin de caractère
    else Texte[i] = Font5x7[(PIXELS - 1) * Numalpha + indice];
  }
}

void DecaleTexte(int Pos) {
  // Décalage de 1 pixel vers la gauche
  for (byte i = 1; i < NUM_LEDS; i++) {
    Texte[i - 1] = Texte[i];
  }
  // Ajout du dernier pixel
  byte NumLettre = Pos / PIXELS + 1;
  byte NumAlpha = Message[NumLettre] - 32;
  byte indice = Pos % PIXELS; // Position du pixel dans le caractère
  if (indice >5) Texte[NUM_LEDS] = Font5x7[(PIXELS - 1) * NumAlpha + indice];
  else Texte[NUM_LEDS] = 0;
}

void AfficheTexte() {
  int ledColor = 0x0000FF; // Color used (in hex)
  byte filtre[8] = {0x10000000, 0x01000000, 0x00100000,  0x00010000, 0x00001000, 0x00000100, 0x00000010, 0x00000001};
  for (byte i = 0; i < NUM_LEDS; i++) {
  leds[i] = ledColor * (Texte[i] && filtre[i]);
  FastLED[i].showLeds(BRIGHTNESS);
  }
  delay(500); // <-- Vitesse d'affichage (à ajuster)
}
On passe à 36% de mémoire pour les variables globales (au lieu de 98% !). Teste déjà la version précédente : si elle marche (je suis optimiste de nature :) ) ça fera déjà une version. Si elle ne marche pas, passe direct à la nouvelle...
Title: Re: Horloge Géante
Post by: lesept on Jul 23, 2018, 02:38 pm
Une petite erreur à corriger dans la version 2 : changer la fonction AfficheTexte par :
Code: [Select]
void AfficheTexte() {
  int ledColor = 0x0000FF; // Color used (in hex)
  byte filtre[NumLignes] = {128, 64, 32, 16, 8, 4, 2, 1};
  for (byte i = 0; i < NumLignes; i++) {
    for (byte j = 0; j < NUM_LEDS; j++) leds[j] = ledColor * (Texte[j] && filtre[i]);
    FastLED[i].showLeds(BRIGHTNESS);
  }
  delay(500); // <-- Vitesse d'affichage (à ajuster)
}
Title: Re: Horloge Géante
Post by: ASSM on Jul 23, 2018, 03:02 pm
Je teste tout cela dès que possible.

en attendant je te remercie de ta réactivité.

je te ferais bien sur le retour sur les deux versions.
Title: Re: Horloge Géante
Post by: ASSM on Jul 23, 2018, 10:09 pm
Bonsoir lesept

La version 1 ne fonctionne pas car pas assez de mémoire.
La version 2 m'affiche 1 ligne verticale qui se décale vers la gauche mais n'affiche pas le texte.

toutes les leds s'allument en vert et cette barre s'éteint et se décale vers la gauche.

il y a déja un bon début.
Title: Re: Horloge Géante
Post by: lesept on Jul 24, 2018, 12:10 am
Ok, je regarde demain. A+
Title: Re: Horloge Géante
Post by: ASSM on Jul 24, 2018, 10:51 am
Bonjour lesept

Comment je pourrais voir sur le moniteur série si le message initial s'affiche bien.
Title: Re: Horloge Géante
Post by: lesept on Jul 24, 2018, 11:20 am
Je croyais avoir répondu avec la nouvelle version.. .Bizarre.

Alors voici une nouvelle version, car j'ai compris que le problème est plus compliqué que je le pensais.

Code: [Select]
/*
   Affichage d'un message déroulant vers la gauche en boucle
   sur une barre de 8 rubans de LEDs
   Les paramètres sont dans les #define : nombre de LEDs des rubans, taille
   max du message, espace entre chaque lettre, nombre d'espace à la fin
                       ----> LESEPT juillet 2018 <----
*/
#define NUM_LEDS 60    // Nombre de LEDs par ligne
#define TAILLE 100     // Nombre maximum de caractères à afficher
#define ESPACE 1       // Un pixel entre chaque lettre
#define PIXELS 5       // Nombre de pixels par lettre
#define FIN_MESSAGE 10 // Nombre de pixels à la fin du message

#include "FastLED.h"
#define COLOR_ORDER BRG // Color order
#define NumLignes 8
#define BRIGHTNESS 255
CRGB leds[NUM_LEDS];

char Message[TAILLE + 1] = "Itaque tum Scaevola cum in eam ipsam mentionem incidisset, exposuit nobis sermonem Laeli de amicitia"; // Max 100 caractères à afficher
char Texte[NUM_LEDS];   // Le texte affiché à chaque instant
byte Position = 0;
byte MessLength = 0;
byte Largeur = 0;

// A priori 7 lignes de LEDs suffisent avec cette définition de lettres
const uint8_t Font5x7[] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, //
  0x00, 0x00, 0xfa, 0x00, 0x00, // !
  0x00, 0xe0, 0x00, 0xe0, 0x00, // "
  0x28, 0xfe, 0x28, 0xfe, 0x28, // #
  0x24, 0x54, 0xfe, 0x54, 0x48, // $
  0xc4, 0xc8, 0x10, 0x26, 0x46, // %
  0x6c, 0x92, 0xaa, 0x44, 0x0a, // &
  0x00, 0xa0, 0xc0, 0x00, 0x00, // '
  0x00, 0x38, 0x44, 0x82, 0x00, // (
  0x00, 0x82, 0x44, 0x38, 0x00, // )
  0x10, 0x54, 0x38, 0x54, 0x10, // *
  0x10, 0x10, 0x7c, 0x10, 0x10, // +
  0x00, 0x0a, 0x0c, 0x00, 0x00, // ,
  0x10, 0x10, 0x10, 0x10, 0x10, // -
  0x00, 0x06, 0x06, 0x00, 0x00, // .
  0x04, 0x08, 0x10, 0x20, 0x40, // /
  0x7c, 0x8a, 0x92, 0xa2, 0x7c, // 0
  0x00, 0x42, 0xfe, 0x02, 0x00, // 1
  0x42, 0x86, 0x8a, 0x92, 0x62, // 2
  0x84, 0x82, 0xa2, 0xd2, 0x8c, // 3
  0x18, 0x28, 0x48, 0xfe, 0x08, // 4
  0xe4, 0xa2, 0xa2, 0xa2, 0x9c, // 5
  0x3c, 0x52, 0x92, 0x92, 0x0c, // 6
  0x80, 0x8e, 0x90, 0xa0, 0xc0, // 7
  0x6c, 0x92, 0x92, 0x92, 0x6c, // 8
  0x60, 0x92, 0x92, 0x94, 0x78, // 9
  0x00, 0x6c, 0x6c, 0x00, 0x00, // :
  0x00, 0x6a, 0x6c, 0x00, 0x00, // ;
  0x00, 0x10, 0x28, 0x44, 0x82, // <
  0x28, 0x28, 0x28, 0x28, 0x28, // =
  0x82, 0x44, 0x28, 0x10, 0x00, // >
  0x40, 0x80, 0x8a, 0x90, 0x60, // ?
  0x4c, 0x92, 0x9e, 0x82, 0x7c, // @
  0x7e, 0x88, 0x88, 0x88, 0x7e, // A
  0xfe, 0x92, 0x92, 0x92, 0x6c, // B
  0x7c, 0x82, 0x82, 0x82, 0x44, // C
  0xfe, 0x82, 0x82, 0x44, 0x38, // D
  0xfe, 0x92, 0x92, 0x92, 0x82, // E
  0xfe, 0x90, 0x90, 0x80, 0x80, // F
  0x7c, 0x82, 0x82, 0x8a, 0x4c, // G
  0xfe, 0x10, 0x10, 0x10, 0xfe, // H
  0x00, 0x82, 0xfe, 0x82, 0x00, // I
  0x04, 0x02, 0x82, 0xfc, 0x80, // J
  0xfe, 0x10, 0x28, 0x44, 0x82, // K
  0xfe, 0x02, 0x02, 0x02, 0x02, // L
  0xfe, 0x40, 0x20, 0x40, 0xfe, // M
  0xfe, 0x20, 0x10, 0x08, 0xfe, // N
  0x7c, 0x82, 0x82, 0x82, 0x7c, // O
  0xfe, 0x90, 0x90, 0x90, 0x60, // P
  0x7c, 0x82, 0x8a, 0x84, 0x7a, // Q
  0xfe, 0x90, 0x98, 0x94, 0x62, // R
  0x62, 0x92, 0x92, 0x92, 0x8c, // S
  0x80, 0x80, 0xfe, 0x80, 0x80, // T
  0xfc, 0x02, 0x02, 0x02, 0xfc, // U
  0xf8, 0x04, 0x02, 0x04, 0xf8, // V
  0xfe, 0x04, 0x18, 0x04, 0xfe, // W
  0xc6, 0x28, 0x10, 0x28, 0xc6, // X
  0xc0, 0x20, 0x1e, 0x20, 0xc0, // Y
  0x86, 0x8a, 0x92, 0xa2, 0xc2, // Z
  0x00, 0x00, 0xfe, 0x82, 0x82, // [
  0x40, 0x20, 0x10, 0x08, 0x04, // (backslash)
  0x82, 0x82, 0xfe, 0x00, 0x00, // ]
  0x20, 0x40, 0x80, 0x40, 0x20, // ^
  0x02, 0x02, 0x02, 0x02, 0x02, // _
  0x00, 0x80, 0x40, 0x20, 0x00, // `
  0x04, 0x2a, 0x2a, 0x2a, 0x1e, // a
  0xfe, 0x12, 0x22, 0x22, 0x1c, // b
  0x1c, 0x22, 0x22, 0x22, 0x04, // c
  0x1c, 0x22, 0x22, 0x12, 0xfe, // d
  0x1c, 0x2a, 0x2a, 0x2a, 0x18, // e
  0x10, 0x7e, 0x90, 0x80, 0x40, // f
  0x10, 0x28, 0x2a, 0x2a, 0x3c, // g
  0xfe, 0x10, 0x20, 0x20, 0x1e, // h
  0x00, 0x22, 0xbe, 0x02, 0x00, // i
  0x04, 0x02, 0x22, 0xbc, 0x00, // j
  0x00, 0xfe, 0x08, 0x14, 0x22, // k
  0x00, 0x82, 0xfe, 0x02, 0x00, // l
  0x3e, 0x20, 0x18, 0x20, 0x1e, // m
  0x3e, 0x10, 0x20, 0x20, 0x1e, // n
  0x1c, 0x22, 0x22, 0x22, 0x1c, // o
  0x3e, 0x28, 0x28, 0x28, 0x10, // p
  0x10, 0x28, 0x28, 0x18, 0x3e, // q
  0x3e, 0x10, 0x20, 0x20, 0x10, // r
  0x12, 0x2a, 0x2a, 0x2a, 0x04, // s
  0x20, 0xfc, 0x22, 0x02, 0x04, // t
  0x3c, 0x02, 0x02, 0x04, 0x3e, // u
  0x38, 0x04, 0x02, 0x04, 0x38, // v
  0x3c, 0x02, 0x0c, 0x02, 0x3c, // w
  0x22, 0x14, 0x08, 0x14, 0x22, // x
  0x30, 0x0a, 0x0a, 0x0a, 0x3c, // y
  0x22, 0x26, 0x2a, 0x32, 0x22, // z
  0x00, 0x10, 0x6c, 0x82, 0x00, // {
  0x00, 0x00, 0xfe, 0x00, 0x00, // |
  0x00, 0x82, 0x6c, 0x10, 0x00, // }
  0x10, 0x10, 0x54, 0x38, 0x10, // ~
  0x10, 0x38, 0x54, 0x10, 0x10, // 
};

void setup() {
  Serial.begin(115200);
  // Les pins de commande vont de 2 à 9
  FastLED.addLeds<WS2811, 2, COLOR_ORDER>(leds, NUM_LEDS); // <-- C'est la ligne du haut !
  FastLED.addLeds<WS2811, 3, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 4, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 5, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 6, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 7, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 8, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 9, COLOR_ORDER>(leds, NUM_LEDS);
  Largeur = PIXELS + ESPACE;
  MessLength = sizeof(Message) * PIXELS + FIN_MESSAGE; // Nb de pixels total du message
  Serial.print("Taille totale message : ");
  Serial.println(MessLength);
}

void loop() {
  PrepareTexte();
  AfficheTexte();
  Position = (Position + 1) % MessLength; // Position du pixel à gauche dans le message
}

void PrepareTexte() {
  byte PosLettre = Position % Largeur; // Position du pixel dans la première lettre
  for (int i = 0; i < NUM_LEDS; i++) {
    byte NumLettreAff = ((Position + i) % MessLength) / Largeur; // Numéro de la lettre à afficher
    byte PosLettreAff = (PosLettre + i % Largeur) % Largeur; // Position du pixel dans la lettre à afficher
    if (NumLettreAff >= sizeof(Message)) Texte[i] = 0; // Mettre > si on ne voit pas la dernière lettre
    else if (PosLettreAff >= PIXELS) Texte[i] = 0;
    else {
      byte RangLettre = Message[NumLettreAff] - 32; // Rang de la lettre dans le tableau
      byte Indice = RangLettre * PIXELS + PosLettreAff; // Colonne du tableau à afficher
      Texte[i] = Font5x7[Indice];
    }
  }
}

void AfficheTexte() {
  int ledColor = 0x0000FF; // Color used (in hex)
  byte filtre[NumLignes] = {128, 64, 32, 16, 8, 4, 2, 1};
  for (byte i = 0; i < NumLignes; i++) {
    for (byte j = 0; j < NUM_LEDS; j++) leds[j] = ledColor * (Texte[j] && filtre[i]);
    FastLED[i].showLeds(BRIGHTNESS);
  }
  delay(500); // <-- Vitesse d'affichage (à ajuster)
}

Si ça ne fonctionne pas, ça peut venir de 2 choses :
Si ça marche (je suis toujours optimiste :) ) pas la peine d'aller plus loin... Sinon, peux-tu tester ce code et me dire ce qu'il fait ? Il faut connecter 4 rubans sur les pins 2, 3, 4 et 5.

Code: [Select]
#include "FastLED.h"

#define NUM_LEDS 60
#define COLOR_ORDER BRG // Color order

CRGB leds[NUM_LEDS];
uint8_t gBrightness = 128;

void setup() {
  FastLED.addLeds<WS2811, 2, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 3, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 4, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 5, COLOR_ORDER>(leds, NUM_LEDS);
}

void loop() {
  // draw led data for the first strand into leds
  fill_solid(leds, NUM_LEDS, 0x0000FF); // vert
  FastLED[0].showLeds(gBrightness);

  // draw led data for the second strand into leds
  fill_solid(leds, NUM_LEDS, 0x00FF00); // rouge
  FastLED[1].showLeds(gBrightness);

  // draw led data for the third strand into leds
  fill_solid(leds, NUM_LEDS, 0xFF0000); // bleu
  FastLED[2].showLeds(gBrightness);

  // draw led data for the first strand into leds
  fill_solid(leds, NUM_LEDS, 0xFFFFFF); // blanc
  FastLED[3].showLeds(gBrightness);
}

Si je comprends bien, les LEDs de la pin 2 devraient être vertes, pin 3 rouges, pin 4 bleues et pin 5 blanches.

Pour voir le message, tu ouvres la console de l'IDE et tu la règles à 115200 bauds.
Title: Re: Horloge Géante
Post by: ASSM on Jul 24, 2018, 11:32 am
Sur la version modifiée

la console affiche:

Taille totale message : 3

je ne pourrais tester en réel que ce soir.
Title: Re: Horloge Géante
Post by: lesept on Jul 24, 2018, 11:37 am
Change
Code: [Select]
byte MessLength = 0;
en
Code: [Select]
int MessLength = 0;
et
Code: [Select]
  MessLength = sizeof(Message) * Largeur + FIN_MESSAGE; // Nb de pixels total du message
Title: Re: Horloge Géante
Post by: ASSM on Jul 24, 2018, 11:52 am
Maintenant cela affiche sur la console

Taille totale message : 616
Title: Re: Horloge Géante
Post by: lesept on Jul 24, 2018, 12:03 pm
C'est mieux. Peux-tu tester en changeant le contenu de message ?
Code: [Select]
char Message[TAILLE + 1] = "0123456789";Ça donne combien ? Moi, je veux avoir 70 ici...

Si ça donne 76, il faudra mettre
Code: [Select]
  MessLength = (sizeof(Message) - 1) * Largeur + FIN_MESSAGE; // Nb de pixels total du message
Title: Re: Horloge Géante
Post by: ASSM on Jul 24, 2018, 12:27 pm
Dans la premiere solution la console affiche toujours 616
et dans la deuxieme solution elle affiche 610
Title: Re: Horloge Géante
Post by: lesept on Jul 24, 2018, 01:26 pm
OK, 610 c'est bon si tu n'as pas changé le message. Mais avec le nouveau contenu c'est pas bon, grrrr !
Title: Re: Horloge Géante
Post by: ASSM on Jul 24, 2018, 01:34 pm
Peu importe le message écris j'ai toujours la même valeur.
Title: Re: Horloge Géante
Post by: lesept on Jul 24, 2018, 01:41 pm
Qu'est-ce que ça donne avec
Code: [Select]
MessLength = (strlen(Message) - 1) * Largeur + FIN_MESSAGE; // Nb de pixels total du message
Title: Re: Horloge Géante
Post by: ASSM on Jul 24, 2018, 01:45 pm
Pour le message"0123456789"

la console affiche :

Taille totale message : 64
Title: Re: Horloge Géante
Post by: lesept on Jul 24, 2018, 01:50 pm
OK, alors la bonne ligne c'est
Code: [Select]
MessLength = strlen(Message) * Largeur + FIN_MESSAGE; // Nb de pixels total du message
Title: Re: Horloge Géante
Post by: ASSM on Jul 24, 2018, 01:50 pm
Avec le code

Code: [Select]

  MessLength = strlen(Message) * Largeur + FIN_MESSAGE;


La console affiche 70
Title: Re: Horloge Géante
Post by: lesept on Jul 24, 2018, 01:56 pm
Avec cette dernière modif et en gardant "0123456789", peux-tu changer la loop et la fonction PrepareTexte par ceci :

Code: [Select]
void loop() {
  Serial.print("Position :");
  Serial.println(Position);
  PrepareTexte();
  AfficheTexte();
  Position = (Position + 1) % MessLength; // Position du pixel à gauche dans le message
  Serial.println();
  Serial.println();
  delay(10000);
}

void PrepareTexte() {
  byte PosLettre = Position % Largeur; // Position du pixel dans la première lettre
  for (int i = 0; i < NUM_LEDS; i++) {
    byte NumLettreAff = ((Position + i) % MessLength) / Largeur; // Numéro de la lettre à afficher
    byte PosLettreAff = (PosLettre + i % Largeur) % Largeur; // Position du pixel dans la lettre à afficher
    if (NumLettreAff >= sizeof(Message)) Texte[i] = 0; // Mettre > si on ne voit pas la dernière lettre
    else if (PosLettreAff >= PIXELS) Texte[i] = 0;
    else {
      byte RangLettre = Message[NumLettreAff] - 32; // Rang de la lettre dans le tableau
      byte Indice = RangLettre * PIXELS + PosLettreAff; // Colonne du tableau à afficher
      Texte[i] = Font5x7[Indice];
    }
    Serial.print(Texte[i]);
    Serial.print(" ");
  }
  Serial.println();
}

Ensuite, copie ce qu'affiche la console. J'ai mis un delay de 10 secondes pour temporiser un peu. Peux-tu copier les deux premiers groupes de messages de la console (c'est à dire depuis le début jusqu'à la seconde temporisation) ? Merci
Title: Re: Horloge Géante
Post by: ASSM on Jul 24, 2018, 02:06 pm
Voici ce que affiche la console avec le message "0123456789"
Title: Re: Horloge Géante
Post by: lesept on Jul 24, 2018, 02:25 pm
C'est pas beau. Il faut changer tout en haut :
Code: [Select]
uint8_t Texte[NUM_LEDS];   // Le texte affiché à chaque instantEnsuite, plutôt qu'une image, peux-tu copier du texte (entre balises CODE) ?
Title: Re: Horloge Géante
Post by: ASSM on Jul 24, 2018, 02:29 pm
Voici l'affichage de la console pour le message "0123456789"

Code: [Select]

Taille totale message : 70
Position :0
0 248 254 255 0 0 0 2 2 2 184 0 6 1 16 0 0 0 2 2 184 2 2 0 2 184 2 2 184 0 2 184 2 2 2 0 184 2 2 2 2 0 2 2 2 2 184 0 2 184 184 35 184 0 184 184 184 184 184 0


Position :1
248 254 255 0 0 0 2 2 2 184 0 6 2 16 0 0 0 2 2 1 2 184 0 2 2 2 2 2 0 2 2 184 2 2 0 2 184 2 2 184 0 2 2 2 184 2 0 184 2 2 2 2 0 2 2 2 2 184 0 2


Position :2
254 255 0 0 0 2 2 2 184 0 6 2 16 0 0 0 2 32 2 2 2 0 184 2 2 184 2 0 2 2 184 2 2 0 2 184 2 2 184 0 2 2 2 184 2 0 184 2 2 2 2 0 2 2 2 2 2 0 184 2
Title: Re: Horloge Géante
Post by: lesept on Jul 24, 2018, 02:35 pm
C'est encourageant, mais j'ai oublié que le tableau est stocké en PROGMEM, voici une nouvelle version de la fonction :

Code: [Select]
void PrepareTexte() {
  byte PosLettre = Position % Largeur; // Position du pixel dans la première lettre
  for (int i = 0; i < NUM_LEDS; i++) {
    byte NumLettreAff = ((Position + i) % MessLength) / Largeur; // Numéro de la lettre à afficher
    byte PosLettreAff = (PosLettre + i % Largeur) % Largeur; // Position du pixel dans la lettre à afficher
    if (NumLettreAff >= sizeof(Message)) Texte[i] = 0; // Mettre > si on ne voit pas la dernière lettre
    else if (PosLettreAff >= PIXELS) Texte[i] = 0;
    else {
      byte RangLettre = Message[NumLettreAff] - 32; // Rang de la lettre dans le tableau
      byte Indice = RangLettre * PIXELS + PosLettreAff; // Colonne du tableau à afficher
      Texte[i] = pgm_read_byte(Font5x7 + indice);
      // Texte[i] = Font5x7[Indice];
    }
    Serial.print(Texte[i],HEX);
    Serial.print(" ");
  }
  Serial.println();
}
Ça donne quoi ?
Title: Re: Horloge Géante
Post by: ASSM on Jul 24, 2018, 02:38 pm
Code: [Select]

      Texte[i] = pgm_read_byte(Font5x7 + indice);



'indice' was not declared in this scope
Title: Re: Horloge Géante
Post by: lesept on Jul 24, 2018, 02:59 pm
Indice avec une majuscule, désolé
Title: Re: Horloge Géante
Post by: ASSM on Jul 24, 2018, 03:07 pm
Voici le résultat affiché sur la console


Code: [Select]

Taille totale message : 70
Position :0
7C 8A 92 A2 7C 0 0 42 FE 2 0 0 42 86 8A 92 62 0 84 82 A2 D2 8C 0 18 28 48 FE 8 0 E4 A2 A2 A2 9C 0 3C 52 92 92 C 0 80 8E 90 A0 C0 0 6C 92 92 92 6C 0 60 92 92 94 78 0


Position :1
8A 92 A2 7C 0 0 42 FE 2 0 0 42 86 8A 92 62 0 84 82 A2 D2 8C 0 18 28 48 FE 8 0 E4 A2 A2 A2 9C 0 3C 52 92 92 C 0 80 8E 90 A0 C0 0 6C 92 92 92 6C 0 60 92 92 94 78 0 82
Title: Re: Horloge Géante
Post by: lesept on Jul 24, 2018, 03:15 pm
C'est correct.  :smiley-lol:

Quand tu le testeras sur les rubans de LEDs, si ça ne marche pas, fais ce que j'ai demandé dans mon message de 9h20 ce matin (la deuxième partie) pour me dire ce que ça donne.

A+
Title: Re: Horloge Géante
Post by: ASSM on Jul 24, 2018, 03:17 pm
Je testerai ce soir et te ferais un retour et si jamais sa ne marche pas j'essayerais la deuxieme solution.

En attendant je te remercie.
Title: Re: Horloge Géante
Post by: lesept on Jul 24, 2018, 04:12 pm
Une petite erreur dans la fonction AfficheTexte : changer
Code: [Select]
for (byte j = 0; j < NUM_LEDS; j++) leds[j] = ledColor * (Texte[j] && filtre[i]);
en
Code: [Select]
for (byte j = 0; j < NUM_LEDS; j++) leds[j] = ledColor * (Texte[j] && filtre[i] != 0);
ou bien en condition ternaire (j'aime bien :) ) :
Code: [Select]
for (byte j = 0; j < NUM_LEDS; j++) leds[j] = (Texte[j] && filtre[i] != 0) ? ledColor : 0;

Si ça ne marche pas, voici une version moins compacte :
Code: [Select]
for (byte j = 0; j < NUM_LEDS; j++) {
   if (Texte[j] && filtre[i] != 0) leds[j] = ledColor;
   else leds[j] = 0;
   }
Title: Re: Horloge Géante
Post by: ASSM on Jul 25, 2018, 10:38 am
bonjour lesept

je n'ai pas pu tester le code hier soir (j'avais oublié mon câble pour le téléversement)mais je suis extrêmement confiant pour la suite.

Si maintenant je voulais intégré un module Bluetooth HC-06 pour pouvoir d'une application envoyer directement le message.

Que faut il intégrer au code.

Pour la partie de l'application j'ai utilisé Mit App Inventor.(il y a de très bon tuto sur internet pour faire l'application)

Sur l'application il y a juste un bouton pour connecté le Bluetooth, un encart pour écrire le message et un bouton pour envoyer le message.
Title: Re: Horloge Géante
Post by: lesept on Jul 25, 2018, 11:36 am
Le module HC-06 communique avec l'Arduino via une liaison série. Si tu as un Mega, il est équipé de plusieurs liaisons série hardware, tu peux en utiliser une pour le HC-06 et en garder une autre pour la console.

Si tu n'as pas un Mega, tu peux créer une liaison série virtuelle grâce à la bibliothèque SoftwareSerial  (https://github.com/PaulStoffregen/SoftwareSerial): il suffit de lire ce qui arrive dans cette liaison série pour obtenir le texte à afficher.

Un très bon tuto se trouve ici (https://www.gammon.com.au/serial) et un autre ici (https://forum.arduino.cc/index.php?topic=396450.0). Dans ce dernier, l'auteur explique que pour s'assurer de ne pas louper des caractères, il faut entourer le message avec des marqueurs (start and end marker). Je propose d'utiliser [ et ] pour encadrer le message (je suppose que tu n'utiliseras pas ces caractères dans tes messages).

Dans ton appli sur smartphone, lorsque tu entres ton message, il te faut ajouter un [ avant le texte et un ] à la fin avant d'envoyer le tout. Pour envoyer le message "Premiere mi-temps", tu enverras "[Premiere mi-temps]"

Le code modifié devient :
Code: [Select]
/*
   Affichage d'un message déroulant vers la gauche en boucle
   sur une barre de 8 rubans de LEDs
   Les paramètres sont dans les #define : nombre de LEDs des rubans, taille
   max du message, espace entre chaque lettre, nombre d'espace à la fin
                       ----> LESEPT juillet 2018 <----
*/
#define NUM_LEDS 60    // Nombre de LEDs par ligne
#define TAILLE 100        // Nombre maximum de caractères à afficher
#define ESPACE 1          // Un pixel entre chaque lettre
#define PIXELS 5           // Nombre de pixels par lettre
#define FIN_MESSAGE 10 // Nombre de pixels à la fin du message

#include <SoftwareSerial.h>
SoftwareSerial Bluetooth(10, 11); // RX, TX
#include "FastLED.h"
#define COLOR_ORDER BRG // Color order
#define NumLignes 8
#define BRIGHTNESS 255
CRGB leds[NUM_LEDS];

char Message[TAILLE + 1]; // Max 100 caractères à afficher
byte Texte[NUM_LEDS];     // Le texte affiché à chaque instant
byte Position = 0;
int MessLength = 0;
byte Largeur = 0;
boolean newData = false;

// A priori 7 lignes de LEDs suffisent avec cette définition de lettres
const uint8_t Font5x7[] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, //
  0x00, 0x00, 0xfa, 0x00, 0x00, // !
  0x00, 0xe0, 0x00, 0xe0, 0x00, // "
  0x28, 0xfe, 0x28, 0xfe, 0x28, // #
  0x24, 0x54, 0xfe, 0x54, 0x48, // $
  0xc4, 0xc8, 0x10, 0x26, 0x46, // %
  0x6c, 0x92, 0xaa, 0x44, 0x0a, // &
  0x00, 0xa0, 0xc0, 0x00, 0x00, // '
  0x00, 0x38, 0x44, 0x82, 0x00, // (
  0x00, 0x82, 0x44, 0x38, 0x00, // )
  0x10, 0x54, 0x38, 0x54, 0x10, // *
  0x10, 0x10, 0x7c, 0x10, 0x10, // +
  0x00, 0x0a, 0x0c, 0x00, 0x00, // ,
  0x10, 0x10, 0x10, 0x10, 0x10, // -
  0x00, 0x06, 0x06, 0x00, 0x00, // .
  0x04, 0x08, 0x10, 0x20, 0x40, // /
  0x7c, 0x8a, 0x92, 0xa2, 0x7c, // 0
  0x00, 0x42, 0xfe, 0x02, 0x00, // 1
  0x42, 0x86, 0x8a, 0x92, 0x62, // 2
  0x84, 0x82, 0xa2, 0xd2, 0x8c, // 3
  0x18, 0x28, 0x48, 0xfe, 0x08, // 4
  0xe4, 0xa2, 0xa2, 0xa2, 0x9c, // 5
  0x3c, 0x52, 0x92, 0x92, 0x0c, // 6
  0x80, 0x8e, 0x90, 0xa0, 0xc0, // 7
  0x6c, 0x92, 0x92, 0x92, 0x6c, // 8
  0x60, 0x92, 0x92, 0x94, 0x78, // 9
  0x00, 0x6c, 0x6c, 0x00, 0x00, // :
  0x00, 0x6a, 0x6c, 0x00, 0x00, // ;
  0x00, 0x10, 0x28, 0x44, 0x82, // <
  0x28, 0x28, 0x28, 0x28, 0x28, // =
  0x82, 0x44, 0x28, 0x10, 0x00, // >
  0x40, 0x80, 0x8a, 0x90, 0x60, // ?
  0x4c, 0x92, 0x9e, 0x82, 0x7c, // @
  0x7e, 0x88, 0x88, 0x88, 0x7e, // A
  0xfe, 0x92, 0x92, 0x92, 0x6c, // B
  0x7c, 0x82, 0x82, 0x82, 0x44, // C
  0xfe, 0x82, 0x82, 0x44, 0x38, // D
  0xfe, 0x92, 0x92, 0x92, 0x82, // E
  0xfe, 0x90, 0x90, 0x80, 0x80, // F
  0x7c, 0x82, 0x82, 0x8a, 0x4c, // G
  0xfe, 0x10, 0x10, 0x10, 0xfe, // H
  0x00, 0x82, 0xfe, 0x82, 0x00, // I
  0x04, 0x02, 0x82, 0xfc, 0x80, // J
  0xfe, 0x10, 0x28, 0x44, 0x82, // K
  0xfe, 0x02, 0x02, 0x02, 0x02, // L
  0xfe, 0x40, 0x20, 0x40, 0xfe, // M
  0xfe, 0x20, 0x10, 0x08, 0xfe, // N
  0x7c, 0x82, 0x82, 0x82, 0x7c, // O
  0xfe, 0x90, 0x90, 0x90, 0x60, // P
  0x7c, 0x82, 0x8a, 0x84, 0x7a, // Q
  0xfe, 0x90, 0x98, 0x94, 0x62, // R
  0x62, 0x92, 0x92, 0x92, 0x8c, // S
  0x80, 0x80, 0xfe, 0x80, 0x80, // T
  0xfc, 0x02, 0x02, 0x02, 0xfc, // U
  0xf8, 0x04, 0x02, 0x04, 0xf8, // V
  0xfe, 0x04, 0x18, 0x04, 0xfe, // W
  0xc6, 0x28, 0x10, 0x28, 0xc6, // X
  0xc0, 0x20, 0x1e, 0x20, 0xc0, // Y
  0x86, 0x8a, 0x92, 0xa2, 0xc2, // Z
  0x00, 0x00, 0xfe, 0x82, 0x82, // [
  0x40, 0x20, 0x10, 0x08, 0x04, // (backslash)
  0x82, 0x82, 0xfe, 0x00, 0x00, // ]
  0x20, 0x40, 0x80, 0x40, 0x20, // ^
  0x02, 0x02, 0x02, 0x02, 0x02, // _
  0x00, 0x80, 0x40, 0x20, 0x00, // `
  0x04, 0x2a, 0x2a, 0x2a, 0x1e, // a
  0xfe, 0x12, 0x22, 0x22, 0x1c, // b
  0x1c, 0x22, 0x22, 0x22, 0x04, // c
  0x1c, 0x22, 0x22, 0x12, 0xfe, // d
  0x1c, 0x2a, 0x2a, 0x2a, 0x18, // e
  0x10, 0x7e, 0x90, 0x80, 0x40, // f
  0x10, 0x28, 0x2a, 0x2a, 0x3c, // g
  0xfe, 0x10, 0x20, 0x20, 0x1e, // h
  0x00, 0x22, 0xbe, 0x02, 0x00, // i
  0x04, 0x02, 0x22, 0xbc, 0x00, // j
  0x00, 0xfe, 0x08, 0x14, 0x22, // k
  0x00, 0x82, 0xfe, 0x02, 0x00, // l
  0x3e, 0x20, 0x18, 0x20, 0x1e, // m
  0x3e, 0x10, 0x20, 0x20, 0x1e, // n
  0x1c, 0x22, 0x22, 0x22, 0x1c, // o
  0x3e, 0x28, 0x28, 0x28, 0x10, // p
  0x10, 0x28, 0x28, 0x18, 0x3e, // q
  0x3e, 0x10, 0x20, 0x20, 0x10, // r
  0x12, 0x2a, 0x2a, 0x2a, 0x04, // s
  0x20, 0xfc, 0x22, 0x02, 0x04, // t
  0x3c, 0x02, 0x02, 0x04, 0x3e, // u
  0x38, 0x04, 0x02, 0x04, 0x38, // v
  0x3c, 0x02, 0x0c, 0x02, 0x3c, // w
  0x22, 0x14, 0x08, 0x14, 0x22, // x
  0x30, 0x0a, 0x0a, 0x0a, 0x3c, // y
  0x22, 0x26, 0x2a, 0x32, 0x22, // z
  0x00, 0x10, 0x6c, 0x82, 0x00, // {
  0x00, 0x00, 0xfe, 0x00, 0x00, // |
  0x00, 0x82, 0x6c, 0x10, 0x00, // }
  0x10, 0x10, 0x54, 0x38, 0x10, // ~
  0x10, 0x38, 0x54, 0x10, 0x10, // 
};

void setup() {
  Serial.begin(115200);
  Bluetooth.begin(57600); // A configurer en AT sur le module HC-06
  // Les pins de commande vont de 2 à 9
  FastLED.addLeds<WS2811, 2, COLOR_ORDER>(leds, NUM_LEDS); // <-- C'est la ligne du haut !
  FastLED.addLeds<WS2811, 3, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 4, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 5, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 6, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 7, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 8, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 9, COLOR_ORDER>(leds, NUM_LEDS);
  Largeur = PIXELS + ESPACE;
  MessLength = strlen(Message) * Largeur + FIN_MESSAGE; // Nb de pixels total du message
}

void loop() {
  recvWithStartEndMarkers();
  ShowMessage();
}

void PrepareTexte() {
  byte PosLettre = Position % Largeur; // Position du pixel dans la première lettre
  for (int i = 0; i < NUM_LEDS; i++) {
    byte NumLettreAff = ((Position + i) % MessLength) / Largeur; // Numéro de la lettre à afficher
    byte PosLettreAff = (PosLettre + i % Largeur) % Largeur; // Position du pixel dans la lettre à afficher
    if (NumLettreAff >= sizeof(Message)) Texte[i] = 0; // Mettre > si on ne voit pas la dernière lettre
    else if (PosLettreAff >= PIXELS) Texte[i] = 0;
    else {
      byte RangLettre = Message[NumLettreAff] - 32; // Rang de la lettre dans le tableau
      byte Indice = RangLettre * PIXELS + PosLettreAff; // Colonne du tableau à afficher
      Texte[i] = pgm_read_byte(Font5x7 + Indice);
    }
  }
}

void AfficheTexte() {
  int ledColor = 0x0000FF; // Color used (in hex)
  byte filtre[NumLignes] = {128, 64, 32, 16, 8, 4, 2, 1};
  for (byte i = 0; i < NumLignes; i++) {
    for (byte j = 0; j < NUM_LEDS; j++) leds[j] = (Texte[j] && filtre[i] != 0) ? ledColor : 0;
    FastLED[i].showLeds(BRIGHTNESS);
  }
  delay(500); // <-- Vitesse d'affichage (à ajuster)
}

void recvWithStartEndMarkers() {
  static boolean recvInProgress = false;
  static byte ndx = 0;
  char startMarker = '[';
  char endMarker = ']';
  char rc;

  while (Bluetooth.available() > 0 && newData == false) {
    rc = Bluetooth.read();
    if (recvInProgress == true) {
      if (rc != endMarker) {
        Message[ndx] = rc;
        ndx++;
        if (ndx >= TAILLE + 1) {
          ndx = TAILLE;
        }
      }
      else {
        Message[ndx] = '\0'; // terminate the string
        recvInProgress = false;
        ndx = 0;
        newData = true;
      }
    }
    else if (rc == startMarker) recvInProgress = true;
  }
}

void ShowMessage () {
  PrepareTexte();
  AfficheTexte();
  Position = (Position + 1) % MessLength; // Position du pixel à gauche dans le message
}
Title: Re: Horloge Géante
Post by: lesept on Jul 25, 2018, 11:37 am
Comme pour la liaison série habituelle, il faut configurer la nouvelle liaison série, notamment mettre le module HC-06 en esclave et lui indiquer le baudrate. A priori c'est réglé à 9600 bauds par défaut, mais on peut l'augmenter jusqu'à 115200 (j'ai mis 57600 dans le sketch). Enfin, le module HC-06 accepte du 5V sur ses pins sauf sur la RX qui doit recevoir du 3.3V : il faut faire un pont diviseur.

(https://static.wixstatic.com/media/f840a8_82bb1224515545d6886d2c6ec856630e~mv2.png/v1/fill/w_600,h_324,al_c,usm_0.66_1.00_0.01/f840a8_82bb1224515545d6886d2c6ec856630e~mv2.png)

Tout est expliqué ici (http://pecquery.wixsite.com/arduino-passion/copie-de-le-detecteur-a-ultrasons-h-1). Il faudra bien sûr configurer le module avant de lancer le sketch d'affichage sur Arduino.
Title: Re: Horloge Géante
Post by: ASSM on Jul 25, 2018, 02:35 pm
Le module HC-06 est bien un module "esclave" ce module ne peut pas être "maitre" ?

C'est le module HC-05 qui peut faire les deux.

Dans ton code je branche bien la broche RX du module HC-06 sur la borne 10 de mon "arduino nano" par le biais d'un pont diviseur pour obtenir 3.3V et la broche TX sur la borne 11 du "nano"?
Title: Re: Horloge Géante
Post by: lesept on Jul 25, 2018, 02:53 pm
Teste selon les directives du dernier lien de mon message : tu verras quelle broche brancher sur quelle pin (moi, je n'ai pas ce module ici). Tu pourras en même temps le configurer.

Quand à la question maître / esclave, c'est possible : je sais que l'un des deux n'est qu'esclave, mais je ne sais plus lequel...
Title: Re: Horloge Géante
Post by: ASSM on Jul 25, 2018, 05:42 pm
J'ai essayé le code mais sa ne marche pas j'ai une rangé de leds verticale qui se décale vers la gauche simplement.

j'ai essayé ta solution d'hier et j'ai le premier ruban qui s'allume en vert le second en bleu le troisieme en rouge et le dernier en blanc.
Title: Re: Horloge Géante
Post by: lesept on Jul 25, 2018, 09:51 pm
OK, merci je regarde demain
Title: Re: Horloge Géante
Post by: lesept on Jul 26, 2018, 09:57 am
Hello
Peux-tu tester cette version et me dire ce qui s'affiche sur la console (copier / coller en texte) ?

Code: [Select]
/*
   Affichage d'un message déroulant vers la gauche en boucle
   sur une barre de 8 rubans de LEDs
   Les paramètres sont dans les #define : nombre de LEDs des rubans, taille
   max du message, espace entre chaque lettre, nombre d'espace à la fin
                       ----> LESEPT juillet 2018 <----
*/
#define NUM_LEDS 60    // Nombre de LEDs par ligne
#define TAILLE 100     // Nombre maximum de caractères à afficher
#define ESPACE 1       // Un pixel entre chaque lettre
#define PIXELS 5       // Nombre de pixels par lettre
#define FIN_MESSAGE 10 // Nombre de pixels à la fin du message

#include "FastLED.h"
#define COLOR_ORDER BRG // Color order
#define NumLignes 8
#define BRIGHTNESS 255
CRGB leds[NUM_LEDS];

//char Message[TAILLE + 1] = "Itaque tum Scaevola cum in eam ipsam mentionem incidisset, exposuit nobis sermonem Laeli de amicitia"; // Max 100 caractères à afficher
char Message[TAILLE + 1] = "0123456789"; // Max 100 caractères à afficher
uint8_t Texte[NUM_LEDS];   // Le texte affiché à chaque instant
byte Position = 0;
byte MessLength = 0;
byte Largeur = 0;

// A priori 7 lignes de LEDs suffisent avec cette définition de lettres
const uint8_t Font5x7[] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, //
  0x00, 0x00, 0xfa, 0x00, 0x00, // !
  0x00, 0xe0, 0x00, 0xe0, 0x00, // "
  0x28, 0xfe, 0x28, 0xfe, 0x28, // #
  0x24, 0x54, 0xfe, 0x54, 0x48, // $
  0xc4, 0xc8, 0x10, 0x26, 0x46, // %
  0x6c, 0x92, 0xaa, 0x44, 0x0a, // &
  0x00, 0xa0, 0xc0, 0x00, 0x00, // '
  0x00, 0x38, 0x44, 0x82, 0x00, // (
  0x00, 0x82, 0x44, 0x38, 0x00, // )
  0x10, 0x54, 0x38, 0x54, 0x10, // *
  0x10, 0x10, 0x7c, 0x10, 0x10, // +
  0x00, 0x0a, 0x0c, 0x00, 0x00, // ,
  0x10, 0x10, 0x10, 0x10, 0x10, // -
  0x00, 0x06, 0x06, 0x00, 0x00, // .
  0x04, 0x08, 0x10, 0x20, 0x40, // /
  0x7c, 0x8a, 0x92, 0xa2, 0x7c, // 0
  0x00, 0x42, 0xfe, 0x02, 0x00, // 1
  0x42, 0x86, 0x8a, 0x92, 0x62, // 2
  0x84, 0x82, 0xa2, 0xd2, 0x8c, // 3
  0x18, 0x28, 0x48, 0xfe, 0x08, // 4
  0xe4, 0xa2, 0xa2, 0xa2, 0x9c, // 5
  0x3c, 0x52, 0x92, 0x92, 0x0c, // 6
  0x80, 0x8e, 0x90, 0xa0, 0xc0, // 7
  0x6c, 0x92, 0x92, 0x92, 0x6c, // 8
  0x60, 0x92, 0x92, 0x94, 0x78, // 9
  0x00, 0x6c, 0x6c, 0x00, 0x00, // :
  0x00, 0x6a, 0x6c, 0x00, 0x00, // ;
  0x00, 0x10, 0x28, 0x44, 0x82, // <
  0x28, 0x28, 0x28, 0x28, 0x28, // =
  0x82, 0x44, 0x28, 0x10, 0x00, // >
  0x40, 0x80, 0x8a, 0x90, 0x60, // ?
  0x4c, 0x92, 0x9e, 0x82, 0x7c, // @
  0x7e, 0x88, 0x88, 0x88, 0x7e, // A
  0xfe, 0x92, 0x92, 0x92, 0x6c, // B
  0x7c, 0x82, 0x82, 0x82, 0x44, // C
  0xfe, 0x82, 0x82, 0x44, 0x38, // D
  0xfe, 0x92, 0x92, 0x92, 0x82, // E
  0xfe, 0x90, 0x90, 0x80, 0x80, // F
  0x7c, 0x82, 0x82, 0x8a, 0x4c, // G
  0xfe, 0x10, 0x10, 0x10, 0xfe, // H
  0x00, 0x82, 0xfe, 0x82, 0x00, // I
  0x04, 0x02, 0x82, 0xfc, 0x80, // J
  0xfe, 0x10, 0x28, 0x44, 0x82, // K
  0xfe, 0x02, 0x02, 0x02, 0x02, // L
  0xfe, 0x40, 0x20, 0x40, 0xfe, // M
  0xfe, 0x20, 0x10, 0x08, 0xfe, // N
  0x7c, 0x82, 0x82, 0x82, 0x7c, // O
  0xfe, 0x90, 0x90, 0x90, 0x60, // P
  0x7c, 0x82, 0x8a, 0x84, 0x7a, // Q
  0xfe, 0x90, 0x98, 0x94, 0x62, // R
  0x62, 0x92, 0x92, 0x92, 0x8c, // S
  0x80, 0x80, 0xfe, 0x80, 0x80, // T
  0xfc, 0x02, 0x02, 0x02, 0xfc, // U
  0xf8, 0x04, 0x02, 0x04, 0xf8, // V
  0xfe, 0x04, 0x18, 0x04, 0xfe, // W
  0xc6, 0x28, 0x10, 0x28, 0xc6, // X
  0xc0, 0x20, 0x1e, 0x20, 0xc0, // Y
  0x86, 0x8a, 0x92, 0xa2, 0xc2, // Z
  0x00, 0x00, 0xfe, 0x82, 0x82, // [
  0x40, 0x20, 0x10, 0x08, 0x04, // (backslash)
  0x82, 0x82, 0xfe, 0x00, 0x00, // ]
  0x20, 0x40, 0x80, 0x40, 0x20, // ^
  0x02, 0x02, 0x02, 0x02, 0x02, // _
  0x00, 0x80, 0x40, 0x20, 0x00, // `
  0x04, 0x2a, 0x2a, 0x2a, 0x1e, // a
  0xfe, 0x12, 0x22, 0x22, 0x1c, // b
  0x1c, 0x22, 0x22, 0x22, 0x04, // c
  0x1c, 0x22, 0x22, 0x12, 0xfe, // d
  0x1c, 0x2a, 0x2a, 0x2a, 0x18, // e
  0x10, 0x7e, 0x90, 0x80, 0x40, // f
  0x10, 0x28, 0x2a, 0x2a, 0x3c, // g
  0xfe, 0x10, 0x20, 0x20, 0x1e, // h
  0x00, 0x22, 0xbe, 0x02, 0x00, // i
  0x04, 0x02, 0x22, 0xbc, 0x00, // j
  0x00, 0xfe, 0x08, 0x14, 0x22, // k
  0x00, 0x82, 0xfe, 0x02, 0x00, // l
  0x3e, 0x20, 0x18, 0x20, 0x1e, // m
  0x3e, 0x10, 0x20, 0x20, 0x1e, // n
  0x1c, 0x22, 0x22, 0x22, 0x1c, // o
  0x3e, 0x28, 0x28, 0x28, 0x10, // p
  0x10, 0x28, 0x28, 0x18, 0x3e, // q
  0x3e, 0x10, 0x20, 0x20, 0x10, // r
  0x12, 0x2a, 0x2a, 0x2a, 0x04, // s
  0x20, 0xfc, 0x22, 0x02, 0x04, // t
  0x3c, 0x02, 0x02, 0x04, 0x3e, // u
  0x38, 0x04, 0x02, 0x04, 0x38, // v
  0x3c, 0x02, 0x0c, 0x02, 0x3c, // w
  0x22, 0x14, 0x08, 0x14, 0x22, // x
  0x30, 0x0a, 0x0a, 0x0a, 0x3c, // y
  0x22, 0x26, 0x2a, 0x32, 0x22, // z
  0x00, 0x10, 0x6c, 0x82, 0x00, // {
  0x00, 0x00, 0xfe, 0x00, 0x00, // |
  0x00, 0x82, 0x6c, 0x10, 0x00, // }
  0x10, 0x10, 0x54, 0x38, 0x10, // ~
  0x10, 0x38, 0x54, 0x10, 0x10, // 
};

void setup() {
  Serial.begin(115200);
  // Les pins de commande vont de 2 à 9
  FastLED.addLeds<WS2811, 2, COLOR_ORDER>(leds, NUM_LEDS); // <-- C'est la ligne du haut !
  FastLED.addLeds<WS2811, 3, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 4, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 5, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 6, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 7, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 8, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 9, COLOR_ORDER>(leds, NUM_LEDS);
  Largeur = PIXELS + ESPACE;
  MessLength = strlen(Message) * Largeur + FIN_MESSAGE; // Nb de pixels total du message  Serial.print("Taille totale message : ");
  Serial.println(MessLength);
}

void loop() {
  Serial.print("Position :");
  Serial.println(Position);
  PrepareTexte();
  AfficheTexte();
  Position = (Position + 1) % MessLength; // Position du pixel à gauche dans le message
  Serial.println();
  Serial.println();
  delay(10000);
}

void PrepareTexte() {
  byte PosLettre = Position % Largeur; // Position du pixel dans la première lettre
  for (byte i = 0; i < NUM_LEDS; i++) {
    byte NumLettreAff = ((Position + i) % MessLength) / Largeur; // Numéro de la lettre à afficher
    byte PosLettreAff = (PosLettre + i % Largeur) % Largeur; // Position du pixel dans la lettre à afficher
    if (NumLettreAff >= sizeof(Message)) Texte[i] = 0; // Mettre > si on ne voit pas la dernière lettre
    else if (PosLettreAff >= PIXELS) Texte[i] = 0;
    else {
      byte RangLettre = Message[NumLettreAff] - 32; // Rang de la lettre dans le tableau
      byte Indice = RangLettre * PIXELS + PosLettreAff; // Colonne du tableau à afficher
      Texte[i] = pgm_read_byte(Font5x7 + Indice);
      // Texte[i] = Font5x7[Indice];
    }
    Serial.print(Texte[i], HEX);
    Serial.print(" ");
  }
  Serial.println();
}
void AfficheTexte() {
  unsigned long ledColor = 0x0000FF; // Color used (in hex)
  byte filtre[NumLignes] = {128, 64, 32, 16, 8, 4, 2, 1};
  for (byte i = 0; i < NumLignes; i++) {
    Serial.print ("Ruban numero : ");
    Serial.println(i);
    for (byte j = 0; j < NUM_LEDS; j++) {
      leds[j] = (Texte[j] && filtre[i] != 0) ? 1 : 0;
//      leds[j] = (Texte[j] && filtre[i] != 0) ? ledColor : 0;
      Serial.print(leds[j]);
      Serial.print(" ");
    }
    FastLED[i].showLeds(BRIGHTNESS);
    Serial.println();
  }
  delay(500); // <-- Vitesse d'affichage (à ajuster)
}
Title: Re: Horloge Géante
Post by: ASSM on Jul 26, 2018, 10:18 am
Bonjour

Voici l'affichage sur la console

Code: [Select]

70
Position :0
7C 8A 92 A2 7C 0 0 42 FE 2 0 0 42 86 8A 92 62 0 84 82 A2 D2 8C 0 18 28 48 FE 8 0 E4 A2 A2 A2 9C 0 3C 52 92 92 C 0 80 8E 90 A0 C0 0 6C 92 92 92 6C 0 60 92 92 94 78 0
Ruban numero : 0
1 1 1 1 1 0 0 1 1 1 0 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0
Ruban numero : 1
1 1 1 1 1 0 0 1 1 1 0 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0
Ruban numero : 2
1 1 1 1 1 0 0 1 1 1 0 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0
Ruban numero : 3
1 1 1 1 1 0 0 1 1 1 0 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0
Ruban numero : 4
1 1 1 1 1 0 0 1 1 1 0 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0
Ruban numero : 5
1 1 1 1 1 0 0 1 1 1 0 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0
Ruban numero : 6
1 1 1 1 1 0 0 1 1 1 0 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0
Ruban numero : 7
1 1 1 1 1 0 0 1 1 1 0 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0
Title: Re: Horloge Géante
Post by: lesept on Jul 26, 2018, 11:01 am
OK, j'ai compris l'erreur : j'ai mis '&&' au lieu de '&'

Code: [Select]
void AfficheTexte() {
  unsigned long ledColor = 0x0000FF; // Color used (in hex)
  byte filtre[NumLignes] = {128, 64, 32, 16, 8, 4, 2, 1};
  for (byte i = 0; i < NumLignes; i++) {
    Serial.print ("Ruban numero : ");
    Serial.print(i);
    for (byte j = 0; j < NUM_LEDS; j++) {
      leds[j] = (Texte[j] & filtre[i] != 0) ? 1 : 0;
//      leds[j] = (Texte[j] & filtre[i] != 0) ? ledColor : 0;
      Serial.print(leds[j]);
      Serial.print(" ");
    }
    FastLED[i].showLeds(BRIGHTNESS);
    Serial.println();
  }
  delay(500); // <-- Vitesse d'affichage (à ajuster)
}

Qu'est-ce que ça donne avec ça ?
Title: Re: Horloge Géante
Post by: ASSM on Jul 26, 2018, 11:07 am
Voici l'affichage de la console

Code: [Select]

70
Position :0
7C 8A 92 A2 7C 0 0 42 FE 2 0 0 42 86 8A 92 62 0 84 82 A2 D2 8C 0 18 28 48 FE 8 0 E4 A2 A2 A2 9C 0 3C 52 92 92 C 0 80 8E 90 A0 C0 0 6C 92 92 92 6C 0 60 92 92 94 78 0
Ruban numero : 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Ruban numero : 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Ruban numero : 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Ruban numero : 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Ruban numero : 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Ruban numero : 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Ruban numero : 60 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Ruban numero : 70 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Title: Re: Horloge Géante
Post by: lesept on Jul 26, 2018, 11:17 am
Grrr ! Peux-tu tester ça ?
Code: [Select]
void AfficheTexte() {
  unsigned long ledColor = 0x0000FF; // Color used (in hex)
  byte filtre[NumLignes] = {128, 64, 32, 16, 8, 4, 2, 1};
  for (byte i = 0; i < NumLignes; i++) {
    Serial.print ("Ruban numero : ");
    Serial.print(i);
    Serial.print (" filtre : ");
    Serial.println(filtre[i],HEX);
    for (byte j = 0; j < NUM_LEDS; j++) {
      leds[j] = (Texte[j] & filtre[i] != 0) ? 1 : 0;
//      leds[j] = (Texte[j] & filtre[i] != 0) ? ledColor : 0;
      Serial.print(Texte[j] & filtre[i],HEX);
      Serial.print(" -> ");
      Serial.print(leds[j]);
      Serial.print(" / ");
    }
    FastLED[i].showLeds(BRIGHTNESS);
    Serial.println();
  }
  delay(500); // <-- Vitesse d'affichage (à ajuster)
}
Merci
Title: Re: Horloge Géante
Post by: ASSM on Jul 26, 2018, 11:22 am
Voici l'affichage

Code: [Select]

70
Position :0
7C 8A 92 A2 7C 0 0 42 FE 2 0 0 42 86 8A 92 62 0 84 82 A2 D2 8C 0 18 28 48 FE 8 0 E4 A2 A2 A2 9C 0 3C 52 92 92 C 0 80 8E 90 A0 C0 0 6C 92 92 92 6C 0 60 92 92 94 78 0
Ruban numero : 0 filtre : 80
0 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 0 / 80 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 0 -> 0 / 0 -> 0 /
Ruban numero : 1 filtre : 40
40 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 40 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 40 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 /
Ruban numero : 2 filtre : 20
20 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 20 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 20 -> 0 / 20 -> 0 / 20 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 /
Ruban numero : 3 filtre : 10
10 -> 0 / 0 -> 0 / 10 -> 0 / 0 -> 0 / 10 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 0 / 0 -> 0 / 10 -> 0 / 10 -> 0 / 10 -> 0 / 10 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 0 / 10 -> 0 / 10 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 0 / 10 -> 0 / 10 -> 0 / 10 -> 0 / 0 -> 0 /
Ruban numero : 4 filtre : 8
8 -> 0 / 8 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 / 8 -> 0 / 8 -> 0 / 8 -> 0 / 8 -> 0 / 8 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 /
Ruban numero : 5 filtre : 4
4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 /
Ruban numero : 6 filtre : 2
0 -> 0 / 2 -> 0 / 2 -> 0 / 2 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 0 / 2 -> 0 / 2 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 0 / 2 -> 0 / 2 -> 0 / 2 -> 0 / 2 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 0 / 2 -> 0 / 2 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 0 / 2 -> 0 / 2 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 0 / 2 -> 0 / 2 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 0 / 2 -> 0 / 2 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 0 / 2 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 /
Ruban numero : 7 filtre : 1
0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 /
Title: Re: Horloge Géante
Post by: lesept on Jul 26, 2018, 11:33 am
Merci
Remplace la ligne
Code: [Select]
      leds[j] = (Texte[j] & filtre[i] != 0) ? 1 : 0;
par les lignes
Code: [Select]
      leds[j] = 0;
      if (Texte[j] & filtre[i] != 0) leds[j] = 1;
... et ça devrait marcher ! (sinon, je vais envisager sérieusement de rentrer dans les ordres  :smiley-confuse:  )
Title: Re: Horloge Géante
Post by: ASSM on Jul 26, 2018, 11:37 am
Voici l'affichage

Code: [Select]

70
Position :0
7C 8A 92 A2 7C 0 0 42 FE 2 0 0 42 86 8A 92 62 0 84 82 A2 D2 8C 0 18 28 48 FE 8 0 E4 A2 A2 A2 9C 0 3C 52 92 92 C 0 80 8E 90 A0 C0 0 6C 92 92 92 6C 0 60 92 92 94 78 0
Ruban numero : 0 filtre : 80
0 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 0 / 80 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 0 -> 0 / 0 -> 0 /
Ruban numero : 1 filtre : 40
40 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 40 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 40 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 /
Ruban numero : 2 filtre : 20
20 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 20 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 20 -> 0 / 20 -> 0 / 20 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 /
Ruban numero : 3 filtre : 10
10 -> 0 / 0 -> 0 / 10 -> 0 / 0 -> 0 / 10 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 0 / 0 -> 0 / 10 -> 0 / 10 -> 0 / 10 -> 0 / 10 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 0 / 10 -> 0 / 10 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 0 / 10 -> 0 / 10 -> 0 / 10 -> 0 / 0 -> 0 /
Ruban numero : 4 filtre : 8
8 -> 0 / 8 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 / 8 -> 0 / 8 -> 0 / 8 -> 0 / 8 -> 0 / 8 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 /
Ruban numero : 5 filtre : 4
4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 /
Ruban numero : 6 filtre : 2
0 -> 0 / 2 -> 0 / 2 -> 0 / 2 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 0 / 2 -> 0 / 2 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 0 / 2 -> 0 / 2 -> 0 / 2 -> 0 / 2 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 0 / 2 -> 0 / 2 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 0 / 2 -> 0 / 2 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 0 / 2 -> 0 / 2 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 0 / 2 -> 0 / 2 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 0 / 2 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 /
Ruban numero : 7 filtre : 1
0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 /

Title: Re: Horloge Géante
Post by: lesept on Jul 26, 2018, 11:57 am
Argh ! Et ça ?
Code: [Select]
void AfficheTexte() {
  unsigned long ledColor = 0x0000FF; // Color used (in hex)
  byte filtre[NumLignes] = {128, 64, 32, 16, 8, 4, 2, 1};
  for (byte i = 0; i < NumLignes; i++) {
    Serial.print ("Ruban numero : ");
    Serial.print(i);
    Serial.print (" filtre : ");
    Serial.println(filtre[i],HEX);
    for (byte j = 0; j < NUM_LEDS; j++) {
      leds[j] = 0;
      if (Texte[j] & filtre[i] != 0) leds[j] = 0x0000FF;
//      leds[j] = (Texte[j] & filtre[i] != 0) ? ledColor : 0;
      Serial.print(Texte[j] & filtre[i],HEX);
      Serial.print(" -> ");
      Serial.print(leds[j]);
      Serial.print(" / ");
    }
    FastLED[i].showLeds(BRIGHTNESS);
    Serial.println();
  }
  delay(500); // <-- Vitesse d'affichage (à ajuster)
}
Title: Re: Horloge Géante
Post by: ASSM on Jul 26, 2018, 12:02 pm
Voici l'affichage

Code: [Select]

70
Position :0
7C 8A 92 A2 7C 0 0 42 FE 2 0 0 42 86 8A 92 62 0 84 82 A2 D2 8C 0 18 28 48 FE 8 0 E4 A2 A2 A2 9C 0 3C 52 92 92 C 0 80 8E 90 A0 C0 0 6C 92 92 92 6C 0 60 92 92 94 78 0
Ruban numero : 0 filtre : 80
0 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 0 / 80 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 0 / 80 -> 0 / 80 -> 0 / 0 -> 0 / 0 -> 0 /
Ruban numero : 1 filtre : 40
40 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 40 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 40 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 0 / 0 -> 0 /
Ruban numero : 2 filtre : 20
20 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 20 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 20 -> 0 / 20 -> 0 / 20 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 0 / 0 -> 0 /
Ruban numero : 3 filtre : 10
10 -> 0 / 0 -> 0 / 10 -> 0 / 0 -> 0 / 10 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 0 / 0 -> 0 / 10 -> 0 / 10 -> 0 / 10 -> 0 / 10 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 0 / 10 -> 0 / 10 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 0 / 10 -> 0 / 10 -> 0 / 10 -> 0 / 0 -> 0 /
Ruban numero : 4 filtre : 8
8 -> 0 / 8 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 / 8 -> 0 / 8 -> 0 / 8 -> 0 / 8 -> 0 / 8 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 0 / 0 -> 0 /
Ruban numero : 5 filtre : 4
4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 0 / 0 -> 0 / 0 -> 0 /
Ruban numero : 6 filtre : 2
0 -> 0 / 2 -> 0 / 2 -> 0 / 2 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 0 / 2 -> 0 / 2 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 0 / 2 -> 0 / 2 -> 0 / 2 -> 0 / 2 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 0 / 2 -> 0 / 2 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 0 / 2 -> 0 / 2 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 0 / 2 -> 0 / 2 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 0 / 2 -> 0 / 2 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 0 / 2 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 /
Ruban numero : 7 filtre : 1
0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 /
Title: Re: Horloge Géante
Post by: lesept on Jul 26, 2018, 12:12 pm
Bon, il y a un problème avec cette ligne :
Code: [Select]
if (Texte[j] & filtre[i] != 0) leds[j] = 0x0000FF;
Lorsque je print le résultat de Texte[j] & filtre[ i ] on voit bien que ça vaut parfois 80, ou 40, ou 20... Mais leds[j] reste invariablement à 0 !
Je ne comprends pas...
Title: Re: Horloge Géante
Post by: lesept on Jul 26, 2018, 02:25 pm
Essaye avec :
Code: [Select]
      if ((Texte[j] & filtre[i]) != 0) leds[j] = 0x0000FF;
Title: Re: Horloge Géante
Post by: ASSM on Jul 26, 2018, 03:04 pm
Voici l'affichage

Code: [Select]

70
Position :0
7C 8A 92 A2 7C 0 0 42 FE 2 0 0 42 86 8A 92 62 0 84 82 A2 D2 8C 0 18 28 48 FE 8 0 E4 A2 A2 A2 9C 0 3C 52 92 92 C 0 80 8E 90 A0 C0 0 6C 92 92 92 6C 0 60 92 92 94 78 0
Ruban numero : 0 filtre : 80
0 -> 0 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 /
Ruban numero : 1 filtre : 40
40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 /
Ruban numero : 2 filtre : 20
20 -> 1 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 20 -> 1 / 20 -> 1 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 /
Ruban numero : 3 filtre : 10
10 -> 1 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 10 -> 1 / 10 -> 1 / 10 -> 1 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 10 -> 1 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 10 -> 1 / 10 -> 1 / 10 -> 1 / 0 -> 0 /
Ruban numero : 4 filtre : 8
8 -> 1 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 8 -> 1 / 8 -> 1 / 8 -> 1 / 8 -> 1 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 /
Ruban numero : 5 filtre : 4
4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 /
Ruban numero : 6 filtre : 2
0 -> 0 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 /
Ruban numero : 7 filtre : 1
0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 /
Title: Re: Horloge Géante
Post by: lesept on Jul 26, 2018, 03:16 pm
Là, ça marche ! Pour la beauté du code, peux-tu tester ceci ?
Code: [Select]
void AfficheTexte() {
  unsigned long ledColor = 0x0000FF; // Color used (in hex)
  byte filtre[NumLignes] = {128, 64, 32, 16, 8, 4, 2, 1};
  for (byte i = 0; i < NumLignes; i++) {
    Serial.print ("Ruban numero : ");
    Serial.print(i);
    Serial.print (" filtre : ");
    Serial.println(filtre[i], HEX);
    for (byte j = 0; j < NUM_LEDS; j++) {
      leds[j] = ((Texte[j] & filtre[i]) != 0) ? ledColor : 0;
      Serial.print(Texte[j] & filtre[i], HEX);
      Serial.print(" -> ");
      Serial.print(leds[j]);
      Serial.print(" / ");
    }
    FastLED[i].showLeds(BRIGHTNESS);
    Serial.println();
  }
  delay(500); // <-- Vitesse d'affichage (à ajuster)
}

Si ça donne la même chose, je t'envoie une version à tester avec les rubans.
Title: Re: Horloge Géante
Post by: ASSM on Jul 26, 2018, 03:19 pm
L'affichage donne

Code: [Select]

70
Position :0
7C 8A 92 A2 7C 0 0 42 FE 2 0 0 42 86 8A 92 62 0 84 82 A2 D2 8C 0 18 28 48 FE 8 0 E4 A2 A2 A2 9C 0 3C 52 92 92 C 0 80 8E 90 A0 C0 0 6C 92 92 92 6C 0 60 92 92 94 78 0
Ruban numero : 0 filtre : 80
0 -> 0 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 /
Ruban numero : 1 filtre : 40
40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 /
Ruban numero : 2 filtre : 20
20 -> 1 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 20 -> 1 / 20 -> 1 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 /
Ruban numero : 3 filtre : 10
10 -> 1 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 10 -> 1 / 10 -> 1 / 10 -> 1 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 10 -> 1 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 10 -> 1 / 10 -> 1 / 10 -> 1 / 0 -> 0 /
Ruban numero : 4 filtre : 8
8 -> 1 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 8 -> 1 / 8 -> 1 / 8 -> 1 / 8 -> 1 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 /
Ruban numero : 5 filtre : 4
4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 /
Ruban numero : 6 filtre : 2
0 -> 0 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 /
Ruban numero : 7 filtre : 1
0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 /
Title: Re: Horloge Géante
Post by: lesept on Jul 26, 2018, 03:27 pm
Bon, alors le décodage du texte fonctionne bien mais je ne comprends pas pourquoi ça donne des '1' : tu as bien copié la fonction que je t'ai envoyée en entier ? Elle devrait renvoyer des 255 après les flèches '->'

Title: Re: Horloge Géante
Post by: ASSM on Jul 26, 2018, 03:31 pm
Voici le code complet que j'ai mis.

Code: [Select]

/*
   Affichage d'un message déroulant vers la gauche en boucle
   sur une barre de 8 rubans de LEDs
   Les paramètres sont dans les #define : nombre de LEDs des rubans, taille
   max du message, espace entre chaque lettre, nombre d'espace à la fin
                       ----> LESEPT juillet 2018 <----
*/
#define NUM_LEDS 60    // Nombre de LEDs par ligne
#define TAILLE 100     // Nombre maximum de caractères à afficher
#define ESPACE 1       // Un pixel entre chaque lettre
#define PIXELS 5       // Nombre de pixels par lettre
#define FIN_MESSAGE 10 // Nombre de pixels à la fin du message

#include "FastLED.h"
#define COLOR_ORDER BRG // Color order
#define NumLignes 8
#define BRIGHTNESS 255
CRGB leds[NUM_LEDS];

//char Message[TAILLE + 1] = "Itaque tum Scaevola cum in eam ipsam mentionem incidisset, exposuit nobis sermonem Laeli de amicitia"; // Max 100 caractères à afficher
char Message[TAILLE + 1] = "0123456789"; // Max 100 caractères à afficher
uint8_t Texte[NUM_LEDS];   // Le texte affiché à chaque instant
byte Position = 0;
byte MessLength = 0;
byte Largeur = 0;

// A priori 7 lignes de LEDs suffisent avec cette définition de lettres
const uint8_t Font5x7[] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, //
  0x00, 0x00, 0xfa, 0x00, 0x00, // !
  0x00, 0xe0, 0x00, 0xe0, 0x00, // "
  0x28, 0xfe, 0x28, 0xfe, 0x28, // #
  0x24, 0x54, 0xfe, 0x54, 0x48, // $
  0xc4, 0xc8, 0x10, 0x26, 0x46, // %
  0x6c, 0x92, 0xaa, 0x44, 0x0a, // &
  0x00, 0xa0, 0xc0, 0x00, 0x00, // '
  0x00, 0x38, 0x44, 0x82, 0x00, // (
  0x00, 0x82, 0x44, 0x38, 0x00, // )
  0x10, 0x54, 0x38, 0x54, 0x10, // *
  0x10, 0x10, 0x7c, 0x10, 0x10, // +
  0x00, 0x0a, 0x0c, 0x00, 0x00, // ,
  0x10, 0x10, 0x10, 0x10, 0x10, // -
  0x00, 0x06, 0x06, 0x00, 0x00, // .
  0x04, 0x08, 0x10, 0x20, 0x40, // /
  0x7c, 0x8a, 0x92, 0xa2, 0x7c, // 0
  0x00, 0x42, 0xfe, 0x02, 0x00, // 1
  0x42, 0x86, 0x8a, 0x92, 0x62, // 2
  0x84, 0x82, 0xa2, 0xd2, 0x8c, // 3
  0x18, 0x28, 0x48, 0xfe, 0x08, // 4
  0xe4, 0xa2, 0xa2, 0xa2, 0x9c, // 5
  0x3c, 0x52, 0x92, 0x92, 0x0c, // 6
  0x80, 0x8e, 0x90, 0xa0, 0xc0, // 7
  0x6c, 0x92, 0x92, 0x92, 0x6c, // 8
  0x60, 0x92, 0x92, 0x94, 0x78, // 9
  0x00, 0x6c, 0x6c, 0x00, 0x00, // :
  0x00, 0x6a, 0x6c, 0x00, 0x00, // ;
  0x00, 0x10, 0x28, 0x44, 0x82, // <
  0x28, 0x28, 0x28, 0x28, 0x28, // =
  0x82, 0x44, 0x28, 0x10, 0x00, // >
  0x40, 0x80, 0x8a, 0x90, 0x60, // ?
  0x4c, 0x92, 0x9e, 0x82, 0x7c, // @
  0x7e, 0x88, 0x88, 0x88, 0x7e, // A
  0xfe, 0x92, 0x92, 0x92, 0x6c, // B
  0x7c, 0x82, 0x82, 0x82, 0x44, // C
  0xfe, 0x82, 0x82, 0x44, 0x38, // D
  0xfe, 0x92, 0x92, 0x92, 0x82, // E
  0xfe, 0x90, 0x90, 0x80, 0x80, // F
  0x7c, 0x82, 0x82, 0x8a, 0x4c, // G
  0xfe, 0x10, 0x10, 0x10, 0xfe, // H
  0x00, 0x82, 0xfe, 0x82, 0x00, // I
  0x04, 0x02, 0x82, 0xfc, 0x80, // J
  0xfe, 0x10, 0x28, 0x44, 0x82, // K
  0xfe, 0x02, 0x02, 0x02, 0x02, // L
  0xfe, 0x40, 0x20, 0x40, 0xfe, // M
  0xfe, 0x20, 0x10, 0x08, 0xfe, // N
  0x7c, 0x82, 0x82, 0x82, 0x7c, // O
  0xfe, 0x90, 0x90, 0x90, 0x60, // P
  0x7c, 0x82, 0x8a, 0x84, 0x7a, // Q
  0xfe, 0x90, 0x98, 0x94, 0x62, // R
  0x62, 0x92, 0x92, 0x92, 0x8c, // S
  0x80, 0x80, 0xfe, 0x80, 0x80, // T
  0xfc, 0x02, 0x02, 0x02, 0xfc, // U
  0xf8, 0x04, 0x02, 0x04, 0xf8, // V
  0xfe, 0x04, 0x18, 0x04, 0xfe, // W
  0xc6, 0x28, 0x10, 0x28, 0xc6, // X
  0xc0, 0x20, 0x1e, 0x20, 0xc0, // Y
  0x86, 0x8a, 0x92, 0xa2, 0xc2, // Z
  0x00, 0x00, 0xfe, 0x82, 0x82, // [
  0x40, 0x20, 0x10, 0x08, 0x04, // (backslash)
  0x82, 0x82, 0xfe, 0x00, 0x00, // ]
  0x20, 0x40, 0x80, 0x40, 0x20, // ^
  0x02, 0x02, 0x02, 0x02, 0x02, // _
  0x00, 0x80, 0x40, 0x20, 0x00, // `
  0x04, 0x2a, 0x2a, 0x2a, 0x1e, // a
  0xfe, 0x12, 0x22, 0x22, 0x1c, // b
  0x1c, 0x22, 0x22, 0x22, 0x04, // c
  0x1c, 0x22, 0x22, 0x12, 0xfe, // d
  0x1c, 0x2a, 0x2a, 0x2a, 0x18, // e
  0x10, 0x7e, 0x90, 0x80, 0x40, // f
  0x10, 0x28, 0x2a, 0x2a, 0x3c, // g
  0xfe, 0x10, 0x20, 0x20, 0x1e, // h
  0x00, 0x22, 0xbe, 0x02, 0x00, // i
  0x04, 0x02, 0x22, 0xbc, 0x00, // j
  0x00, 0xfe, 0x08, 0x14, 0x22, // k
  0x00, 0x82, 0xfe, 0x02, 0x00, // l
  0x3e, 0x20, 0x18, 0x20, 0x1e, // m
  0x3e, 0x10, 0x20, 0x20, 0x1e, // n
  0x1c, 0x22, 0x22, 0x22, 0x1c, // o
  0x3e, 0x28, 0x28, 0x28, 0x10, // p
  0x10, 0x28, 0x28, 0x18, 0x3e, // q
  0x3e, 0x10, 0x20, 0x20, 0x10, // r
  0x12, 0x2a, 0x2a, 0x2a, 0x04, // s
  0x20, 0xfc, 0x22, 0x02, 0x04, // t
  0x3c, 0x02, 0x02, 0x04, 0x3e, // u
  0x38, 0x04, 0x02, 0x04, 0x38, // v
  0x3c, 0x02, 0x0c, 0x02, 0x3c, // w
  0x22, 0x14, 0x08, 0x14, 0x22, // x
  0x30, 0x0a, 0x0a, 0x0a, 0x3c, // y
  0x22, 0x26, 0x2a, 0x32, 0x22, // z
  0x00, 0x10, 0x6c, 0x82, 0x00, // {
  0x00, 0x00, 0xfe, 0x00, 0x00, // |
  0x00, 0x82, 0x6c, 0x10, 0x00, // }
  0x10, 0x10, 0x54, 0x38, 0x10, // ~
  0x10, 0x38, 0x54, 0x10, 0x10, // 
};

void setup() {
  Serial.begin(115200);
  // Les pins de commande vont de 2 à 9
  FastLED.addLeds<WS2811, 2, COLOR_ORDER>(leds, NUM_LEDS); // <-- C'est la ligne du haut !
  FastLED.addLeds<WS2811, 3, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 4, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 5, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 6, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 7, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 8, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 9, COLOR_ORDER>(leds, NUM_LEDS);
  Largeur = PIXELS + ESPACE;
  MessLength = strlen(Message) * Largeur + FIN_MESSAGE; // Nb de pixels total du message  Serial.print("Taille totale message : ");
  Serial.println(MessLength);
}

void loop() {
  Serial.print("Position :");
  Serial.println(Position);
  PrepareTexte();
  AfficheTexte();
  Position = (Position + 1) % MessLength; // Position du pixel à gauche dans le message
  Serial.println();
  Serial.println();
  delay(10000);
}

void PrepareTexte() {
  byte PosLettre = Position % Largeur; // Position du pixel dans la première lettre
  for (byte i = 0; i < NUM_LEDS; i++) {
    byte NumLettreAff = ((Position + i) % MessLength) / Largeur; // Numéro de la lettre à afficher
    byte PosLettreAff = (PosLettre + i % Largeur) % Largeur; // Position du pixel dans la lettre à afficher
    if (NumLettreAff >= sizeof(Message)) Texte[i] = 0; // Mettre > si on ne voit pas la dernière lettre
    else if (PosLettreAff >= PIXELS) Texte[i] = 0;
    else {
      byte RangLettre = Message[NumLettreAff] - 32; // Rang de la lettre dans le tableau
      byte Indice = RangLettre * PIXELS + PosLettreAff; // Colonne du tableau à afficher
      Texte[i] = pgm_read_byte(Font5x7 + Indice);
      // Texte[i] = Font5x7[Indice];
    }
    Serial.print(Texte[i], HEX);
    Serial.print(" ");
  }
  Serial.println();
}
void AfficheTexte() {
  unsigned long ledColor = 0x0000FF; // Color used (in hex)
  byte filtre[NumLignes] = {128, 64, 32, 16, 8, 4, 2, 1};
  for (byte i = 0; i < NumLignes; i++) {
    Serial.print ("Ruban numero : ");
    Serial.print(i);
    Serial.print (" filtre : ");
    Serial.println(filtre[i], HEX);
    for (byte j = 0; j < NUM_LEDS; j++) {
      leds[j] = ((Texte[j] & filtre[i]) != 0) ? ledColor : 0;
      Serial.print(Texte[j] & filtre[i], HEX);
      Serial.print(" -> ");
      Serial.print(leds[j]);
      Serial.print(" / ");
    }
    FastLED[i].showLeds(BRIGHTNESS);
    Serial.println();
  }
  delay(500); // <-- Vitesse d'affichage (à ajuster)
}
Title: Re: Horloge Géante
Post by: lesept on Jul 26, 2018, 03:33 pm
Teste avec :
Code: [Select]
      leds[j] = ((Texte[j] & filtre[i]) != 0) ? CRGB::Green : 0;
Title: Re: Horloge Géante
Post by: ASSM on Jul 26, 2018, 03:50 pm
Cela done

Code: [Select]

70
Position :0
7C 8A 92 A2 7C 0 0 42 FE 2 0 0 42 86 8A 92 62 0 84 82 A2 D2 8C 0 18 28 48 FE 8 0 E4 A2 A2 A2 9C 0 3C 52 92 92 C 0 80 8E 90 A0 C0 0 6C 92 92 92 6C 0 60 92 92 94 78 0
Ruban numero : 0 filtre : 80
0 -> 0 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 /
Ruban numero : 1 filtre : 40
40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 /
Ruban numero : 2 filtre : 20
20 -> 1 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 20 -> 1 / 20 -> 1 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 /
Ruban numero : 3 filtre : 10
10 -> 1 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 10 -> 1 / 10 -> 1 / 10 -> 1 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 10 -> 1 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 10 -> 1 / 10 -> 1 / 10 -> 1 / 0 -> 0 /
Ruban numero : 4 filtre : 8
8 -> 1 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 8 -> 1 / 8 -> 1 / 8 -> 1 / 8 -> 1 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 /
Ruban numero : 5 filtre : 4
4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 /
Ruban numero : 6 filtre : 2
0 -> 0 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 /
Ruban numero : 7 filtre : 1
0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 /
Title: Re: Horloge Géante
Post by: lesept on Jul 26, 2018, 03:53 pm
Et avec ça ?
Code: [Select]
void AfficheTexte() {
  CRGB ledColor = 0x0000FF; // Color used (in hex)
  byte filtre[NumLignes] = {128, 64, 32, 16, 8, 4, 2, 1};
  for (byte i = 0; i < NumLignes; i++) {
    Serial.print ("Ruban numero : ");
    Serial.print(i);
    Serial.print (" filtre : ");
    Serial.println(filtre[i], HEX);
    for (byte j = 0; j < NUM_LEDS; j++) {
      leds[j] = ((Texte[j] & filtre[i]) != 0) ? ledColor : 0;
      Serial.print(Texte[j] & filtre[i], HEX);
      Serial.print(" -> ");
      Serial.print(leds[j]);
      Serial.print(" / ");
    }
    FastLED[i].showLeds(BRIGHTNESS);
    Serial.println();
  }
  delay(500); // <-- Vitesse d'affichage (à ajuster)
}

Si ça donne encore des '-> 1', essaye avec:
Code: [Select]
  CRGB ledColor = CRGB::Green; // Color used (in hex)
Title: Re: Horloge Géante
Post by: lesept on Jul 26, 2018, 03:58 pm
En dernier ressort :
Code: [Select]
void AfficheTexte() {
  CRGB ledColor = CRGB::Green; // Color used (in hex)
  CRGB black = CRGB::Black;
  byte filtre[NumLignes] = {128, 64, 32, 16, 8, 4, 2, 1};
  for (byte i = 0; i < NumLignes; i++) {
    Serial.print ("Ruban numero : ");
    Serial.print(i);
    Serial.print (" filtre : ");
    Serial.println(filtre[i], HEX);
    for (byte j = 0; j < NUM_LEDS; j++) {
      leds[j] = ((Texte[j] & filtre[i]) != 0) ? ledColor : black;
      Serial.print(Texte[j] & filtre[i], HEX);
      Serial.print(" -> ");
      Serial.print(leds[j]);
      Serial.print(" / ");
    }
    FastLED[i].showLeds(BRIGHTNESS);
    Serial.println();
  }
  delay(500); // <-- Vitesse d'affichage (à ajuster)
}

Après, c'est peut-être le Serial.print qui n'est pas adapté à l'affichage d'une structure comme le CRGB.
Dans ce cas, on fera une version pseudo finale pour que tu puisses tester ce soir avec les rubans.
Title: Re: Horloge Géante
Post by: ASSM on Jul 26, 2018, 03:58 pm
j'ai le message d'erreur

Code: [Select]

operands to ?: have different types 'CRGB' and 'int'
Title: Re: Horloge Géante
Post by: lesept on Jul 26, 2018, 04:02 pm
Alors essaye la dernière version.
Title: Re: Horloge Géante
Post by: ASSM on Jul 26, 2018, 04:08 pm
Avec la derniere version

Code: [Select]

70
Position :0
7C 8A 92 A2 7C 0 0 42 FE 2 0 0 42 86 8A 92 62 0 84 82 A2 D2 8C 0 18 28 48 FE 8 0 E4 A2 A2 A2 9C 0 3C 52 92 92 C 0 80 8E 90 A0 C0 0 6C 92 92 92 6C 0 60 92 92 94 78 0
Ruban numero : 0 filtre : 80
0 -> 0 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 80 -> 1 / 80 -> 1 / 80 -> 1 / 0 -> 0 / 0 -> 0 /
Ruban numero : 1 filtre : 40
40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 40 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 40 -> 1 / 0 -> 0 /
Ruban numero : 2 filtre : 20
20 -> 1 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 20 -> 1 / 20 -> 1 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 20 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 20 -> 1 / 0 -> 0 /
Ruban numero : 3 filtre : 10
10 -> 1 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 10 -> 1 / 10 -> 1 / 10 -> 1 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 10 -> 1 / 10 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 10 -> 1 / 10 -> 1 / 10 -> 1 / 10 -> 1 / 0 -> 0 /
Ruban numero : 4 filtre : 8
8 -> 1 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 8 -> 1 / 8 -> 1 / 8 -> 1 / 8 -> 1 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 8 -> 1 / 0 -> 0 /
Ruban numero : 5 filtre : 4
4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 4 -> 1 / 0 -> 0 / 0 -> 0 /
Ruban numero : 6 filtre : 2
0 -> 0 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 2 -> 1 / 2 -> 1 / 0 -> 0 / 0 -> 0 / 0 -> 0 /
Ruban numero : 7 filtre : 1
0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 / 0 -> 0 /
Title: Re: Horloge Géante
Post by: lesept on Jul 26, 2018, 04:11 pm
Je vais craquer...  :-X

Peux-tu me dire ce qu'affiche la console pour ce code tout simple :
Code: [Select]
#include "FastLED.h"
CRGB leds[2];

void setup() {
  leds[0] = CRGB::Blue;
  Serial.begin(115200);
  Serial.prinln(leds[0]);
}

void loop() {

}
Title: Re: Horloge Géante
Post by: ASSM on Jul 26, 2018, 04:14 pm
j'ai le message d'erreur

Code: [Select]

'class HardwareSerial' has no member named 'prinln'
Title: Re: Horloge Géante
Post by: lesept on Jul 26, 2018, 04:15 pm
Serial.println(leds[0]); // <-- j'ai oublié le 't'
Title: Re: Horloge Géante
Post by: ASSM on Jul 26, 2018, 04:20 pm
la console affiche "1"
Title: Re: Horloge Géante
Post by: lesept on Jul 26, 2018, 04:28 pm
OK, bonne nouvelle : je suppose que le Serial.print n'est pas adapté à la strcture CRGB.

Donc, voici une version "propre" (sans affichage console ni temporisation) pour tester avec les rubans : je ne garantis pas que les LEDs seront de couleur verte.

Code: [Select]
/*
   Affichage d'un message déroulant vers la gauche en boucle
   sur une barre de 8 rubans de LEDs
   Les paramètres sont dans les #define : nombre de LEDs des rubans, taille
   max du message, espace entre chaque lettre, nombre d'espace à la fin
                       ----> LESEPT juillet 2018 <----
*/
#define NUM_LEDS 60    // Nombre de LEDs par ligne
#define TAILLE 100     // Nombre maximum de caractères à afficher
#define ESPACE 1       // Un pixel entre chaque lettre
#define PIXELS 5       // Nombre de pixels par lettre
#define FIN_MESSAGE 10 // Nombre de pixels à la fin du message

#include "FastLED.h"
#define COLOR_ORDER RGB // BRG // Color order
#define NumLignes 8
#define BRIGHTNESS 255
CRGB leds[NUM_LEDS];

char Message[TAILLE + 1] = "Itaque tum Scaevola cum in eam ipsam mentionem incidisset, exposuit nobis sermonem Laeli de amicitia"; // Max 100 caractères à afficher
uint8_t Texte[NUM_LEDS];   // Le texte affiché à chaque instant
byte Position = 0;
byte MessLength = 0;
byte Largeur = 0;

// A priori 7 lignes de LEDs suffisent avec cette définition de lettres
const uint8_t Font5x7[] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, //
  0x00, 0x00, 0xfa, 0x00, 0x00, // !
  0x00, 0xe0, 0x00, 0xe0, 0x00, // "
  0x28, 0xfe, 0x28, 0xfe, 0x28, // #
  0x24, 0x54, 0xfe, 0x54, 0x48, // $
  0xc4, 0xc8, 0x10, 0x26, 0x46, // %
  0x6c, 0x92, 0xaa, 0x44, 0x0a, // &
  0x00, 0xa0, 0xc0, 0x00, 0x00, // '
  0x00, 0x38, 0x44, 0x82, 0x00, // (
  0x00, 0x82, 0x44, 0x38, 0x00, // )
  0x10, 0x54, 0x38, 0x54, 0x10, // *
  0x10, 0x10, 0x7c, 0x10, 0x10, // +
  0x00, 0x0a, 0x0c, 0x00, 0x00, // ,
  0x10, 0x10, 0x10, 0x10, 0x10, // -
  0x00, 0x06, 0x06, 0x00, 0x00, // .
  0x04, 0x08, 0x10, 0x20, 0x40, // /
  0x7c, 0x8a, 0x92, 0xa2, 0x7c, // 0
  0x00, 0x42, 0xfe, 0x02, 0x00, // 1
  0x42, 0x86, 0x8a, 0x92, 0x62, // 2
  0x84, 0x82, 0xa2, 0xd2, 0x8c, // 3
  0x18, 0x28, 0x48, 0xfe, 0x08, // 4
  0xe4, 0xa2, 0xa2, 0xa2, 0x9c, // 5
  0x3c, 0x52, 0x92, 0x92, 0x0c, // 6
  0x80, 0x8e, 0x90, 0xa0, 0xc0, // 7
  0x6c, 0x92, 0x92, 0x92, 0x6c, // 8
  0x60, 0x92, 0x92, 0x94, 0x78, // 9
  0x00, 0x6c, 0x6c, 0x00, 0x00, // :
  0x00, 0x6a, 0x6c, 0x00, 0x00, // ;
  0x00, 0x10, 0x28, 0x44, 0x82, // <
  0x28, 0x28, 0x28, 0x28, 0x28, // =
  0x82, 0x44, 0x28, 0x10, 0x00, // >
  0x40, 0x80, 0x8a, 0x90, 0x60, // ?
  0x4c, 0x92, 0x9e, 0x82, 0x7c, // @
  0x7e, 0x88, 0x88, 0x88, 0x7e, // A
  0xfe, 0x92, 0x92, 0x92, 0x6c, // B
  0x7c, 0x82, 0x82, 0x82, 0x44, // C
  0xfe, 0x82, 0x82, 0x44, 0x38, // D
  0xfe, 0x92, 0x92, 0x92, 0x82, // E
  0xfe, 0x90, 0x90, 0x80, 0x80, // F
  0x7c, 0x82, 0x82, 0x8a, 0x4c, // G
  0xfe, 0x10, 0x10, 0x10, 0xfe, // H
  0x00, 0x82, 0xfe, 0x82, 0x00, // I
  0x04, 0x02, 0x82, 0xfc, 0x80, // J
  0xfe, 0x10, 0x28, 0x44, 0x82, // K
  0xfe, 0x02, 0x02, 0x02, 0x02, // L
  0xfe, 0x40, 0x20, 0x40, 0xfe, // M
  0xfe, 0x20, 0x10, 0x08, 0xfe, // N
  0x7c, 0x82, 0x82, 0x82, 0x7c, // O
  0xfe, 0x90, 0x90, 0x90, 0x60, // P
  0x7c, 0x82, 0x8a, 0x84, 0x7a, // Q
  0xfe, 0x90, 0x98, 0x94, 0x62, // R
  0x62, 0x92, 0x92, 0x92, 0x8c, // S
  0x80, 0x80, 0xfe, 0x80, 0x80, // T
  0xfc, 0x02, 0x02, 0x02, 0xfc, // U
  0xf8, 0x04, 0x02, 0x04, 0xf8, // V
  0xfe, 0x04, 0x18, 0x04, 0xfe, // W
  0xc6, 0x28, 0x10, 0x28, 0xc6, // X
  0xc0, 0x20, 0x1e, 0x20, 0xc0, // Y
  0x86, 0x8a, 0x92, 0xa2, 0xc2, // Z
  0x00, 0x00, 0xfe, 0x82, 0x82, // [
  0x40, 0x20, 0x10, 0x08, 0x04, // (backslash)
  0x82, 0x82, 0xfe, 0x00, 0x00, // ]
  0x20, 0x40, 0x80, 0x40, 0x20, // ^
  0x02, 0x02, 0x02, 0x02, 0x02, // _
  0x00, 0x80, 0x40, 0x20, 0x00, // `
  0x04, 0x2a, 0x2a, 0x2a, 0x1e, // a
  0xfe, 0x12, 0x22, 0x22, 0x1c, // b
  0x1c, 0x22, 0x22, 0x22, 0x04, // c
  0x1c, 0x22, 0x22, 0x12, 0xfe, // d
  0x1c, 0x2a, 0x2a, 0x2a, 0x18, // e
  0x10, 0x7e, 0x90, 0x80, 0x40, // f
  0x10, 0x28, 0x2a, 0x2a, 0x3c, // g
  0xfe, 0x10, 0x20, 0x20, 0x1e, // h
  0x00, 0x22, 0xbe, 0x02, 0x00, // i
  0x04, 0x02, 0x22, 0xbc, 0x00, // j
  0x00, 0xfe, 0x08, 0x14, 0x22, // k
  0x00, 0x82, 0xfe, 0x02, 0x00, // l
  0x3e, 0x20, 0x18, 0x20, 0x1e, // m
  0x3e, 0x10, 0x20, 0x20, 0x1e, // n
  0x1c, 0x22, 0x22, 0x22, 0x1c, // o
  0x3e, 0x28, 0x28, 0x28, 0x10, // p
  0x10, 0x28, 0x28, 0x18, 0x3e, // q
  0x3e, 0x10, 0x20, 0x20, 0x10, // r
  0x12, 0x2a, 0x2a, 0x2a, 0x04, // s
  0x20, 0xfc, 0x22, 0x02, 0x04, // t
  0x3c, 0x02, 0x02, 0x04, 0x3e, // u
  0x38, 0x04, 0x02, 0x04, 0x38, // v
  0x3c, 0x02, 0x0c, 0x02, 0x3c, // w
  0x22, 0x14, 0x08, 0x14, 0x22, // x
  0x30, 0x0a, 0x0a, 0x0a, 0x3c, // y
  0x22, 0x26, 0x2a, 0x32, 0x22, // z
  0x00, 0x10, 0x6c, 0x82, 0x00, // {
  0x00, 0x00, 0xfe, 0x00, 0x00, // |
  0x00, 0x82, 0x6c, 0x10, 0x00, // }
  0x10, 0x10, 0x54, 0x38, 0x10, // ~
  0x10, 0x38, 0x54, 0x10, 0x10, // 
};

void setup() {
  Serial.begin(115200);
  // Les pins de commande vont de 2 à 9
  FastLED.addLeds<WS2811, 2, COLOR_ORDER>(leds, NUM_LEDS); // <-- C'est la ligne du haut !
  FastLED.addLeds<WS2811, 3, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 4, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 5, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 6, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 7, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 8, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 9, COLOR_ORDER>(leds, NUM_LEDS);
  Largeur = PIXELS + ESPACE;
  MessLength = strlen(Message) * Largeur + FIN_MESSAGE; // Nb de pixels total du message  Serial.print("Taille totale message : ");
}

void loop() {
  PrepareTexte();
  AfficheTexte();
  Position = (Position + 1) % MessLength; // Position du pixel à gauche dans le message
}

void PrepareTexte() {
  byte PosLettre = Position % Largeur; // Position du pixel dans la première lettre
  for (byte i = 0; i < NUM_LEDS; i++) {
    byte NumLettreAff = ((Position + i) % MessLength) / Largeur; // Numéro de la lettre à afficher
    byte PosLettreAff = (PosLettre + i % Largeur) % Largeur; // Position du pixel dans la lettre à afficher
    if (NumLettreAff >= sizeof(Message)) Texte[i] = 0; // Mettre > si on ne voit pas la dernière lettre
    else if (PosLettreAff >= PIXELS) Texte[i] = 0;
    else {
      byte RangLettre = Message[NumLettreAff] - 32; // Rang de la lettre dans le tableau
      byte Indice = RangLettre * PIXELS + PosLettreAff; // Colonne du tableau à afficher
      Texte[i] = pgm_read_byte(Font5x7 + Indice);
    }
  }
}

void AfficheTexte() {
  CRGB ledColor = CRGB::Green; // Color used (in hex)
  CRGB black = CRGB::Black;
  byte filtre[NumLignes] = {128, 64, 32, 16, 8, 4, 2, 1};
  for (byte i = 0; i < NumLignes; i++) {
    for (byte j = 0; j < NUM_LEDS; j++) {
      if ((Texte[j] & filtre[i]) != 0) {
        leds[j] = ledColor;
      } else {
        leds[j] = black;
      }
      // leds[j] = ((Texte[j] & filtre[i]) != 0) ? ledColor : black;
    }
    FastLED[i].showLeds(BRIGHTNESS);
  }
  delay(500); // <-- Vitesse d'affichage (à ajuster)
}

Tu peux déjà le compiler pour voir si je n'ai pas fait d'erreur.

Ensuite, si tu veux changer la couleur, c'est la ligne :
Code: [Select]
  CRGB ledColor = CRGB::Green; // Color used (in hex)
Tu trouveras la liste des couleurs ici (http://fastled.io/docs/3.1/pixeltypes_8h_source.html) à partir de la ligne 591. Si tu veux tester la couleur "Crimson", il suffit de changer la ligne en :
Code: [Select]
  CRGB ledColor = CRGB::Crimson; // Color used (in hex)

Pour changer la vitesse de défilement, il faut changer la valeur du delay à la ligne :
Code: [Select]
  delay(500); // <-- Vitesse d'affichage (à ajuster)Plus rapide : plus petit.


J'espère que ça va marcher : demain je ne pourrai rien faire avant le soir et ce n'est même pas sûr...
Title: Re: Horloge Géante
Post by: ASSM on Jul 26, 2018, 04:31 pm
Je vais tester cela ce soir et je te ferais un retour.

Pour mon cas si cela ne fonctionne pas je ne pourrais pas avant le 4 Aout un grand merci en attendant.

Je suis confiant pour que tout fonctionne.
Title: Re: Horloge Géante
Post by: lesept on Jul 26, 2018, 04:37 pm
Merci, moi je suis à moitié confiant, mais on croise les doigts.

Pour le Bluetooth, si tu es prêt à tester, voici une version qui prend en compte ce qu'on vient de faire :
Code: [Select]
/*
   Affichage d'un message déroulant vers la gauche en boucle
   sur une barre de 8 rubans de LEDs
   Les paramètres sont dans les #define : nombre de LEDs des rubans, taille
   max du message, espace entre chaque lettre, nombre d'espace à la fin
                       ----> LESEPT juillet 2018 <----
*/
#define NUM_LEDS 60    // Nombre de LEDs par ligne
#define TAILLE 100        // Nombre maximum de caractères à afficher
#define ESPACE 1          // Un pixel entre chaque lettre
#define PIXELS 5           // Nombre de pixels par lettre
#define FIN_MESSAGE 10 // Nombre de pixels à la fin du message

#include <SoftwareSerial.h>
SoftwareSerial Bluetooth(10, 11); // RX, TX
#include "FastLED.h"
#define COLOR_ORDER RGB // BRG // Color order
#define NumLignes 8
#define BRIGHTNESS 255
CRGB leds[NUM_LEDS];

char Message[TAILLE + 1] = "BONJOUR A TOUS !"; // Max 100 caractères à afficher
byte Texte[NUM_LEDS];     // Le texte affiché à chaque instant
byte Position = 0;
int MessLength = 0;
byte Largeur = 0;
boolean newData = false;

// A priori 7 lignes de LEDs suffisent avec cette définition de lettres
const uint8_t Font5x7[] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, //
  0x00, 0x00, 0xfa, 0x00, 0x00, // !
  0x00, 0xe0, 0x00, 0xe0, 0x00, // "
  0x28, 0xfe, 0x28, 0xfe, 0x28, // #
  0x24, 0x54, 0xfe, 0x54, 0x48, // $
  0xc4, 0xc8, 0x10, 0x26, 0x46, // %
  0x6c, 0x92, 0xaa, 0x44, 0x0a, // &
  0x00, 0xa0, 0xc0, 0x00, 0x00, // '
  0x00, 0x38, 0x44, 0x82, 0x00, // (
  0x00, 0x82, 0x44, 0x38, 0x00, // )
  0x10, 0x54, 0x38, 0x54, 0x10, // *
  0x10, 0x10, 0x7c, 0x10, 0x10, // +
  0x00, 0x0a, 0x0c, 0x00, 0x00, // ,
  0x10, 0x10, 0x10, 0x10, 0x10, // -
  0x00, 0x06, 0x06, 0x00, 0x00, // .
  0x04, 0x08, 0x10, 0x20, 0x40, // /
  0x7c, 0x8a, 0x92, 0xa2, 0x7c, // 0
  0x00, 0x42, 0xfe, 0x02, 0x00, // 1
  0x42, 0x86, 0x8a, 0x92, 0x62, // 2
  0x84, 0x82, 0xa2, 0xd2, 0x8c, // 3
  0x18, 0x28, 0x48, 0xfe, 0x08, // 4
  0xe4, 0xa2, 0xa2, 0xa2, 0x9c, // 5
  0x3c, 0x52, 0x92, 0x92, 0x0c, // 6
  0x80, 0x8e, 0x90, 0xa0, 0xc0, // 7
  0x6c, 0x92, 0x92, 0x92, 0x6c, // 8
  0x60, 0x92, 0x92, 0x94, 0x78, // 9
  0x00, 0x6c, 0x6c, 0x00, 0x00, // :
  0x00, 0x6a, 0x6c, 0x00, 0x00, // ;
  0x00, 0x10, 0x28, 0x44, 0x82, // <
  0x28, 0x28, 0x28, 0x28, 0x28, // =
  0x82, 0x44, 0x28, 0x10, 0x00, // >
  0x40, 0x80, 0x8a, 0x90, 0x60, // ?
  0x4c, 0x92, 0x9e, 0x82, 0x7c, // @
  0x7e, 0x88, 0x88, 0x88, 0x7e, // A
  0xfe, 0x92, 0x92, 0x92, 0x6c, // B
  0x7c, 0x82, 0x82, 0x82, 0x44, // C
  0xfe, 0x82, 0x82, 0x44, 0x38, // D
  0xfe, 0x92, 0x92, 0x92, 0x82, // E
  0xfe, 0x90, 0x90, 0x80, 0x80, // F
  0x7c, 0x82, 0x82, 0x8a, 0x4c, // G
  0xfe, 0x10, 0x10, 0x10, 0xfe, // H
  0x00, 0x82, 0xfe, 0x82, 0x00, // I
  0x04, 0x02, 0x82, 0xfc, 0x80, // J
  0xfe, 0x10, 0x28, 0x44, 0x82, // K
  0xfe, 0x02, 0x02, 0x02, 0x02, // L
  0xfe, 0x40, 0x20, 0x40, 0xfe, // M
  0xfe, 0x20, 0x10, 0x08, 0xfe, // N
  0x7c, 0x82, 0x82, 0x82, 0x7c, // O
  0xfe, 0x90, 0x90, 0x90, 0x60, // P
  0x7c, 0x82, 0x8a, 0x84, 0x7a, // Q
  0xfe, 0x90, 0x98, 0x94, 0x62, // R
  0x62, 0x92, 0x92, 0x92, 0x8c, // S
  0x80, 0x80, 0xfe, 0x80, 0x80, // T
  0xfc, 0x02, 0x02, 0x02, 0xfc, // U
  0xf8, 0x04, 0x02, 0x04, 0xf8, // V
  0xfe, 0x04, 0x18, 0x04, 0xfe, // W
  0xc6, 0x28, 0x10, 0x28, 0xc6, // X
  0xc0, 0x20, 0x1e, 0x20, 0xc0, // Y
  0x86, 0x8a, 0x92, 0xa2, 0xc2, // Z
  0x00, 0x00, 0xfe, 0x82, 0x82, // [
  0x40, 0x20, 0x10, 0x08, 0x04, // (backslash)
  0x82, 0x82, 0xfe, 0x00, 0x00, // ]
  0x20, 0x40, 0x80, 0x40, 0x20, // ^
  0x02, 0x02, 0x02, 0x02, 0x02, // _
  0x00, 0x80, 0x40, 0x20, 0x00, // `
  0x04, 0x2a, 0x2a, 0x2a, 0x1e, // a
  0xfe, 0x12, 0x22, 0x22, 0x1c, // b
  0x1c, 0x22, 0x22, 0x22, 0x04, // c
  0x1c, 0x22, 0x22, 0x12, 0xfe, // d
  0x1c, 0x2a, 0x2a, 0x2a, 0x18, // e
  0x10, 0x7e, 0x90, 0x80, 0x40, // f
  0x10, 0x28, 0x2a, 0x2a, 0x3c, // g
  0xfe, 0x10, 0x20, 0x20, 0x1e, // h
  0x00, 0x22, 0xbe, 0x02, 0x00, // i
  0x04, 0x02, 0x22, 0xbc, 0x00, // j
  0x00, 0xfe, 0x08, 0x14, 0x22, // k
  0x00, 0x82, 0xfe, 0x02, 0x00, // l
  0x3e, 0x20, 0x18, 0x20, 0x1e, // m
  0x3e, 0x10, 0x20, 0x20, 0x1e, // n
  0x1c, 0x22, 0x22, 0x22, 0x1c, // o
  0x3e, 0x28, 0x28, 0x28, 0x10, // p
  0x10, 0x28, 0x28, 0x18, 0x3e, // q
  0x3e, 0x10, 0x20, 0x20, 0x10, // r
  0x12, 0x2a, 0x2a, 0x2a, 0x04, // s
  0x20, 0xfc, 0x22, 0x02, 0x04, // t
  0x3c, 0x02, 0x02, 0x04, 0x3e, // u
  0x38, 0x04, 0x02, 0x04, 0x38, // v
  0x3c, 0x02, 0x0c, 0x02, 0x3c, // w
  0x22, 0x14, 0x08, 0x14, 0x22, // x
  0x30, 0x0a, 0x0a, 0x0a, 0x3c, // y
  0x22, 0x26, 0x2a, 0x32, 0x22, // z
  0x00, 0x10, 0x6c, 0x82, 0x00, // {
  0x00, 0x00, 0xfe, 0x00, 0x00, // |
  0x00, 0x82, 0x6c, 0x10, 0x00, // }
  0x10, 0x10, 0x54, 0x38, 0x10, // ~
  0x10, 0x38, 0x54, 0x10, 0x10, // 
};

void setup() {
  Serial.begin(115200);
  Bluetooth.begin(57600); // A configurer en AT sur le module HC-06
  // Les pins de commande vont de 2 à 9
  FastLED.addLeds<WS2811, 2, COLOR_ORDER>(leds, NUM_LEDS); // <-- C'est la ligne du haut !
  FastLED.addLeds<WS2811, 3, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 4, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 5, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 6, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 7, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 8, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 9, COLOR_ORDER>(leds, NUM_LEDS);
  Largeur = PIXELS + ESPACE;
  MessLength = strlen(Message) * Largeur + FIN_MESSAGE; // Nb de pixels total du message
}

void loop() {
  recvWithStartEndMarkers();
  ShowMessage();
}

void PrepareTexte() {
  byte PosLettre = Position % Largeur; // Position du pixel dans la première lettre
  for (int i = 0; i < NUM_LEDS; i++) {
    byte NumLettreAff = ((Position + i) % MessLength) / Largeur; // Numéro de la lettre à afficher
    byte PosLettreAff = (PosLettre + i % Largeur) % Largeur; // Position du pixel dans la lettre à afficher
    if (NumLettreAff >= sizeof(Message)) Texte[i] = 0; // Mettre > si on ne voit pas la dernière lettre
    else if (PosLettreAff >= PIXELS) Texte[i] = 0;
    else {
      byte RangLettre = Message[NumLettreAff] - 32; // Rang de la lettre dans le tableau
      byte Indice = RangLettre * PIXELS + PosLettreAff; // Colonne du tableau à afficher
      Texte[i] = pgm_read_byte(Font5x7 + Indice);
    }
  }
}

void AfficheTexte() {
  CRGB ledColor = CRGB::Green; // Color used (in hex)
  CRGB black = CRGB::Black;
  byte filtre[NumLignes] = {128, 64, 32, 16, 8, 4, 2, 1};
  for (byte i = 0; i < NumLignes; i++) {
    for (byte j = 0; j < NUM_LEDS; j++) {
      if ((Texte[j] & filtre[i]) != 0) {
        leds[j] = ledColor;
      } else {
        leds[j] = black;
      }
      // leds[j] = ((Texte[j] & filtre[i]) != 0) ? ledColor : black;
    }
    FastLED[i].showLeds(BRIGHTNESS);
  }
  delay(500); // <-- Vitesse d'affichage (à ajuster)
}

void recvWithStartEndMarkers() {
  static boolean recvInProgress = false;
  static byte ndx = 0;
  char startMarker = '[';
  char endMarker = ']';
  char rc;

  while (Bluetooth.available() > 0 && newData == false) {
    rc = Bluetooth.read();
    if (recvInProgress == true) {
      if (rc != endMarker) {
        Message[ndx] = rc;
        ndx++;
        if (ndx >= TAILLE + 1) {
          ndx = TAILLE;
        }
      }
      else {
        Message[ndx] = '\0'; // terminate the string
        recvInProgress = false;
        ndx = 0;
        newData = true;
      }
    }
    else if (rc == startMarker) recvInProgress = true;
  }
}

void ShowMessage () {
  PrepareTexte();
  AfficheTexte();
  Position = (Position + 1) % MessLength; // Position du pixel à gauche dans le message
}

Elle affiche "BONJOUR A TOUS !" en attendant que tu lui envoies un message depuis ton appli sur smartphone.

Je me suis dit que puisque tu te lances dans le contrôle de l'affichage via bluetooth, on pourrait aussi penser à contrôler les autres afficheurs : le chrono et le score (tu peux faire des boutons sur ton écran). Si ça te dit, on verra ça ensuite.

Bonnes vacances !
Title: Re: Horloge Géante
Post by: ASSM on Jul 26, 2018, 04:40 pm
Merci et Bonnes Vacances

Et cela serait génial de pouvoir tout contrôler par Bluetooth.

Je peux faire tout se que je veux avec l'application sur l'écran.
Title: Re: Horloge Géante
Post by: lesept on Jul 26, 2018, 04:41 pm
Comment ça marche pour l'instant avec tous tes afficheurs ? Tout est contrôlé avec un seul Arduino ou chaque afficheur (chrono, score, message) aura son propre Arduino ?
Title: Re: Horloge Géante
Post by: ASSM on Jul 26, 2018, 04:46 pm
Chaque Afficheur a son Arduino nano car en cas de panne cela évite d'avoir tout le panneau d'affichage HS.
Title: Re: Horloge Géante
Post by: lesept on Jul 26, 2018, 04:58 pm
Donc pour piloter chaque afficheur depuis le téléphone, il faudra :
Pour l'utilisateur ce sera transparent : il aura ses boutons, éventuellement organisés en onglets ou tous sur le même écran et le téléphone fera le tri de quoi envoyer à quel module (ça sera ton boulot, moi je ne connais pas MIT truc-chose). On peut imaginer de nouvelles fonctions : changer la couleur des afficheurs, etc.

A propos de couleur : dans les codes précédents, j'ai changé la ligne :
Code: [Select]
#define COLOR_ORDER BRG // Color orderen
Code: [Select]
#define COLOR_ORDER RGB // BRG // Color orderAvant c'était Blue - Red - Green, j'ai mis Red - Green - Blue (le codage habituel, qui semble fonctionner pour les LEDs WS2811 aussi). Si les couleurs déconnent, tu peux revenir au cas précédent.
Title: Re: Horloge Géante
Post by: ASSM on Jul 27, 2018, 08:11 am
Bonjour lesept

j'ai testé la version hier soir et elle ne fonctionne pas parfaitement.

Par contre il y a un très gros progrès les rubans leds affichent bien des caractères.je n'ai pas trop eu le temps d'approfondir la chose mais au retour de mes vacances je vais regarder de plus près pour savoir se que les rubans leds affichent comme caractères.

Pour ton message précédent c'est l'application APP MIT INVENTOR et je la maitrise donc sa ne devrais pas poser de problème pour pouvoir piloter l'ensemble en Bluetooth.

Nous sommes sur la bonne voie !!!!!!
Title: Re: Horloge Géante
Post by: lesept on Jul 27, 2018, 08:37 am
Cool! Bonnes vacances
Title: Re: Horloge Géante
Post by: ASSM on Aug 07, 2018, 12:34 pm
Bonjour lesept

j'ai testé le code et il fonctionne avec les lettres en majuscules (sauf le U) mais pas avec les lettres en minuscules.

il faut que je regarde la matrice de plus près mais nous sommes vraiment sur la bonne voie.
Title: Re: Horloge Géante
Post by: lesept on Aug 07, 2018, 02:08 pm
Bonjour
Les vacances se sont bien passées ?

Tu testes avec quelle version ? Celle du message 182 ? (sans le Bluetooth)
Il n'y a pas de raison que le U ne fonctionne pas ni les minuscules, ça doit venir d'autre chose. Tu n'as pas dépassé les 100 caractères ?

Pour tester essaye d'abord avec ABCDEFGHIJKLMNOPQRSTUVWXYZ ensuite avec abcdefghijklmnopqrstuvwxyz puis avec 0123456789/*-+.,;:!?<=>
et dis moi ce que ça donne
Title: Re: Horloge Géante
Post by: ASSM on Aug 07, 2018, 09:29 pm
Bonsoir

j'essaye bien avec cette version et j'ai juste essayé avec mon nom et mon prénom donc juste quelques caractères.

Demain j'essaye les caractères un par un et je te ferais un retour.

et bien sur les vacances se sont très très bien passé beaucoup de soleil.
Title: Re: Horloge Géante
Post by: ASSM on Aug 08, 2018, 10:11 am
Bonjour lesept

je viens de faire le test avec "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

C'est a partir de la lettre "S" jusqu'à "Z" que cela ne fonctionne pas correctement

J'ai fait l'essai en minuscule et aucune lettre ne fonctionne correctement.

J'ai fait le test "0123456789/*-+.,;:!?<=>" et la il n'y a aucun problème.
Title: Re: Horloge Géante
Post by: lesept on Aug 08, 2018, 10:17 am
OK, j'essaye de voir si c'est un problème de lettre ou de traitement : essaye "STUVWXYZ"
Si ça ne marche pas, il faut que tu me dises précisément ce que tu vois sur l'afficheur, ou poster une photo.
Title: Re: Horloge Géante
Post by: lesept on Aug 08, 2018, 10:34 am
Il y a peut-être une erreur dans la fonction PrepareTexte : change 'sizeof' par 'strlen' pour voir
Title: Re: Horloge Géante
Post by: ASSM on Aug 08, 2018, 10:43 am
j'ai remplacé 'sizeof' par 'strlen' mais rien ne change j'ai la meme chose
Title: Re: Horloge Géante
Post by: lesept on Aug 08, 2018, 11:47 am
OK, j'essaye de voir si c'est un problème de lettre ou de traitement : essaye "STUVWXYZ"
Si ça ne marche pas, il faut que tu me dises précisément ce que tu vois sur l'afficheur, ou poster une photo.
Title: Re: Horloge Géante
Post by: ASSM on Aug 08, 2018, 01:42 pm
je viens d'essayer "RSTUVWXYZ"


Le "R" s'affiche correctement lorsqu'il arrive complètement a gauche (sinon il y a un décalage de deux points dans la boucle du "R".

Regarde la photo jointe les autres lettres ne s'affichent pas du tout correctement.
Title: Re: Horloge Géante
Post by: lesept on Aug 08, 2018, 01:43 pm
Peux-tu me faire une photo pour "RSTUVWXYZ" et pour "ABCDEFGHIJ" par exemple, que je voie la différence ?
Title: Re: Horloge Géante
Post by: ASSM on Aug 08, 2018, 02:29 pm
Pour "RSTUVWXYZ" c'étais l'image de tout a l'heure et pour "ABCDEFGHIJ" la voici et comme je te disais jusqu'à la lettre "R3" cela ne pose aucun probleme.
Title: Re: Horloge Géante
Post by: ASSM on Aug 08, 2018, 02:32 pm
Avec ce programme trouvé sur le net tout fonctionne et je ne suis pas limité en caractères il manque juste a intégrer le module Bluetooth HC-06.

Aurais tu une idée.
Title: Re: Horloge Géante
Post by: lesept on Aug 08, 2018, 02:59 pm
Là, ça me dépasse : le code contient des choses en assembleur et écrit directement dans les LEDs sans passer par une bibli dédiée. L'important c'est que ça marche !

Voici une version qui devrait prendre en compte le bluetooth. Elle compile, mais je ne sais pas si elle fonctionne... Tu dois toujours mettre un '[' avant ton texte et un ']' après la fin du texte à afficher.
Title: Re: Horloge Géante
Post by: lesept on Aug 08, 2018, 04:07 pm
Je pars en vacances ce soir jusqu'à fin août, ce sera difficile de suivre le sujet parce je n'aurai pas toujours de bonnes conditions de connexion (pas toujours de wifi, téléphone portable).
Title: Re: Horloge Géante
Post by: ASSM on Aug 09, 2018, 07:13 pm
J'ai essayé mais cela n'envoi rien de mon application.

Par contre avec le fichier joint que je te mets j'arrive a afficher ce que je veux sur la console Arduino par mon application.

Je te souhaites de très bonne vacances.
Title: Re: Horloge Géante
Post by: lesept on Aug 09, 2018, 10:20 pm
Merci
Est ce que ça fonctionne comme tu veux ?
Title: Re: Horloge Géante
Post by: ASSM on Aug 10, 2018, 09:01 am
Bonjour lesept dans le post 203 lorsque j'envoi un message avec mon application les leds affichent ce qu'il y a dans le 'char Message[] =' mais pas se que j'écris dans mon application.

La ligne du bas du ruban leds n'affichent plus rien dans ce cas la.
Title: Re: Horloge Géante
Post by: ASSM on Aug 10, 2018, 05:30 pm
Me revoila avec de bonnes nouvelles

J'arrive a envoyer tout ce que je veux avec mon application mais seule un ruban n'affiche pas les caractères.

les rubans sont câblés de la façon suivante sur l'Arduino nano:

Ruban du haut : En D7
2ème Ruban : En D6
3ème Ruban : En D5
4ème Ruban : En D4
5ème Ruban : En D3
6ème Ruban : En D2
7ème Ruban : En TX1

C'est le ruban câblé en TX1 qui ne fonctionne pas il n'y a pas d'affichage et pourtant si je remet le code sans la partie Bluetooth il fonctionne correctement.

Aurais tu une idée ?
Title: Re: Horloge Géante
Post by: lesept on Aug 11, 2018, 08:20 am
Il y a peut être un conflit avec la maison série avec le PC ou avec le Bluetooth. Je suis sur mon téléphone portable, difficile de voir les pièces jointes
Title: Re: Horloge Géante
Post by: hbachetti on Aug 11, 2018, 09:23 am
Salut

TX1 est la ligne de transmission vers le convertisseur USB / série.
Ne rien brancher sur cette broche.
Où est branché ton module BT ?
Title: Re: Horloge Géante
Post by: ASSM on Aug 11, 2018, 09:45 am
Bonjour hbachetti

Mon module BT est branché sur les broches 10 et 11.
Title: Re: Horloge Géante
Post by: hbachetti on Aug 11, 2018, 09:57 am
OK, Je viens de voir ton lien HC06 (https://forum.arduino.cc/index.php?action=dlattach;topic=548770.0;attach=269772).
Je vois que tu utilises la sortie console :

Code: [Select]
                Serial.println("ENTER AT Commands:");


Si c'est bien le cas, tu devrais choisir une autre broche pour ton 7ème Ruban, en évitant TX1 et RX0.

@+
Title: Re: Horloge Géante
Post by: ASSM on Aug 11, 2018, 10:01 am
j'ai branché mon 7ème ruban sur une autre broche en évitant TX1 et RX0 mais cela ne fonctionne pas.
Title: Re: Horloge Géante
Post by: lesept on Aug 11, 2018, 10:56 pm
Si tu utilises le code trouvé sur internet, il faut le disséquer pour comprendre comment il adresse les leds, c'est peut-être lui qui pose problème ?
Title: Re: Horloge Géante
Post by: ASSM on Aug 13, 2018, 02:22 pm
Bonjour

Après recherche le code trouvé sur internet fait qu'il adresse les leds de façon binaire de D0 à D7 donc je suis obligé de passé par TX1 ou RX0.


Code: [Select]

#define PIXELS 4*96  // Number of pixels in the string. I am using 4 meters of 96LED/M

// These values depend on which pins your 8 strings are connected to and what board you are using
// More info on how to find these at http://www.arduino.cc/en/Reference/PortManipulation

// PORTD controls Digital Pins 0-7 on the Uno

// You'll need to look up the port/bit combination for other boards.

// Note that you could also include the DigitalWriteFast header file to not need to to this lookup.

#define PIXEL_PORT  PORTD  // Port of the pin the pixels are connected to
#define PIXEL_DDR   DDRD   // Port of the pin the pixels are connected to


static const uint8_t onBits = 0b11111111; // Bit pattern to write to port to turn on all pins connected to LED strips.



Je ne vois pas comment faire pour faire fonctionner cela.

Peut être un autre moyen?
Title: Re: Horloge Géante
Post by: lesept on Aug 14, 2018, 08:36 am
Est ce qu'on peut rerouter la console série habituelle sur d'autres broches avec la bibliothèque softwareserial ?
Code: [Select]
Serial SoftwareSerial(12,13);par exemple ?
Title: Re: Horloge Géante
Post by: hbachetti on Aug 14, 2018, 08:58 am
Salut.

Oui mais il te faudra un convertisseur USB / Série (https://fr.aliexpress.com/store/product/USB-TTL-Convertisseur-Adaptateur-FT232RL-Module-3-3-V-5-V/3092058_32890094205.html?spm=a2g0w.search0104.3.72.205b5094atvRRH&ws_ab_test=searchweb0_0%2Csearchweb201602_2_10152_10151_10065_10344_10068_10342_10343_10340_10341_5012517_10696_310_10084_10083_10618_10304_10307_10820_10821_10302_10843_10059_100031_5012617_10103_10624_10623_10622_10621_10620_526%2Csearchweb201603_13%2CppcSwitch_5&algo_expid=b45719c7-b71b-45d7-a528-963e55dfd1fe-10&algo_pvid=b45719c7-b71b-45d7-a528-963e55dfd1fe&transAbTest=ae803_1&priceBeautifyAB=0) pour pouvoir brancher ta ligne série sur le PC.

Quote
Après recherche le code trouvé sur internet fait qu'il adresse les leds de façon binaire de D0 à D7 donc je suis obligé de passé par TX1 ou RX0.
Le problème est qu'apparemment le logiciel que tu essaies de faire fonctionner manipule le PORTD en direct. Et sur une NANO il n'y a guère le choix. C'est le seul port complet que l'on puisse adresser de cette manière.

@+



Title: Re: Horloge Géante
Post by: ASSM on Aug 14, 2018, 09:58 pm
Est il possible avec une autre carte qu'une Arduino nano de ne pas avoir ce problème ?
Title: Re: Horloge Géante
Post by: hbachetti on Aug 14, 2018, 10:14 pm
Non, même avec une MEGA, possédant 4 liaisons série, le convertisseur USB / Série est obligatoire si tu veux dialoguer sur un autre port série que le port USB servant au téléversement / console.

Sinon, il faudrait que la carte possède plusieurs ports USB. Perso je n'en connais pas.

 @+
Title: Re: Horloge Géante
Post by: ASSM on Aug 14, 2018, 10:59 pm
Le code utilise simplement le PortD sur 8 bits ne serait il pas possible d'utiliser 4 bits du PortD et 4 bits du PortB pour pouvoir laisser libre TX1 et RX0 ?
Title: Re: Horloge Géante
Post by: hbachetti on Aug 14, 2018, 11:16 pm
Bien évidemment mais il faut modifier le code en conséquence.
Title: Re: Horloge Géante
Post by: ASSM on Aug 15, 2018, 12:28 pm
Bonjour

Je viens de reprendre ce code la de lesept et les lettres en majuscule a partir du 'S' au 'Z' ne fonctionne pas et aucune lettre en minuscle.

Quelqu'un aurait une idée ?


Code: [Select]

/*
   Affichage d'un message déroulant vers la gauche en boucle
   sur une barre de 8 rubans de LEDs
   Les paramètres sont dans les #define : nombre de LEDs des rubans, taille
   max du message, espace entre chaque lettre, nombre d'espace à la fin
                       ----> LESEPT juillet 2018 <----
*/
#define NUM_LEDS 30    // Nombre de LEDs par ligne
#define TAILLE 100     // Nombre maximum de caractères à afficher
#define ESPACE 1       // Un pixel entre chaque lettre
#define PIXELS 5       // Nombre de pixels par lettre
#define FIN_MESSAGE 10 // Nombre de pixels à la fin du message

#include "FastLED.h"
#define COLOR_ORDER BRG // Color order
//#define COLOR_ORDER RGB // BRG // Color order
#define NumLignes 8
#define BRIGHTNESS 255
CRGB leds[NUM_LEDS];

char Message[TAILLE + 1] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // Max 100 caractères à afficher
uint8_t Texte[NUM_LEDS];   //
byte Position = 0;
byte MessLength = 0;
byte Largeur = 0;

// A priori 7 lignes de LEDs suffisent avec cette définition de lettres
const uint8_t Font5x7[] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, //
  0x00, 0x00, 0xfa, 0x00, 0x00, // !
  0x00, 0xe0, 0x00, 0xe0, 0x00, // "
  0x28, 0xfe, 0x28, 0xfe, 0x28, // #
  0x24, 0x54, 0xfe, 0x54, 0x48, // $
  0xc4, 0xc8, 0x10, 0x26, 0x46, // %
  0x6c, 0x92, 0xaa, 0x44, 0x0a, // &
  0x00, 0xa0, 0xc0, 0x00, 0x00, // '
  0x00, 0x38, 0x44, 0x82, 0x00, // (
  0x00, 0x82, 0x44, 0x38, 0x00, // )
  0x10, 0x54, 0x38, 0x54, 0x10, // *
  0x10, 0x10, 0x7c, 0x10, 0x10, // +
  0x00, 0x0a, 0x0c, 0x00, 0x00, // ,
  0x10, 0x10, 0x10, 0x10, 0x10, // -
  0x00, 0x06, 0x06, 0x00, 0x00, // .
  0x04, 0x08, 0x10, 0x20, 0x40, // /
  0x7c, 0x8a, 0x92, 0xa2, 0x7c, // 0
  0x00, 0x42, 0xfe, 0x02, 0x00, // 1
  0x42, 0x86, 0x8a, 0x92, 0x62, // 2
  0x84, 0x82, 0xa2, 0xd2, 0x8c, // 3
  0x18, 0x28, 0x48, 0xfe, 0x08, // 4
  0xe4, 0xa2, 0xa2, 0xa2, 0x9c, // 5
  0x3c, 0x52, 0x92, 0x92, 0x0c, // 6
  0x80, 0x8e, 0x90, 0xa0, 0xc0, // 7
  0x6c, 0x92, 0x92, 0x92, 0x6c, // 8
  0x60, 0x92, 0x92, 0x94, 0x78, // 9
  0x00, 0x6c, 0x6c, 0x00, 0x00, // :
  0x00, 0x6a, 0x6c, 0x00, 0x00, // ;
  0x00, 0x10, 0x28, 0x44, 0x82, // <
  0x28, 0x28, 0x28, 0x28, 0x28, // =
  0x82, 0x44, 0x28, 0x10, 0x00, // >
  0x40, 0x80, 0x8a, 0x90, 0x60, // ?
  0x4c, 0x92, 0x9e, 0x82, 0x7c, // @
  0x7e, 0x88, 0x88, 0x88, 0x7e, // A
  0xfe, 0x92, 0x92, 0x92, 0x6c, // B
  0x7c, 0x82, 0x82, 0x82, 0x44, // C
  0xfe, 0x82, 0x82, 0x44, 0x38, // D
  0xfe, 0x92, 0x92, 0x92, 0x82, // E
  0xfe, 0x90, 0x90, 0x80, 0x80, // F
  0x7c, 0x82, 0x82, 0x8a, 0x4c, // G
  0xfe, 0x10, 0x10, 0x10, 0xfe, // H
  0x00, 0x82, 0xfe, 0x82, 0x00, // I
  0x04, 0x02, 0x82, 0xfc, 0x80, // J
  0xfe, 0x10, 0x28, 0x44, 0x82, // K
  0xfe, 0x02, 0x02, 0x02, 0x02, // L
  0xfe, 0x40, 0x20, 0x40, 0xfe, // M
  0xfe, 0x20, 0x10, 0x08, 0xfe, // N
  0x7c, 0x82, 0x82, 0x82, 0x7c, // O
  0xfe, 0x90, 0x90, 0x90, 0x60, // P
  0x7c, 0x82, 0x8a, 0x84, 0x7a, // Q
  0xfe, 0x90, 0x98, 0x94, 0x62, // R
  0x62, 0x92, 0x92, 0x92, 0x8c, // S
  0x80, 0x80, 0xfe, 0x80, 0x80, // T
  0xfc, 0x02, 0x02, 0x02, 0xfc, // U
  0xf8, 0x04, 0x02, 0x04, 0xf8, // V
  0xfe, 0x04, 0x18, 0x04, 0xfe, // W
  0xc6, 0x28, 0x10, 0x28, 0xc6, // X
  0xc0, 0x20, 0x1e, 0x20, 0xc0, // Y
  0x86, 0x8a, 0x92, 0xa2, 0xc2, // Z
  0x00, 0x00, 0xfe, 0x82, 0x82, // [
  0x40, 0x20, 0x10, 0x08, 0x04, // (backslash)
  0x82, 0x82, 0xfe, 0x00, 0x00, // ]
  0x20, 0x40, 0x80, 0x40, 0x20, // ^
  0x02, 0x02, 0x02, 0x02, 0x02, // _
  0x00, 0x80, 0x40, 0x20, 0x00, // `
  0x04, 0x2a, 0x2a, 0x2a, 0x1e, // a
  0xfe, 0x12, 0x22, 0x22, 0x1c, // b
  0x1c, 0x22, 0x22, 0x22, 0x04, // c
  0x1c, 0x22, 0x22, 0x12, 0xfe, // d
  0x1c, 0x2a, 0x2a, 0x2a, 0x18, // e
  0x10, 0x7e, 0x90, 0x80, 0x40, // f
  0x10, 0x28, 0x2a, 0x2a, 0x3c, // g
  0xfe, 0x10, 0x20, 0x20, 0x1e, // h
  0x00, 0x22, 0xbe, 0x02, 0x00, // i
  0x04, 0x02, 0x22, 0xbc, 0x00, // j
  0x00, 0xfe, 0x08, 0x14, 0x22, // k
  0x00, 0x82, 0xfe, 0x02, 0x00, // l
  0x3e, 0x20, 0x18, 0x20, 0x1e, // m
  0x3e, 0x10, 0x20, 0x20, 0x1e, // n
  0x1c, 0x22, 0x22, 0x22, 0x1c, // o
  0x3e, 0x28, 0x28, 0x28, 0x10, // p
  0x10, 0x28, 0x28, 0x18, 0x3e, // q
  0x3e, 0x10, 0x20, 0x20, 0x10, // r
  0x12, 0x2a, 0x2a, 0x2a, 0x04, // s
  0x20, 0xfc, 0x22, 0x02, 0x04, // t
  0x3c, 0x02, 0x02, 0x04, 0x3e, // u
  0x38, 0x04, 0x02, 0x04, 0x38, // v
  0x3c, 0x02, 0x0c, 0x02, 0x3c, // w
  0x22, 0x14, 0x08, 0x14, 0x22, // x
  0x30, 0x0a, 0x0a, 0x0a, 0x3c, // y
  0x22, 0x26, 0x2a, 0x32, 0x22, // z
  0x00, 0x10, 0x6c, 0x82, 0x00, // {
  0x00, 0x00, 0xfe, 0x00, 0x00, // |
  0x00, 0x82, 0x6c, 0x10, 0x00, // }
  0x10, 0x10, 0x54, 0x38, 0x10, // ~
  0x10, 0x38, 0x54, 0x10, 0x10, // 
};

void setup() {
  Serial.begin(115200);
  // Les pins de commande vont de 2 à 9
  FastLED.addLeds<WS2811, 2, COLOR_ORDER>(leds, NUM_LEDS); // <-- C'est la ligne du haut !
  FastLED.addLeds<WS2811, 3, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 4, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 5, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 6, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 7, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 8, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.addLeds<WS2811, 9, COLOR_ORDER>(leds, NUM_LEDS);
  Largeur = PIXELS + ESPACE;
  MessLength = strlen(Message) * Largeur + FIN_MESSAGE; // Nb de pixels total du message  Serial.print("Taille totale message : ");
}

void loop() {
  PrepareTexte();
  AfficheTexte();
  Position = (Position + 1) % MessLength; // Position du pixel à gauche dans le message
}

void PrepareTexte() {
  byte PosLettre = Position % Largeur; // Position du pixel dans la première lettre
  for (byte i = 0; i < NUM_LEDS; i++) {
    byte NumLettreAff = ((Position + i) % MessLength) / Largeur; // Numéro de la lettre à afficher
    byte PosLettreAff = (PosLettre + i % Largeur) % Largeur; // Position du pixel dans la lettre à afficher
    if (NumLettreAff >= strlen(Message)) Texte[i] = 0; // Mettre > si on ne voit pas la dernière lettre
    else if (PosLettreAff >= PIXELS) Texte[i] = 0;
    else {
      byte RangLettre = Message[NumLettreAff] - 32; // Rang de la lettre dans le tableau
      byte Indice = RangLettre * PIXELS + PosLettreAff; // Colonne du tableau à afficher
      Texte[i] = pgm_read_byte(Font5x7 + Indice);
    }
  }
}

void AfficheTexte() {
  CRGB ledColor = CRGB::Red; // Color used (in hex)
  CRGB black = CRGB::Black;
  byte filtre[NumLignes] = {128, 64, 32, 16, 8, 4, 2, 1};
  for (byte i = 0; i < NumLignes; i++) {
    for (byte j = 0; j < NUM_LEDS; j++) {
      if ((Texte[j] & filtre[i]) != 0) {
        leds[j] = ledColor;
      } else {
        leds[j] = black;
      }
      // leds[j] = ((Texte[j] & filtre[i]) != 0) ? ledColor : black;
    }
    FastLED[i].showLeds(BRIGHTNESS);
  }
  delay(200); // <-- Vitesse d'affichage (à ajuster)
}
Title: Re: Horloge Géante
Post by: ASSM on Aug 15, 2018, 09:43 pm
Personne a une petite idée ?
Title: Re: Horloge Géante
Post by: ASSM on Aug 15, 2018, 10:41 pm
Bonsoir hbachetti

Comment dois je faire pour utiliser le convertisseur USB / SERIE par rapport a ta réponse du post 217.


Merci d'avance
Title: Re: Horloge Géante
Post by: hbachetti on Aug 15, 2018, 11:07 pm
Tu branches le RX du convertisseur sur le TX de l'ARDUINO, le TX du convertisseur sur le RX de l'ARDUINO, le GND sur le GND,
l'USB sur le PC.
Ensuite dans ton gestionnaire de périphériques tu dois voir apparaître un nouveau port série.
S'il n'apparaît pas c'est que ton Windows n'a pas le driver, et tu poses à nouveau une question.

@+
Title: Re: Horloge Géante
Post by: lesept on Aug 16, 2018, 10:58 am
Bonjour

Je viens de reprendre ce code la de lesept et les lettres en majuscule a partir du 'S' au 'Z' ne fonctionne pas et aucune lettre en minuscle.

Quelqu'un aurait une idée ?
Bonjour
l'erreur doit se trouver dans la fonction suivante :
Code: [Select]
void PrepareTexte() {
  byte PosLettre = Position % Largeur; // Position du pixel dans la première lettre
  for (byte i = 0; i < NUM_LEDS; i++) {
    byte NumLettreAff = ((Position + i) % MessLength) / Largeur; // Numéro de la lettre à afficher
    byte PosLettreAff = (PosLettre + i % Largeur) % Largeur; // Position du pixel dans la lettre à afficher
    if (NumLettreAff >= strlen(Message)) Texte[i] = 0; // Mettre > si on ne voit pas la dernière lettre
    else if (PosLettreAff >= PIXELS) Texte[i] = 0;
    else {
      byte RangLettre = Message[NumLettreAff] - 32; // Rang de la lettre dans le tableau
      byte Indice = RangLettre * PIXELS + PosLettreAff; // Colonne du tableau à afficher
      Texte[i] = pgm_read_byte(Font5x7 + Indice);
    }
  }
}

Le tableau des lettres doit être correct puisqu'il vient d'internet et a déjà été utilisé moultes fois...
Title: Re: Horloge Géante
Post by: ASSM on Aug 16, 2018, 12:05 pm
Bonjour lesept

J'essaye de trouver l'erreur mais je ne suis pas assez doué en programmation pour la trouver.
Title: Re: Horloge Géante
Post by: lesept on Aug 16, 2018, 02:35 pm
Essaye de remplacer cette ligne
Code: [Select]
    byte PosLettreAff = (PosLettre + i % Largeur) % Largeur; // Position du pixel dans la lettre à afficherpar celle-ci
Code: [Select]
    byte PosLettreAff = (PosLettre + i % PIXELS) % PIXELS; // Position du pixel dans la lettre à afficher
Title: Re: Horloge Géante
Post by: ASSM on Aug 16, 2018, 03:27 pm
J'ai remplacé le code mais c'est pire les lettres qui fonctionnaient sont dégradées.
Title: Re: Horloge Géante
Post by: lesept on Aug 16, 2018, 06:45 pm
Bon, on va essayer de comprendre ce qui ne va pas. Tu prends le texte "STUVWXYZ" par exemple.
Règle la console sur 115200, change le code de la fonction preparetexte par celui-ci
Code: [Select]
void PrepareTexte() {
  byte PosLettre = Position % Largeur; // Position du pixel dans la première lettre
  for (byte i = 0; i < NUM_LEDS; i++) {
    byte NumLettreAff = ((Position + i) % MessLength) / Largeur; // Numéro de la lettre à afficher
    byte PosLettreAff = (PosLettre + i % Largeur) % Largeur; // Position du pixel dans la lettre à afficher
    if (NumLettreAff >= strlen(Message)) Texte[i] = 0; // Mettre > si on ne voit pas la dernière lettre
    else if (PosLettreAff >= PIXELS) Texte[i] = 0;
    else {
      byte RangLettre = Message[NumLettreAff] - 32; // Rang de la lettre dans le tableau
      byte Indice = RangLettre * PIXELS + PosLettreAff; // Colonne du tableau à afficher
      Texte[i] = pgm_read_byte(Font5x7 + Indice);
      Serial.print (" "); Serial.print (Texte[i], HEX);
    }
  }
  Serial.println(" ");
}
et copie ce qui apparaît dans la console (entre balises CODE).
Title: Re: Horloge Géante
Post by: ASSM on Aug 16, 2018, 08:00 pm
Voici l'affichage de la console

Code: [Select]

62 0 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 28 24 54 FE 54
 0 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 28 24 54 FE 54 48
 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 28 24 54 FE 54 48 C4
 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8
 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10
 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26
 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26
 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26 46
 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26 46 6C
 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92
 0 0 0 E0 0 E0 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA
 0 0 E0 0 E0 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44
 0 0 E0 0 E0 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44
 0 E0 0 E0 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44 A
 E0 0 E0 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44 A 0
 0 E0 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44 A 0 A0
 E0 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44 A 0 A0 C0
 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44 A 0 A0 C0 0
 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44 A 0 A0 C0 0
 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44 A 0 A0 C0 0
 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44 A 0 A0 C0 0
 28 FE 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44 A 0 A0 C0 0
 FE 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44 A 0 A0 C0 0
 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44 A 0 A0 C0 0
 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44 A 0 A0 C0 0
 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44 A 0 A0 C0 0
 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44 A 0 A0 C0 0
 FE 54 48 C4 C8 10 26 46 6C 92 AA 44 A 0 A0 C0 0
 54 48 C4 C8 10 26 46 6C 92 AA 44 A 0 A0 C0 0
 48 C4 C8 10 26 46 6C 92 AA 44 A 0 A0 C0 0 0
 48 C4 C8 10 26 46 6C 92 AA 44 A 0 A0 C0 0 0
 C4 C8 10 26 46 6C 92 AA 44 A 0 A0 C0 0 0 62
 C8 10 26 46 6C 92 AA 44 A 0 A0 C0 0 0 62 0
 10 26 46 6C 92 AA 44 A 0 A0 C0 0 0 62 0 0
 26 46 6C 92 AA 44 A 0 A0 C0 0 0 62 0 0 0
 46 6C 92 AA 44 A 0 A0 C0 0 0 62 0 0 0 0
 46 6C 92 AA 44 A 0 A0 C0 0 0 62 0 0 0 0
 6C 92 AA 44 A 0 A0 C0 0 0 62 0 0 0 0 0
 92 AA 44 A 0 A0 C0 0 0 62 0 0 0 0 0 0
 AA 44 A 0 A0 C0 0 0 62 0 0 0 0 0 0 0
 44 A 0 A0 C0 0 0 62 0 0 0 0 0 0 0 FA
 A 0 A0 C0 0 0 62 0 0 0 0 0 0 0 FA E0
 A 0 A0 C0 0 0 62 0 0 0 0 0 0 0 FA E0
 0 A0 C0 0 0 62 0 0 0 0 0 0 0 FA E0 0
 A0 C0 0 0 62 0 0 0 0 0 0 0 FA E0 0 0
 C0 0 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0
 0 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0 0
 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0 0 FE
 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0 0 FE
 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0 0 FE 0
 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0 0 FE 0 28
 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0 0 FE 0 28 FE
 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0 0 FE 0 28 FE 28
 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0 0 FE 0 28 FE 28 54
 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0 0 FE 0 28 FE 28 54
 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0 0 FE 0 28 FE 28 54 28
 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0 0 FE 0 28 FE 28 54 28 24
 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0 0 FE 0 28 FE 28 54 28 24 54
 62 0 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 28 24 54 FE 54
 0 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 28 24 54 FE 54 48
 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 28 24 54 FE 54 48 C4
 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8
 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10
 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26
 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26
 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26 46
 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26 46 6C
 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92
 0 0 0 E0 0 E0 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA
 0 0 E0 0 E0 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44
 0 0 E0 0 E0 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44
 0 E0 0 E0 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44 A
 E0 0 E0 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44 A 0
 0 E0 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44 A 0 A0
 E0 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44 A 0 A0 C0
 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44 A 0 A0 C0 0
 0 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44 A 0 A0 C0 0
 28 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44 A 0 A0 C0 0
 FE 28 FE 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44 A 0 A0 C0 0
 28 FE 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44 A 0 A0 C0 0
 FE 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44 A 0 A0 C0 0
 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44 A 0 A0 C0 0
 28 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44 A 0 A0 C0 0
 24 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44 A 0 A0 C0 0
 54 FE 54 48 C4 C8 10 26 46 6C 92 AA 44 A 0 A0 C0 0
 FE 54 48 C4 C8 10 26 46 6C 92 AA 44 A 0 A0 C0 0
 54 48 C4 C8 10 26 46 6C 92 AA 44 A 0 A0 C0 0
Title: Re: Horloge Géante
Post by: lesept on Aug 16, 2018, 10:25 pm
OK, le 62 est correct - premier code du S - puis le reste est n'importe quoi. Peux-tu faire pareil avec le message "RSTUV" pour voir si le R est correct ?
Title: Re: Horloge Géante
Post by: ASSM on Aug 17, 2018, 10:07 am
Bonjour lesept

Voici l'affichage de la console avec 'RSTUV'
Code: [Select]

FE 90 98 94 62 62 0 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 90 98 94 62 62 0 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 98 94 62 62 0 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 94 62 62 0 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 62 62 0 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 62 0 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 62 0 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 0 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 62
 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 62
 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 62 FE
 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 62 FE 90
 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 62 FE 90 98
 0 0 0 E0 0 E0 0 28 FE 28 FE 62 FE 90 98 94
 0 0 E0 0 E0 0 28 FE 28 FE 62 FE 90 98 94 0
 0 0 E0 0 E0 0 28 FE 28 FE 62 FE 90 98 94 0
 0 E0 0 E0 0 28 FE 28 FE 62 FE 90 98 94 0 62
 E0 0 E0 0 28 FE 28 FE 62 FE 90 98 94 0 62 0
 0 E0 0 28 FE 28 FE 62 FE 90 98 94 0 62 0 0
 E0 0 28 FE 28 FE 62 FE 90 98 94 0 62 0 0 0
 0 28 FE 28 FE 62 FE 90 98 94 0 62 0 0 0 0
 0 28 FE 28 FE 62 FE 90 98 94 0 62 0 0 0 0
 28 FE 28 FE 62 FE 90 98 94 0 62 0 0 0 0 0
 FE 28 FE 62 FE 90 98 94 0 62 0 0 0 0 0 0
 28 FE 62 FE 90 98 94 0 62 0 0 0 0 0 0 0
 FE 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0 0
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0 0 0
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0 0
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0 0 FE
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0 0 FE
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0 0 FE 0
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0 0 FE 0 28
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0 0 FE 0 28 FE
 FE 90 98 94 62 62 0 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 90 98 94 62 62 0 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 98 94 62 62 0 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 94 62 62 0 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 62 62 0 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 62 0 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 62 0 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 0 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 62
 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 62
 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 62 FE
 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 62 FE 90
 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 62 FE 90 98
 0 0 0 E0 0 E0 0 28 FE 28 FE 62 FE 90 98 94
 0 0 E0 0 E0 0 28 FE 28 FE 62 FE 90 98 94 0
 0 0 E0 0 E0 0 28 FE 28 FE 62 FE 90 98 94 0
 0 E0 0 E0 0 28 FE 28 FE 62 FE 90 98 94 0 62
 E0 0 E0 0 28 FE 28 FE 62 FE 90 98 94 0 62 0
 0 E0 0 28 FE 28 FE 62 FE 90 98 94 0 62 0 0
 E0 0 28 FE 28 FE 62 FE 90 98 94 0 62 0 0 0
 0 28 FE 28 FE 62 FE 90 98 94 0 62 0 0 0 0
 0 28 FE 28 FE 62 FE 90 98 94 0 62 0 0 0 0
 28 FE 28 FE 62 FE 90 98 94 0 62 0 0 0 0 0
 FE 28 FE 62 FE 90 98 94 0 62 0 0 0 0 0 0
 28 FE 62 FE 90 98 94 0 62 0 0 0 0 0 0 0
 FE 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0 0
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0 0 0
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0 0
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0 0 FE
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0 0 FE
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0 0 FE 0
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0 0 FE 0 28
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0 0 FE 0 28 FE
 FE 90 98 94 62 62 0 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 90 98 94 62 62 0 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 98 94 62 62 0 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 94 62 62 0 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 62 62 0 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 62 0 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 62 0 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 0 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 62
 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 62
 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 62 FE
 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 62 FE 90
 FA 0 0 0 E0 0 E0 0 28 FE 28 FE 62 FE 90 98
 0 0 0 E0 0 E0 0 28 FE 28 FE 62 FE 90 98 94
 0 0 E0 0 E0 0 28 FE 28 FE 62 FE 90 98 94 0
 0 0 E0 0 E0 0 28 FE 28 FE 62 FE 90 98 94 0
 0 E0 0 E0 0 28 FE 28 FE 62 FE 90 98 94 0 62
 E0 0 E0 0 28 FE 28 FE 62 FE 90 98 94 0 62 0
 0 E0 0 28 FE 28 FE 62 FE 90 98 94 0 62 0 0
 E0 0 28 FE 28 FE 62 FE 90 98 94 0 62 0 0 0
 0 28 FE 28 FE 62 FE 90 98 94 0 62 0 0 0 0
 0 28 FE 28 FE 62 FE 90 98 94 0 62 0 0 0 0
 28 FE 28 FE 62 FE 90 98 94 0 62 0 0 0 0 0
 FE 28 FE 62 FE 90 98 94 0 62 0 0 0 0 0 0
 28 FE 62 FE 90 98 94 0 62 0 0 0 0 0 0 0
 FE 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0 0
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0 0 0
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0 0
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0 0 FE
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0 0 FE
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0 0 FE 0
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0 0 FE 0 28
 62 FE 90 98 94 0 62 0 0 0 0 0 0 0 FA E0 0 0 E0 0 FE 0 28 FE
 FE 90 98 94 62 62 0 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
 90 98 94 62 62 0 0 0 0 0 0 0 FA 0 0 0 E0 0 E0 0 28 FE 28 FE
Title: Re: Horloge Géante
Post by: ASSM on Aug 17, 2018, 11:29 am
Bonjour lesept

j'ai changé ma façon de procéder et j'ai câblé mes rubans leds comme une matrice de 64x8 en zigzag.

j'utilise le code en pièce jointe qui fonctionne parfaitement il ne reste plus la partie Bluetooth a insérer peut tu m'aider sur ce point la ?
Title: Re: Horloge Géante
Post by: lesept on Aug 17, 2018, 01:03 pm
Avant ça, peux-tu essayer de tester cette version de la fonction preparetexte avec des int à la place des byte :
Code: [Select]
void PrepareTexte() {
  int PosLettre = Position % Largeur; // Position du pixel dans la première lettre
  for (byte i = 0; i < NUM_LEDS; i++) {
    int NumLettreAff = ((Position + i) % MessLength) / Largeur; // Numéro de la lettre à afficher
    int PosLettreAff = (PosLettre + i % Largeur) % Largeur; // Position du pixel dans la lettre à afficher
    if (NumLettreAff >= strlen(Message)) Texte[i] = 0; // Mettre > si on ne voit pas la dernière lettre
    else if (PosLettreAff >= PIXELS) Texte[i] = 0;
    else {
      int RangLettre = Message[NumLettreAff] - 32; // Rang de la lettre dans le tableau
      int Indice = RangLettre * PIXELS + PosLettreAff; // Colonne du tableau à afficher
      Texte[i] = pgm_read_byte(Font5x7 + Indice);
      Serial.print (" "); Serial.print (Texte[i], HEX);
    }
  }
  Serial.println(" ");
}
Title: Re: Horloge Géante
Post by: ASSM on Aug 17, 2018, 02:35 pm
Je ne vais pas pouvoir tester pour l'instant car j'ai soudé les rubans led en forme de matrice.

je pourrais tester ta dernière version que mi-septembre le temps d'avoir d'autres rubans leds.
Title: Re: Horloge Géante
Post by: ASSM on Aug 17, 2018, 03:25 pm
Lesept

J'ai réussi a alléger complètement mon code en ajoutant les commentaires il ne reste plus que le module Bluetooth a intégrer.

Pourrais je avoir ton avis ?

Code: [Select]

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>

int matrixW = 32;  // Largeur de la matrice
int matrixH = 8;   // Hauteur de la matrice
#define PIN 3      // N° Broche Branché à l'arduino

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(matrixW, matrixH, PIN,
                            NEO_MATRIX_TOP     + NEO_MATRIX_LEFT +
                            NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
                            NEO_GRB            + NEO_KHZ800);

const uint16_t colors[] = {
  matrix.Color(0, 0, 255), }; // Couleur de la matrice(Bleu)

void setup() {
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(255);
  matrix.setTextColor(colors[0]);
}
int x    = matrix.width();
int pass = 0;

void loop() {
matrix.fillScreen(0);
matrix.setCursor(x, 0);
 matrix.print(F("Philippe"));  // Texte à définir
 if(--x < -50) {               // Valeur d'attente entre deux messages(5 secondes)
    x = matrix.width();
    if(++pass >= 1) pass = 0;
    matrix.setTextColor(colors[pass]);
  }
  matrix.show();
  delay(100);                 // Vitesse du texte
}

Title: Re: Horloge Géante
Post by: lesept on Aug 17, 2018, 04:45 pm
Je vais tacher de regarder. C'est pas facile car je suis en vacances dans un endroit avec une très faible connectivite
Title: Re: Horloge Géante
Post by: ASSM on Aug 17, 2018, 04:47 pm
Voici ma version finale sans le Bluetooth j'avais oublié de prendre en compte la longueur du texte.
Code: [Select]

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>

int matrixW = 32; // Largeur de la matrice
int matrixH = 8; // Hauteur de la matrice
#define PIN 3 // N° Broche Branché à l'arduino

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(matrixW, matrixH, PIN,
                            NEO_MATRIX_TOP     + NEO_MATRIX_LEFT +
                            NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
                            NEO_GRB            + NEO_KHZ800);

const uint16_t colors[] = {
matrix.Color(0, 0, 255), }; // Couleur de la matrice(Bleu)choisir une ou plusieurs couleurs

#define arr_len( x )  ( sizeof( x ) / sizeof( *x ) ) // Calcul de la taille du message

int pixelPerChar = 6; // Charactères Standart est 8X6 Pixels
int x = matrix.width(); // Largeur de l'affichage
int pass = 0; // Compteur
int i = 0; // Compteur
int clr = 0; // Compteur d'indexation pour les couleurs

void setup() {
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(255);
  matrix.setTextColor(colors[0]);
}

void loop() {
  int arrSize = arr_len( colors );
  char exampleText[] = "Bienvenue a l'ASSM.Ou sont nos arbitres : Philippe Gueffet arbitre sur le 1er tour de la Coupe de France a Noirmoutier (D3) contre Beauvoir Sur Mer (D2)!!!!!!"; // Choix du texte
  writeText(exampleText);
  delay(1000);

}

/* --------------------  FUNCTION  --------------------  */
void writeText(String msg) {
  int arrSize = arr_len( colors ); // Tableau des couleurs du texte
  int msgSize = (msg.length() * pixelPerChar) + (2 * pixelPerChar); // Calcul de la longueur du message
  int scrollingMax = (msgSize) + matrix.width(); // Ajustement pour la longueur du message

  x = matrix.width(); // Position du curseur et du message a l'extreme droite
  clr = 0; // RAZ de la couleur

  while (clr <= arrSize) {
    /* Changement de la couleur a la fin du message */
  matrix.setTextColor(colors[0]);// Mettre clr a la place de 0 pour la couleur suivante
  matrix.fillScreen(0); // Ecran en entier;
  matrix.setCursor(x, 0); // Définir le point de départ pour la chaîne de texte
  matrix.print(msg); // Définir la chaîne de message

    /* DÉFILEZ LE TEXTE DE GAUCHE À DROITE EN DÉPLACANT LA POSITION DU CURSEUR */
  if (--x < -scrollingMax ) {
      /*  Ajustement de la longueur du message  */
     x = matrix.width();
     ++clr;
    }
    matrix.show();
    delay(100); // Vitesse de défilement du message
  }

}
Title: Re: Horloge Géante
Post by: lesept on Aug 17, 2018, 07:20 pm
Voici une version à  tester :
Code: [Select]

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#include <SoftwareSerial.h>
SoftwareSerial Bluetooth(10, 11); // RX, TX

int matrixW = 32; // Largeur de la matrice
int matrixH = 8; // Hauteur de la matrice
#define PIN 3 // N° Broche Branché à l'arduino

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(matrixW, matrixH, PIN,
                            NEO_MATRIX_TOP     + NEO_MATRIX_LEFT +
                            NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
                            NEO_GRB            + NEO_KHZ800);

const uint16_t colors[] = {
  matrix.Color(0, 0, 255),
}; // Couleur de la matrice(Bleu) choisir une ou plusieurs couleurs

#define arr_len( x )  ( sizeof( x ) / sizeof( *x ) ) // Calcul de la taille du message

int pixelPerChar = 6; // Charactères Standart est 8X6 Pixels
int x = matrix.width(); // Largeur de l'affichage
int pass = 0; // Compteur
int i = 0; // Compteur
int clr = 0; // Compteur d'indexation pour les couleurs
boolean newData = false;
char Message[];

void setup() {
  Serial.begin(115200);
  Bluetooth.begin(57600); // A configurer en AT sur le module HC-06
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(255);
  matrix.setTextColor(colors[0]);
  Message = "Bienvenue a l'ASSM. Ou sont nos arbitres : Philippe Gueffet arbitre sur le 1er tour de la Coupe de France a Noirmoutier (D3) contre Beauvoir Sur Mer (D2)!!!!!!"; // Choix du texte
  writeText(Message);
  delay(1000);
}

void loop() {
  recvWithStartEndMarkers();
  ShowMessage();
}

void ShowMessage() {
  int arrSize = arr_len( colors );
  writeText(Message);
  delay(1000);
}

/* --------------------  FUNCTION  --------------------  */
void writeText(String msg) {
  int arrSize = arr_len( colors ); // Tableau des couleurs du texte
  int msgSize = (msg.length() * pixelPerChar) + (2 * pixelPerChar); // Calcul de la longueur du message
  int scrollingMax = (msgSize) + matrix.width(); // Ajustement pour la longueur du message

  x = matrix.width(); // Position du curseur et du message a l'extreme droite
  clr = 0; // RAZ de la couleur

  while (clr <= arrSize) {
    /* Changement de la couleur a la fin du message */
    matrix.setTextColor(colors[0]);// Mettre clr a la place de 0 pour la couleur suivante
    matrix.fillScreen(0); // Ecran en entier;
    matrix.setCursor(x, 0); // Définir le point de départ pour la chaîne de texte
    matrix.print(msg); // Définir la chaîne de message

    /* DÉFILEZ LE TEXTE DE GAUCHE À DROITE EN DÉPLACANT LA POSITION DU CURSEUR */
    if (--x < -scrollingMax ) {
      /*  Ajustement de la longueur du message  */
      x = matrix.width();
      ++clr;
    }
    matrix.show();
    delay(100); // Vitesse de défilement du message
  }
}

void recvWithStartEndMarkers() {
  static boolean recvInProgress = false;
  static byte ndx = 0;
  char startMarker = '[';
  char endMarker = ']';
  char rc;

  while (Bluetooth.available() > 0 && newData == false) {
    rc = Bluetooth.read();
    if (recvInProgress == true) {
      if (rc != endMarker) {
        Message[ndx] = rc;
        ndx++;
        if (ndx >= TAILLE + 1) {
          ndx = TAILLE;
        }
      }
      else {
        Message[ndx] = '\0'; // terminate the string
        recvInProgress = false;
        ndx = 0;
        newData = true;
      }
    }
    else if (rc == startMarker) recvInProgress = true;
  }
}
Je n'ai pas regardé si elle compile, n'ayant pas installé la bibliothèque NeoMatrix.
A toi de me dire ce que ça donne...
Title: Re: Horloge Géante
Post by: ASSM on Aug 17, 2018, 07:38 pm
j'ai le message d'erreur suivant :

Code: [Select]



Matrice_BT:93: error: 'TAILLE' was not declared in this scope

         if (ndx >= TAILLE + 1) {

                    ^

exit status 1
storage size of 'Message' isn't known


Title: Re: Horloge Géante
Post by: lesept on Aug 17, 2018, 10:17 pm
Tu peux ajouter dans l'entête avant le setup
#define TAILLE 100
ou mettre le nombre que tu veux
Title: Re: Horloge Géante
Post by: ASSM on Aug 17, 2018, 11:07 pm
j'ai cette erreur maintenant

Code: [Select]


Matrice_BT:29: error: storage size of 'Message' isn't known

 char Message[];

              ^

exit status 1
storage size of 'Message' isn't known


Title: Re: Horloge Géante
Post by: lesept on Aug 18, 2018, 09:28 am
Alors change par
char Message[TAILLE] ;

Je maîtrise mal les tableaux et leur déclaration. Je pense qu'on peut se passer de donner une taille maximale pour le message à afficher, mais si 100 caractères ne suffisent pas tu peux augmenter la valeur de TAILLE.
Title: Re: Horloge Géante
Post by: ASSM on Aug 18, 2018, 11:41 am
Voici le nouveau message d'erreur

Code: [Select]


ndx = TAILLE;

                 ^

Matrice_BT:99: error: invalid types 'char[byte {aka unsigned char}]' for array subscript

         Message[ndx] = '\0'; // terminate the string

                    ^

exit status 1
converting to 'String' from initializer list would use explicit constructor 'String::String(char)'



Title: Re: Horloge Géante
Post by: lesept on Aug 18, 2018, 12:04 pm
Au temps pour moi, c'est
char Message[TAILLE+1] ;
Title: Re: Horloge Géante
Post by: ASSM on Aug 18, 2018, 12:14 pm
Et maintenant j'ai cette erreur

Code: [Select]

  Message = "Bienvenue a l'ASSM"; // Choix du texte

           ^

exit status 1
incompatible types in assignment of 'const char [19]' to 'char [101]'

Title: Re: Horloge Géante
Post by: lesept on Aug 18, 2018, 03:57 pm
Il faudrait récrire la fonction recvWithStartEndMarkers pour qu'elle crée un String, qui est la structure utilisée par ton code d'affichage.
Title: Re: Horloge Géante
Post by: ASSM on Aug 18, 2018, 05:58 pm
Je ne vois pas trop comment récrire la fonction recvWithStartEndMarkers.
Title: Re: Horloge Géante
Post by: lesept on Aug 18, 2018, 06:44 pm
Voici un essai :
Code: [Select]

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#include <SoftwareSerial.h>
SoftwareSerial Bluetooth(10, 11); // RX, TX

int matrixW = 32; // Largeur de la matrice
int matrixH = 8; // Hauteur de la matrice
#define PIN 3 // N° Broche Branché à l'arduino

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(matrixW, matrixH, PIN,
                            NEO_MATRIX_TOP     + NEO_MATRIX_LEFT +
                            NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
                            NEO_GRB            + NEO_KHZ800);

const uint16_t colors[] = {
  matrix.Color(0, 0, 255),
}; // Couleur de la matrice(Bleu) choisir une ou plusieurs couleurs

#define arr_len( x )  ( sizeof( x ) / sizeof( *x ) ) // Calcul de la taille du message

int pixelPerChar = 6; // Charactères Standart est 8X6 Pixels
int x = matrix.width(); // Largeur de l'affichage
int pass = 0; // Compteur
int i = 0; // Compteur
int clr = 0; // Compteur d'indexation pour les couleurs
boolean newData = false;
String Message;

void setup() {
  Serial.begin(115200);
  Bluetooth.begin(57600); // A configurer en AT sur le module HC-06
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(255);
  matrix.setTextColor(colors[0]);
  Message = "Bienvenue a l'ASSM. Ou sont nos arbitres : Philippe Gueffet arbitre sur le 1er tour de la Coupe de France a Noirmoutier (D3) contre Beauvoir Sur Mer (D2)!!!!!!"; // Choix du texte
  writeText(Message);
  delay(1000);
}

void loop() {
  recvWithStartEndMarkers();
  ShowMessage();
}

void ShowMessage() {
  int arrSize = arr_len( colors );
  writeText(Message);
  delay(1000);
}

/* --------------------  FUNCTION  --------------------  */
void writeText(String msg) {
  int arrSize = arr_len( colors ); // Tableau des couleurs du texte
  int msgSize = (msg.length() * pixelPerChar) + (2 * pixelPerChar); // Calcul de la longueur du message
  int scrollingMax = (msgSize) + matrix.width(); // Ajustement pour la longueur du message

  x = matrix.width(); // Position du curseur et du message a l'extreme droite
  clr = 0; // RAZ de la couleur

  while (clr <= arrSize) {
    /* Changement de la couleur a la fin du message */
    matrix.setTextColor(colors[0]);// Mettre clr a la place de 0 pour la couleur suivante
    matrix.fillScreen(0); // Ecran en entier;
    matrix.setCursor(x, 0); // Définir le point de départ pour la chaîne de texte
    matrix.print(msg); // Définir la chaîne de message

    /* DÉFILEZ LE TEXTE DE GAUCHE À DROITE EN DÉPLACANT LA POSITION DU CURSEUR */
    if (--x < -scrollingMax ) {
      /*  Ajustement de la longueur du message  */
      x = matrix.width();
      ++clr;
    }
    matrix.show();
    delay(100); // Vitesse de défilement du message
  }
}

void recvWithStartEndMarkers() {
  static boolean recvInProgress = false;
  char startMarker = '[';
  char endMarker = ']';
  char rc;

  while (Bluetooth.available() > 0 && newData == false) {
    rc = Bluetooth.read();
    if (recvInProgress == true) {
      if (rc != endMarker) Message += rc;
      else {
        Message += '\0'; // terminate the string
        recvInProgress = false;
        newData = true;
      }
    }
    else if (rc == startMarker) recvInProgress = true;
  }
}
De même, pas compilé, pas testé : à toi...
Title: Re: Horloge Géante
Post by: ASSM on Aug 18, 2018, 07:35 pm
Le code compile correctement.
Je ferais l'essais  demain matin en réel et je te ferais le retour.
Title: Re: Horloge Géante
Post by: ASSM on Aug 18, 2018, 09:33 pm
J'ai essayé mais le message écris sur l'application ne s'affiche pas sur les leds c'est toujours le message en mémoire dans le code.
Title: Re: Horloge Géante
Post by: lesept on Aug 18, 2018, 10:46 pm
Es tu sur que le téléphone et le module Bluetooth sont bien appairés ?

Tu envoies bien le message entre les caractères [ et] ?
Title: Re: Horloge Géante
Post by: ASSM on Aug 19, 2018, 01:24 pm
Bonjour

J'arrive a envoyer le message de l'application mais a chaque nouveau message je suis obligé d'éteindre l'Arduino nano et l'application pour en envoyer un nouveau.

Je n'arrive pas a configurer le module HC-06
Title: Re: Horloge Géante
Post by: lesept on Aug 19, 2018, 01:34 pm
Bonjour

J'arrive a envoyer le message de l'application mais a chaque nouveau message je suis obligé d'éteindre l'Arduino nano et l'application pour en envoyer un nouveau.

Je n'arrive pas a configurer le module HC-06
Je ne comprends pas : tu dis que tu envoies un premier message et qu'il s'affiche, mais qu'ensuite tu n'arrives pas à faire afficher un second message ?

Si ça marche une fois, le HC06 doit être bien configuré. Donc je ne comprends pas ta dernière phrase.

Tu peux voir ce qui arrive sur le HC06 en ajoutant
Code: [Select]
     Serial.println(rc);après a ligne
Code: [Select]
    rc = Bluetooth.read();
Title: Re: Horloge Géante
Post by: ASSM on Aug 19, 2018, 02:08 pm
Il commence d'abord par envoyer le message prédéfini dans le code et ensuite celui qui proviens de l'application.
Title: Re: Horloge Géante
Post by: ASSM on Aug 19, 2018, 02:21 pm
sur la console il affiche le message que j'écris de l'application entre[] mais si j'écris un second message rien ne se passe je suis obligé de redémarrer l'Arduino nano et l'application.

lorsque je dis que je ne peux pas configurer le module HC-06 c'est a dire que je n'arrive pas a lui changer de nom a lui changer la vitesse d'origine de 9600 a 57600.Les commandes AT ne fonctionne pas.
Title: Re: Horloge Géante
Post by: Artouste on Aug 19, 2018, 02:39 pm
...

lorsque je dis que je ne peux pas configurer le module HC-06 c'est a dire que je n'arrive pas a lui changer de nom a lui changer la vitesse d'origine de 9600 a 57600.Les commandes AT ne fonctionne pas.
Bonjour


Tu procede exactement comment pour essayer/tenter de faire les changements ?
attention : de memoire le HC06 est sensible aux "terminateurs AT"
pas de HC06 là où je suis actuellement sous la main
Title: Re: Horloge Géante
Post by: ASSM on Aug 19, 2018, 03:10 pm
Bonjour Artouste

J'utilise ce code la et je configure le moniteur serie sur 9600 et pas de fin de ligne et par exemple je tape la commande AT mais rien ne se passe dans la console j'ai lancé le logiciel termite en meme temps et quand je tape AT dans la console de l'Arduino sur le logiciel termite AT s'affiche en vert.

Code: [Select]

//**********************************************
// Module bluetooth HC06  envoi de commandes AT
// et affichage de la réponse du module
// D'après http://nicolasz68.blogspot.fr/2012/09/module-bluetooth-jy-mcu-v104-pour.html
//
//
//***********************************************/* 
#include <SoftwareSerial.h>  //Software Serial Port 
#define RxD 10    //Pin 10 pour RX (pin0=serial) vert
#define TxD 11    //Pin 11 pour TX, on peut changer noir
SoftwareSerial BTSerie(RxD,TxD); 

void setup() 

  Serial.begin(9600);    //115200 si on veut
  delay(500); 
  Serial.println("Bonjour - Pret pour les commandes AT"); 
  // Configuration du bluetooth 
  pinMode(RxD, INPUT); 
  pinMode(TxD, OUTPUT); 
  BTSerie.begin(9600);  //57600
  delay(500); 
  BTSerie.print("AT+VERSION");  //Demande le N° de version
  delay(1000); 
  // BTSerie.print("\n"); 

void loop() 

  char recvChar; 
  //On lit caractere par caractere sur le BTSerie et on affiche sur le Terminal Serie 
  if (BTSerie.available()) { 
    recvChar = BTSerie.read(); 
    Serial.print(recvChar); 
  } 
  // Serial.write(blueToothSerial.read()); 
  if (Serial.available()) { 
    recvChar = Serial.read(); 
    BTSerie.write(recvChar); 
  } 


Title: Re: Horloge Géante
Post by: ASSM on Aug 19, 2018, 04:25 pm
le soucis viens de cette partie du code void recvWithStartEndMarkers() car quand je joue avec le 'true' ou 'false' j'arrive a avoir sur la console les messages envoyés a la suite mais pas d'affichage sur les rubans leds

Code: [Select]


     
    else if (rc == startMarker) recvInProgress = false;
 



Title: Re: Horloge Géante
Post by: lesept on Aug 19, 2018, 05:31 pm
Essaye d'ajouter
Code: [Select]
newData=false;après la dernière ligne de la loop (avant le } bien sûr)
Title: Re: Horloge Géante
Post by: ASSM on Aug 19, 2018, 05:58 pm
Avec ce code je peux envoyer tout les messages sur la console mais le premier s'affiche correctement mais le deuxieme ne remplace pas le premier message et ecris n'importe quoi sur les rubans leds par contre sur le moniteur série cela s'affiche correctement.
Title: Re: Horloge Géante
Post by: lesept on Aug 19, 2018, 06:00 pm
Ça avance...
Je n'ai pas le code sous les yeux mais essaye d'afficher la variable 'message' sur la console avant l'appel de ta fonction de gestion des leds (dans la loop). Enleve ou commente la ligne Serial.println (rc) ; pour éviter d'avoir trop de texte dans la console.

Ensuite envoie un premier texte, puis un second et copie ce que dit la console, sans oublier de nous dire quels sont les textes que tu envoies.
Title: Re: Horloge Géante
Post by: ASSM on Aug 20, 2018, 09:16 am
Bonjour Lesept

Malgré la fin des vacances et la reprise du travail ce matin j'ai réussi a faire un petit test hier soir.

Donc dans le code si je met le mot "Bienvenue" les rubans leds affichent bien "Bienvenue".

Si par la suite j'envoie de mon application le mot "Philippe" les rubans leds affichent "Bienvenue Philippe" et cela en boucle.
le moniteur série affiche"[Philippe]".

Jusque la tout est normal.

Par la suite si j'envoie de nouveau par l'application le mot"Gueffet" le moniteur série affiche"[Gueffet]".et les rubans leds affichent "Bienvenue Philippe" et après le "Philippe" n'importe quoi comme caractères.

Petite précision a chaque fois que j'envoie un mot ou un message de l'application il est pris en compte que lorsque le code a terminé complétement la loop.

Mon souhait aurai été dès que j'envoie un message de l'application celui-ci soit prioritaire sur n'importe quel action et que bien sur il ne garde pas en mémoire le message précédent.

il aurait fallut dans le principe de faire comme si on mettais l'Arduino a zéro.

J'espère avoir été plus clair a mon problème.
Title: Re: Horloge Géante
Post by: lesept on Aug 20, 2018, 09:30 am
Je vais voir ce que je peux faire, mais je ne sais pas si on peut interrompre facilement l'affichage.
Pour être sûr de n'avoir rien loupé : peux-tu poster ton code actuel ? Merci
Title: Re: Horloge Géante
Post by: ASSM on Aug 20, 2018, 09:59 am
Voici le code actuel

Code: [Select]

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#include <SoftwareSerial.h>
SoftwareSerial Bluetooth(10, 11); // RX, TX

int matrixW = 32; // Largeur de la matrice
int matrixH = 8; // Hauteur de la matrice
#define PIN 3 // N° Broche Branché à l'arduino

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(matrixW, matrixH, PIN,
                            NEO_MATRIX_TOP     + NEO_MATRIX_LEFT +
                            NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
                            NEO_GRB            + NEO_KHZ800);

const uint16_t colors[] = {
  matrix.Color(0, 0, 255),
}; // Couleur de la matrice(Bleu) choisir une ou plusieurs couleurs

#define arr_len( x )  ( sizeof( x ) / sizeof( *x ) ) // Calcul de la taille du message

int pixelPerChar = 6; // Charactères Standart est 8X6 Pixels
int x = matrix.width(); // Largeur de l'affichage
int pass = 0; // Compteur
int i = 0; // Compteur
int clr = 0; // Compteur d'indexation pour les couleurs
boolean newData = false;
String Message;

void setup() {
  Serial.begin(115200);
  Bluetooth.begin(57600); // A configurer en AT sur le module HC-06
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(255);
  matrix.setTextColor(colors[0]);
  Message = "Bienvenue a l'ASSM. Ou sont nos arbitres : Philippe Gueffet arbitre sur le 1er tour de la Coupe de France a Noirmoutier (D3) contre Beauvoir Sur Mer (D2)!!!!!!"; // Choix du texte
  writeText(Message);
  delay(1000);
}

void loop() {
  recvWithStartEndMarkers();
  ShowMessage();
  newData=false;
}

void ShowMessage() {
  int arrSize = arr_len( colors );
  writeText(Message);
  delay(1000);
}

/* --------------------  FUNCTION  --------------------  */
void writeText(String msg) {
  int arrSize = arr_len( colors ); // Tableau des couleurs du texte
  int msgSize = (msg.length() * pixelPerChar) + (2 * pixelPerChar); // Calcul de la longueur du message
  int scrollingMax = (msgSize) + matrix.width(); // Ajustement pour la longueur du message

  x = matrix.width(); // Position du curseur et du message a l'extreme droite
  clr = 0; // RAZ de la couleur

  while (clr <= arrSize) {
    /* Changement de la couleur a la fin du message */
    matrix.setTextColor(colors[0]);// Mettre clr a la place de 0 pour la couleur suivante
    matrix.fillScreen(0); // Ecran en entier;
    matrix.setCursor(x, 0); // Définir le point de départ pour la chaîne de texte
    matrix.print(msg); // Définir la chaîne de message

    /* DÉFILEZ LE TEXTE DE GAUCHE À DROITE EN DÉPLACANT LA POSITION DU CURSEUR */
    if (--x < -scrollingMax ) {
      /*  Ajustement de la longueur du message  */
      x = matrix.width();
      ++clr;
    }
    matrix.show();
    delay(100); // Vitesse de défilement du message
  }
}

void recvWithStartEndMarkers() {
  static boolean recvInProgress = false;
  char startMarker = '[';
  char endMarker = ']';
  char rc;

  while (Bluetooth.available() > 0 && newData == false) {
    rc = Bluetooth.read();
    if (recvInProgress == true) {
      if (rc != endMarker) Message += rc;
      else {
        Message += '\0'; // terminate the string
        recvInProgress = false;
        newData = true;
      }
    }
    else if (rc == startMarker) recvInProgress = true;
  }
}
Title: Re: Horloge Géante
Post by: lesept on Aug 20, 2018, 10:30 am
Dans le test rc == startmarker
Ajoute
        Message ="" ;
Et des accolades pour y inclure l'instruction recvinprogress
Title: Re: Horloge Géante
Post by: ASSM on Aug 20, 2018, 10:43 am
Si j'ai bien compris sa donne cela

Code: [Select]

void recvWithStartEndMarkers() {
  static boolean recvInProgress = false;
  char startMarker = '[';
  char endMarker = ']';
  char rc;

  while (Bluetooth.available() > 0 && newData == false) {
    rc = Bluetooth.read();
    if (recvInProgress == true) {
      if (rc != endMarker) Message += rc;
      else {
        Message += '\0'; // terminate the string
        recvInProgress = false;
        newData = true;
      }
    }
    else if (rc == startMarker) Message=""; recvInProgress = true;
  }
}
Title: Re: Horloge Géante
Post by: lesept on Aug 20, 2018, 11:33 am
Plus précisément
Code: [Select]
    else if (rc == startMarker) { Message=""; recvInProgress = true; }
Title: Re: Horloge Géante
Post by: ASSM on Aug 20, 2018, 12:07 pm
Je ferais le test ce soir.
Title: Re: Horloge Géante
Post by: lesept on Aug 20, 2018, 11:59 pm
Allez, un nouvel essai en suivant les conseils de Bricoleau...
Code: [Select]

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#include <SoftwareSerial.h>
SoftwareSerial Bluetooth(10, 11); // RX, TX

int matrixW = 32; // Largeur de la matrice
int matrixH = 8; // Hauteur de la matrice
#define PIN 3 // N° Broche Branché à l'arduino

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(matrixW, matrixH, PIN,
                            NEO_MATRIX_TOP     + NEO_MATRIX_LEFT +
                            NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
                            NEO_GRB            + NEO_KHZ800);

const uint16_t colors[] = {
  matrix.Color(0, 0, 255),
}; // Couleur de la matrice(Bleu) choisir une ou plusieurs couleurs

#define arr_len( x )  ( sizeof( x ) / sizeof( *x ) ) // Calcul de la taille du message

int pixelPerChar = 6; // Charactères Standart est 8X6 Pixels
int x = matrix.width(); // Largeur de l'affichage
int pass = 0; // Compteur
int i = 0; // Compteur
int clr = 0; // Compteur d'indexation pour les couleurs
boolean newData = false;
String Message;

void setup() {
  Serial.begin(115200);
  Bluetooth.begin(57600); // A configurer en AT sur le module HC-06
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(255);
  matrix.setTextColor(colors[0]);
  Message = "Bienvenue a l'ASSM. Ou sont nos arbitres : Philippe Gueffet arbitre sur le 1er tour de la Coupe de France a Noirmoutier (D3) contre Beauvoir Sur Mer (D2)!!!!!!"; // Choix du texte
  writeText(Message);
  delay(1000);
}

void loop() {
 // recvWithStartEndMarkers();
  ShowMessage();
  newData=false;
}

void ShowMessage() {
  int arrSize = arr_len( colors );
  writeText(Message);
  unsigned long chrono = millis();
  while (millis()-chrono<1000) {
    // rien (delay 1000)
    recvWithStartEndMarkers();
    }
}

/* --------------------  FUNCTION  --------------------  */
void writeText(String msg) {
  int arrSize = arr_len( colors ); // Tableau des couleurs du texte
  int msgSize = (msg.length() * pixelPerChar) + (2 * pixelPerChar); // Calcul de la longueur du message
  int scrollingMax = (msgSize) + matrix.width(); // Ajustement pour la longueur du message

  x = matrix.width(); // Position du curseur et du message a l'extreme droite
  clr = 0; // RAZ de la couleur

  while (clr <= arrSize) {
    /* Changement de la couleur a la fin du message */
    matrix.setTextColor(colors[0]);// Mettre clr a la place de 0 pour la couleur suivante
    matrix.fillScreen(0); // Ecran en entier;
    matrix.setCursor(x, 0); // Définir le point de départ pour la chaîne de texte
    matrix.print(msg); // Définir la chaîne de message

    /* DÉFILEZ LE TEXTE DE GAUCHE À DROITE EN DÉPLACANT LA POSITION DU CURSEUR */
    if (--x < -scrollingMax ) {
      /*  Ajustement de la longueur du message  */
      x = matrix.width();
      ++clr;
    }
    matrix.show();
    unsigned long chrono = millis();
  while (millis()-chrono<100) {
    recvWithStartEndMarkers();
    // rien (delay 100)
    // Vitesse de défilement du message
     }
  }
}

void recvWithStartEndMarkers() {
  static boolean recvInProgress = false;
  char startMarker = '[';
  char endMarker = ']';
  char rc;

  while (Bluetooth.available() > 0 && newData == false) {
    rc = Bluetooth.read();
    if (recvInProgress == true) {
      if (rc != endMarker) Message += rc;
      else {
        Message += '\0'; // terminate the string
        recvInProgress = false;
        newData = true;
        // effacer la matrice
        matrix.fillScreen(0);
      }
    }
    else if (rc == startMarker) {
      Message = "";
      recvInProgress = true;
      }
  }
}
Title: Re: Horloge Géante
Post by: ASSM on Aug 21, 2018, 08:38 am
Bonjour lesept

J'ai essayé le code du post 269 et il affiche simplement le texte en mémoire et rien sur le moniteur série par contre je n'ai pas eu le temps d'essayer ton dernier code sur le post 271.

Je ferais le test ce soir car je n'ai pas ma matrice de leds avec moi.
Title: Re: Horloge Géante
Post by: ASSM on Aug 21, 2018, 09:19 am
J'ai fait l'essai de ton dernier code sans ma matrice leds j'ai d'abord envoyé de mon application 3 messages différents d'abord le mot "philippe" et après "jean" et pour terminer "pierre"

Voici ce que le moniteur série à affiché (je pense que sa parait pas mal comme résultat en attendant l'essai réel)

Code: [Select]

[
p
h
i
l
i
p
p
e
]
[
j
e
a
n
]
[
p
i
e
r
r
e
]
Title: Re: Horloge Géante
Post by: lesept on Aug 21, 2018, 09:48 am
Ça semble correct, attendons le verdict des leds
Title: Re: Horloge Géante
Post by: ASSM on Aug 21, 2018, 02:08 pm
Voila je viens enfin de réussir à configurer mon module bluetooth HC-06

Voici ma procédure tout les commandes sont décrites dans le code.
Code: [Select]

// Configuration du module Bluetooth HC-06

#include <SoftwareSerial.h>
SoftwareSerial BTserial(10,11); // RX | TX
// Connecter la broche TXD du module HC-06 a la broche 10 de l'Arduino.
// Connecter la broche RXD du module HC-06 a la broche 11 de l'Arduino.
// Connecter la broche GND du module HC-06 a la broche GND de l'Arduino.
// Connecter la broche VCC du module HC-06 a la broche 3.3V de l'Arduino.
 
void setup()
{
    Serial.begin(9600);
    Serial.println("Enter AT commands:");
 
    // Vitesse par défaut 9600 du HC-06
    BTserial.begin(9600);
}
 
void loop()
{
    if (BTserial.available())
    { 
        Serial.write(BTserial.read());
    }
 
    if (Serial.available())
    {
        BTserial.write(Serial.read());
    }
 
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
// Liste des commandes à copier dans le BlocNotes de windows                                         //
// Ouvrir le moniteur série de l'Arduino et copier le code provenant du BlocNotes IMPERATIVEMENT    //
// NE PAS ECRIRE DIRECTEMENT DANS LE MONITEUR SERIE MAIS BIEN FAIRE UN COPIER COLLER DU BLOCNOTES  //
// Le moniteur série doit être réglé sur "Pas de fin de ligne" et sur "9600 baud"                 //
///////////////////////////////////////////////////////////////////////////////////////////////////

//AT                  Permet de vérifier la transmission

//AT+VERSION          Permet de lire la version du HC-06

//AT+NAME             Permet de lire le nom du HC-06
//AT+NAME=HC06        Permet de changer le nom du HC-06

//AT+PSWD             Permet de lire le mot de passe du HC-06
//AT+PSWD="1234"      Bien mettre le nouveau mot de passe entre ""

//AT+UART             Permet de lire la vitesses de transmission du HC-06
//AT+UART=4800,0,0    Permet de changer la vitesse a 4800
//AT+UART=9600,0,0    Permet de changer la vitesse a 9600
//AT+UART=19200,0,0   Permet de changer la vitesse a 19200
//AT+UART=38400,0,0   Permet de changer la vitesse a 38400
//AT+UART=57600,0,0   Permet de changer la vitesse a 57600
//AT+UART=115200,0,0  Permet de changer la vitesse a 115200
//AT+UART=230400,0,0  Permet de changer la vitesse a 230400
//AT+UART=460800,0,0  Permet de changer la vitesse a 460800
//AT+UART=921600,0,0  Permet de changer la vitesse a 921600
//AT+UART=1382400,0,0 Permet de changer la vitesse a 1382400


Sa serait bien si possible de pouvoir mettre ce message dans les tutos.
Title: Re: Horloge Géante
Post by: ASSM on Aug 21, 2018, 07:43 pm
Je viens de faire le test et cela fonctionne comme je voulais.
lorsqu'il n'y aucun message d'envoyer c'est celui du code qui défile et dès que j'envoie un message de l'application il prend la place de celui du code.
La seule chose il faut attendre que le message est complètement défilé pour pouvoir en envoyer un autre.

Mais c'est juste une petite chose a améliorer mais c'est déjà pas mal.

Merci encore lesept.
Title: Re: Horloge Géante
Post by: lesept on Aug 21, 2018, 08:43 pm
Good news! :)
C'est bizarre, je pensais avoir codé pour que l'arrivée d'un nouveau message le fasse s'afficher directement. Je vais regarder ça...
Title: Re: Horloge Géante
Post by: lesept on Aug 21, 2018, 09:26 pm
Essaye d'ajouter
Code: [Select]
recvWithStartEndMarkers();
if (newData) break;
après la ligne
Code: [Select]
matrix.print(msg);
Title: Re: Horloge Géante
Post by: ASSM on Aug 21, 2018, 09:43 pm
Bonsoir lesept

Après ajout dans le code c'est parfait.

Je te remercie grandement sans toi je n'aurais jamais pu aboutir a la fin de ce projet.

la seule chose de triste est que le projet arrive a la fin(mais  j'ai d'autre idée comme par exemple faire une tondeuse autonome qui reviendrait a sa base pour se recharger elle même et qui pourrait tondre le gazon avec des programmes définis ou aléatoire.)

Il me restera a faire un tuto complet sur ce panneau d'affichage complet!!!!!


Un grand merci une fois de plus!!!!
Title: Re: Horloge Géante
Post by: lesept on Aug 21, 2018, 10:13 pm
Avec plaisir, j'aime ce genre de projet qui évolue dans le temps.
Je continuerai à t'aider, toi et ceux qui ont des projets qui rejoignent mes connaissances. Ça me permet d'apprendre en même temps.

La tondeuse intelligente me plaît bien. Ça doit poser de nouveaux problèmes intéressants. A suivre...

Peux tu poster une vidéo qui montre l'afficheur en fonctionnement, avec l'appli sur le smartphone ?
Title: Re: Horloge Géante
Post by: ASSM on Aug 21, 2018, 10:19 pm
Bien sur je posterais au plus tard ce Week-end une vidéo avec l'application en fonctionnement !!!!!
Et je ferais une autre vidéo lorsque l'afficheur sera totalement fini car c'est un prototype pour l'instant avec 32 leds par ruban sur la matrice alors que l'afficheur final aura 64 leds par ruban !!!! et bien sur dans un boitier qui viendra se fixer au dessus du panneau des scores déjà fait grâce a ton aide !!!!!

Et je reviendrais avec mon projet de cette tondeuse intelligente imprimé en 3D !!!!!
Title: Re: Horloge Géante
Post by: ASSM on Sep 09, 2018, 11:24 am
Bonjour

Me revoila avec la finalisation de mon projet.
j'ai un dernier petit soucis car j'utilise trois matrices de 32x8 leds. Suivant le code ci-dessous avec une seule matrice je n'ai aucun soucis.
Mais lorsque je rajoute une deuxième matrice branché en série je n'ai plus rien qui s'affiche.(même en changeant la largeur de la matrice a 64 dans la définition)

Code: [Select]

int matrixW = 64; // Largeur de la matrice
int matrixH = 8; // Hauteur de la matrice
#define PIN 3 // N° Broche Branché à l'arduino




Code: [Select]

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#include <SoftwareSerial.h>
SoftwareSerial Bluetooth(10, 11); // RX, TX

//   NEO_MATRIX_TOP, NEO_MATRIX_BOTTOM, NEO_MATRIX_LEFT, NEO_MATRIX_RIGHT:
//     Position of the FIRST LED in the matrix; pick two, e.g.
//     NEO_MATRIX_TOP + NEO_MATRIX_LEFT for the top-left corner.
//   NEO_MATRIX_ROWS, NEO_MATRIX_COLUMNS: LEDs are arranged in horizontal
//     rows or in vertical columns, respectively; pick one or the other.
//   NEO_MATRIX_PROGRESSIVE, NEO_MATRIX_ZIGZAG: all rows/columns proceed
//     in the same order, or alternate lines reverse direction; pick one.

int matrixW = 32; // Largeur de la matrice
int matrixH = 8; // Hauteur de la matrice
#define PIN 3 // N° Broche Branché à l'arduino

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(matrixW, matrixH, PIN,
                            NEO_MATRIX_TOP    + NEO_MATRIX_LEFT +
                            NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
                            NEO_GRB            + NEO_KHZ800);

const uint16_t colors[] = {
  matrix.Color(0, 0, 255),
}; // Couleur de la matrice(Bleu) choisir une ou plusieurs couleurs

#define arr_len( x )  ( sizeof( x ) / sizeof( *x ) ) // Calcul de la taille du message

int pixelPerChar = 6; // Charactères Standart est 8X6 Pixels
int x = matrix.width(); // Largeur de l'affichage
int pass = 0; // Compteur
int i = 0; // Compteur
int clr = 0; // Compteur d'indexation pour les couleurs
boolean newData = false;
String Message;

void setup() {
  Serial.begin(115200);
  Bluetooth.begin(57600); // A configurer en AT sur le module HC-06
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(255);
  matrix.setTextColor(colors[0]);
  Message = "Philippe Gueffet"; // Choix du texte
  writeText(Message);
  delay(1000);
}

void loop() {
 // recvWithStartEndMarkers();
  ShowMessage();
  newData=false;
}

void ShowMessage() {
  int arrSize = arr_len( colors );
  writeText(Message);
  unsigned long chrono = millis();
  while (millis()-chrono<1000) {
    // rien (delay 1000)
    recvWithStartEndMarkers();
    }
}

/* --------------------  FUNCTION  --------------------  */
void writeText(String msg) {
  int arrSize = arr_len( colors ); // Tableau des couleurs du texte
  int msgSize = (msg.length() * pixelPerChar) + (2 * pixelPerChar); // Calcul de la longueur du message
  int scrollingMax = (msgSize) + matrix.width(); // Ajustement pour la longueur du message

  x = matrix.width(); // Position du curseur et du message a l'extreme droite
  clr = 0; // RAZ de la couleur

  while (clr <= arrSize) {
    /* Changement de la couleur a la fin du message */
    matrix.setTextColor(colors[0]);// Mettre clr a la place de 0 pour la couleur suivante
    matrix.fillScreen(0); // Ecran en entier;
    matrix.setCursor(x, 0); // Définir le point de départ pour la chaîne de texte
    matrix.print(msg); // Définir la chaîne de message
    recvWithStartEndMarkers();
if (newData) break;

    /* DÉFILEZ LE TEXTE DE GAUCHE À DROITE EN DÉPLACANT LA POSITION DU CURSEUR */
    if (--x < -scrollingMax ) {
      /*  Ajustement de la longueur du message  */
      x = matrix.width();
      ++clr;
    }
    matrix.show();
    unsigned long chrono = millis();
  while (millis()-chrono<100) {
    recvWithStartEndMarkers();
    // rien (delay 100)
    // Vitesse de défilement du message
     }
  }
}

void recvWithStartEndMarkers() {
  static boolean recvInProgress = false;
  char startMarker = '#';
  char endMarker = '#';
  char rc;

  while (Bluetooth.available() > 0 && newData == false) {
    rc = Bluetooth.read();
    Serial.println(rc);
    if (recvInProgress == true) {
      if (rc != endMarker) Message += rc;
      else {
        Message += '\0'; // terminate the string
        recvInProgress = false;
        newData = true;
        // effacer la matrice
        matrix.fillScreen(0);
      }
    }
    else if (rc == startMarker) {
      Message = "";
      recvInProgress = true;
      }
  }
}
Title: Re: Horloge Géante
Post by: lesept on Sep 09, 2018, 01:09 pm
Bonjour
Content de te revoir ici.

Essaye avec un exemple de la bibliothèque neomatrix.
Sinon, poste un schéma de branchement. Ça peut venir d'un problème d'alimentation des leds, ça dépend comment c'est branché.

As tu une référence de ces matrices ou un lien vers un site marchant pour voir exactement de quoi il s'agit ?
Title: Re: Horloge Géante
Post by: ASSM on Sep 09, 2018, 06:24 pm
Bonjour Lesept

Voici le lien des matrices se sont des matrices 32x8

https://fr.aliexpress.com/item/DC5V-8x8-16x16-32x8-WS2812B-led-Pixel-2811-ic-Individually-addressable-LED-module-rgb-LED-Heatsink/32844142502.html?spm=a2g0s.9042311.0.0.bc946c37oLRq8b (https://fr.aliexpress.com/item/DC5V-8x8-16x16-32x8-WS2812B-led-Pixel-2811-ic-Individually-addressable-LED-module-rgb-LED-Heatsink/32844142502.html?spm=a2g0s.9042311.0.0.bc946c37oLRq8b)
Title: Re: Horloge Géante
Post by: lesept on Sep 09, 2018, 08:03 pm
Comment les alimentes-tu ? Une matrice comporte 256 LEDs qui chacune peut consommer jusqu'à 60mA, soit un total de plus de 15A ! 3 matrices 45 A ! Tu vas avoir besoin d'une centrale nucléaire à ce rythme là :)
Donc le problème peut venir de là.

Il peut aussi venir de la commande : les LEDs sont cascadées, donc le signal de commande de la dernière LED d'une matrice dit passer par les 255 autres LEDs. Si tu connectes les 3 matrices en série (au niveau de la commande) la dernière LED sera atteinte au bout de plus de 760 LEDs, s'il y a un peu de pertes en ligne ça dégénère rapidement.

Enfin, la bibliothèque neomatrix prévoit le cas de plusieurs matrices cascadées : il faut le déclarer d'une certaine façon dans le constructeur. Lis ça et vérifie s'ils donnent des instructions d'alimentation et de commande.
Title: Re: Horloge Géante
Post by: ASSM on Sep 09, 2018, 09:31 pm
Bonsoir lesept

J'alimente le tout avec une alimentation de PC et les 45A ne pose pas de problème.

Je vais regarder du coté de la bibliothèque neomatrix...
Title: Re: Horloge Géante
Post by: ASSM on Sep 09, 2018, 10:01 pm
Lesept
J'ai suivi ton conseil et j'ai modifié le début du code pour pouvoir déclarer le nombre de matrices branchées.

Je ferais le test demain soir et un retour bien sur.

Code: [Select]

#include <Adafruit_NeoMatrix.h>
#include <Adafruit_GFX.h>
#include <Adafruit_NeoPixel.h>
#include <SoftwareSerial.h>
SoftwareSerial Bluetooth(10, 11); // RX, TX

//   NEO_MATRIX_TOP, NEO_MATRIX_BOTTOM, NEO_MATRIX_LEFT, NEO_MATRIX_RIGHT:
//     Position of the FIRST LED in the matrix; pick two, e.g.
//     NEO_MATRIX_TOP + NEO_MATRIX_LEFT for the top-left corner.
//   NEO_MATRIX_ROWS, NEO_MATRIX_COLUMNS: LEDs are arranged in horizontal
//     rows or in vertical columns, respectively; pick one or the other.
//   NEO_MATRIX_PROGRESSIVE, NEO_MATRIX_ZIGZAG: all rows/columns proceed
//     in the same order, or alternate lines reverse direction; pick one.

int matrixW = 32; // Largeur de la matrice
int matrixH = 8; // Hauteur de la matrice
int tilesX = 3; // Nombre de matrice en Horizontale
int tilesY = 1; // Nombre de matrice en Hauteur
#define PIN 3 // N° Broche Branché à l'arduino

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(matrixW, matrixH, tilesX, tilesY, PIN,
                            NEO_TILE_TOP    + NEO_TILE_LEFT +
                            NEO_TILE_COLUMNS + NEO_TILE_ZIGZAG,
                            NEO_GRB            + NEO_KHZ800);

Title: Re: Horloge Géante
Post by: hbachetti on Sep 09, 2018, 10:35 pm

Une petite touche d'écologie ...

45A sous 5V cela fait 225W, donc 5.4 KWh par jour, 1971 KWh par an.
Au tarif EDF 6KW (1KWh = 0,1467€) cela donne 289€ par an rien que pour afficher l'heure.
Tu n'as pas l'impression de délirer ?
Même un écran de PC 19 pouces ferait mieux question rendement, et en plus tu pourrais afficher des images, ou bien l'heure sur un fond d'écran sympa, la photo de ta belle-mère par exemple.

@+
Title: Re: Horloge Géante
Post by: ASSM on Sep 10, 2018, 08:27 am
Cher hbachetti

J'ai bien compris ta petite touche d'écologie mais je me permet de te répondre que c'est un panneau d'affichage comme décrit et illustré dans les posts précédent qui comporte :

-1 Horloge
-1 Chronomètre
-1 Compteur de points local
-1 Compteur de points visiteurs
-1 Texte défilant commandé par Bluetooth

Ce panneau d'affichage est pour un club local de Football et fonctionnera pendant tout le championnat se déroulant a domicile et pour les deux équipes séniors, soit 11 jours dans l'année et pendant 6 heures.

Si je suis bien ton raisonnement cela fait 225W par heure donc 1.3KWh par journée de championnat soit 14.85KWh par an.(donc un cout total de 2.20€ par an).

Pour l'affichage de la photo de la Belle-mère je ne suis pas sur que se soit un projet très passionnant !!!!

Title: Re: Horloge Géante
Post by: hbachetti on Sep 10, 2018, 09:04 am
Tu me rassures.  :D
Title: Re: Horloge Géante
Post by: ASSM on Sep 10, 2018, 08:27 pm
Voici la version finale pour le texte déroulant !!!!!

Code: [Select]

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#include <SoftwareSerial.h>
SoftwareSerial Bluetooth(10, 11); // RX, TX
#ifndef PSTR
 #define PSTR // Make Arduino Due happy
#endif

#define PIN 3 // N° Broche Branché à l'arduino

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(32, 8, 3, 1, PIN,
  NEO_TILE_TOP   + NEO_TILE_LEFT   + NEO_TILE_COLUMNS   + NEO_TILE_PROGRESSIVE +
  NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
  NEO_GRB + NEO_KHZ800);
  
const uint16_t colors[] = {
  matrix.Color(0, 0, 255),
}; // Couleur de la matrice(Bleu) choisir une ou plusieurs couleurs

#define arr_len( x )  ( sizeof( x ) / sizeof( *x ) ) // Calcul de la taille du message

int pixelPerChar = 6; // Charactères Standart est 8X6 Pixels
int x = matrix.width(); // Largeur de l'affichage
int pass = 0; // Compteur
int i = 0; // Compteur
int clr = 0; // Compteur d'indexation pour les couleurs
boolean newData = false;
String Message;

void setup() {
  Serial.begin(115200);
  Bluetooth.begin(57600); // A configurer en AT sur le module HC-06
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(255);
  matrix.setTextColor(colors[0]);
  Message = "ASSM"; // Choix du texte
  writeText(Message);
  delay(1000);
}

void loop() {
 // recvWithStartEndMarkers();
  ShowMessage();
  newData=false;
}

void ShowMessage() {
  int arrSize = arr_len( colors );
  writeText(Message);
  unsigned long chrono = millis();
  while (millis()-chrono<1000) {
    // rien (delay 1000)
    recvWithStartEndMarkers();
    }
}

/* --------------------  FUNCTION  --------------------  */
void writeText(String msg) {
  int arrSize = arr_len( colors ); // Tableau des couleurs du texte
  int msgSize = (msg.length() * pixelPerChar) + (2 * pixelPerChar); // Calcul de la longueur du message
  int scrollingMax = (msgSize) + matrix.width(); // Ajustement pour la longueur du message

  x = matrix.width(); // Position du curseur et du message a l'extreme droite
  clr = 0; // RAZ de la couleur

  while (clr <= arrSize) {
    /* Changement de la couleur a la fin du message */
    matrix.setTextColor(colors[0]);// Mettre clr a la place de 0 pour la couleur suivante
    matrix.fillScreen(0); // Ecran en entier;
    matrix.setCursor(x, 0); // Définir le point de départ pour la chaîne de texte
    matrix.print(msg); // Définir la chaîne de message
    recvWithStartEndMarkers();
    if (newData) break;

    /* DÉFILEZ LE TEXTE DE GAUCHE À DROITE EN DÉPLACANT LA POSITION DU CURSEUR */
    if (--x < -scrollingMax ) {
      /*  Ajustement de la longueur du message  */
      x = matrix.width();
      ++clr;
    }
    matrix.show();
    unsigned long chrono = millis();
  while (millis()-chrono<100) {
    recvWithStartEndMarkers();
    // rien (delay 100)
    // Vitesse de défilement du message
     }
  }
}

void recvWithStartEndMarkers() {
  static boolean recvInProgress = false;
  char startMarker = '#';
  char endMarker = '#';
  char rc;

  while (Bluetooth.available() > 0 && newData == false) {
    rc = Bluetooth.read();
    Serial.println(rc);
    if (recvInProgress == true) {
      if (rc != endMarker) Message += rc;
      else {
        Message += '\0'; // terminate the string
        recvInProgress = false;
        newData = true;
        // effacer la matrice
        matrix.fillScreen(0);
      }
    }
    else if (rc == startMarker) {
      Message = "";
      recvInProgress = true;
      }
  }
}
Title: Re: Horloge Géante
Post by: lesept on Sep 10, 2018, 09:06 pm
Et ... ça marche ? ? ?
Si oui, une petite vidéo STP :) 
Title: Re: Horloge Géante
Post by: ASSM on Sep 10, 2018, 09:30 pm
Oui sa marche j'attend de recevoir mon alimentation et après je mettrais une vidéo du résultat final.


Encore un petit peu de patience!!!!!


Mais si jamais tu est vraiment impatient je peux te faire une petite vidéo dans la semaine avec une seul matrice de brancher et l'envoi par l'application.
Title: Re: Horloge Géante
Post by: lesept on Sep 10, 2018, 10:26 pm
Je préfère attendre et voir le résultat complet. Merci !
Title: Re: Horloge Géante
Post by: ASSM on Sep 23, 2018, 12:45 pm
bonjour

Me voila proche de la fin du projet mais j'ai un dernier soucis.
Je branche 3 matrices de 32x8 leds en série avec chacune une alimentation séparée.
Cela me fait une matrice au total de 96x8 leds.
Lors de l'affichage je n'ai que 49x8 leds qui s'allument comme si la bibliothèque Adafruit n'arrivait pas a gérer les trois matrices.
Chaque matrice a été testée individuellement pour être sur quelle fonctionne parfaitement.
Le tout est piloté par un Arduino Mega 2650 pour avoir assez de mémoire disponible.

Auriez vous une idée?
Title: Re: Horloge Géante
Post by: lesept on Sep 23, 2018, 02:22 pm
Bonjour
Il doit y avoir une subtilité quelque part, car le nombre n'est pas aléatoire : 49 c'est la moitié de 96 plus 1. Si ça avait été n'importe quel autre chiffre, j'aurais pensé à un problème comme celui dont je parlais dans la réponse 285 :

Quote
Il peut aussi venir de la commande : les LEDs sont cascadées, donc le signal de commande de la dernière LED d'une matrice dit passer par les 255 autres LEDs. Si tu connectes les 3 matrices en série (au niveau de la commande) la dernière LED sera atteinte au bout de plus de 760 LEDs, s'il y a un peu de pertes en ligne ça dégénère rapidement.
Que se passe-t-il si tu ne mets que 2 panneaux en série au lieu de 3 ? Ça s'arrête au même endroit ?
Title: Re: Horloge Géante
Post by: lesept on Sep 23, 2018, 02:47 pm
Ça peut aussi venir d'un problème de mémoire le site neomatrix  (https://learn.adafruit.com/adafruit-neopixel-uberguide/neomatrix-library)indique
Quote
RAM Again
On a per-pixel basis, Adafruit_NeoMatrix is no more memory-hungry than Adafruit_NeoPixel, requiring 3 bytes of RAM per pixel. But the number of pixels in a two-dimensional display takes off exponentially…a 16x16 display requires four times the memory of an 8x8 display, or about 768 bytes of RAM (nearly half the available space on an Arduino Uno). It can be anywhere from tricky to impossible to combine large displays with memory-hungry libraries such as SD or ffft.
Tu as 3 displays de 32x8 soit 3x32x8 = 768 leds, chacune utilise 3 octets soit au total 2304 octets. Le Mega dispose de 8ko de SRAM, donc ça devrait aller. Que dit le rapport de compilation sur la mémoire utilisée ?

Au passage, tu utilises un String pour stocker le message, ce qui risque de poser des problèmes de mémoire. Est-ce nécessaire ?
En lisant le code, on voit la ligne
Code: [Select]
    matrix.print(msg); // Définir la chaîne de messagemais je ne trouve pas dans les bibliothèques utilisées le code de cette fonction print... Quelqu'un a une idée ?
Title: Re: Horloge Géante
Post by: ASSM on Sep 23, 2018, 06:33 pm
Bonsoir lesept

Que se soit avec deux ou trois matrices cela s'arrête toujours au même endroit.

Voici se que la console affiche (je me dis que se n'est pas un problème de mémoire)

Code: [Select]

Le croquis utilise 12416 octets (4%) de l'espace de stockage de programmes. Le maximum est de 253952 octets.
Les variables globales utilisent 480 octets (5%) de mémoire dynamique, ce qui laisse 7712 octets pour les variables locales. Le maximum est de 8192 octets.



J'ai essayé d'utiliser un exemple de la bibliothèque Adafruit avec deux matrices dont le code est le suivant et c'est exactement le même soucis.

Code: [Select]

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#ifndef PSTR
#define PSTR // Make Arduino Due happy
#endif
#define PIN 3

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(32, 8, 2, 1, PIN,
  NEO_TILE_TOP   + NEO_TILE_LEFT   + NEO_TILE_COLUMNS   + NEO_TILE_PROGRESSIVE +
  NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
  NEO_GRB + NEO_KHZ800);

const uint16_t colors[] = {
  matrix.Color(255, 0, 0), matrix.Color(0, 255, 0), matrix.Color(0, 0, 255) };

void setup() {
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(40);
  matrix.setTextColor(colors[0]);
}

int x    = matrix.width();
int pass = 0;

void loop() {
  matrix.fillScreen(0);
  matrix.setCursor(x, 0);
  matrix.print(F("Philippe"));
  if(--x < -36) {
    x = matrix.width();
    if(++pass >= 3) pass = 0;
    matrix.setTextColor(colors[pass]);
  }
  matrix.show();
  delay(100);
}


Pour ce code voici se que la console affiche

Code: [Select]

Le croquis utilise 8974 octets (3%) de l'espace de stockage de programmes. Le maximum est de 253952 octets.
Les variables globales utilisent 176 octets (2%) de mémoire dynamique, ce qui laisse 8016 octets pour les variables locales. Le maximum est de 8192 octets.
Title: Re: Horloge Géante
Post by: lesept on Sep 23, 2018, 06:38 pm
J'aimerais avoir l'avis de quelques autres membres du forum, notamment vis à vis de l'impact de l'utilisation des String sur les mémoire dans le cas particulier de ton code.
Title: Re: Horloge Géante
Post by: ASSM on Sep 23, 2018, 06:40 pm
Attendons l'avis des autres membres du forum….
Title: Re: Horloge Géante
Post by: lesept on Sep 24, 2018, 12:22 am
Quel message as tu mis ? Que se passe t-il si tu augmentes la longueur du message, par exemple en ajoutant vingt caractères ? Est ce que ça plante encore au même endroit ?
Title: Re: Horloge Géante
Post by: ASSM on Sep 24, 2018, 08:06 am
Bonjour

Peut importe le nombre de caractères cela plante toujours au même endroit.

Par contre je me suis aperçu avant que le message s'affiche il s'écoule un certain temps qui correspond exactement au temps qu'il faut pour commencer l'affichage a partir de la colonne 49.

Donc de la colonne 96 à 50 pas d'affichage et de la colonne 49 à 1 tout est ok(le texte défilant va de la droite vers la gauche c'est à dire de la colonne 96 a la colonne 1)
Title: Re: Horloge Géante
Post by: ASSM on Sep 24, 2018, 09:20 am
bonjour

après recherche sur internet il y a une personne qui a réussi a faire la même chose que moi mais impossible de trouver le code

https://www.youtube.com/watch?v=Y0_4W2f0OsI (https://www.youtube.com/watch?v=Y0_4W2f0OsI)
Title: Re: Horloge Géante
Post by: lesept on Sep 25, 2018, 10:35 pm
J'ai un peu avancé dans mon analyse, mais je ne sais pas si ça va dans la bonne direction.

Dans ton code, dans la fonction writetext, il y a la ligne
Code: [Select]
    matrix.print(msg); // Définir la chaîne de messageoù msg est un string.

J'ai cherché cette fonction print dans toutes les bibliothèques que tu utilises sans la trouver, puis je suis tombé sur ceci : la printclass (https://playground.arduino.cc/Code/Printclass). Si je comprends bien, c'est une astuce pour utiliser les fonctions print, comme pour la liaison série, sans avoir à les réécrire, et pour des affichages qui n'utilisent pas cette liaison série.

On trouve en effet dans la bibliothèque Adafruit_GFX (https://github.com/adafruit/Adafruit-GFX-Library/) dans le fichier .h (ligne 113)
Code: [Select]
#if ARDUINO >= 100
  virtual size_t write(uint8_t);
#else
  virtual void   write(uint8_t);
#endif
et dans le fichier .cpp (ligne 1115 - 1121)
Code: [Select]
/**************************************************************************/
/*!
    @brief  Print one byte/character of data, used to support print()
    @param  c  The 8-bit ascii character to write
*/
/**************************************************************************/
size_t Adafruit_GFX::write(uint8_t c) {
C'est donc cohérent avec ce qui est décrit dans le lien plus haut.

Par contre, c'est utilisé pour afficher un caractère seulement. Ils disent de faire un truc similaire pour les string et les c-string (un tableau de char) mais Adafruit ne l'a pas fait !

A partir de là, je ne sais plus. Comme tu passes en argument une string alors que ça attend un caractère, peut-être que ça marche comme les pointeurs, et que ce qui est important ici c'est l'adresse de ce qui est affiché et pas la valeur... Ou bien c'est une sorte de récursivité comme indiqué ici :
Quote
Basically, all of the functions in Print.cpp call each other until they get down to write(uint8_t), displaying a single character at a time. This write function is not defined in the Print class, and must be defined by the user. However, it also lets you define the two functions which are one level higher, because it could be easier for the user to display an entire string at once.
Mais là, je ne sais plus.

Peut-être qu'il suffirait d'utiliser une c-string directement au lieu d'une string ? Essaye de remplacer
Code: [Select]
String Message;par
Code: [Select]
char Message[]="ASSM";et de commenter la ligne
Code: [Select]
  Message = "ASSM"; // Choix du texte
Un volontaire pour aller plus loin ? ? ?
Title: Re: Horloge Géante
Post by: hbachetti on Sep 26, 2018, 11:35 am
Quote
mais je ne trouve pas dans les bibliothèques utilisées le code de cette fonction print... Quelqu'un a une idée ?
La méthode print est forcément héritée.

Code: [Select]


// dans Adafruit_NeoMatrix.h :
class Adafruit_NeoMatrix : public Adafruit_GFX, public Adafruit_NeoPixel {

// dans Adafruit_GFX.h :
class Adafruit_GFX : public Print {


La classe print se trouve dans le core ARDUINO :

hardware/arduino/avr/cores/arduino/Print.h

Là se trouvent toutes les méthodes print() et println() avec différents arguments dont :

Code: [Select]

size_t Print::print(const String &s)
size_t Print::print(const char str[])


Donc print() fonctionnera avec c-string ou String, String est déconseillé, même avec une MEGA..

Mais je ne pense pas que soit la cause du problème.

@+
Title: Re: Horloge Géante
Post by: hbachetti on Sep 26, 2018, 01:17 pm
Quote
J'ai essayé d'utiliser un exemple de la bibliothèque Adafruit avec deux matrices dont le code est le suivant et c'est exactement le même soucis.
Plutôt inquiétant.

J'aimerais parler de la construction de ton objet :

Code: [Select]
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(32, 8, 2, 1, PIN,
  NEO_TILE_TOP   + NEO_TILE_LEFT   + NEO_TILE_COLUMNS   + NEO_TILE_PROGRESSIVE +
  NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
  NEO_GRB + NEO_KHZ800);


Tu es sûr du NEO_MATRIX_COLUMNS ?

Code: [Select]

#define NEO_MATRIX_ROWS        0x00 // Matrix is row major (horizontal)
#define NEO_MATRIX_COLUMNS     0x04 // Matrix is column major (vertical)


@+
Title: Re: Horloge Géante
Post by: ASSM on Sep 26, 2018, 01:42 pm
Bonjour

j'ai deux matrices en série de 32x8 donc 64 leds en lignes par 8 leds en colonnes.

cela fait 512 leds a gérer.

En ce qui concerne NEO_MATRIX_COLUMNS cela est bon car j'ai bien l'affichage qui fonctionne correctement mais sur 392 leds et non sur les 512 leds.

Au début je travaillais avec un arduino nano et je pensais que je n'avais pas assez de mémoire donc je suis passé sur un Mega mais j'ai exactement le même problème.

j'ai l'impression que l'on ne peut pas gérer plus de 392 leds en même temps.

la seule chose que je n'ai pas essayé c'est de faire allumer les leds une par une pour voir si je vais bien jusqu'au bout de la matrice avec la bibliothèque néopixel

Sur internet j'ai trouvé ce type de boitier qui lui peut gérer jusqu'a 2048 leds en même temps et en wifi.

https://fr.aliexpress.com/item/led-WiFi-controller-1-port-control-max-2048-pixels-support-WS2811-WS2812-DMX512-etc-Controlled-by/32507572159.html?spm=a2g0w.search0104.3.49.70c61624UPk7c6&ws_ab_test=searchweb0_0,searchweb201602_4_10065_10068_10843_10059_10884_10887_10696_100031_310_10084_10083_10103_451_10618_10304_10307_10820_10821_10302_526-451,searchweb201603_60,ppcSwitch_7&algo_expid=f2369467-bd58-477a-a662-5322a5464f09-7&algo_pvid=f2369467-bd58-477a-a662-5322a5464f09&transAbTest=ae803_1&priceBeautifyAB=0 (https://fr.aliexpress.com/item/led-WiFi-controller-1-port-control-max-2048-pixels-support-WS2811-WS2812-DMX512-etc-Controlled-by/32507572159.html?spm=a2g0w.search0104.3.49.70c61624UPk7c6&ws_ab_test=searchweb0_0,searchweb201602_4_10065_10068_10843_10059_10884_10887_10696_100031_310_10084_10083_10103_451_10618_10304_10307_10820_10821_10302_526-451,searchweb201603_60,ppcSwitch_7&algo_expid=f2369467-bd58-477a-a662-5322a5464f09-7&algo_pvid=f2369467-bd58-477a-a662-5322a5464f09&transAbTest=ae803_1&priceBeautifyAB=0)
Title: Re: Horloge Géante
Post by: ASSM on Sep 26, 2018, 01:46 pm
Je trouve étonnant que  personne n'a jamais essayé de faire fonctionner deux matrices en série de 32x8 ?
Title: Re: Horloge Géante
Post by: lesept on Sep 26, 2018, 02:14 pm
Ce boitier a l'air pas mal en effet.
Title: Re: Horloge Géante
Post by: ASSM on Sep 26, 2018, 02:59 pm
Je me pose une question.

Puisque je peux faire fonctionner une matrice de 32x8 leds correctement serait il pas possible d'adapter mon code pour que :

Actuellement je branche le data des 3 matrices en série sur le pin 3 du Mega2650 mais serai t'il pas possible de brancher la première matrice sur le pin 3 la deuxième sur le pin 4 et la troisième sur le pin 5.
Lorsque la première lettre termine de s'afficher au bout de la matrice elle passe sur la deuxième matrice ainsi de suite ?
Title: Re: Horloge Géante
Post by: lesept on Sep 26, 2018, 03:03 pm
Je pense qu'il faudrait un timing très précis et savoir en plus quelles lettres s'affichent sur quelle matrice à chaque instant. Pas facile.

De plus, je ne sais pas comment se déroule l'affichage sur la matrice : est-ce un décalage pixel par pixel ou lettre par lettre ? Bref, je pense que ce serait difficile...
Title: Re: Horloge Géante
Post by: ASSM on Sep 26, 2018, 03:20 pm
A force de chercher je suis tombé sur se site :

http://74led.ru/ (http://74led.ru/)

La personne utilise "led master mini rf 6.1" pour pouvoir piloter de très nombreuses matrices.

Quelqu'un connait il cela ?
Title: Re: Horloge Géante
Post by: lesept on Sep 26, 2018, 04:20 pm
Non
Title: Re: Horloge Géante
Post by: ASSM on Oct 01, 2018, 01:49 pm
Bonjour

N'arrivant pas à trouver la solution a mon problème je viens de commander le fameux boitier pour contrôler 2048 leds.

Je ferais un petit retour dessus.
Title: Re: Horloge Géante
Post by: ASSM on Oct 09, 2018, 11:04 am
Bonjour Lesept

Me revoilà de retour toujours avec ma problématique des gestions des 768 leds pour mon projet d'un texte défilant par Bluetooth.

J' ai réussi a trouver une bibliothèque qui est capable de gérer énormément de leds.(j'ai fait l'essai du code suivant sur 768 leds et il n'y a aucun soucis)

Code: [Select]

////////////////////////////////////////////////////////////////////////////////
/// Fast Adressable Bitbang LED Library
/// Copyright (c)2015, 2016 Dan Truong
///
/// This example demonstrates control of up to 64K LEDs using 10 bytes of RAM.
/// By default it will light up 64 pixels. the downside of using more pixels
/// is an increase of the display refresh lag.
///
/// WARNING: If you drive many LEDs, make sure you power them separately and
/// not from your Arduino board. I set the value to 64 LEDs because I can
/// drive them with my Arduino Uno, provided I do not change the LED colors
/// or brightness from the original code.
///
/// Visual display:
///
/// 1 pixel will go red, green, blue, full brightness.
/// All pixels will go red green blue low brightness.
/// All pixels will show rainbows.
/// All pixels will fade through all colors of the rainbow.
///
/// Hardware configuration:
///
/// This example works for a regular Arduino board connected to your PC via the
/// USB port to the Arduino IDE (integrated development environment used to
/// compile and load an arduino sketch program to your arduino board).
/// By default it is expected the LED strip is on port D6.
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
#include <FAB_LED.h>

////////////////////////////////////////////////////////////////////////////////
/// @brief This parameter says how many LEDs are in your strip.
/// If you power the LED strip through your Arduino USB power supply, and not
/// through a separate power supply, make sure to not turn on too many LEDs.
const uint16_t numPixels = 768; // Max: 64K pixels

////////////////////////////////////////////////////////////////////////////////
/// @brief this definition allows you to select which digital port the LED strip
/// is attached to: Valid are ports A through D, 0 to 7. For AtTiny, you may
/// want to use port D2 instead of D6.
/// Uncomment the LED strip model you are using and comment the others. By
/// default the ws2812b LED strip is used.
ws2812b<D,19> myLeds;
//sk6812<D,2> myLeds;
//apa104<D,2> myLeds;
//apa106<D,2> myLeds;


////////////////////////////////////////////////////////////////////////////////
/// @brief Waits then clears the LED strip.
////////////////////////////////////////////////////////////////////////////////
void holdAndClear(uint16_t on_time, uint16_t off_time)
{
 // Wait 1sec, turn off LEDs, wait 200msec
 delay(on_time);
 //PORTB ^= 1U << 5; // On
 myLeds.clear(1000);
 delay(off_time);
 //PORTB ^= 1U << 5; // Off
}



////////////////////////////////////////////////////////////////////////////////
/// @brief Display one pixel with one solid color for 1 second.
/// Each value can be from 0 to 255.
////////////////////////////////////////////////////////////////////////////////
void color1(uint8_t red, uint8_t green, uint8_t blue)
{
 rgb pix[1];

 pix[0].r = red;
 pix[0].g = green;
 pix[0].b = blue;

 // Display the LEDs
 myLeds.sendPixels(1, pix);
}

////////////////////////////////////////////////////////////////////////////////
/// @brief Display numPixels with one solid color.
/// We only use a 3 byte array, storing one pixel.
/// We then send the same pixel repeatedly to the LED strip very fast.
/// This demonstrates the ability tocall the library repeatedly.
/// If this feature fails, you may see only 1 pixel lit, or a varying number
/// of pixels glitching on and off.
////////////////////////////////////////////////////////////////////////////////
void color1N(uint8_t red, uint8_t green, uint8_t blue)
{
 rgb pix[1];

 pix[0].r = red;
 pix[0].g = green;
 pix[0].b = blue;

 // Disable interupts, save the old interupt state
 const uint8_t oldSREG = SREG;
 cli();

 // Display the LEDs
 for (uint16_t i = 0; i < numPixels; i++) {
 myLeds.sendPixels(1, pix);
 }

 // Restore the old interrupt state
 SREG = oldSREG;
}

////////////////////////////////////////////////////////////////////////////////
/// @brief Helper routine to calculate the next color for a rainbow
/// Note: we force gcc to inline to meet the timing constraints of the LED strip
////////////////////////////////////////////////////////////////////////////////
static void colorWheel(uint8_t incStep, uint8_t & R, uint8_t & G, uint8_t & B)
__attribute__ ((always_inline));

static void colorWheel(uint8_t incStep, uint8_t & R, uint8_t & G, uint8_t & B)
{
 if (B == 0 && R != 0) {
 R = (R <= incStep) ? 0 : R - incStep;
 G = (G >= 255-incStep) ? 255 : G + incStep;
 return;
 }
 if (R == 0 && G != 0) {
 G = (G <= incStep) ? 0 : G - incStep;
 B = (B >= 255-incStep) ? 255 : B + incStep;
 return;
 }
 if (G == 0 && B != 0) {
 B = (B <= incStep) ? 0 : B - incStep;
 R = (R >= 255-incStep) ? 255 : R + incStep;
 return;
 }
}

////////////////////////////////////////////////////////////////////////////////
/// @brief Display numPixels in a single color changing to all rainbow color.
/// We use a 3 byte array storing one pixel.
/// We then send the same pixel repeatedly to the LED strip very fast.
/// This demonstrates the ability tocall the library repeatedly.
/// If this feature fails, you may see only 1 pixel lit, or a varying number
/// of pixels glitching on and off.
////////////////////////////////////////////////////////////////////////////////
void fade1N(uint8_t brightness, uint8_t incLevel)
{
 rgb pix[1];

 // Initialize the colors on the array
 pix[0].r = brightness;
 pix[0].g = 0;
 pix[0].b = 0;

 // Display the LEDs
 for (uint16_t iter = 0; iter < 20 ; iter++) {
 const uint8_t oldSREG = SREG;
 cli();
 for (uint16_t i = 0; i < numPixels ; i++) {
 myLeds.sendPixels(1, pix);
 }
 SREG = oldSREG;
 delay(100);

 // Rotate the colors based on the pixel's previous color.
 colorWheel(incLevel, pix[0].r, pix[0].g, pix[0].b);
 }
}

////////////////////////////////////////////////////////////////////////////////
/// @brief Display numPixels with a rotating rainbow color.
/// We use a 3 byte array storing one pixel.
/// We then send the same pixel repeatedly to the LED strip very fast.
/// This demonstrates the ability tocall the library repeatedly.
/// If this feature fails, you may see only 1 pixel lit, or a varying number
/// of pixels glitching on and off.
////////////////////////////////////////////////////////////////////////////////
void rainbow1N(uint8_t brightness)
{
  rgb pix[1];

  // Initialize the colors on the array
  pix[0].r = brightness;
  pix[0].g = 0;
  pix[0].b = 0;

  // Display the LEDs
  for (uint16_t iter = 0; iter < 20 ; iter++) {
    const uint8_t oldSREG = SREG;
    cli();
    for (uint16_t i = 0; i < numPixels ; i++) {
      myLeds.sendPixels(1, pix);
      // Rotate the colors based on the pixel's previous color.
      colorWheel(1, pix[0].r, pix[0].g, pix[0].b);
    }
    SREG = oldSREG;
    delay(100);
  }
}



////////////////////////////////////////////////////////////////////////////////
/// @brief This method is automatically called once when the board boots.
////////////////////////////////////////////////////////////////////////////////
void setup()
{
 // Turn off first 1000 LEDs
 myLeds.clear(1000);

 // Configure a strobe signal to Port B5 for people who
 // use oscilloscopes to look at the signal sent to the LEDs
 // Port B5 corresponds to the Arduino Uno pin13 (LED).
 //DDRB |= 1U << 5;
 //PORTB &= ~(1U << 5);
}


////////////////////////////////////////////////////////////////////////////////
/// @brief This method is automatically called repeatedly after setup() has run.
/// It is the main loop, and it calls all the other demo methods declared below.
////////////////////////////////////////////////////////////////////////////////
void loop()
{

 // Show 1 bright pixel, R, G then B.
 color1(255,0,0);
 holdAndClear(1000,200);
 color1(0,255,0);
 holdAndClear(1000,200);
 color1(0,0,255);
 holdAndClear(1000,200);

 // Show numPixels dim pixels, R, G then B
 color1N(8,0,0);
 holdAndClear(1000,200);
 color1N(0,8,0);
 holdAndClear(1000,200);
 color1N(0,0,8);
 holdAndClear(1000,200);

  // Rainbows
  rainbow1N(16);
  holdAndClear(1000,200);
  fade1N(16, 1);
  holdAndClear(1000,200);
}


Maintenant es t'il possible d'adapter cette bibliothèque avec mon code pour que tout cela fonctionne ?(code en pièce jointe+bibliothèque FAB_LED-master)

Merci d'avance !!!!
Title: Re: Horloge Géante
Post by: lesept on Oct 09, 2018, 05:59 pm
Bonjour

La bibliothèque est ici (https://github.com/sonyhome/FAB_LED) : je ne la connais pas, mais il me semble qu'elle fait ce que font les Neopixel et FastLED. Peut-être en mieux...

Donc, pour l'utiliser pour afficher des messages, il faut faire la fonction qui indique à chaque bande de leds quelles leds allumer. Ça nous ramène à deux étapes en arrière.
Title: Re: Horloge Géante
Post by: ASSM on Oct 09, 2018, 07:26 pm
Bonsoir Lespt

J'ai réussi a faire fonctionner le code Matrice_BT avec mes 3 matrices leds.(enfin ouf)

j'aurais souhaité rajouter la fonction de pouvoir régler la vitesse de défilement et l'intensité des leds.(sur mon application c'est une barre que j'augmente ou bien que je diminue)

Aurais tu une idée
Title: Re: Horloge Géante
Post by: lesept on Oct 09, 2018, 09:36 pm
Bravo !
J'imagine que la vitesse doit de régler via des delay ou un paramètre de temps, avec des appels de la fonction millis.
Pour la luminosité, ça dépend de la bibliothèque que tu utilises pour gérer les leds, je suppose. Ça doit être un paramètre du genre BRIGHTNESS
Title: Re: Horloge Géante
Post by: ASSM on Oct 09, 2018, 09:43 pm
Bonsoir

C'est sur le code suivant que j'aimerais avoir le contrôle de la vitesse du texte et de la luminosité des leds.

Code: [Select]

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#include <SoftwareSerial.h>
SoftwareSerial Bluetooth(10, 11); // RX, TX
#ifndef PSTR
 #define PSTR // Make Arduino Due happy
#endif

#define PIN 3 // N° Broche Branché à l'arduino

// MATRIX DECLARATION:
// Parameter 1 = width of EACH NEOPIXEL MATRIX (not total display)
// Parameter 2 = height of each matrix
// Parameter 3 = number of matrices arranged horizontally
// Parameter 4 = number of matrices arranged vertically
// Parameter 5 = pin number (most are valid)
// Parameter 6 = matrix layout flags, add together as needed:
//   NEO_MATRIX_TOP, NEO_MATRIX_BOTTOM, NEO_MATRIX_LEFT, NEO_MATRIX_RIGHT:
//     Position of the FIRST LED in the FIRST MATRIX; pick two, e.g.
//     NEO_MATRIX_TOP + NEO_MATRIX_LEFT for the top-left corner.
//   NEO_MATRIX_ROWS, NEO_MATRIX_COLUMNS: LEDs WITHIN EACH MATRIX are
//     arranged in horizontal rows or in vertical columns, respectively;
//     pick one or the other.
//   NEO_MATRIX_PROGRESSIVE, NEO_MATRIX_ZIGZAG: all rows/columns WITHIN
//     EACH MATRIX proceed in the same order, or alternate lines reverse
//     direction; pick one.
//   NEO_TILE_TOP, NEO_TILE_BOTTOM, NEO_TILE_LEFT, NEO_TILE_RIGHT:
//     Position of the FIRST MATRIX (tile) in the OVERALL DISPLAY; pick
//     two, e.g. NEO_TILE_TOP + NEO_TILE_LEFT for the top-left corner.
//   NEO_TILE_ROWS, NEO_TILE_COLUMNS: the matrices in the OVERALL DISPLAY
//     are arranged in horizontal rows or in vertical columns, respectively;
//     pick one or the other.
//   NEO_TILE_PROGRESSIVE, NEO_TILE_ZIGZAG: the ROWS/COLUMS OF MATRICES
//     (tiles) in the OVERALL DISPLAY proceed in the same order for every
//     line, or alternate lines reverse direction; pick one.  When using
//     zig-zag order, the orientation of the matrices in alternate rows
//     will be rotated 180 degrees (this is normal -- simplifies wiring).
//   See example below for these values in action.
// Parameter 7 = pixel type flags, add together as needed:
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 pixels)
//   NEO_GRB     Pixels are wired for GRB bitstream (v2 pixels)
//   NEO_KHZ400  400 KHz bitstream (e.g. FLORA v1 pixels)
//   NEO_KHZ800  800 KHz bitstream (e.g. High Density LED strip)

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(32, 8, 3, 1, PIN,
  NEO_TILE_TOP   + NEO_TILE_LEFT   + NEO_TILE_COLUMNS   + NEO_TILE_PROGRESSIVE +
  NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
  NEO_GRB + NEO_KHZ800);
 
const uint16_t colors[] = {
  matrix.Color(0, 0, 255),
}; // Couleur de la matrice(Bleu) choisir une ou plusieurs couleurs

#define arr_len( x )  ( sizeof( x ) / sizeof( *x ) ) // Calcul de la taille du message

int pixelPerChar = 6; // Charactères Standart est 8X6 Pixels
int x = matrix.width(); // Largeur de l'affichage
int pass = 0; // Compteur
int i = 0; // Compteur
int clr = 0; // Compteur d'indexation pour les couleurs
boolean newData = false;
String Message;

void setup() {
  Serial.begin(115200);
  Bluetooth.begin(57600); // A configurer en AT sur le module HC-06
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(40);
  matrix.setTextColor(colors[0]);
  Message = "ASSM"; // Choix du texte
  writeText(Message);
  delay(1000);
}

void loop() {
 // recvWithStartEndMarkers();
  ShowMessage();
  newData=false;
}

void ShowMessage() {
  int arrSize = arr_len( colors );
  writeText(Message);
  unsigned long chrono = millis();
  while (millis()-chrono<1000) {
    // rien (delay 1000)
    recvWithStartEndMarkers();
    }
}

/* --------------------  FUNCTION  --------------------  */
void writeText(String msg) {
  int arrSize = arr_len( colors ); // Tableau des couleurs du texte
  int msgSize = (msg.length() * pixelPerChar) + (2 * pixelPerChar); // Calcul de la longueur du message
  int scrollingMax = (msgSize) + matrix.width(); // Ajustement pour la longueur du message

  x = matrix.width(); // Position du curseur et du message a l'extreme droite
  clr = 0; // RAZ de la couleur

  while (clr <= arrSize) {
    /* Changement de la couleur a la fin du message */
    matrix.setTextColor(colors[0]);// Mettre clr a la place de 0 pour la couleur suivante
    matrix.fillScreen(0); // Ecran en entier;
    matrix.setCursor(x, 0); // Définir le point de départ pour la chaîne de texte
    matrix.print(msg); // Définir la chaîne de message
    recvWithStartEndMarkers();
    if (newData) break;

    /* DÉFILEZ LE TEXTE DE GAUCHE À DROITE EN DÉPLACANT LA POSITION DU CURSEUR */
    if (--x < -scrollingMax ) {
      /*  Ajustement de la longueur du message  */
      x = matrix.width();
      ++clr;
    }
    matrix.show();
    unsigned long chrono = millis();
  while (millis()-chrono<100) {
    recvWithStartEndMarkers();
    // rien (delay 100)
    // Vitesse de défilement du message
     }
  }
}

void recvWithStartEndMarkers() {
  static boolean recvInProgress = false;
  char startMarker = '#';
  char endMarker = '#';
  char rc;

  while (Bluetooth.available() > 0 && newData == false) {
    rc = Bluetooth.read();
    Serial.println(rc);
    if (recvInProgress == true) {
      if (rc != endMarker) Message += rc;
      else {
        Message += '\0'; // terminate the string
        recvInProgress = false;
        newData = true;
        // effacer la matrice
        matrix.fillScreen(0);
      }
    }
    else if (rc == startMarker) {
      Message = "";
      recvInProgress = true;
      }
  }
}
Title: Re: Horloge Géante
Post by: lesept on Oct 09, 2018, 10:40 pm
Et bien je suppose que le contrôle de la luminosité se fait par cette ligne
Code: [Select]
matrix.setBrightness(40);
et que la vitesse est réglée par la valeur 1000 ici
Code: [Select]
while (millis()-chrono<1000) {

Si tu augmentes cette valeur ça devrait ralentir...
Title: Re: Horloge Géante
Post by: ASSM on Oct 10, 2018, 07:27 am
Bonjour lesept

c'est exactement cela.

comment dois faire ?
Title: Re: Horloge Géante
Post by: lesept on Oct 10, 2018, 09:35 am
Je ne comprends pas, tu dis :

Quote
J'ai réussi a faire fonctionner le code Matrice_BT avec mes 3 matrices leds.(enfin ouf)
et tu postes un code : je pensais que c'était ça qui fonctionnait.

Tu veux contrôler la vitesse et la luminosité via ton appli Android ?

Si c'est le cas, tu dois créer des sliders qui te donneront les valeurs de luminosité et de vitesse (ou de temps d'attente), puis envoyer ces valeurs à l'appli Arduino. Il faut alors définir un "protocole" de communication, car tu dois pouvoir envoyer soit la luminosité, soit la vitesse, soit le texte à afficher, et ça doit être compris sans équivoque par le code.

Pour l'instant, tu as un caractère # en début et en fin de message : tu peux par exemple réserver ce caractère pour indiquer qu'il annonce le texte à afficher. Pour envoyer une valeur de luminosité, tu commencerais ton message par L et pour la vitesse par V.

Ça donnerait :
Code: [Select]
V500#      <-- Mise à 500 du temps d'attente
L50#       <-- Luminosité 50
#Message#  <-- Texte à afficher

Ensuite il faudra adapter la fonction recvWithStartEndMarkers pour prendre en compte ces différents start markers.
Title: Re: Horloge Géante
Post by: ASSM on Oct 10, 2018, 09:54 am
bonjour

je m'explique le code que j'ai posté fonctionne parfaitement avec mes 3 matrices et mon application en bluetooth.

Pour l'envoi du message je mais bien un # en début et fin de message.

j'aurais voulu améliorer ce code pour pouvoir contrôler la vitesse et la luminosité par un slider que j'ai ajouter a mon application (un pour la vitesse et l'autre pour la luminosité)

j'espère que je me suis bien expliqué.
Title: Re: Horloge Géante
Post by: lesept on Oct 10, 2018, 12:31 pm
C'est ce que j'avais cru comprendre.

Je te propose une nouvelle version de la fonction recvWithStartEndMarkers :
Code: [Select]
void recvWithStartEndMarkers() {
  static boolean recvMessageInProgress = false;
  static boolean recvLumiInProgress = false;
  static boolean recvSpeedInProgress = false;
  char startMessageMarker = '#';
  char startLumiMarker = '[';
  char startSpeedMarker = '{';
  char endMarker = '#';
  char rc;
  static int Lumi = 0;

  while (Bluetooth.available() > 0 && newData == false) {
    rc = Bluetooth.read();
    Serial.println(rc);

    // Traitement du message
    if (recvMessageInProgress == true) {
      if (rc != endMarker) Message += rc;
      else {
        Message += '\0'; // terminate the string
        recvMessageInProgress = false;
        newData = true;
        // effacer la matrice
        matrix.fillScreen(0);
      }
    }

    // Traitement luminosité
    else if (recvLumiInProgress == true) {
      if (rc != endMarker) Lumi = Lumi * 10 + rc - '0';
      else {
        recvLumiInProgress = false;
        Lumi = Lumi % 256; // Ne pas dépasser un certain seuil
        matrix.setBrightness(Lumi);
      }
    }

    // Traitement vitesse
    else if (recvSpeedInProgress == true) {
      if (rc != endMarker) Speed = Speed * 10 + rc - '0';
      else {
        recvSpeedInProgress = false;
      }
    }

    // Début de réception
    else if (rc == startMessageMarker) {
      Message = "";
      recvMessageInProgress = true;
    }
    else if (rc == startLumiMarker) {
      Lumi = 0;
      recvLumiInProgress = true;
    }
    else if (rc == startSpeedMarker) {
      Speed = 0;
      recvSpeedInProgress = true;
    }
  }
}

Elle suppose que les marqueurs de début sont :
Donc tu dois envoyer des commandes du genre :

La fonction met à jour la luminosité, mais pour la vitesse, il faut changer d'autres lignes dans le code. Il faut définir une variable globale
Code: [Select]
int Speed = 1000;
et changer
Code: [Select]
while (millis()-chrono<1000) {
en
Code: [Select]
while (millis()-chrono<Speed) {
Et tester...
Title: Re: Horloge Géante
Post by: ASSM on Oct 10, 2018, 01:43 pm
J'ai bien compris ton raisonnement mais il n'est pas plutot possible d'utiliser un indicateur

indicator== '1' pour le message envoyé
indicator== '2' pour la vitesse du message
indicator== '3' pour la luminosité

dans le principe du code suivant :

Code: [Select]

    void loop() {
      // Printing the text
      printStringWithShift(text, scrollSpeed);
      
      if (Bluetooth.available()) {   // Checks whether data is comming from the serial port
        indicator = Bluetooth.read();   // Starts reading the serial port, the first byte from the incoming data
        // If we have pressed the "Send" button from the Android App, clear the previous text
        if (indicator == '1') {
          for (int i = 0; i < 100; i++) {
            text[i] = 0;
            m.clear();
          }
          // Read the whole data/string comming from the phone and put it into text[] array.
          while (Bluetooth.available()) {
            incomebyte = Bluetooth.read();
            text[count] = incomebyte;
            count++;
          }
          count = 0;
        }
        // Adjusting the Scrolling Speed
        else if (indicator == '2') {
          String sS = Bluetooth.readString();
          scrollSpeed = 150 - sS.toInt(); // Milliseconds, subtraction because lower value means higher scrolling speed
        }
        // Adjusting the brightness
        else if (indicator == '3') {
          String sB = Bluetooth.readString();
          brightness = sB.toInt();
          m.setIntensity(brightness);
        }
      }
    }



En rajoutant bien sur cette partie du code
Code: [Select]

    int scrollSpeed = 100;
    int brightness = 15;
    char indicator;



Et cette partie dans le void setup()
Code: [Select]

      m.setIntensity(brightness); // initial led matrix intensity, 0-15



Title: Re: Horloge Géante
Post by: lesept on Oct 10, 2018, 02:05 pm
Ça revient au même, ce qui est appelé 'indicator', je l'appelle 'startMarker'. La principale différence c'est que la solution que je propose (qui n'est pas la mienne, je l'adapte) n'est pas bloquante et n'utilise pas de String.

Après, j'ai choisi les marqueurs en espérant qu'ils n'apparaissent pas dans les messages à afficher, pour qu'il n'y ait pas d'ambiguïté. Si on prend un indicateur "1" et que ton message à afficher comporte un "1", le code risque de se tromper et le prendre pour un indicateur.
Title: Re: Horloge Géante
Post by: ASSM on Oct 10, 2018, 02:13 pm
Je comprend bien mais de mon application je dois envoyer la commande [50# pour avoir la luminosité à 50.

Alors que dans mon application c'est une barre que j'augmente ou que je diminue pour le réglage de l'intensité.(qui est beaucoup plus simple a l'utilisation)
Title: Re: Horloge Géante
Post by: ASSM on Oct 10, 2018, 02:20 pm
En ce qui concerne l'indicator == '1' a la place du 1 cela pourrait être n'importe quel symbole pour éviter les conflits.
Title: Re: Horloge Géante
Post by: lesept on Oct 10, 2018, 02:32 pm
Ton appli est faite sous MIT App Inventor ? Je connais assez peu, mais ça me semble très flexible : tu dois pouvoir utiliser un slider, qui donnera une valeur que tu peux insérer entre les caractères que tu veux '[' et '#' pour créer le message envoyé par Bluetooth.

Mais, comme j'ai dit, je connais très peu...
Title: Re: Horloge Géante
Post by: ASSM on Oct 10, 2018, 02:59 pm
Mon application est bien faite sous MIT App Inventor

Je vais déjà faire un test ce soir avec la modification du code que tu m'as mis.
Title: Re: Horloge Géante
Post by: ASSM on Oct 10, 2018, 06:04 pm
Je viens de tester le code et je peux bien changer la luminosité en mettant par exemple [70#.

Par contre la vitesse je ne peux pas y toucher même si je met {200# rien se passe.

Voici le code complet utilisé
Code: [Select]

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#include <SoftwareSerial.h>
SoftwareSerial Bluetooth(10, 11); // RX, TX
#ifndef PSTR
 #define PSTR // Make Arduino Due happy
#endif

#define PIN 3 // N° Broche Branché à l'arduino

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(32, 8, 1, 1, PIN,
  NEO_TILE_TOP   + NEO_TILE_LEFT   + NEO_TILE_COLUMNS   + NEO_TILE_PROGRESSIVE +
  NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
  NEO_GRB + NEO_KHZ800);
 
const uint16_t colors[] = {
  matrix.Color(0, 0, 255),
}; // Couleur de la matrice(Bleu) choisir une ou plusieurs couleurs

#define arr_len( x )  ( sizeof( x ) / sizeof( *x ) ) // Calcul de la taille du message

int pixelPerChar = 6; // Charactères Standart est 8X6 Pixels
int x = matrix.width(); // Largeur de l'affichage
int pass = 0; // Compteur
int i = 0; // Compteur
int clr = 0; // Compteur d'indexation pour les couleurs
boolean newData = false;
String Message;
int Speed = 1000;

void setup() {
  Serial.begin(115200);
  Bluetooth.begin(57600); // A configurer en AT sur le module HC-06
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(255);
  matrix.setTextColor(colors[0]);
  Message = "L'ASSM vous souhaite la bienvenue"; // Choix du texte
  writeText(Message);
  delay(1000);
}

void loop() {
 // recvWithStartEndMarkers();
  ShowMessage();
  newData=false;
}

void ShowMessage() {
  int arrSize = arr_len( colors );
  writeText(Message);
  unsigned long chrono = millis();
  while (millis()-chrono<Speed) {
    // rien (delay 1000)
    recvWithStartEndMarkers();
    }
}

/* --------------------  FUNCTION  --------------------  */
void writeText(String msg) {
  int arrSize = arr_len( colors ); // Tableau des couleurs du texte
  int msgSize = (msg.length() * pixelPerChar) + (2 * pixelPerChar); // Calcul de la longueur du message
  int scrollingMax = (msgSize) + matrix.width(); // Ajustement pour la longueur du message

  x = matrix.width(); // Position du curseur et du message a l'extreme droite
  clr = 0; // RAZ de la couleur

  while (clr <= arrSize) {
    /* Changement de la couleur a la fin du message */
    matrix.setTextColor(colors[0]);// Mettre clr a la place de 0 pour la couleur suivante
    matrix.fillScreen(0); // Ecran en entier;
    matrix.setCursor(x, 0); // Définir le point de départ pour la chaîne de texte
    matrix.print(msg); // Définir la chaîne de message
    recvWithStartEndMarkers();
    if (newData) break;

    /* DÉFILEZ LE TEXTE DE GAUCHE À DROITE EN DÉPLACANT LA POSITION DU CURSEUR */
    if (--x < -scrollingMax ) {
      /*  Ajustement de la longueur du message  */
      x = matrix.width();
      ++clr;
    }
    matrix.show();
    unsigned long chrono = millis();
  while (millis()-chrono<100) {
    recvWithStartEndMarkers();
    // rien (delay 100)
    // Vitesse de défilement du message
     }
  }
}

void recvWithStartEndMarkers() {
  static boolean recvMessageInProgress = false;
  static boolean recvLumiInProgress = false;
  static boolean recvSpeedInProgress = false;
  char startMessageMarker = '#';
  char startLumiMarker = '[';
  char startSpeedMarker = '{';
  char endMarker = '#';
  char rc;
  static int Lumi = 0;

  while (Bluetooth.available() > 0 && newData == false) {
    rc = Bluetooth.read();
    Serial.println(rc);

    // Traitement du message
    if (recvMessageInProgress == true) {
      if (rc != endMarker) Message += rc;
      else {
        Message += '\0'; // terminate the string
        recvMessageInProgress = false;
        newData = true;
        // effacer la matrice
        matrix.fillScreen(0);
      }
    }

    // Traitement luminosité
    else if (recvLumiInProgress == true) {
      if (rc != endMarker) Lumi = Lumi * 10 + rc - '0';
      else {
        recvLumiInProgress = false;
        Lumi = Lumi % 256; // Ne pas dépasser un certain seuil
        matrix.setBrightness(Lumi);
      }
    }

    // Traitement vitesse
    else if (recvSpeedInProgress == true) {
      if (rc != endMarker) Speed = Speed * 10 + rc - '0';
      else {
        recvSpeedInProgress = false;
      }
    }

    // Début de réception
    else if (rc == startMessageMarker) {
      Message = "";
      recvMessageInProgress = true;
    }
    else if (rc == startLumiMarker) {
      Lumi = 0;
      recvLumiInProgress = true;
    }
    else if (rc == startSpeedMarker) {
      Speed = 0;
      recvSpeedInProgress = true;
    }
  }
}
Title: Re: Horloge Géante
Post by: lesept on Oct 10, 2018, 06:24 pm
Essaye de changer :
Code: [Select]
    // Traitement vitesse
    else if (recvSpeedInProgress == true) {
      if (rc != endMarker) Speed = Speed * 10 + rc - '0';
      else {
        recvSpeedInProgress = false;
      }
    }

par
Code: [Select]
    // Traitement vitesse
    else if (recvSpeedInProgress == true) {
      if (rc != endMarker) {
         Speed = Speed * 10 + rc - '0';
         Serial.print ("Speed =");
         Serial.println(Speed);
         }
      else {
        recvSpeedInProgress = false;
      }
    }

et regarde ce que ça affiche sur la console : comment se comporte la variable Speed lorsque tu envoies la commande {578# par exemple ?

La différence entre la réglage de la luminosité et celui de la vitesse, c'est que pour la luminosité c'est fait lorsque on a fini de traiter la valeur. Pour la vitesse, c'est fait ... je ne sais pas trop. Il faut peut-être créer un drapeau qui indique quand changer la valeur de la vitesse.

Déjà, dis moi ce qu'affiche la console, je verrai ensuite.
Title: Re: Horloge Géante
Post by: ASSM on Oct 10, 2018, 06:51 pm
Je ne peux toujours pas controler la vitesse

et voici se que la console affiche

{
5
Speed =5
7
Speed =57
8
Speed =578
#
Title: Re: Horloge Géante
Post by: lesept on Oct 10, 2018, 07:45 pm
OK, alors la lecture de la vitesse est correcte, il reste à la communiquer à la loop. Peux tu ajouter dans la fonction ShowMessage, après
Code: [Select]
  unsigned long chrono = millis();la ligne
Code: [Select]
  Serial.println(Speed);et me dire ce qui s'affiche dans la console après que la vitesse soit reconstituée ?
Title: Re: Horloge Géante
Post by: ASSM on Oct 11, 2018, 11:06 am
Bonjour

j'ai essayé avec MIT App Inventor de mettre le slider par exemple entre [# mais impossible.

je ne peux qu'utiliser un indicateur comme décrit précédemment.

Comment pourrais je procéder ?
Title: Re: Horloge Géante
Post by: lesept on Oct 11, 2018, 11:38 am
Si c'est possible : épluche bien cet exemple (http://www.martyncurrey.com/arduino-hm-10-and-app-inventor-2-adding-a-slider/) (tu le comprendras mieux que moi, je l'ai lu en diagonale, mais Martin Currey est un cador du bluetooth), il montre ceci :

(http://www.martyncurrey.com/wp-content/uploads/2018/02/Arduino_HM-10_AI2_Adding_Slider_15-blocks05.jpg)


Il ajoute '[S' avant la valeur du slider et ']' après.
Title: Re: Horloge Géante
Post by: ASSM on Oct 11, 2018, 11:46 am
Je viens d'essayer le même code mais avec des indicateurs.

Peux tu me dire si je suis sur la bonne voie

Voici le code

Code: [Select]

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#include <SoftwareSerial.h>
SoftwareSerial Bluetooth(10, 11); // RX, TX
#ifndef PSTR
 #define PSTR // Make Arduino Due happy
#endif

#define PIN 3 // N° Broche Branché à l'arduino

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(32, 8, 3, 1, PIN,
  NEO_TILE_TOP   + NEO_TILE_LEFT   + NEO_TILE_COLUMNS   + NEO_TILE_PROGRESSIVE +
  NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
  NEO_GRB + NEO_KHZ800);
 
const uint16_t colors[] = {
  matrix.Color(0, 0, 255),
}; // Couleur de la matrice(Bleu) choisir une ou plusieurs couleurs

#define arr_len( x )  ( sizeof( x ) / sizeof( *x ) ) // Calcul de la taille du message

int pixelPerChar = 6; // Charactères Standart est 8X6 Pixels
int x = matrix.width(); // Largeur de l'affichage
int pass = 0; // Compteur
int i = 0; // Compteur
int clr = 0; // Compteur d'indexation pour les couleurs
boolean newData = false;
String Message;
int scrollSpeed = 100;
char indicator;
int brightness = 15;
char incomebyte;
int count = 0;

void setup() {
  Serial.begin(115200);
  Bluetooth.begin(57600); // A configurer en AT sur le module HC-06
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(255);
  matrix.setTextColor(colors[0]);
  Message = "L'ASSM vous souhaite la bienvenue"; // Choix du texte
  writeText(Message);
  delay(1000);
}

void loop() {
  ShowMessage();
  newData=false;
        if (Bluetooth.available()) {   // Checks whether data is comming from the serial port
        indicator = Bluetooth.read();   // Starts reading the serial port, the first byte from the incoming data
        // If we have pressed the "Send" button from the Android App, clear the previous text
        if (indicator == '1') {
          for (int i = 0; i < 100; i++) {
            Message[i] = 0;
            matrix.clear();
          }
          // Read the whole data/string comming from the phone and put it into text[] array.
          while (Bluetooth.available()) {
            incomebyte = Bluetooth.read();
            Message = incomebyte;
            count++;
          }
          count = 0;
        }
        // Adjusting the Scrolling Speed
        else if (indicator == '2') {
          String sS = Bluetooth.readString();
          scrollSpeed = 150 - sS.toInt(); // Milliseconds, subtraction because lower value means higher scrolling speed
        }
        // Adjusting the brightness
        else if (indicator == '3') {
          String sB = Bluetooth.readString();
          brightness = sB.toInt();
          matrix.setBrightness(100);
      }
   }
}

void ShowMessage() {
  int arrSize = arr_len( colors );
  writeText(Message);
  unsigned long chrono = millis();
  while (millis()-chrono<1000) {
    }
}

/* --------------------  FUNCTION  --------------------  */
void writeText(String msg) {
  int arrSize = arr_len( colors ); // Tableau des couleurs du texte
  int msgSize = (msg.length() * pixelPerChar) + (2 * pixelPerChar); // Calcul de la longueur du message
  int scrollingMax = (msgSize) + matrix.width(); // Ajustement pour la longueur du message

  x = matrix.width(); // Position du curseur et du message a l'extreme droite
  clr = 0; // RAZ de la couleur

  while (clr <= arrSize) {
    /* Changement de la couleur a la fin du message */
    matrix.setTextColor(colors[0]);// Mettre clr a la place de 0 pour la couleur suivante
    matrix.fillScreen(0); // Ecran en entier;
    matrix.setCursor(x, 0); // Définir le point de départ pour la chaîne de texte
    matrix.print(msg); // Définir la chaîne de message
    if (newData) break;

    /* DÉFILEZ LE TEXTE DE GAUCHE À DROITE EN DÉPLACANT LA POSITION DU CURSEUR */
    if (--x < -scrollingMax ) {
      /*  Ajustement de la longueur du message  */
      x = matrix.width();
      ++clr;
    }
    matrix.show();
    unsigned long chrono = millis();
  while (millis()-chrono<100) {
    // Vitesse de défilement du message
     }
  }
}


Title: Re: Horloge Géante
Post by: lesept on Oct 11, 2018, 12:11 pm
Je pense qu'il faut :
Code: [Select]
Message += incomebyte;

Code: [Select]
while (millis()-chrono<scrollSpeed)

et là
Code: [Select]
scrollSpeed = 150 - sS.toInt();ça dépend de ton échelle pour le slider (valeurs min et max).
Ça dépend aussi si tu veux que le slider te permette de choisir une vitesse d'affichage ou un temps d'attente entre deux affichages successifs. Dans le premier cas, tu peux mettre ça comme un pourcentage (0% : presque arrêté, 100% très rapide). Pour le code Arduino, il faut indiquer un temps d'attente (en gros un delay) donc scrollSpeed doit contenir cette durée.

Tu peux essayer :
Code: [Select]
scrollSpeed = 2100 - sS.toInt()*20;
Si tu es à 0%, ça fera 2.1 secondes et si tu es à 100% ça fera 100ms.

Mais tel que tu codes, ces instructions sont équivalentes à un delay :
Code: [Select]
while (millis()-chrono<scrollSpeed) {
    }
J'avais essayé d'éviter ça, car c'est bloquant : si une commande arrive pendant ce temps d'attente, elle ne sera pas prise en compte...
Title: Re: Horloge Géante
Post by: ASSM on Oct 11, 2018, 06:02 pm
je viens de faire un essai suite a ton post 334

et voici se que la console affiche
Code: [Select]


{
1
Speed =1
0
Speed =10
0
Speed =100
#
#


Title: Re: Horloge Géante
Post by: lesept on Oct 11, 2018, 09:35 pm
Et tu lui avais bien envoyé une valeur de 100 ?

A quoi correspond cette valeur : est-ce le maximum du curseur ?
Title: Re: Horloge Géante
Post by: ASSM on Nov 15, 2018, 04:53 pm
Bonjour

Voici le panneau d'affichage des scores enfin fini avec une petite vidéo

https://youtu.be/uqM4B4j-jeE (https://youtu.be/uqM4B4j-jeE)

Une deuxième avec l'envoi des messages par téléphone.
https://youtu.be/u9lKQAbWrEA (https://youtu.be/u9lKQAbWrEA)
Title: Re: Horloge Géante
Post by: lesept on Nov 15, 2018, 05:00 pm
Les liens sont locaux à ton ordinateur : je vais devoir le hacker pour y accéder... :)
Title: Re: Horloge Géante
Post by: ASSM on Nov 15, 2018, 05:28 pm
c'est modifié les liens….
Title: Re: Horloge Géante
Post by: lesept on Nov 15, 2018, 05:46 pm
Bravo, c'est superbe !

Perso, je trouve le défilement un peu lent... Mais sinon, c'est super !
Le message passe une seule fois ou en boucle ?
Title: Re: Horloge Géante
Post by: ASSM on Nov 15, 2018, 06:01 pm
Pour les défilement c'est normal que se soit un peu lent car il y a aussi des personnes âgées qui vont lire le message.
Et le message passe bien en boucle tant qu'il n'y a pas de nouveau message envoyé.
Title: Re: Horloge Géante
Post by: lesept on Nov 15, 2018, 08:28 pm
Eh bien : karma !
Title: Re: Horloge Géante
Post by: J4l13n on Nov 30, 2018, 12:57 pm
Bonjour ASSM

Pourrais tu poster ton code ?

Ton projet m'intérresse pour une association :)

@+
Title: Re: Horloge Géante
Post by: J4l13n on Nov 30, 2018, 04:18 pm
Re

Le code fonctionnel :


Code: [Select]

#include "FastLED.h"
#define NUM_LEDS 114 // Number of LED controls (remember I have 3 leds / controler
#define LED_TYPE WS2812B
#define COLOR_ORDER RGB
#define DATA_PIN 6  // Data pin for led comunication
#define BP_START 7 // Pin bouton Start
#define BP_STOP   8 // Pin bouton Stop
#define BP_RESET 9 // Pin bouton Reset
#define INTER 10   // Pin inter 15 / 45

CRGB leds[NUM_LEDS]; // Define LEDs strip
byte digits[10][28] = {
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, //0
  {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 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, 0, 0, 0, 0}, //2
  {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1}, //3
  {1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1}, //4
  {1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 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, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, //6
  {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1}, //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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1}, //9 | 2D Array for numbers on 7 segment
};
bool Dot = true;  //Dot state
int ledColor = CRGB::DarkGreen; // Color used (in hex)
int Heure = 0;
bool EtatChrono = false;  // Chrono arrêté
int HeureMax = 4500;
unsigned long dernierTempsChrono;

void setup() {
  Serial.begin(115200);
  LEDS.addLeds<WS2812B, DATA_PIN, RGB>(leds, NUM_LEDS);
  LEDS.setBrightness(255); // Set initial brightness
  BrightnessCheck();
  pinMode(BP_START, INPUT_PULLUP); // bouton START
  pinMode(BP_STOP, INPUT_PULLUP); // bouton STOP
  pinMode(BP_RESET, INPUT_PULLUP); // bouton RESET
  pinMode(INTER, INPUT_PULLUP); // inter 15 / 45
  TimeToArray();
  FastLED.show();
  dernierTempsChrono = millis();
}

// Check Light sensor and set brightness accordingly
void BrightnessCheck() {
  const byte sensorPin = 3; // light sensor pin
  const byte brightnessLow = 255; // 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 cursor = 0;
  int Secondes = Heure % 100;
  int Now = Heure;

  Dot = true;
  if (Secondes % 2 == 1) Dot = false;
  if (Dot) {
    leds[56] = ledColor;
    leds[57] = ledColor;
  }
  else {
    leds[56] = 0x000000;
    leds[57] = 0x000000;
  }

for (int i = 3; i >= 0; i--) {
    int digit = Now % 10; // get last digit in time
    cursor = i * 28;
    if (i > 1) cursor += 2;
    Serial.print (" "); Serial.print(digit);
    for (int k = 0; k < 28; k++) {
      leds[cursor + k] = ledColor * digits[digit][k];
    }
    Now /= 10;
  }
  Serial.println();
}

void MiseAJour()
{
  Heure += 1;
  if (Heure % 100 == 60) Heure = Heure + 40;
  Serial.print("Heure = "); Serial.print(Heure); Serial.print (" :");
}

void LectureBoutons()
{
  bool EtatStart = digitalRead(BP_START);
  delay(50);
  bool EtatStop = digitalRead(BP_STOP);
  delay(50);
  bool EtatReset = digitalRead(BP_RESET);
  delay(50);
  //  Serial.print ("Etat des boutons : Start = ");
  //  Serial.print (EtatStart );
  //  Serial.print (" Stop = ");
  //  Serial.print (EtatStop );
  //  Serial.print (" Reset = ");
  //  Serial.println (EtatReset );

  if (!EtatStart)  StartChrono ();
  else if (!EtatStop)  StopChrono ();
  else if (!EtatReset) ResetChrono ();
  HeureMax = 4500;
  if (digitalRead(INTER)) HeureMax = 1500;
}

void loop()  // Main loop
{
  LectureBoutons();
  if (EtatChrono)
  {
    if (millis() - dernierTempsChrono >= 1000)
    {
      dernierTempsChrono += 1000;
      MiseAJour();
      TimeToArray();
      FastLED.show(); // Display leds array
    }
  }
  if (Heure >= HeureMax) EtatChrono = false;
}

void StartChrono () {
  if (!EtatChrono) dernierTempsChrono = millis();
  EtatChrono = true;
}

void StopChrono () {
  EtatChrono = false;
}

void ResetChrono () {
  EtatChrono = false;
  Heure = 0;
  TimeToArray();
  FastLED.show();
}



@+