Son d’accordo e nei programmi precedenti l’avevo fatto.
Poi mi pare qualcuno avesse suggerito che era un’allocazione non necessaria, se non per chiarimenti della lettura del codice da altri, e così in questo caso ho seguito la via semplice.
Ma di base anch’io preferisco dichiarare costanti dedicate così da leggere meglio il codice in futuro.
Ad esempio, un altro programma semplice che abbiamo fatto (tutta l’idea del gioco e come doveva funzionare era di mio figlio, che ha anche costruito il circuito, io ho scritto solo il codice
) e´ questo “gioco delle campane” digitale.
Qui avevo dichiarato meglio le costanti dei pin a seconda della loro funzione:
/*
GIOCO DELLE CAMPANE DIGITALE
*/
const int P1 = 8; // imposto i piedini dei pulsanti
const int P2 = 9;
const int P3 = 10;
const int P4 = 11;
const int P5 = 12;
const int piezo = 3; // piedino del piezo
const int ledBianco = 4; // imposto i piedini dei led
const int ledVerde = 5;
const int ledRosso = 6;
const int ledBlu = 2;
int P1stato = 0; // variabili per lo stato dei pulsanti
int P2stato = 0;
int P3stato = 0;
int P4stato = 0;
int P5stato = 0;
int dado = 0; // variabile per il sorteggio della pallina
int notes[] = { 262, 440, 330 }; // note do, la, mi
int ledPin = 0;
int pulsantePin = 0;
void setup() {
for (int ledPin = 2; ledPin <= 5; ledPin++) {
pinMode(ledPin, OUTPUT); // pin dei led e del piezo in output
digitalWrite(ledPin, LOW);// tutti led e piezo spenti
}
for (int pulsantePin = 8; pulsantePin <= 12; pulsantePin++) {
pinMode(pulsantePin, INPUT); // pin dei pulsanti in input
}
}
void loop() { // all'inizio attendo che venga premuto il pulsante P5 prima di iniziare il gioco
P5stato = digitalRead(P5);
if (P5stato == 1) { // quando premo P5, lampeggio il led bianco e vado alla routine del sorteggio
digitalWrite(ledBianco, HIGH);
delay(500);
digitalWrite(ledBianco, LOW);
lanciaDado();
}
}
void lanciaDado() { // routine per il sorteggio di dove sta la pallina sotto la campana
dado = random(4); // lancio il sorteggio randomico
switch(dado){
case 0: // risultato sorteggio 1
P5stato = 0;
controllaPulsanti1(); // vado alla routine dove il vincitore e´ 1
break;
case 1: // risultato sorteggio 2
P5stato = 0;
controllaPulsanti2(); // vado alla routine dove il vincitore e´ 2
break;
case 2: // risultato sorteggio 3
P5stato = 0;
controllaPulsanti3(); // vado alla routine dove il vincitore e´ 3
break;
case 3: // risultato sorteggio 4
P5stato = 0;
controllaPulsanti4(); // vado alla routine dove il vincitore e´ 4
break;
}
}
void controllaPulsanti1() { // routine per verificare se premo il P1 quando e´ stato sorteggiato l'1
while (P1stato == 0 || P2stato == 0 || P3stato == 0 || P4stato == 0) { // se nessuno dei pulsanti e´ stato promuto, continuo in loop a controllarli
P1stato = digitalRead(P1);
P2stato = digitalRead(P2);
P3stato = digitalRead(P3);
P4stato = digitalRead(P4);
if (P1stato == 1) { // se ho premuto il pulsante 1 corretto
digitalWrite(ledVerde, HIGH); // accendo il led verde
tone(piezo, notes[2]); // suono le due note della vittoria
delay(400);
tone(piezo, notes[1]);
delay(1000);
noTone(piezo);
digitalWrite(ledVerde, LOW);
digitalWrite(ledBianco, HIGH); // lampeggio due volte il led bianco per segnalare che ha inizio un nuovo sorteggio
delay(500);
digitalWrite(ledBianco, LOW);
delay(500);
digitalWrite(ledBianco, HIGH);
delay(500);
digitalWrite(ledBianco, LOW);
P1stato = 0;
lanciaDado(); // ritorno alla routine del sorteggio di un nuovo numero
} else if (P2stato == 1 || P3stato == 1 || P4stato == 1) { // altrimenti se premo un tasto sbagliato (diverso da 1)
digitalWrite(ledRosso, HIGH); // accendo il led rosso
tone(piezo, notes[0]); // suono la nota della sconfitta
delay(1500);
noTone(piezo);
digitalWrite(ledRosso, LOW);
P2stato = 0; // azzero tutti i registri dei pulsanti e ritorno all'inizio di questa routine finche´ non indovino
P3stato = 0;
P4stato = 0;
}
}
}
/*
di seguito le routine per verificare il sorteggio degli altri numeri
*/
void controllaPulsanti2() {
while (P1stato == 0 || P2stato == 0 || P3stato == 0 || P4stato == 0) {
P1stato = digitalRead(P1);
P2stato = digitalRead(P2);
P3stato = digitalRead(P3);
P4stato = digitalRead(P4);
if (P2stato == 1) {
digitalWrite(ledVerde, HIGH);
tone(piezo, notes[2]);
delay(400);
tone(piezo, notes[1]);
delay(1000);
noTone(piezo);
digitalWrite(ledVerde, LOW);
digitalWrite(ledBianco, HIGH);
delay(500);
digitalWrite(ledBianco, LOW);
delay(500);
digitalWrite(ledBianco, HIGH);
delay(500);
digitalWrite(ledBianco, LOW);
P2stato = 0;
lanciaDado();
} else if (P1stato == 1 || P3stato == 1 || P4stato == 1) {
digitalWrite(ledRosso, HIGH);
tone(piezo, notes[0]);
delay(1500);
noTone(piezo);
digitalWrite(ledRosso, LOW);
P1stato = 0;
P3stato = 0;
P4stato = 0;
}
}
}
void controllaPulsanti3() {
while (P1stato == 0 || P2stato == 0 || P3stato == 0 || P4stato == 0) {
P1stato = digitalRead(P1);
P2stato = digitalRead(P2);
P3stato = digitalRead(P3);
P4stato = digitalRead(P4);
if (P3stato == 1) {
digitalWrite(ledVerde, HIGH);
tone(piezo, notes[2]);
delay(400);
tone(piezo, notes[1]);
delay(1000);
noTone(piezo);
digitalWrite(ledVerde, LOW);
digitalWrite(ledBianco, HIGH);
delay(500);
digitalWrite(ledBianco, LOW);
delay(500);
digitalWrite(ledBianco, HIGH);
delay(500);
digitalWrite(ledBianco, LOW);
P3stato = 0;
lanciaDado();
} else if (P1stato == 1 || P2stato == 1 || P4stato == 1) {
digitalWrite(ledRosso, HIGH);
tone(piezo, notes[0]);
delay(1500);
noTone(piezo);
digitalWrite(ledRosso, LOW);
P1stato = 0;
P2stato = 0;
P4stato = 0;
}
}
}
void controllaPulsanti4() {
while (P1stato == 0 || P2stato == 0 || P3stato == 0 || P4stato == 0) {
P1stato = digitalRead(P1);
P2stato = digitalRead(P2);
P3stato = digitalRead(P3);
P4stato = digitalRead(P4);
if (P4stato == 1) {
digitalWrite(ledVerde, HIGH);
tone(piezo, notes[2]);
delay(400);
tone(piezo, notes[1]);
delay(1000);
noTone(piezo);
digitalWrite(ledVerde, LOW);
digitalWrite(ledBianco, HIGH);
delay(500);
digitalWrite(ledBianco, LOW);
delay(500);
digitalWrite(ledBianco, HIGH);
delay(500);
digitalWrite(ledBianco, LOW);
P4stato = 0;
lanciaDado();
} else if (P1stato == 1 || P2stato == 1 || P3stato == 1) {
digitalWrite(ledRosso, HIGH);
tone(piezo, notes[0]);
delay(1500);
noTone(piezo);
digitalWrite(ledRosso, LOW);
P1stato = 0;
P2stato = 0;
P3stato = 0;
}
}
}
Le funzioni posso ricevere un parametro. Per iniziare potresti avere una funzione DisplayNum() a cui passi 0-9 e -1 per spegnere. Per ora non ottimizzato:
Interessante, grazie!