problema sketch contatore a bottoni

Salve ragazzi, volevo chiedervi gentilmente un aiuto con uno sketch che non riesco a far funzionare. Quello che vorrei ottenere è un contatore a 4 pulsanti, che partendo da 20 aumenta di uno o diminuisce di uno alla pressione. I pulsanti sono 4 perchè devo cambiare 2 costanti, in pratica è un contatore per in gioco in cui ci sono 2 giocatori con 20 punti vita, ognuno dei quali usa 2 pulsanti per aumentarli o diminuirli.

Non ci sono problemi di elettronica in quanto ci sono solo 4 pulsanti collegati tutti nella stessa maniera: 5 volt a pulsante, altra uscita del pulsante a pin e resistenza 10k, altro capo della resistenza a terra.

Lo sketch gira benissimo con un giocatore, aumenta e diminuisce i punti correttamente. Il problema lo riscontro quando copio, incollo e modifico opportunamente il void loop() per ottenere la parte del 2 giocatore... A quel punto Arduino inizia a far ele bizze e conta numeri a caso anche se i pulsanti non vengono premuti. (più precisamente solo uno dei due valori di vita cambia a ripetizione di +1 e -1.... l'altro rimane fisso posso cambiarlo coi pulsanti.)

di seguito vi aggiungo lo sketch che non funziona, e quello che funziona successivamente... grazie dell'aiuto preventivamente! non li ho commentati perchè sono davvero semplicissimi e lineari ma se serve qualche chiarimento sono qua.

//sketch a 2 giocatori che non funziona const int butt1up=11; const int butt1down=12; const int butt2up= 6; const int butt2down=7; int vitauno = 20; int vitadue = 20;

void setup() { Serial.begin(9600); pinMode(butt1up, INPUT); pinMode(butt1down, INPUT); pinMode(butt2up, INPUT); pinMode(butt2down,INPUT); }

void loop() { int readingunoup = digitalRead(butt1up); int readingunodown = digitalRead(butt1down); int readingdueup = digitalRead(butt2up); int readingduedown = digitalRead(butt2down); if (readingdueup == HIGH) { vitadue++; delay(300); Serial.print(vitauno); Serial.print("----"); Serial.println(vitadue); } if (readingduedown == HIGH) { vitadue--; delay(300); Serial.print(vitauno); Serial.print("----"); Serial.println(vitadue); } if (readingunoup == HIGH) { vitauno++; delay(300); Serial.print(vitauno); Serial.print("----"); Serial.println(vitadue); } if (readingunodown == HIGH) { vitauno--; delay(300); Serial.print(vitauno); Serial.print("----"); Serial.println(vitadue); } }

//sketch che funziona a 1 giocatore const int butt1up=11; const int butt1down=12; int vitauno = 20; int vitadue = 20;

void setup() { Serial.begin(9600); pinMode(butt1up, INPUT); pinMode(butt1down, INPUT); }

void loop() { int readingunoup = digitalRead(butt1up); int readingunodown = digitalRead(butt1down);

if (readingunoup == HIGH) { vitauno++; delay(300); Serial.print(vitauno); Serial.print("----"); Serial.println(vitadue); } if (readingunodown == HIGH) { vitauno--; delay(300); Serial.print(vitauno); Serial.print("----"); Serial.println(vitadue); } }

Ciao, io non vedo errori di programmazione, tu dici che l'elettronica "i pulsanti" vanno bene, però il comportamento anomalo, sembra dovuto proprio alla lettura dei pulsanti.

Per essere sicuri, usa lo scketch dei due pulsanti, cambiando numero di pin, e usando in questo modo i pulsanti del secondo giocatore, e vediamo se è un problema di pulsanti...

Essendo il tuo primo post Ti invitiamo a presentarti QUI (dicci quali conoscenze hai di elettronica e di programmazione) e a leggere il regolamento QUI se non lo hai già fatto.

Inoltre, in conformità con il punto 7 del regolamento, dovresti cortesemente editare il tuo post e racchiudere il codice negli appositi “tag code” (il pulsante in alto a sinistra con il simbolo </>).

Comunque benvenuto sul forum.

Attilio

torn24: Ciao, io non vedo errori di programmazione, tu dici che l'elettronica "i pulsanti" vanno bene, però il comportamento anomalo, sembra dovuto proprio alla lettura dei pulsanti.

Per essere sicuri, usa lo scketch dei due pulsanti, cambiando numero di pin, e usando in questo modo i pulsanti del secondo giocatore, e vediamo se è un problema di pulsanti...

si ho fatto un pò di prove, se cambio i pin del primo e del secondo giocatore il problema del cambio del numero automaticamente cambia a sua volta... ovvero se prima è 2 giocatore con il problema, poi diventa il giocatore 1... però il problema è proprio a livello di programmazione perchè con il circuito ho fato molte prove, cambiando i pin, i pulsanti, intercambiandoli fra loro per vedere se era uno dei pulsanti a dare problemi, e non cambia nulla. invece appena cambio lo sketch e i pin relativi, cambia anche come si comporta arduino. Oltretutto lampeggia continuamente il led in Arduino che indica la rilevazione dei dati, mentre quando ho 1 solo giocatore lampeggia solo quando clicco...

se prima è 2 giocatore con il problema, poi diventa il giocatore 1.

appunto, il problema come ti hanno detto e' nei pulsanti, o meglio nella resistenza di PullDown. ce n'è una che o non fa' contatto o è collegata male

ma ho fatto una prova anche a vuoto ovvero a pin non collegati. la lettura dovrebbe essere sempre LOW e quindi i valori non dovrebbero cambiare. invece cambiano lo stesso in continuazione... 100% errore di programmazione

Te lo stanno dicendo dall'inizio: controlla bene l'hardware ;)

Ho passato lo sketch nel simulatore e funziona benissimo, ergo, rivedi il circuito. In caso posta lo schema o una foto ben chiara e vediamo.

Altra cosa: se ad ogni pressione di un pulsante devi contare +1 o -1, pensa anche a implementare un debounce (software o hardware) che ti eviti di contare anche i rimbalzi dei contatti.

Attilio

PS. Ricordati di mettere il codice nei "tag code". :D

grazie a tutti, ho risolto e il problema era effettivamente dell'elettronica :)

volevo chiedervi inoltre, vorrei nominare i due giocatori con i relativi nomi ad esempio Giocatore 1= Marco, Giocatore 2= Alberto. Quando mi capita di giocare inserisco arduino al pc e cambio le variabili costanti con il nome dei relativi giocatori, senza dover sostituire i nomi ad ogni riga di script... Vorrei tipo una cosa come:

int giocatoreuno= Marco // sbagliato perchè non posso salvare un nome come costante int vita=20

e poi lo script ha in ogni ciclo Serial.print("punti vita:"); Serial.print(vita); Serial.println(giocatoreuno);

il problema è che non posso salvare un nome come variabile ma solo un numero, sapete dirmi al volo come si fa?

ciao

char giocatoreuno[] = "Marco";
int vita = 20;

------
  Serial.print("punti vita:");
  Serial.print(vita);
  Serial.println(giocatoreuno);

Vedi qui.

ciao pippo72