Buongiorno a tutti , sto realizzando per gioco una tombola elettronica particolare .
L'idea è quella di inserire dei soprannomi , cose ,oggetti in uso nel luogo/paese dove si gioca. Quando si estrae il numero i partecipanti non lo vedono direttamente ma lo devono indovinare dal soprannome, oggetto o cosa del loro paese. Una volta indovinato si prosegue .... (Lo scopo è allungare il brodo e fare due risate sui soprannomi e oggetti in uso con i nomi strampalati...)
Per l'Hardware utilizzo i MAX7219 a cui lascio la gestione del pannello dei 90 led e del display numerico , mentre quello testuale via IC2 bus con interfaccia PCF8574 per minimizzare le connessioni....
Voglio utilizzare un array contenente 90 testi appunto da richiamare a secondo del numero
Voglio utilizzare un generatore di numeri casuale per l'estrazione, magari dall' ADC
e in fine ho il problema di non far uscire una seconda volta il numero già estratto.
Su questo ultimo aspetto non ho una idea precisa....
Dico la prima che mi viene , memorizzare in eeprom la cifra estratta incrementando la posizione ogni volta , inserire in un array il valore e comparare il contenuto dell'array restituendo un vero o falso se continuare l'estrazione in caso di numero doppio ....
Come posso fare? Anche tenuto conto che la eeprom interna è un po permalosa per via dei cicli di scrittura.. (penso però per almeno 5000 cicli)
La vita "garantita" di ogni singolo byte della memoria EEPROM dei vari Arduino AVR è di 100'000 scritture (le letture sono illimitate).
Guglielmo
P.S.: Parliamo di vita "garantita", in pratica il numero di scritture possoibili è, normalmente, molto più alto.
Grazie Guglielmo non ricordavo bene il numero ... vedo che farò in tempo a morire e risorgere
Ma la scrittura in EEPROM serve solo per mantenere dati quando viene tolta l'alimentazione. Durante il funzionamento è sufficiente una variabile.
si ma se voglio spegnere il sistema e poi riprendere la partita potrebbe essere utile ... oppure se va a batteria un falso contatto alla clip , va via rete ecc...mi resetta il tutto...
Memorizzare potrebbe essere una garanzia? Oppure troppo sofistico? Alla fine sono 90 locazioni di eeprom memorizzabili a livello di 1 byte numerico....
leggermente troppo sofistico, secondo me
se va via corrente il problema di riprendere la partita è un problema minore
comunque credo si possa fare:
potresti usare una memoria esterna, una ram tamponata
nei moduli rtc hai a disposizione pochi byte
si potrebbe adottare un rtc che abbia spazio per due int (sto inventando adesso)
la questione è che Arduino non ha un generatore di numeri casuali, ma un generatore di numeri pseudo-casuali
che a partire da un seme genera una sequenza
a partire dallo stesso seme genererà sempre la stessa sequenza
quindi salvare il seme e il numero di estrazioni (diciamo H) già eseguite permetterà di ricominciare da zero la partita, semplicemente nascondendo le prime H estrazioni che siccome partono dallo stesso seme saranno le stesse della volta precedente
ovvio che all'accensione serve qualcosa per distinguere tra partita nuova o ripresa
e anche serve qualcosa per impedire di riprendere erroneamente una partita già finita
e se invece faccio partire con ciclo for 90 memorizzazioni casuali su eeprom dal generatore pseudo casuale di arduino .... dopo utilizzando una variabile index con modulo 90 agganciata a micros punto alla casella memorizzata e blocco la scansione col tasto estrazione.... otterrei la memorizzazione , il primo mischio dei numeri (pseudo arduino) e il successivo ri mischio all'estrazione (dito).....
Però c'è un ottima libreria del vecchio admin Leo che invece è molto più randomica e da sequenze diverse, la trovi QUI
Guglielmo
Grazie Guglielmo sembra interessante lo provo e ti dico ....
Cosa che comunque non interessa in questo caso
Io andrei semplicemente a leggere la durata della pressione del tasto di estrazione in microsecondi e poi farei modulo 90, più 1.
(Ho corretto)
Così rischi estrazioni doppie in abbondanza, modulo 91 poi ti potrebbe dare anche 0 come estrazione
Ok per la correzione
Inoltre non risolvi il problema di interrompere la partita, spegnere e poi riprendere quando vuoi
Sospendere e riprendere la partita è un altro discorso, ma basta mettere una batteria di backup che mantiene il microprocessore in funzione spegnendo i LED. La tensione di alimentazione può anche dare un consenso per bloccare le estrazioni quando l'apparecchio è in pausa.
Ah... Microsecondi diviso 4!
Se un numero è già uscito, moltiplica il valore per 7 e fa di nuovo mod90 +1.
Con un random si estrae un tempo pseudo casuale dopo il quale inizia, con un rumore, il conteggio dei tempo alla pressione del pulsante.
Allora ciclo for i per 90 numeri , ottenuti dal generatore random o rumore adc
abbiamo 90 numeri in memoria eeprom con 90 indirizzi da scansionare.
Appena inizio con l'estrazione mossa dalla pressione del tasto sotto una variabile legata a millis con modulo 89 leggo il numero, sparo le coordinate alla matrice led poi metto la locazione eeprom interessata a FF e quel numero non potrà piu uscire ....Cancellato.
Quindi:
- premo il pulsante
- dopo 0...1000ms inizia un rumore e comincia a contare il tempo della pressione del pulsante
- lasciato il pulsante, un secondo dopo appare il numero estratto in base a micros(); ((x/4)%90)+1.
Se è già stato estratto, fa x+=7 e di nuovo: ((x/4)%90)+1 finché non esce un numero non ancora estratto. Naturalmente, tutto questo dura un istante!
...e non esce nulla?...
Temo, però, che non ci sarà divertimento senza prendere i numeri dal sacchetto!
no quando trovo FF scelgo di proseguire la pressione del tasto automaticamente
il divertimento è indovinare i numeri dai soprannomi degli abitanti del paese ... perchè i numeri che escono non sono visibili al pubblico ma solo al gestore del tabellone. Il pubblico avrà solo un display 16x2 a caratteri grossi dove sarà scritto il soprannome esempio " Strappalenzola"