Problema di documentazione software: funzione output

Nel codice dello sketch binarydice (il dado virtuale binario - vedi manuale Schmidt), riportato di seguito:

const unsigned int LED_BIT0 = 12;
const unsigned int LED_BIT1 = 11;
const unsigned int LED_BIT2 = 10;

void setup() {
 pinMode(LED_BIT0, OUTPUT);
 pinMode(LED_BIT1, OUTPUT);
 pinMode(LED_BIT2, OUTPUT);
 
 randomSeed(analogRead(A0)); 
 long result = random(1, 7);
 output_result(result);
}

void loop() {
}

void output_result(const long result) {
 digitalWrite(LED_BIT0, result & B001);
 digitalWrite(LED_BIT1, result & B010);
 digitalWrite(LED_BIT2, result & B100);
}

appare, per la generazione di numeri casuali, la funzione OUTPUT_RESULT il cui risultato (result) andrà confrontato mediante and logico con i binari di accensione dei Led per accendere il dado magico con numeri binari.

Il codice funziona (dovrebbe funzionare) ma non ho trovato documentazione di cosa è e come funziona la funzione OUTPUT_RESULT. Nelle reference software di Arduino tale funzione non c'è e non la ho trovata neppure come funzione di C++. Non è un metodo della funzione random. Schmidt dice che tale funzione output_result accetta un valore numerico e restituisce i tre bit meno significativi del valore casuale attivando in corrispondenza i tre led di output. Dove trovo e come posso ispezionare questa funzione di numeri casuali?

Ps. Prima di essere ca...to: io non trovo e non dispongo del tasto insert code per l'inserzione el codice, ecco perchè del semplice copia e incolla. Grazie e saluti.

Esposito:
Nel codice dello sketch binarydice (il dado virtuale binario - vedi manuale Schmidt), riportato di seguito:

… se magari metti un link … lo troviamo anche noi :grin:

Esposito:
Ps. Prima di essere ca…to: io non trovo e non dispongo del tasto insert code per l’inserzione el codice, ecco perchè del semplice copia e incolla.

… disattento … è il primo a sinistra “</>” … correggi il post :wink:

Guglielmo

Esposito: ...non ho trovato documentazione di cosa è e come funziona la funzione OUTPUT_RESULT.

Non è una funzione di Arduino, è una funzione creata dall'autore. Nella funzione in questione usa l'operatore sui bit AND ovvero quel & http://www.arduino.cc/en/Reference/BitwiseAnd

const unsigned int LED_BIT0 = 12;
const unsigned int LED_BIT1 = 11;
const unsigned int LED_BIT2 = 10;

void setup() {
  pinMode(LED_BIT0, OUTPUT);
  pinMode(LED_BIT1, OUTPUT);
  pinMode(LED_BIT2, OUTPUT);
  
  randomSeed(analogRead(A0)); 
  long result = random(1, 7);
  output_result(result);
}

void loop() {
}

void output_result(const long result) {
  digitalWrite(LED_BIT0, result & B001);
  digitalWrite(LED_BIT1, result & B010);
  digitalWrite(LED_BIT2, result & B100);
}

Grazie Guglielmo, sopra c’è il, codice corretto. Ma non ho il link perchè si tratta del codice allegato al manuale di Arduino di Schmidt. Posso dare il link della pagina web per lo scarico del codice del libro:

http;//pragprog.com/book/msard2

Qui si trova tutto il codice degli esercizi tra cui il dado virtuale.

Quel libro ce l'ho (... ce li ho ho praticamente tutti :D) e ... ... scusa, ma a pagina 57 c'è :

void output_result(const long result) {
  digitalWrite(LED_BIT0, result & B001);
  digitalWrite(LED_BIT1, result & B010); 
  digitalWrite(LED_BIT2, result & B100);
}

... mi sembra abbastanza chiaro che è una funzione definita dall'autore che fa semplicemente delle digitalWrite().

Guglielmo

Edit : Più che riportare il codice corretto ... edita il tuo primo post e correggi quello ;)

Ringrazio i moderatori del link bitwise (non l'avrei mai trovato da solo) e della precisazione del fatto che output_result è una funzione creata dall'autore stesso la quale, da quello che dice lui, prende un valore numerico e restituisce i tre bit meno significativi (???????) del valore per fare poi ( e questo l'ho capito anche io) un and logico di corrispondenza tra i tre bit rilasciati da OUTput e i tre bit dei Led per fare la sequenza di accensione. Quindi, e poi bannatemi pure.:

1 - Mister Schmidt ha fatto una funzione ad hoc e anche una libreria per la generazione di numeri casuali? Come ha fatto?

2 - Che funzione altra standard posso usare per ottenere lo stesso risultalto casuale e poi fare l'and logico?

Grazie e saluti. Mi scuso per l'ignoranza.

1 - Mister Schmidt ha fatto una funzione ad hoc e anche una libreria per la generazione di numeri casuali? Come ha fatto?

No, ha usato invece la funzione random (vedi Reference)

// prepara il generatore pseudo casuale indicando il “seme” (livello casuale dell’ingresso analogico A0)
randomSeed(analogRead(A0));

// restituisce un valore long casuale tra 1 e 7
long result = random(1, 7);

Leggo ora ciberhs e ti ringrazio perchè è proprio qui che non capisco il software. Schimdt ha usato random e poi il valore casuale ottenutol viene passato in una variabile long result. Ma poi istituisce una funzione output_result che chiama il parametro result. Questo parametro result, istanziato da output, viene utilizzato come fattore per l'and logico nel void successivo. Cioè:

  randomSeed(analogRead(A0)); 
  long result = random(1, 7);
  output_result(result);
}

void loop() {
}

void output_result(const long result) {
  digitalWrite(LED_BIT0, result & B001);
  digitalWrite(LED_BIT1, result & B010);
  digitalWrite(LED_BIT2, result & B100);
}

Cosa fa output_result? Perchè creare una funzione ad hoc per la generazione di numeri casuali e non utilizzare random? Grazie.

No, fermo. Quel codice è solo un esempio e quindi NON è molto utile nella realtà. Un valore tra 0 e 7 vuol dire in binario un valore da 000 a 111 quindi un led per ogni posizione. Con questo ottiene un numero tra 1 e 7:

long result = random(1, 7);

Mentre la sua funzione output_result serve per farti "vedere" quali bit si accendono

Meglio se quelle tre righe le sposti nella loop, così:

void loop()
{ randomSeed(analogRead(A0)); 
  long result = random(1, 7);
  output_result(result);
  delay(3000);       // attesa 3 secondi
}

Almeno ogni 3 secondi ha un nuovo risultato :)

Grazie nid69ita delle delucidazioni. Ho trovato in rete un altro modo di realizzaare il dado magico utilizzando invece di output_result la funzione writeDIe per vedere i risultati della funzione random. Ecco il codice.

int numbers[6]=
{
  0b0010001000,
  0b0101000100,
  0b0111001100,
  0b1001010101,
  0b1011011101,
  0b1101110111,
};

long time=0;

void setup()
{
  for(int i=0;i<13;i++)pinMode(i,OUTPUT);
  pinMode(13,OUTPUT);
  randomSeed(analogRead(0));
}

void loop()
{
  while(digitalRead(13)==0);
  writeDie(random(1,7));
  while(digitalRead(13)==1);
}

void writeDie(byte num)
{
  int i=0;
  for(;i<6;i++)if(num==numbers[i]>>7)break;
  for(int k=0;k<9;k++)digitalWrite(k,bitRead(numbers[i],k));