Vi chiedo scusa in anticipo per la mia incompetenza ma è davvero pochissimo che ho Arduino e non sono riuscito a capirci poi tanto.. Mi sono comprato il libro di Maik Schimdt "Il Manuale di Arduino" ma per quanto possa essere semplice per alcuni di voi, per me è alquanto impossibile capirci qualcosa..
Non riesco a capire per nulla il seguente codice:
const unsigned int LED_BIT0 = 12;
const unsigned int LED_BIT1 = 11;
const unsigned int LED_BIT2 = 10;
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);
La parte della dichiarazioni delle variabili è chiara, ma il resto è arabo..
Se volete darmi una mano ve ne sarei davvero grato..
}
Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare.
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.
Genera un numero casuale tra 1 e 7 con la random()
In binario tali numeri sono 3 bit nelle varie combinazioni 000 fino a 111
Quindi 3 bit => 3 led e li accende a seconda della combinazione.
Se esce ad esempio il numero 5 avrai il numero binario 101 e quindi accende 2 led su 3
Il trucco stà qui nelle 3 istruzioni della output: result & B001 , questo verifica se il primo bit è a 1, si chiama mascheramento. & - Arduino Reference
Una operazione AND, dove c'e' 0 avrai sempre 0 (quindi non ti preoccupi dei primi due bit) dove c'e' 1, otterrai 0 o 1 a seconda del primo bit di "result"
Quindi result & B010 serve per "testare" se è a 1 o 0 il secondo bit
Non un esempio molto semplice. Se usava la bitRead() era più leggibile:
Vi ringrazio infinitamente per le risposte, da ciò che è scritto sul libro però si deduce che 3 led contemporaneamente non vengono accesi mai..
In maniera "terra terra" mi potete spiegare il perchè?
perche un dado va dal numero uno al numero sei, sette sarebbe 111 e quindi accenderebbe tutti i led ma non avresti più un dado.
random restituisce un long compreso tra min e max-1 scrivendo 1,7 avrai un numero tra 1 e 6, prova a scrivere 1,8.
se vuoi vedere i numeri collegaci un BCD con display 7 segmenti.
//PIN DOVE SONO COLLEGATI I LED
const byte PIN_LED[6] = { 2,3,4,5,6,7 };
void clearDado()
{
int i = 0;
for ( i = 0; i < 6; ++i )
digitalWrite(PIN_LED[i],LOW);
}
void displayDado(byte val)
{
int i;
for ( i = 0; i < 6; ++i )
digitalWrite(PIN_LED[i],HIGH);
}
void setup()
{
byte i,ani,e;
for ( i = 0; i < 6; ++i )
pinMode(PIN_LED[i], OUTPUT);
randomSeed(analogRead(A0));
ani = random(10,20);
for ( i = 0; i < ani; ++i)
{
clearDado();
e = random(1,7);
displayDado(e);
delay(250);
}
}
void loop() {
}
ora hai 6 led collegati e i pin sono scritti nel vettore PIN_LED, in questo caso avrai i led collegati ai pin 2,3,4,5,6,7.
Poi ho creato due funzioni, la prima "clearDado()" scorre il vettore abbassando le uscite e spegnendo di conseguenza tutti i led.
La seconda "displayDado()" invece alza il pin del vettore fino ad arrivare al numero passato come argomento.
Ho usato sempre il vettore per mettere tutti i pin in modalità output.
Ho aggiunto anche la classica animazione da dado, ovvero viene estrato un numero nell'intervallo tra 10 e 20 e inizio un ciclo entro 0 ed il numero estratto, a questo punto spengo i led e visualizzo il nuovo numero, aspetto un pochino e ripeto il ciclo fino ad arrivare a "ani" e allora esco lasciando visualizzato l'ultimo numero estratto.
@uwe sono una persona molto "Free Software"
e poi non era il problema ma solo una sua curiosità, non penso abbia ancora le capacità tecniche necessarie.
@paulus ci sono dadi di ogni sorta, con le lettere, coi disegni e quant'altro ma parlando di dado generico si intende quello a 6 facce e 6 numeri da 1-6.in caso diverso bisogna specificarlo.
La questione del dado binario è già stata da me sollevata e mi hanno cortesemente risposto Nidita69 e il moderator. Ho capito che devo studiare C per Arduino per capire meglio la programmazione del micro Arduino. Nel caso specifico le funzioni come output_result(result) che viene introdotta da Schimisdt come segue.
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
Il punto è proprio quando si introduce, fuori dal loop, output_result (result) per poi utilizzarla come bitwise per confrontare i bit.
Dove è il body e la signature della funzione creata da Schmidt?
Cosa fa? Non vedo parentesi graffe quando è stata invocata, cioè qui:
randomSeed(analogRead(A0));
long result = random(1, 7);
output_result(result);
Se è già in una libreria perchè non è richiamata all'inizio, tale libreria, con un include? O è nella libreria standard di Arduino?
Sto cercando di capire leggendo e studiando Beginning C for Arduino ma non riesco a trovare la soluzione. Se io mi creo una funzione devo mettere la signature, nevvero? Cito ad esempio VBextreme che per fare il dado a sei LED ha creato le seguenti funzioni clearDad e display Dad con tanto di loro signature. E output_result, perchè no?
Ma allora come faccio a testare e sapere cosa fa, ad esempio, output_result se non ho il prototipo del suo body o come si chiama?
Grazie in anticipo, Vextreme, dele tue spiegazioni e ne approfitto per chiederti se c'è qualche altro manuale C per Arduino, magari in italiano, oltre quello consigliato da bp01 cioè Beginniong c for Arduino.
output_result() è una funzione, ed è subito dopo la funzione loop(), il c/c++ però vogliono sapere dove sta questa funzione prima di poterla chiamare e pertanto se la chiami prima di dichiararla dovresti avere errore ma Arduino crea lui i prototipi e quindi puoi evitarli di creare anche se io per buona abitudine lo faccio sempre.