Sto realizzando un tabellone segnapunti per padel utilizzando un pannello led 64x32. La parte dei punteggi funziona egregiamente. Ora lo vorrei arricchire con delle funzioni che commentano il punteggi. Per esempio al raggiungimento del 30-40 con la dicitura "break point". Vorrei che questo messaggio apparisse sul pannello per pochi secondi per poi tornare sul punteggio. Ho provato ad usare millis() nel modo seguente ma non va perchè millis() non "si ferma" e quindi non genera un lasso di tempo per far apparire il messaggio.
if (player1 == 30 && player2 == 40){
unsigned long currentMillis = millis();
previousMillis = currentMillis + durata; // --- durata = 5000 ms
if (millis() < previousMillis){
matrix.fillScreen(matrix.Color333(0, 0, 0));
matrix.setFont(&kongtext4pt7b);
matrix.setCursor(10, 15);
matrix.setTextColor(myWHITE);
matrix.print("Break point");
}
}
Riesco a farlo funzionare "imprigionando "currentMillis" in un ciclo while ma mi sembra un metodo troppo spartano in questo modo:
if (player1 == 30 && player2 == 40){
while (d < 1){
unsigned long currentMillis = millis();
cm = currentMillis;
d = d +1;
}
previousMillis = cm + durata; // --- durata = 5000 ms
}
if (millis() < previousMillis){
matrix.fillScreen(matrix.Color333(0, 0, 0));
matrix.setFont(&kongtext4pt7b);
matrix.setCursor(10, 15);
matrix.setTextColor(myWHITE);
matrix.print("break point");
}
C'è un modo per "stoppare" millis() in una variabile affinchè possa fare il calcolo:
if (millis() < (tempo bloccato + durata del messaggio in ms) then " fai apparire messaggio".
Spero di essere riuscito a descrivere il mio problema. Grazie per l'eventuale sostegno.
uint32_t timerBreakPoint;
bool flag3040;
void loop() {
if (timerBreakPoint) {
if (millis() - timerBreakPoint > 5000) { // sono trascorsi 5 secondi da quando hai preso il tempo
timerBreakPoint = 0; // azzera timerBreakPoint
// qui cancelli la scritta "Break point"
// (1) e dovresti tornare a visualizzare il punteggio
}
}
if (player1 == 30 && player2 == 40 && flag3040 ) {
// al prossimo ciclo di loop qui non ci entra più
matrix.fillScreen(matrix.Color333(0, 0, 0));
matrix.setFont(&kongtext4pt7b);
matrix.setCursor(10, 15);
matrix.setTextColor(myWHITE);
matrix.print("Break point");
timerBreakPoint = millis();
flag3040 = true; // per ricordarsi che questo punteggio è stato raggiunto
// la scritta break point è stata già visualizzata.
} // end if (player1 == 30 && player2 == 40)
Riguardo al commento (1) "dovresti" visualizzare il punteggio, solo che non è competenza di quella porzione di codice farlo. Pertanto per adesso lo fai poi posti tutto il codice e vediamo come aggiungere una schermata a tempo, qualcosa che
se schermata == 0 visualizza il punteggio ma se schermata == 1 visualizza un messaggio temporaneo a scelta, perché presumo si possa avere la necessità di visualizzare altri messaggi a tempo. Per introdurre questa funzionalità si dovranno usare le struct (parola chiave C/C++).
Secondo me dovresti aggiornare la scritta sul display (a prescindere dal contenuto che può essere il punteggio, la dicitura break point o quant'altro) solo nel momento in cui il testo da visualizzare è realmente cambiato e non in modo continuo nel loop.
Es:
nuovo punto -> aggiorno display , stop
break point -> aggiorno display e salvo millis() in una variabile, stop
Resta il fatto che scrivere il punteggio non è competenza di quella if al massimo quella if alza un flag per dire: Ho terminato di usare il display.
La competenza di visualizzare qualcosa spetta alla routine principale di gestione del display la quale accetta richieste del tipo: devo visualizzare questo per 5 secondi, accettata la richiesta è la routine principale che la deve soddisfare.
Senza vedere il resto del programma il problema principale è che quel punteggio 30/40 non muterà e verrà eseguito la if:
if (player1 == 30 && player2 == 40)
in loop e ci entrerà sempre fino a che il punteggio non cambia.
se il punteggio è cambiato, chiama per una volta la funzione di scrittura del punteggio, per esempio mettendo a true la variabile richiesta_di_scrittura_punteggio (o scrivi_punteggio), che poi viene rimessa a false;
se il punteggio è 30-40, inoltre, chiama per una volta la funzione del break point, mettendo a true la variabile scrivi_breakpoint, che poi viene rimessa a false.