Présentation et Boule de Cristal: Mes réponses aléatoires ne sont pas aléatoires

Bonjour la commu,

Je me présente,

Je m’appelle Tim j’ai 29 ans et je suis à Toulouse. Je suis réparateur d’appareils photo (Numériques) et accessoirement réparateur et bidouilleur de tout ce qui peut être électronique. Cependant ayant une formation de photographe (CAP et Brevet Technique) mes notions en électroniques restent vagues et très appliquées à mon domaine. J’ai quelques notions en programmation mais celles-ci sont basiques et essentiellement théoriques (html, css, flash).

J’ai actuellement quelques projets:

-fabrication d’un appareil photo numérique pour gaucher (détournement d’un appareil déja existant de marque commune en appareil pour gaucher).

-De la déco lumineuse et un système domotique simple pour piloter les lumières de la maison et créer une maison aux luminaires “intelligents”, ou au moins connectés.

-Un système de lumières nocturnes pour le vélo.

-Pimper ma vie, déguisements qui clignotent, PC qui clignote, Bureau qui clignote, Clavier qui clignote, Led Led Led… Led partout!!

Mais bref, un long chemin dont la première embûche arrive maintenant.

Je viens donc de débuter en Arduino!!

J’ai acheté mon StarterKit avec un Uno (R N°???), avec le bouquin de projets à l’intérieur (Pas super bien expliqué d’ailleurs, pour ce qui est de mon avis), en parallèle je suis le cours “Programmez vos premiers montages” sur OpenClassRoom (j’en suis au chapitre : “faites des boucles et des calculs”). Et biens sur j’expérimente de mon côté (surtout la programmation, à laquelle je suis super étranger).

Et voilà dans le livre je fais la Boule de Cristal, qui consiste à poser une question fermée, secouer l’engin et attendre une réponse aléatoire sur douze réponses possibles (dans mon cas) afichées sur un petit écran (16, 2).
Et ça marche!! Je l’ai un peu arrangé à ma façon histoire de la rendre plus lisible et agréable, l’idée serait de la mettre dans un miroir dont le reflet s’efface au moment d’afficher la réponse, mais on verra plus tard.

Cependant j’ai alors un problème, l’ordre des réponses n’est pas aléatoire… Il suit un pattern. J’ai croisé les tests et les essais (la méthode empirique souvent utilisée en réparation) pour voir d’où venait le soucis mais rien n’y fait. Quoi qu’il arrive le pattern est toujours le même… J’ai réécrit mon code J’ai téléversé, inversé, reversé, renversé, mais non TOUJOURS le même pattern.

Je pense que ça vient du code et pas de l’électronique (pourquoi je pense ça? J’en sais rien).

Enfin… J’ai besoin d’aide et de conseils et je pense que la commu peut m’aider!!

Je vous donne le code et le pattern

 [b]#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5 , 4 , 3 , 2);
const int switchPin = 6;
int switchState = 0;
int prevSwitchState = 0;
int reply;
void setup() {
  lcd.begin(16, 2);
  pinMode (switchPin, INPUT);
  lcd.print("Demandez à la");
  lcd.setCursor(0, 1);
  lcd.print("boule magique !");
}
void loop() {
  switchState = digitalRead(switchPin);
  if (switchState != prevSwitchState) {
    if (switchState == LOW) {

      lcd.clear();
      delay(1000);
      lcd.print("Hmmmmmmm...");
      delay(1000);

      lcd.clear();
      delay(1000);
      lcd.setCursor(0, 0);
      lcd.print("La boule dit :");
      delay(2000);
      lcd.clear();
      delay(1000);
      lcd.setCursor(0, 0);
      reply = random(12);
      switch (reply) {
        case 0 :
          lcd.print("Mais Oui C clair");
          delay(2000);
          lcd.clear();
          delay(1000);
          lcd.print("ca y fait");
          delay(500);

          lcd.setCursor(0, 1);
          lcd.print("allusion");

          break;
        case 1 :
          lcd.print("Probablement");
          delay(2000);
          lcd.setCursor(13, 0);
          lcd.print("ou");
          delay(1000);
          lcd.setCursor(0, 1);
          lcd.print("probablement pas");
          break;
        case 2 :
          lcd.print("Va chier");
          delay(2000);
          lcd.setCursor(0, 1);
          lcd.print("J'ai du bon PQ");
          break;
        case 3 :
          lcd.print("Sans doute");
          break;
        case 4 :
          lcd.print("Pas sur");
          break;
        case 5 :
          lcd.print("Redemande moi");
          break;
        case 6 :
          lcd.print("Non");
          break;
        case 7 :
          lcd.print("Va tfaire foutre");
          delay(1500);
          lcd.setCursor(0, 1);



          lcd.print("Mais avec classe");
          break;
        case 8 :
          lcd.print("C d'la merde");
          delay(2000);
          lcd.setCursor(0, 1);

          lcd.print("Qui sent bon");
          break;
        case 9 :
          lcd.print("J'en sais rien");
          break;
        case 10 :
          lcd.print("42");
          delay(2000);
          lcd.clear();
          delay(1000);
          lcd.print("La reponse est");
          lcd.setCursor(0, 1);
          lcd.print("toujours 42");
          break;
        case 11 :
          lcd.print("Heu...");
          break;
      }
    }
  }
  prevSwitchState = switchState;
}
[/b]

Et pour le pattern:

case:

7-1-5-2-10-8-0-2-11-1-0-5-0-2-3-11-7-1-4-4-3-1 etc etc…

Ha et désolé pour ce qu’il y a d’écrit dans les pattern, c’est pour mes colocs bourrés en soirée!! :slight_smile:

Voilà je vous remercie et je serais ravi de répondre par la même et au fur et à mesure de mon arrivée sur ce forum à toutes vos questions sur la réparation d’un appareil photo numérique alors n’hésitez pas.

En vous remerciant,

Tte!!

Bonjour

Alors je suis désolé je ne connais pas l’astuce pour mettre le code en bonne forme dans mon post… Doit y avoir une astuce (j’avoue avoir peu cherché), donc ce sera moche et illisible mais aussitôt que je saurais je modifierais pour le mettre en bonne forme.

Le secret te sera révélé …si tu lis les divers messages épinglés en tête de forum.
Il est attendu des ‘arrivants’ qu’ils prennent connaissance des consignes avant leur première intervention…

Fait merci, j'ai pas l'habitude d'utiliser les forums!!

dans ton setup(), ajoute la ligne suivante

randomseed ( millis() ) ;

Tritips peut peut être réinitialiser random() avec millis() avant chaque appel à random et ainsi bénéficier d'un écart temporel imprévisible à l'échelle humaine entre deux appuis successifs du BP ?

Oui ! Quand les tirages au sort se font après chaque appui ça parait la méthode la plus simple à mettre en oeuvre et avec micros() la roue tourne encore plus vite !!

Un randomSeed d’un analogRead d’une pin Ax flottante (sans rien de connecté) fonctionne assez bienrandomSeed( analogrRead(A0) );devrait faire le job

Mettre en mémoire Eeprom la valeur renvoyée par millis() lors de l'arrêt de la carte et repartir avec la lecture de cette valeur....

pepe:
C'est effectivement la solution donnée dans la documentation de référence de la fonction randomSeed().

Toutefois, cela ne semble bien fonctionner que si l'opération est menée tout au début du programme et si l'environnement électrique est suffisamment perturbé.

En effet, j'ai pu constater que les mêmes séquences pseudo-aléatoires produites avaient tendance à revenir très souvent quand l'environnement était peu bruité, d'autant plus lorsque la tension avait eu le temps de se stabiliser après le démarrage du programme.

en plantant un fil en l'air dans A0 ça génère du bruit...

C'est normal que vous retrouviez toujours la même séquence, cela vient du fait que vous appelez "random" uniquement lorsque vous en avez besoin, de ce fait, il déroule tranquillement sa séquence "à votre rythme".

Pour y pallier, pas besoin d'initialisation, il suffit de ne plus conditionner l'appel à random à votre appui sur un bouton, mais de l'appeler systématiquement dans la loop, c'est-à dire :

loop() {
  reply = random(12);
  si bouton appuyé {
    choix d'affichage
  }
}

Cordialement.

Pierre

pepe:
Par exemple, on pourrait rajouter (comme le suggère al1fch, mais avec la fonction micros() ) :

...

void loop() {
 switchState = digitalRead(switchPin);
 if (switchState != prevSwitchState) {
   randomSeed( micros() );  // ← modification aléatoire de la séquence pseudo-aléatoire

Dans ce cas, il n’y a même plus besoin des fonctions randomSeed() et random(), il suffit de garder quelques bits faibles de la valeur renvoyée par micros() pour avoir une valeur quasi-aléatoire.

Perso j’utilise ça :

uint32_t seed = 0;
for (uint8_t i=0; i<32; i++) seed = (seed << 1) | (analogRead(A0) & 1);
ramdomSeed(seed);

Bonjour!!

Tout d’abord merci pour vos réponses!! Certaines sont encore un peu techniques pour moi mais j’me documente et ça vient petit à petit.

Alors voilà, j’ai utilisé la solution de “ChPr”, et ça marche!!

J’ai ce que je veux c’est à dire un random total dans les réponses.

Cependant je ne comprend pas comment… le fait de mettre le random à cet endroit change quelque chose.

Je testerais les autres solutions proposées. Je suppose qu’elles doivent fonctionner même si je dois encore étudier randomSeed. Cela veut donc dire qu’il y a plusieurs façon d’arriver au même résultat? A voir en fonction de la situation et de ce que l’on veut?

je vous met le code :

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5 , 4 , 3 , 2);
const int switchPin = 6;
int switchState = 0;
int prevSwitchState = 0;
int reply;
void setup() {
  lcd.begin(16, 2);
  pinMode (switchPin, INPUT);
  lcd.print("Demandez à la");
  lcd.setCursor(0, 1);
  lcd.print("boule magique !");
}
void loop() {
  reply = random(12);
  switchState = digitalRead(switchPin);
  if (switchState != prevSwitchState) {
    if (switchState == LOW) {
      lcd.clear();
      delay(1000);
      lcd.print("Hmmmmmmm...");
      delay(1000);
      lcd.clear();
      delay(1000);
      lcd.setCursor(0, 0);
      lcd.print("La boule dit :");
      delay(2000);
      lcd.clear();
      delay(1000);
      lcd.setCursor(0, 0);

      switch (reply) {
        case 0 :
          lcd.print("Mais Oui C clair");
          delay(2000);
          lcd.clear();
          delay(1000);
          lcd.print("ca y fait");
          delay(500);
          lcd.setCursor(0, 1);
          lcd.print("allusion");
          break;
        case 1 :
          lcd.print("Probablement");
          delay(2000);
          lcd.setCursor(13, 0);
          lcd.print("ou");
          delay(1000);
          lcd.setCursor(0, 1);
          lcd.print("probablement pas");
          break;
        case 2 :
          lcd.print("Va chier");
          delay(2000);
          lcd.setCursor(0, 1);
          lcd.print("J'ai du bon PQ");
          break;
        case 3 :
          lcd.print("Sans doute");
          break;
        case 4 :
          lcd.print("Pas sur");
          break;
        case 5 :
          lcd.print("Redemande moi");
          break;
        case 6 :
          lcd.print("Non");
          break;
        case 7 :
          lcd.print("Va tfaire foutre");
          delay(1500);
          lcd.setCursor(0, 1);
          lcd.print("Mais avec classe");
          break;
        case 8 :
          lcd.print("C d'la merde");
          delay(2000);
          lcd.setCursor(0, 1);
          lcd.print("Qui sent bon");
          break;
        case 9 :
          lcd.print("J'en sais rien");
          break;
        case 10 :
          lcd.print("42");
          delay(2000);
          lcd.clear();
          delay(1000);
          lcd.print("La reponse est");
          lcd.setCursor(0, 1);
          lcd.print("toujours 42");
          break;
         case 11 :
          lcd.print("Heu...");
          break;
      }
    }
  }
  prevSwitchState = switchState;
}

Et je reste à votre écoute pour des questions appareil photo!!

Merci beaucoup!!

PS: Cette histoire de bruit qu’est ce que c’est?

Le bruit en général c'est quelque chose qu'on veut pas.... en électronique, c'est un signal qui n'est pas désiré ( à part dans le cas décrit ici) bref des parasites ....