Go Down

Topic: [RÉSOLUS-][DEBUTANT] Nombre aléatoire vers Byte (Serial.write) (Read 227 times) previous topic - next topic

Nostan

Bonjour,
Je suis certain de faire une duplication de topic mais je ne l'ai pas trouvé.
Merci d'avance si vous l'avez trouvé et que vous me le communiquez :).

J'ai débuté quelques projets et là je but.

Mon Projet: boite a "Ta gueule" (on ne juge pas c'est une demande :p)
Description:Une petite boite avec un bouton (le reste on verra plut tard). A chaque appuis sur le bouton un "Ta gueule" différent est joué.
Je me suis procuré un lecteur mp3 avec son "enceinte":Serial MP3 Player A (OPEN-SMART).
J'ai réussi a codé ce que je voulais a part pour l'aléatoire.
Voici le morceau de code qui ne fonctionne pas:
Code: [Select]
if (t <= 15) {
      char tmp1[10] = "0x0", tmp2[10] = {0};
      itoa(t, tmp2, 16);
      strcat(tmp1, tmp2);
      Serial.write((byte)(tmp1));
      }
         else {
            char tmp1[10] = "0x", tmp2[10] = {0};
            itoa(t, tmp2, 16);
            strcat(tmp1, tmp2);
            Serial.write((byte)(tmp1));
         }

il me permettrais en fonction du nombre aléatoire t de sortir en 0x** en fonction nombre.

J'ai tenté beaucoup de chose toutes aussi stupide les unes que les autres ou ce qu'on voit au dessus.

Voici le code complet au cas ou:
Code: [Select]
const byte Start = 0x7E;
const byte Stop = 0xEF;
const int buton = 12;
const int comTx = 17;
int butonS = 0;

void setup() {
  Serial.begin (9600);
  pinMode(buton, INPUT);
  pinMode (comTx, OUTPUT);


  delay(200);//Wait chip initialization is complete


  //select the TF card
  Serial.write(Start);
  Serial.write((byte)0x02);
  Serial.write((byte)0x35);
  Serial.write((byte)0x01);
  Serial.write(Stop);
  delay(100);

  //select volume
  Serial.write(Start);
  Serial.write((byte)0x03);
  Serial.write((byte)0x31);
  Serial.write((byte)0x0F);
  Serial.write(Stop);

  delay(200);//wait for 200ms

}
void loop() {

  butonS = digitalRead(buton);
  if (butonS == 1) {

    //reset
    Serial.write(Start);
    Serial.write((byte)0x03);
    Serial.write((byte)0x35);
    Serial.write((byte)0x02);
    Serial.write(Stop);
    delay(100);

    //int t = random(19);
    int t = 2; //force  pour test
    


    //play t
    Serial.write(Start);
    Serial.write((byte)0x04);
    Serial.write((byte)0x41);
    Serial.write((byte)0x00);
    if (t <= 15) {
      char tmp1[10] = "0x0", tmp2[10] = {0};
      itoa(t, tmp2, 16);
      strcat(tmp1, tmp2);
      Serial.write((byte)(tmp1));
      
      
      } else {
      char tmp1[10] = "0x", tmp2[10] = {0};
      itoa(t, tmp2, 16);
      strcat(tmp1, tmp2);
      Serial.write((byte)(tmp1));
         }
    
    
     Serial.write(Stop);
    delay(100);

  }

}


J'imagine que je ne suis pas du tout partis dans la bonne direction merci d'avance a ceux qui auront la gentillesse de me pointer le bon chemin. :D

Nostan

fdufnews

En fait, pour que l'on t'aide le plus simple ce serait de nous dire ce que tu voulais faire plutôt que de nous donner ce qui ne fonctionne pas.

Nostan

Effectivement...J'ai la tête dedans depuis ce midi que j'en perd le fil :).
Je cherche a transformer un nombre aléatoire en Hexa pour ensuite l'envoyer via Serial.write

j'arrive a faire le début (selon moi)
mais impossible de l'envoyer en Byte.
J'espère que c'est assez clair :s

fdufnews

Demande légèrement ambiguë.
Soit t une valeur quelconque sur un octet.
Envoyer en hexa
Code: [Select]
Serial.write(t);

Envoyer une valeur hexadécimale sous la forme d'une chaine de caractères
Code: [Select]
Serial.print(t,HEX);

Nostan

Bonjour fdufnews,
Merci pour ta réponse, mon soucis est ici effectivement.
Il faut que je l'envois en byte.
Quand je fais les testes, comme les deux que tu as cité, je vois que l'envois sur le moniteur série n'est pas bon.

Je ne suis pas certain que ça soit utile mais bon:
1.Pour ce code:
Code: [Select]
Serial.write(tmp1);
J'obtiens ce résultat:


2.Pour ce code:
Code: [Select]
Serial.print(tmp1,HEX);
J'obtiens ce résultat:


Et je sais que ça ne fonctionne pas car aucun son n'est joué.

Quand j'envois manuellement:
Code: [Select]
Serial.write((byte)0x02);

J'ai le résultat que je voudrais avoir (en plus du son qui est joué et qui correspond bien a la bonne piste):


Je fais de mon mieux pour expliquer mais je pense que j'utilise les mauvaises méthodes/mots :s.

Mon but ici est d'avoir un nombre aléatoire a envoyer en byte qui a l'"architecture" 0X0f ou 0x11 par exemple. Ce numéro aléatoire est la piste qui doit être joué (de 000.mp3 a 0018.mp3).
Suis-je plus clair?
 
Merci d'avance  :smiley-roll-sweat:   :smiley-zipper:

bricofoy

-tu savais que si tu passe le CD de windows à l'envers, tu entends une chanson satanique ?
-non, mais il y a pire : à l'endroit, ça l'installe !

fdufnews

Je ne vois pas les images. Le site est bloqué par le pare-feu du réseau sur lequel je suis connecté.
Tu es un peu embrouillé.
Dans ta demande tu parlais d'un nombre aléatoire.
Dans ce cas
Code: [Select]
Serial.write(le_nombre_en_question)doit fonctionner. Tu noteras que dans l'exemple que je donnais, j'avais utilisé la variable t que tu avais définie comme étant le nombre à envoyer.

Maintenant tu parles de faire
Code: [Select]
Serial.write(tmp1); or, dans ton programme tmp1 est une chaine de caractères. Pourquoi passer par une chaine alors que tu veux manipuler et envoyer un nombre???

Nostan

Bonjour Bricofoy,
Alors ta solution...fonctionne...  :o

La solution a mon problème est donc:

Code: [Select]
Serial.write((byte)t);

Bonjour Fdufnews,
Mon but était d'utiliser la variable concaténée "tmp1" (qui avait la forme hexa "0x02") donc je me servais uniquement d'elle.

Je ne pensais pas pouvoir envoyer aussi simplement mon nombre aléatoire "t" comme dans le code ci-dessus.
Tout ce que je codais était donc inutile car je faisais tout pour que le chiffre aléatoire ait la forme hexa "0x0E" ou "0x12" en fonction de t... un bricolage en somme.

Merci a vous deux, :smiley-surprise:  je me sens honteux maintenant!  :-[

bricofoy

en fait je crois que tu t'es fait des noeuds entre la valeur que tu dois envoyer, le numéro de la piste si j'ai bien suivi, qui doit être envoyé sur un seul octet (byte) et la représentation de cette valeur. Il faut bien comprendre que la forme décimale (2), la forme hexadécimale (0x02) ou encore la forme binaire (0b00000010) ne sont que des représentations différentes d'une même valeur.

Je suppose que dans la datasheet ou les exemples fournis avec ton lecteur mp3, la représentation hexadécimale était utilisée dans le code et que du coup tu t'es auto-persuadé qu'il fallait envoyer la représentation hexadécimale ? J'ai bon ?

Sauf que ce qu'il faut envoyer, c'est la valeur. Que tu fasse Serial.write(2); Serial.write(0x02); ou encore Serial.write(0b00000010); cela fait concrètement exactement la même chose : ce qui est vraiment envoyé sur le fil Tx de la liaison série, c'est 00000010. Soit la valeur 2.
-tu savais que si tu passe le CD de windows à l'envers, tu entends une chanson satanique ?
-non, mais il y a pire : à l'endroit, ça l'installe !

bricofoy

j'ajouterai que le cast (byte) ne sert à rien si la variable que tu envoies est déjà de type byte.
-tu savais que si tu passe le CD de windows à l'envers, tu entends une chanson satanique ?
-non, mais il y a pire : à l'endroit, ça l'installe !

Go Up