Bonjour à tous!
je débute tout juste dans le milieu Arduino avec le starter kit (merci Noël) et je rencontre un petit problème en essayant d'améliorer le projet 11 "boule magique".
En cherchant à introduire différentes probabilités pour les différentes propositions à afficher sur l'écran LCD, je suis tombé sur cet article :
http://www.locoduino.org/spip.php?article56
Cet article traite du défaut de la fonction random() qui effectue toujours la même séquence à chaque reset. Je m'empresse d'essayer et effectivement cela ne manque pas. A chaque reset du programme on tombe sur les mêmes messages dans le même ordre. Certains diraient sans doute "pas besoin de se compliquer utilise randomSeed() et analog read()" mais justement cet article montre que ce n'est pas tout à fait aléatoire, et comme je suis un poil perfectionniste, j'ai voulu insérer le code de l'article dans le mien. Et c'est là que ça coince, je n'arrive pas à placer correctement le bout de programme, j'ai essayer de mettre tout dans void setup(me juger pas svp je commence :-*), avec ou sans le byte getSeed(), de le mettre avant le setup et d'appeler getSeed pendant le setup, de faire random(getSeed)...
soit le programme est incorect dans la syntaxe, soit on retrouve le même schéma que sans le bout de programme.
Voila je ne sais pas quoi faire et j'aimerais bien un peu d'aide merci d'avance
Bonjour,
Sans le code, on ne peut pas beaucoup t'aider.
Je ne sais pas si c'est une erreur de ton programme ou de ton message, mais ce n'est pas random(getSeed) mais sans doute random(getSeed())
le code est dans le lien qu'il donne mais effectivement pour pouvoir appeler une fonction correctement en C ou C++ il faut lui mettre des parenthèses, qui resteront vides si la fonction ne prend pas de paramètres
Notez que randomSeed
peut prendre un long
en paramètre, donc autant faire un seed qui offre plus de 256 valeurs et générer un long
.
#define RANDOM_PIN A0 // pin qui sert de générateur. mettre un fil en l'air pour augmenter l'entropie.
long buildLongSeed()
{
long seed = 0;
byte i = 8*sizeof(long); // 8 bits par octets multiplié par le nombre d'octets dans un long
while (i > 0) {
byte firstBit = analogRead(RANDOM_PIN) & 0x01;
if (firstBit != (analogRead(RANDOM_PIN) & 0x01)) {
seed = (seed << 1) | firstBit;
i--;
}
}
return seed;
}
void setup() {
Serial.begin(115200);
randomSeed(buildLongSeed());
}
void loop() {
int randNumber = random(300);
Serial.println(randNumber);
delay(50);
}
J-M-L:
le code est dans le lien ...
Je parlais du code de Youg. Comme le problème est quand il essaie d'insérer la fonction getSeed() dans son code, je ne vois pas comment répondre efficacement sans son code.
Oui OK - bien que je pense que vous avez raison vu qu'il dit essayer d'appeler random(getSeed)
Bonjour
Tout d'abord merci pour vos réponses
kamill:
Bonjour,Sans le code, on ne peut pas beaucoup t'aider.
Je ne sais pas si c'est une erreur de ton programme ou de ton message, mais ce n'est pas random(getSeed) mais sans doute random(getSeed())
l'erreur venait effectivement du programme... donc une fois les parenthèses rajouter tout fonctionne merci
mon programme donne donc ceci
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11,5, 4, 3, 2);
const int switchPin = 6;
int switchState = 0;
int prevSwitchState = 0;
int reply;
byte getSeed()
{
byte seed = 0;
for (byte i = 0; i < 8; i++) {
seed = (seed << 1) | (analogRead(A0) & 1);
}
return seed;
}
void setup() {
lcd.begin(16, 2);
pinMode(switchPin, INPUT);
lcd.print("Demandez a la");
lcd.setCursor(0, 1);
lcd.print("boule magique !");
randomSeed(getSeed());
// put your setup code here, to run once:
}
void loop() {
switchState = digitalRead(switchPin);
if (switchState != prevSwitchState) {
if (switchState == LOW){
reply = random(8);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("La boule dit :");
lcd.setCursor(0, 1);
switch(reply){
case 0 :
lcd.print("OUI");
break;
case 1 :
lcd.print("Je ne sais pas");
break;
case 2 :
lcd.print("Certainement");
break;
case 3 :
lcd.print("Sans doute");
break;
case 4 :
lcd.print("Pas sur");
break;
case 5 :
lcd.print("Redemande");
break;
case 6 :
lcd.print("J'en doute");
break;
case 7 :
lcd.print("NON");
break;
}
}
}
prevSwitchState = switchState;
// put your main code here, to run repeatedly:
}
[code]
[/code]
J-M-L:
Notez querandomSeed
peut prendre unlong
en paramètre, donc autant faire un seed qui offre plus de 256 valeurs et générer unlong
.#define RANDOM_PIN A0 // pin qui sert de générateur. mettre un fil en l'air pour augmenter l'entropie.
long buildLongSeed()
{
long seed = 0;
byte i = 8*sizeof(long); // 8 bits par octets multiplié par le nombre d'octets dans un long
while (i > 0) {
byte firstBit = analogRead(RANDOM_PIN) & 0x01;
if (firstBit != (analogRead(RANDOM_PIN) & 0x01)) {
seed = (seed << 1) | firstBit;
i--;
}
}
return seed;
}
void setup() {
Serial.begin(115200);
randomSeed(buildLongSeed());
}
void loop() {
int randNumber = random(300);
Serial.println(randNumber);
delay(50);
}
merci pour ce morceau de programme avec vos conseils j'ai réussi à l'ajouter sans problème et tout fonctionne
par contre faut il que je fasse quelque chose en particulier pour passer le topic en résolu?
tu peux éditer ton premier message et ajouter [Resolu] au début du titre