usare la funzione random() per generare dei numeri esadecimali a caso

Salve! Mi servirebbe generare dei numeri a caso per il mio programma... Il problema è che questi numeri mi servono in esadecimale... Come posso fare? Stavo pensando di farmi generare il numero dalla funzione random() e successivamente di convertirli in qualche modo. Consigli?

Ehhh ? ? ? :o :o :o

Esadecimale, decimale, ottale … sono solo “rappresentazioni” della stessa cosa con caratteri differenti, i numeri sono sempre numeri e, nella MCU, sempre in binario sono !!!

Se li vuoi visualizzare in esadecimale, la funzione di stampa ha un parametro che è la base con cui visualizzare. Studia bene i metodi della classe Serial.

Se lo scopo è un’altro, spiegalo e vediamo di capirci.

Guglielmo

Salve, mi spiace di non essere stato chiaro... Allora, a me il numero esadecimale serve perchè pilotando un registro a scorrimento, nel programma è richiesto un valore esadecimale per dire ad Arduino che sequenza di numeri binari devono essere messi nel registro...

Ti ripeto che la "notazione" esadecimale è, appunto, solo una "notazione" per rappresentare ad un essere "umano" dei numeri binari in una forma più compatta.

Il tuo registro lo piloti in decimale, esadecimale, binario, ottale e qualsuasu altra base tu voglia usare ... devi solo spedire i giusti "bit" !!!

0011 1111 0101 1010 (binario) è l'equivalente di 0x3F5A (esadecimale) che è anche 037532 (ottale) ed anche 16218 (decimale) ... ma è, sempre e comunque, la stessa sequenza di bit.

Quindi, metti il pezzo di codice che vediamo dove hai il problema a spedire questo tuo numero allo shift regsiter ... oppure dai più dettagli perché altrimenti continuo a non capire ... ::)

Guglielmo

Ecco il codice:

void scritturaregistro(unsigned long valore) {         //funzione che si occupa del passaggio dei bit al registro
  digitalWrite(latch_, LOW);
  shiftOut(data_ , clock_ , MSBFIRST , (valore >> 16) ); //sposto le cifre più significative "in fondo" fino al 32 esimo LED
  shiftOut(data_ , clock_ , MSBFIRST , (valore >> 8) );
  shiftOut(data_ , clock_ , MSBFIRST , (valore) );
  digitalWrite(latch_, HIGH);
}

void animazione_slide() {
  if ((millis() - previousMillis1) >= intervalshift) {    //al posto della variabile che "simula" la funzione millis() ho prorpio messo millis()
    previousMillis1 = millis();                           //stessa cosa qua
    i++;
  }
  if (i <= 24) {          //animazione da sinistra verso destra
    scritturaregistro((unsigned long)0x1 << i);
  }
  else {
    i = 0;
  }
  if ((millis() - previousMillis2) >= intervalshift) {
    previousMillis2 = millis();
    j++;
  }
  if ( j <= 24) {                            //animazione da destra verso sinistra
    scritturaregistro(0x800000 >> i);
  }
  else {
    j = 0;
  }
  }

Nel punto in cui richiamo la funzione scrittura registro metto l’esadecimale. Quindi mi stai dicendo che al posto di quello, posso mettere il numero in binario? Io ho sempre visto usare il decimale, per quello faccio così.

Lo stesso valore puoi scriverlo in decimale, in binario, in esadecimale e anche in ottale, ma 10, 0b1010 e 0x0A sono lo stesso valore!

Diverso è quando, come nei moduli GPS u-blox, devi inserire valori divisi in blocchi di 8 bit: in quel caso devi andare a mascherare con 0x0000FF, 0x00FF00, 0xFF0000 per prendere di volta in volta gli 8 bit richiesti, ma poi il valore tra 0 e 255 puoi anche metterlo in decimale.

Datman: Diverso è quando, come nei moduli GPS u-blox, devi inserire valori divisi in blocchi di 8 bit: in quel caso devi andare a mascherare con 0x0000FF, 0x00FF00, 0xFF0000 per prendere ...

NO, non è diverso, le maschere per un AND (e per qualsiasi operazione logica) le puoi fare nella base che ti pare ... certo, in HEX è molto più facile "da leggere", ma nessuno ti vieta di usare il decimale o l'ottale ;)

Guglielmo

Sì, certo, ma voglio dire che lì è richiesto che i valori siano raggruppati per 8 cifre (bit) in base 2, ovvero 2 cifre in base 16.
Pur potendo essere scritti in una notazione qualsiasi, i valori sono raggruppati in blocchi di 8 bit, perché alla fine il processore u-blox li va a leggere in binario. Nella notazione binaria, quindi, si vede che sono in tutto 32 bit e vengono inviati in 4 gruppi di 8. Ho fatto notare questa cosa perché, cercando come inviare i dati al NEO-7 u-blox per la frequenza dell’uscita PPS, avevo trovato un programma con scritte cose strane… Chi l’ha scritto pretendeva di convertire i valori in esadecimale con un hex(x) prima di inviarli! Non riuscivo a capacitarmi di come potesse funzionare… e infatti funzionava solo per frequenze con poche cifre significative come 1MHz, 2kHz o cose simili. Impostando, ad esempio, 1,25MHz, usciva una frequenza completamente diversa! :slight_smile:

Datman: Sì, certo, ma voglio dire che lì è richiesto che i valori siano raggruppati per 8 cifre (bit) in base 2, ovvero 2 cifre in base 16.

Appunto, l'HEX è solo più comodo e "visivamente" molto più chiaro (per chi lo maneggia bene), ma il risultato finale è lo stesso ...

(pippo & 0x00FF) è identico a (pippo & 255)

... ma il primo, "visivamente" è certamente più chiaro :)

Guglielmo

Ok... Ho infatti provato ad usare il valore equivalente in binario, ma stranamente il programma accende sequenze sbagliate di LED. Possibile? Forse ho sbagliato qualcosa io...