Problema con due pulsanti(bottoni) Arduino UNO rev3

Ciao a tutti ragazzi sono abbastanza nuovo e, nel tentativo di creare un segnapunti per il ping-pong con arduino, mi sono imbattuto in un problema apparentemente banale...
Nel mio progetto è presente un display LCD (16x2), un potenziometro collegato ad esso e due bottoni. Ed è proprio riguardo ai bottoni che ho dei problemi: non capisco come collegarli...devo collegarli singolarmente a due pin differenti? Ho provato anche a fare un progetto semplice sempre con due bottoni ma non capisco se sbaglio il circuito per collegarli oppure il programma...potete aiutarmi??

Qui dovresti trovare risposta :wink:
http://arduino.cc/en/tutorial/button

eppure non capisco una cosa...io collego un bottone e il programma stampa nel monitor seriale lo stato del bottone (0 oppure 1)...quando non tengo premuto mi stapa a scroll 01010101010101010 come se non sapesse se e acceso o spento...se premo rimane 11111111...potete aiutarmi??
il loop() del mio programma e il seguente:

void loop(){
   button_1State = digitalRead(7);
    button_2State = digitalRead(6);
    
    if(button_1State == HIGH){
    
      Serial.println("1");
      }
      else{
      
        Serial.println("0");
        }

MattyRed99:
Ciao a tutti ragazzi sono abbastanza nuovo ...

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento

P.S. il codice devi racchiuderlo nei tag code, altrimenti parte potrebbe non essere visibile. Veri regolamento, sezione 7, spiega bene come fare. Per ora lo ha fatto l'admin @Leo72

Come hai collegato i bottoni? Disegna un circuitino, prova ad usare Fritzing (è free)

@Matty:
includi il codice usando gli appositi tag:

MattyRed99:
quando non tengo premuto mi stapa a scroll 01010101010101010 come se non sapesse se e acceso o spento...

L'hai messa la resistenza di pull-down come nell'esempio che ti hanno linkato? Altrimenti lo stato del pulsante, quando non premuto, resta INDEFINITO quindi può essere letto sia come 0 che come 1.

se premo rimane 11111111...potete aiutarmi??

Normale, finché lo premi è ovvio che ti stampi una sfilza di 1. Devi prevedere un sistema di arresto nel codice per cui finché non è stato rilasciato il pulsante, il programma non stampi più lo stato.

Proprio lì ho dei dubbi...come collego opportunatamente la resistenza pull-down? come verifico che i miei collegamenti siano esatti?

Come nel circuito mostrato. Una R da 10K sulla linea che dal pin va al piedino del pulsante.

PIN ----+------ PULSANTE -------
        |
        R
        |
       GND

Pochi msg sopra nid69 ti ha linkato delle schede dell'utente Pighixxx che contengono le connessioni base, scaricale e studiale ti serviranno per muovere i primi passi.

Spero riusciate a vedere il progettino fatto su fritzing...io ho eseguito cosi il collegamento(con resistenza da 10k)
collegando il bottone al pin 7. E corretto?

MattyRed99:
Spero riusciate a vedere il progettino fatto su fritzing...io ho eseguito cosi il collegamento(con resistenza da 10k)
collegando il bottone al pin 7. E corretto?

è sbagliato! Guarda lo schemino che ti ha illustrato Leo nel post precedente. Devi collegare la resistenza tra il cavetto negativo e il cavetto blu del pin. In questo modo quando rilasci il pulsante il pin andrà a massa a traverso la resistenza e ti darà valore "LOW" o "0", altrimenti se lo lasci com'è apena rilasci il pulsante il riferimento al pin non sarà ne positivo ne negativo e molto provabilmente il risultato sarà quello che hai già avuto: 1010101010101.

Una volta che risolvi avrai il problema del rimbalzo che non è altro che il falsocontatto del pulsantino risolvibile con la funzione "debounce" (credo), io ne sono venuto a conoscenza dopo essermi scervellato a fare delle righe di programma da aggiungere allo sketch per evitarlo. casomai se hai bisogno te lo passo. Altrimenti rischi di sbagliare il punteggio della partita e di essere additato come quello che imbroglia nelle partite di ping pong con l'elettronica!!!!! :slight_smile:

Ciao

Quindi il collegamento deve essere fatto come nello sketch qui sotto??

Untitled Sketch 4.fzz (2.72 KB)

non ho il frizing fai uno screenshot come hai fatto nel post precedente....

Ecco qua...comunque nel frattempo sono riuscito a risolvere il problema con il primo pulsante che segna il punteggo del pimo giocatore correttamente il problema sorge con il secondo...vi metto anche il codice di seguito
P.S.
il button_1 è quello che ora sono riuscito a fare funzionare e risM e il risultato legato al primo bottone ovvero quello funzionante

 void loop(){
    button_1State = digitalRead(button_1Pin);
    button_2State = digitalRead(button_2Pin);
    if(button_2State == HIGH){
        risP = risP + 1;
        lcd.setCursor(9,1);
        lcd.print(risP);
        digitalWrite(13,HIGH);
        }
    if(button_1State == HIGH){
      risM = risM + 1;
      lcd.setCursor(9,0);
      lcd.print(risM);
      Serial.print("1");
      }
      else{
        Serial.println("0");
        }
     
        
         delay(500);  
  }

Il collegamento è giusto. idem dev'èssere per il secondo pulsante su un'altro ingresso.

Vedendo lo sketch mi sembra però che se tieni premuto il pulsante il contatore aumenta di uno ad ogni ciclo macchina finchè non lo rilasci. Non posso verificare, non ho un circuitino pronto ne display, ho il mio arduino uno impegnato in altre applicazioni.

Prova a mettere lo sketch completo che ci diamo un'occhio.

Ciao....

Ecco questo è lo sketch completo ma in fase di lavoro...

#include<LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);
const int button_1Pin = 7;
const int button_2Pin = 8;
int button_1State = 0; 
int button_2State = 0;
int risM = 0;
int risP = 0;


void setup(){
  pinMode(button_1Pin, INPUT);
  pinMode(button_2Pin, INPUT);
//  pinMode(13,OUTPUT);
  Serial.begin(9600);
  lcd.begin(16,2);
  lcd.setCursor(0,0);
  lcd.print("Mattia:");
  lcd.setCursor(0,1);
  lcd.print("Papa:");
  lcd.setCursor(9,0);
  lcd.print(risM);
  lcd.setCursor(9,1);
  lcd.print(risP);
  }
  void loop(){
    button_1State = digitalRead(button_1Pin);
    button_2State = digitalRead(button_2Pin);
    if(button_2State == HIGH){
        risP = risP + 1;
        lcd.setCursor(9,1);
        lcd.print(risP);
        digitalWrite(13,HIGH);
        }
    if(button_1State == HIGH){
      risM = risM + 1;
      lcd.setCursor(9,0);
      lcd.print(risM);
      Serial.print("1");
      }
    
     
        
         delay(500);  
  }

MattyRed99:
Ecco questo è lo sketch completo ma in fase di lavoro...

#include<LiquidCrystal.h>

LiquidCrystal lcd(12,11,5,4,3,2);
const int button_1Pin = 7;
const int button_2Pin = 8;
int button_1State = 0;
int button_2State = 0;
int risM = 0;
int risP = 0;

void setup(){
  pinMode(button_1Pin, INPUT);
  pinMode(button_2Pin, INPUT);

//  pinMode(13,OUTPUT);  // qui non ci va la doppia barra iniziale, altrimenti l'assegnazione del pin 13 resta solo un commento
                                                      // poi il pin 13 per cosa lo useresti? non sono tutti i pin designati all'inizio del codice?

Serial.begin(9600);  // il settaggio del monitor seriale io di solito lo metto  dopo void setup, non ho mai provato cosi
  lcd.begin(16,2);          // non so se valga anche per i display 2x16 ma qualsiasi lcd.print io lo metto dopo void loop.
  lcd.setCursor(0,0);
  lcd.print("Mattia:");
  lcd.setCursor(0,1);
  lcd.print("Papa:");
  lcd.setCursor(9,0);
  lcd.print(risM);
  lcd.setCursor(9,1);
  lcd.print(risP);
  }
  void loop(){
    button_1State = digitalRead(button_1Pin);
    button_2State = digitalRead(button_2Pin);

if(button_2State == HIGH){      // qui richiami  il pulsante come "HIGH"  ma all'inizio l'hai dichiarato come "0"
                                                                  // in questi casi io non dichiaro nulla :  int button_1State; Lo stato basso lo da la resistenza
                                                                  //di pulldown

risP = risP + 1;
        lcd.setCursor(9,1);

lcd.print(risP);          // qui richiami risP sul display e anche risM ma non li hai dichiarati all'inizio.
                                              // qui ci metterei un bel delay(1000) ma vedo che alla fine hai messo uno da 500, potrebbe andare
                                                    //da provare

digitalWrite(13,HIGH);
        }
    if(button_1State == HIGH){
      risM = risM + 1;
      lcd.setCursor(9,0);
      lcd.print(risM);
      Serial.print("1");
      }
   
     
       
         delay(500); 
  }

Ti ho messo qualche correzione ma ci devi lavorare anche tu e poi non ho il display 2x16 collegato per provarlo. Ti manca qualche riga di programma per l'azzeramento a fine partita.
Prendi esempio da qualche progetto online,

Ciao