[Résolu] Lettre Aleatoire

Bonsoir,
J’aimerais afficher une lettre ainsi que son code morse en aléatoirement sur un écran lcd 2 lignes.
J’ai réussis le cablage qui est le suivant :
Mais j’ai du mal sur le code : il n’y a pas d’erreurs et le nombre et bien générer mais pas la lettre.

Le code :

long nombre;
char lettre;

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  Serial.begin(9600);
  randomSeed(analogRead(0));

  pinMode(2, OUTPUT);
  pinMode(3, INPUT);
}

void loop() {
    nombre = random(0, 26);
  if(nombre == 1) {
    char lettre[] = "A .-";
  }
  if(nombre == 2){
    char lettre[] = "B -...";
  }
  if(nombre == 3){
    char lettre[] = "C -.-.";
  }
  if(nombre == 4){
    char lettre[] = "D -..";
  }
  if(nombre == 5){
    char lettre[] = "E .";
  }
  if(nombre == 6){
    char lettre[] = "F ..-.";
  }
  if(nombre == 7){
    char lettre[] = "G --.";
  }
  if(nombre == 8){
    char lettre[] = "H ....";
  }
  if(nombre == 9){
    char lettre[] = "I ..";
  }
  if(nombre == 10){
    char lettre[] = "J .---";
  }
  if(nombre == 11){
    char lettre[] = "K -.-";
  }
  if(nombre == 12){
    char lettre []= "L .-..";
  }
  if(nombre == 13){
    char lettre[] = "M --";
  }
  if(nombre == 14){
    char lettre []= "N -.";
  }
  if(nombre == 15){
    char lettre[] = "O ---";
  }
  if(nombre == 16){
    char lettre[] = "P .--.";
  }
  if(nombre == 17){
    char lettr[] = "Q --.-";
  }
  if(nombre == 18){
    char lettre[] = "R .-.";
  }
  if(nombre == 19){
    char lettre[] = "S ...";
  }
  if(nombre == 20){
    char lettre[] = "T -";
  }
  if(nombre == 21){
    char lettre[] = "U ..-";
  }
  if(nombre == 22){
    char lettre[] = "V ...-";
  }
  if(nombre == 23){
    char lettre []= "W .--";
  }
  if(nombre == 24){
    char lettre[] = "X -..-";
  }
  if(nombre == 25){
    char lettre[] = "Y -.--";
  }
  if(nombre == 26){
    char lettre[] = "Z --..";
  }
  Serial.println(nombre);
  Serial.println(lettre);

  delay(500);


  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print(lettre);

}

Cordialement,
ZeEleveZozo,

Tel que tu l'écris, le char est une variable locale de ton if. Donc il n'est pas connu lors de ton print.
Tu dois définir un tableau de char vide en début de loop, et le renseigner dans tes if.

Tout d’abord un grand merci de m’aider mais malheureusement je ne sais comment faire ce que vous me dites et je ne comprend pas bien

Cordialement,

lesept:
Tu dois définir un tableau de char vide en début de loop, et le renseigner dans tes if.

Je dirais plutôt : définir un pointeur sur char en début de loop. Par exemple:

void loop () {
  const char* lettre;
  ...
  if ( nombre == 1 ) {
    lettre = "A .-";
  ...
  lcd.print(lettre);
}

roooohhh la vache, tous les if.
Pourquoi pas un switch?
Et pourquoi pas tirer au sort un chiffre qui renvoie à un code ASCII ?

Par ce que je ne sais pas comment faire.
Je sais que mon code n'est pas du tout optimisé mais je fait avec ...

Cordialement,

En plus de ce qui a déjà été relevé il y a une autre erreur dans le programme. Tu tires un nombre entre 0 et 25 inclus et tu testes le nombre entre 1 et 26 inclus.

Sinon pour éviter de traiter tous ces cas explicitement il est classique de faire comme ceci :

a) définir un tableau de chaînes de caractères

char alphabet[][7] = {  "A .-", "B -...",  /* A compléter */ , "Z --.." };

b) ensuite ce tableau permet d'obtenir directement la chaîne associée à l'entier nombre de la façon suivante :

char *lettre=alphabet[nombre];

Aucun if ou switch n'est plus nécessaire :wink:

Merci @biggil

Et je vais tester @supercc

Cordialement

lesept:
Tel que tu l'écris, le char est une variable locale de ton if. Donc il n'est pas connu lors de ton print.
Tu dois définir un tableau de char vide en début de loop, et le renseigner dans tes if.

Un lien qui explique mieux la portée des variables.

Bonjour, j’ai fait le char alphabet et voila ce que sa me donne :

Message d’erreur :

C:\Users\*****\OneDrive\Documents\Arduino\sketch_may20a\sketch_may20a.ino:2:258: warning: initializer-string for array of chars is too long [-fpermissive]

 char alphabet[][8] = {  "A .-", "B -...", "C -.-.", "D -..", "E", "F ..-.", "G --.", "H ....", "I ..", "J .---", "K -.-", "L .-..", "M --", "N -.", "O ---", "P .--.", "Q --.-", "R .-.", "S ...", "T -", "U ..-", "V ...-", "W .--", "X -..-", "Y -.--""Z --.." };

                                                                                                                                                                                                                                                                  ^

Le croquis utilise 3508 octets (10%) de l'espace de stockage de programmes. Le maximum est de 32256 octets.
Les variables globales utilisent 432 octets (21%) de mémoire dynamique, ce qui laisse 1616 octets pour les variables locales. Le maximum est de 2048 octets.

Mon code actuel :

long nombre;
char alphabet[][8] = {  "A .-", "B -...", "C -.-.", "D -..", "E", "F ..-.", "G --.", "H ....", "I ..", "J .---", "K -.-", "L .-..", "M --", "N -.", "O ---", "P .--.", "Q --.-", "R .-.", "S ...", "T -", "U ..-", "V ...-", "W .--", "X -..-", "Y -.--""Z --.." };

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  Serial.begin(9600);
  randomSeed(analogRead(0));

  pinMode(2, OUTPUT);
  pinMode(3, INPUT);
}

void loop() {
  nombre = random(0, 26);
  char *lettre = alphabet[nombre];
  Serial.println(nombre);
  Serial.println(lettre);
  delay(1000);
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print(lettre);

}

Et ce que sa me génère :

23
X -..-
25
!⸮⸮a
21
V ...-
20
U ..-
2
C -.-.
17
R .-.
9
J .---
3
D -..
6
G --.
15
P .--.
5
F ..-.
4
E
19
T -
14
O ---
10
K -.-
14
O ---
12
M --
18
S ...
13
N -.
17
R .-.
20
U ..-
7
H ....
3
D -..
21
V ...-
19
T -
3
D -..

Tu as oublié une virgule entre la définition du Y et du Z :wink:

Merci @Supercc et tout les autres

Cette communautés et vraiment la meilleur de tout le web !

Cordialement,

Juste dernier petit probleme : le Z n'est jamais generer meme quand je met

nombre = random(0, 27);

Sa me genere

26
J⸮{

Cordialement,

Franchement un random et un atoi() ...

kammo:
Franchement un random et un atoi() ...

Sa veut dire quoi au juste ?

Finalement le Z se genre aucun probleme

Mon code final :

long nombre;
char alphabet[][8] = {  "A .-", "B -...", "C -.-.", "D -..", "E .", "F ..-.", "G --.", "H ....", "I ..", "J .---", "K -.-", "L .-..", "M --", "N -.", "O ---", "P .--.", "Q --.-", "R .-.", "S ...", "T -", "U ..-", "V ...-", "W .--", "X -..-", "Y -.--","Z --.." };

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  Serial.begin(9600);
  randomSeed(analogRead(0));

  pinMode(2, OUTPUT);
  pinMode(3, INPUT);
}

void loop() {
  nombre = random(0, 26);
  char *lettre = alphabet[nombre];
  Serial.println(nombre);
  Serial.println(lettre);
  delay(1000);
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print(lettre);
}







[code]

Cordialement,

On fait un randomseed pour avoir un vrai aléatoire
On fait un random por avoir une valeur aléatoire entre 65 et 90, c’est la correspondance ASCII pour a et z
Avec atoi() on doit pouvoir faire de ce qu’on obtient un ‘vrai’ caractère, donc une lettre
j’ai jamais fait, mais ça me paraît presque évident…

J’essaie, je poste si j’arrive à qch

Voilà, hop, ca prend quelques lignes, pas de tableau, même pas de atoi()...
Evident...

Par contre je pense que les limites du random sont pas bonnes, m'en étais jamais servi...

byte RND;
void setup() {
  Serial.begin(9600);
  randomSeed(analogRead(A0));
}

void loop() {
RND = random(25); //aléatoire de 0 à 25
Serial.print("rand");
Serial.print("\t");
Serial.println(RND);
RND=map(RND,0,25,65,90); //on en fait un aléatoire entre 65 et 90
Serial.print("map");
Serial.print("\t");
Serial.println(RND);
//RND=atoi(RND);
char Z = RND;
Serial.print("\t");
Serial.println(Z);
Serial.println("-----------");
delay(1000);
}

J'ai oublié de virer la ligne //RND=atoi(RND);

Tu mets ça dans un arduino, tu lances le moniteur série (ctrl+M), et tu vois défiler des lettres.
Désolé le pc a planté deux fois entre les deux posts...

bravo kammo
merci merci ...