Go Down

Topic: Générer un Nom de Byte aléatoire  (Read 153 times) previous topic - next topic

steven63

Bonjour

Je veux faire un petit projet pour mon enfant qui commence à apprendre les chiffres et les lettres.
Je voudrais grace à un affichage (led matrix 8x8) pouvoir générer des lettres et des chiffres aléatoirement.


J'utilise plusieurs byte pour stocker les caractères
Code: [Select]

byte un[8]=   {0x08,0x18,0x28,0x48,0x08,0x08,0x08,0x3E};
byte deux[8]=   {0x1C,0x22,0x42,0x44,0x08,0x10,0x20,0x7E};
byte trois[8]=   {0x7C,0x04,0x04,0x04,0x1C,0x04,0x04,0x7C};


Mais ce que je n'arrive pas à faire ces un random qui puisse sélectionner soit le byte un, byte deux,etc...

Je pourrais passer par des if pour faire mon code mais je cherche à faire plus simple voila ce que j'ai compilé mais qui ne marche pas.


Code: [Select]
#include <LedControl.h>
int DIN = 12;
int CS =  11;
int CLK = 10;
long nombre;
byte alphabet[][3] = { "un", "deux", "trois" };
LedControl lc=LedControl(DIN,CLK,CS,0);


void setup() {
  Serial.begin(9600);
  randomSeed(analogRead(0));
  lc.shutdown(0,false);       //The MAX72XX is in power-saving mode on startup
  lc.shutdown(1,false);
  lc.setIntensity(0,1);      // Set the brightness to maximum value
  lc.setIntensity(1,5);
  lc.clearDisplay(0);         // and clear the display
  lc.clearDisplay(1);
  pinMode(2, OUTPUT);
  pinMode(3, INPUT);
}

void loop() {
    byte un[8]=   {0x08,0x18,0x28,0x48,0x08,0x08,0x08,0x3E};
    byte deux[8]=   {0x1C,0x22,0x42,0x44,0x08,0x10,0x20,0x7E};
    byte trois[8]=   {0x7C,0x04,0x04,0x04,0x1C,0x04,0x04,0x7C};
 
  nombre = random(0, 3);
  char *lettre = alphabet[nombre];
  printByte(lettre);
  Serial.println(nombre);
  Serial.println(lettre);
 
  delay(1000);

}
void printByte(byte character [])
{
  int i = 0;
  for(i=0;i<8;i++)
  {
    lc.setRow(1,i,character[i]);
  }
}

void printByte2(byte character [])
{
  int i = 0;
  for(i=0;i<8;i++)
  {
    lc.setRow(0,i,character[i]);
  }
}



Le soucis viens de la :

Code: [Select]
char *lettre = alphabet[nombre];
  printByte(lettre);


Mais je ne trouve pas la solution je sais pas si un atoi pourrez marché j'ai essayé mais je n'y arrive pas.


 

J-M-L

#1
Aug 02, 2020, 07:38 am Last Edit: Aug 02, 2020, 07:46 am by J-M-L
Faites un tableau à 2 dimensions et générez un index aléatoire dans ce tableau qui ira chercher le bon bitmap symboles[index]

Code: [Select]
const byte symboles[][8] = {
  {0x08,0x18,0x28,0x48,0x08,0x08,0x08,0x3E}, // un
  {0x1C,0x22,0x42,0x44,0x08,0x10,0x20,0x7E}, // deux             
  {0x7C,0x04,0x04,0x04,0x1C,0x04,0x04,0x7C}, // trois
....
};


Sinon l'écriture correcte avec vos tableaux déjà déclarés serait un tableau de pointeurs sur des octets
Code: [Select]
const byte* symboles[]= {un, deux, trois};

On peut déclarer tout cela en const puisqu'ils ne changeront pas
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

steven63

Merci de ton aide impeccable.
J'aurais du allez me coucher.
Car la solution était simple je sais pas pourquoi j'y avait pas pensé

Code: [Select]

#include <LedControl.h>
int DIN = 12;
int CS =  11;
int CLK = 10;
long nombre;
byte alphabet[][8] = { {0x08,0x18,0x28,0x48,0x08,0x08,0x08,0x3E} //1
                      , {0x1C,0x22,0x42,0x44,0x08,0x10,0x20,0x7E} //2
                      , {0x7C,0x04,0x04,0x04,0x1C,0x04,0x04,0x7C} //3
                      , {0x40,0x40,0x40,0x50,0x78,0x10,0x10,0x00} //4
                      , {0x7C,0x40,0x40,0x40,0x78,0x04,0x04,0x78} //5
                      };

LedControl lc=LedControl(DIN,CLK,CS,0);


void setup() {
  Serial.begin(9600);
  randomSeed(analogRead(0));
  lc.shutdown(0,false);       //The MAX72XX is in power-saving mode on startup
  lc.shutdown(1,false);
  lc.setIntensity(0,1);      // Set the brightness to maximum value
  lc.setIntensity(1,5);
  lc.clearDisplay(0);         // and clear the display
  lc.clearDisplay(1);
  pinMode(2, OUTPUT);
  pinMode(3, INPUT);
}

void loop() {

  nombre = random(0, 5);
  char *lettre = alphabet[nombre];
  printByte(lettre);
  delay(3000);

}
void printByte(byte character [])
{
  int i = 0;
  for(i=0;i<8;i++)
  {
    lc.setRow(1,i,character[i]);
  }
}

void printByte2(byte character [])
{
  int i = 0;
  for(i=0;i<8;i++)
  {
    lc.setRow(0,i,character[i]);
  }
}

J-M-L

#3
Aug 02, 2020, 09:57 am Last Edit: Aug 02, 2020, 10:08 am by J-M-L
parfois la nuit porte conseil :)

votre code un peu nettoyé
Code: [Select]
#include <LedControl.h>
const byte DIN = 12;
const byte CS =  11;
const byte CLK = 10;

const byte alphabet[][8] = {
  {0x08, 0x18, 0x28, 0x48, 0x08, 0x08, 0x08, 0x3E}, // 1
  {0x1C, 0x22, 0x42, 0x44, 0x08, 0x10, 0x20, 0x7E}, // 2
  {0x7C, 0x04, 0x04, 0x04, 0x1C, 0x04, 0x04, 0x7C}, // 3
  {0x40, 0x40, 0x40, 0x50, 0x78, 0x10, 0x10, 0x00}, // 4
  {0x7C, 0x40, 0x40, 0x40, 0x78, 0x04, 0x04, 0x78}  // 5
};
const byte nombreDeSymboles = sizeof(alphabet) / sizeof(alphabet[0]);

LedControl lc = LedControl(DIN, CLK, CS, 0);

void printByte(byte*character, byte row = 1)
{
  for (byte i = 0; i < 8; i++)   lc.setRow(row, i, character[i]);
}

void setup() {
  pinMode(2, OUTPUT);
  pinMode(3, INPUT);

  Serial.begin(115200);
  randomSeed(analogRead(0));
  lc.shutdown(0, false);      //The MAX72XX is in power-saving mode on startup
  lc.shutdown(1, false);
  lc.setIntensity(0, 1);     // Set the brightness to maximum value
  lc.setIntensity(1, 5);
  lc.clearDisplay(0);         // and clear the display
  lc.clearDisplay(1);
}

void loop()
{
  printByte(alphabet[random(0, nombreDeSymboles)]); // élément aléatoire dans l'alphabet
  delay(3000);
}

J'ai supprimé la seconde fonction printByte2, autant utiliser la première en donnant en paramètre le N° de rang. Je l'ai mis par défaut à 1 dans printByte(byte*character, byte row = 1) comme cela vous n'avez pas à utiliser ce paramètre si vous affichez à cet endroit 

j'ai rajouté une constante qui calcule le nombre de symboles dans votre alphabet, comme cela la fonction random va s'adapter automatiquement si vous rajoutez des symboles.

j'ai mis en 'const' ce qui était constant et supprimé les variables globales ou locales qui ne servaient à rien.

à quoi servent les pin 2 et 3 que vous déclarez en OUTPUT / INPUT mais que vous n'utilisez pas ? (donnez leur un petit nom sympa)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

steven63

Merci pour le nettoyage  :o  effectivement j'avais écrit grossièrement le code .

Sur les 2 inputs je vais rajouter 2 mini capteurs à mercure pour détecter les mouvements pour mettre l'appareil en veille si aucun mouvement est détecté pendant x temps pour économiser la batterie. Et peut être les utiliser pour détecter une secousse pour générer un random de lettre ou de chiffre.

Je suis en plein test je ferai une petite photo du projet final.

Je vais surement essayé de mettre tous ca sur un Attiny85  avec un shield batterie pour gagner le + possible en autonomie.

J-M-L

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up