Ciao a tutti,
mi presento nuovamente anche qui, mi chiamo Giacomo e sono nuovo del mondo di Arduino, da un paio di mesi sto sperimentando con questo microcontrollore e adesso mi sono cimentato in qualcosa di leggermente più complesso dei soliti esercizi per principianti che si trovano in rete.
ho deciso di realizzare un segnapunti da integrare con un biliardino che funzioni sia a controllo automatico che manuale per rettificare eventuali errori nel conteggio automatico.
il mio segnapunti è molto semplice, niente display lcd o a segmenti, utilizza solamente 20 led ad alta intensità (10 rossi e 10 blu per ogni giocatore), due sensori ad ultrasuoni HC-SR04 da installare poco prima degli scivoli dentro le porte per il conteggio automatico e 6 pulsanti per il conteggio manuale (3 per giocatore che servono ad aumentare, a diminuire e a resettare il punteggio).
Ora io possiedo un Arduino UNO rev. 3 e sono perfettamente consapevole che mi servirà un Arduino Mega in futuro per collegare tutta sta roba ma ho voluto lo stesso provare a realizzare almeno una parte del progetto considerando una sola delle porte.
tralasciando al momento la parte automatica con cui mi devo ancora approcciare perchè non mi sono ancora arrivati i sensori ad ultrasuoni mi sono concentrato sulla parte manuale.
ho inizialmente provato con soli 3 led e i tre pulsanti (più, meno e reset) per quanto riguarda la parte collegamenti nessun problema vista la semplicità delle componenti iniziali, non vi nego che però ho trovato serie difficoltà vista la mia poca esperienza nella parte di programmazione invece, ogni pulsante doveva avere il suo compito il primo aumentare il punteggio e mantenerlo ovvero accendere alla pressione i led i serie e alle successive pressioni accendere il led successivo e mantenere accesi i led precedenti, i secondo fare il contrario ovvero ad ogni pressione spegnere in serie i led ritornando a zero (led tutti spenti) e i terzo ripartire da zero in qualsiasi momento della partita.
dopo qualche giorno di prove infinite, studio di post e guide che magari non centravano neppure con quello che stavo facendo io ma che possedevano determinate caratteristiche che volevo replicare per i miei scopi, ci sono finalmente riuscito.
oggi ho voluto aumentare i led da 3 a 10 per simulare una situazione più reale e mi sono detto che bastava semplicemente aggiungerli e modificare il codice aggiungendo le componenti nuove invece no !!!! ho riscontrato un problema abbastanza fastidioso al quale non riesco a dare risposta, in realtà c'è ne sarebbe anche un altro ma lo considero secondario.
il problema principale è il seguente :
il tasto meno e reset funzionano perfettamente come quando avevo solo 3 led ma il tasto più ha un comportamento anomalo ovvero alla pressione del pulsante la prima volta accende sia il primo che il secondo led poi quando premo la seconda volta ovviamente non capita niente perchè il led numero 2 è già acceso e dalla terza in poi mi accende il terzo e gli altri come dovrebbe fare (ogni pressione una nuova accensione e mantenere i precedenti), come ho detto prima il meno e reset si comportano bene perchè alla pressione del meno fino al terzo mi spegne prima il terzo led poi il secondo e infine il primo come dovrebbe e il reset me li spegne tutti, il problema è solo nella prima pressione del pulsante più.
sono sicuro che i collegamenti non centrano niente perchè li ho ricontrollati tutti e sono a posto, ho provato anche a cambiare i pin nel caso ma ho riscontrato lo stesso problema, perciò è probabilmente nel codice che ho scritto il difetto, ho provato a modificare anche li ma niente, sono ad un punto morto gente !!!
l'altro problema e dovuto alla pressione dei pulsanti che ho riscontrato anche quando i led erano solo 3, ovvero che per accendere i led devo tenere premuto qualche secondo mentre io vorrei che alla pressione quasi immediata i led si accendano, si spengano e si resettano, ora da quello che ho capito è un problema nella meccanica dei pulsanti che per risolverlo serve un ritardo di qualche millisecondo (15) da aggiungere da qualche parte nel codice ma per come lo scritto non riesco a capire dove lo devo inserire ho provato ad aggiungerlo in diversi modi ma poi tutto il programma non funziona più.
se qualche anima buona mi vuole dare una mano per entrambi lo ringrazio in anticipo .
il codice è qui sotto :
const int led1 = 10;
const int led2 = 9;
const int led3 = 8;
const int led4 = 7;
const int led5 = 6;
const int led6 = 5;
const int led7 = 4;
const int led8 = 3;
const int led9 = 2;
const int led10 = 1;
const int puls_inc = 13;
const int puls_dec = 12;
const int puls_reset = 11;
int val_inc = 0;
int stato_inc = 0;
int val_dec = 0;
int stato_dec = 0;
int val_reset = 0;
int stato_reset = 0;
int goal = 0;
void setup() {
pinMode(puls_inc, INPUT);
pinMode(puls_dec, INPUT);
pinMode(puls_reset, INPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(led6, OUTPUT);
pinMode(led7, OUTPUT);
pinMode(led8, OUTPUT);
pinMode(led9, OUTPUT);
pinMode(led10, OUTPUT);
}
void loop() {
val_inc = digitalRead(puls_inc);
val_dec = digitalRead(puls_dec);
val_reset = digitalRead(puls_reset);
if(goal<=11){
if(val_inc == HIGH) {
stato_inc = stato_inc - 1;
{
if(stato_inc == 1) {
goal ++;
}
}
switch(goal){
case 1:
digitalWrite(led1, HIGH);
case 2:
digitalWrite(led2, HIGH);
break;
case 3:
digitalWrite(led3, HIGH);
break;
case 4:
digitalWrite(led4, HIGH);
break;
case 5:
digitalWrite(led5, HIGH);
break;
case 6:
digitalWrite(led6, HIGH);
break;
case 7:
digitalWrite(led7, HIGH);
break;
case 8:
digitalWrite(led8, HIGH);
break;
case 9:
digitalWrite(led9, HIGH);
break;
case 10:
digitalWrite(led10, HIGH);
break;
case 11:
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
digitalWrite(led6, LOW);
digitalWrite(led7, LOW);
digitalWrite(led8, LOW);
digitalWrite(led9, LOW);
digitalWrite(led10, LOW);
}
}
}
else {
goal=0;
}
if(goal>=1){
if(val_dec == HIGH) {
stato_dec = stato_dec - 1;
{
if(stato_dec == 1) {
goal --;
}
}
switch(goal){
case 1:
digitalWrite(led1, LOW);
break;
case 2:
digitalWrite(led2, LOW);
break;
case 3:
digitalWrite(led3, LOW);
break;
case 4:
digitalWrite(led4, LOW);
break;
case 5:
digitalWrite(led5, LOW);
break;
case 6:
digitalWrite(led6, LOW);
break;
case 7:
digitalWrite(led7, LOW);
break;
case 8:
digitalWrite(led8, LOW);
break;
case 9:
digitalWrite(led9, LOW);
break;
case 10:
digitalWrite(led10, LOW);
break;
}
}
}
if(goal>0){
if(val_reset == HIGH) {
stato_reset = stato_reset - 1;
{
if(stato_reset == 1) {
goal = 0;{
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
digitalWrite(led6, LOW);
digitalWrite(led7, LOW);
digitalWrite(led8, LOW);
digitalWrite(led9, LOW);
digitalWrite(led10, LOW);
}
}
}
}
}
}