Problema con pulsante

Ciao a tutti.
Non sapevo dove dovevo mettere questo topic se in software o in hardware perchè non sono sicuro di qualche sia il problema con certezza devo aggiungere che sono alle prime armi con Arduino.
Volevo provare a spegnere 3 led quando premevo il pulsante, i LED si accendono poi si spengono senza che io debba premere il pulsante il pulsante questo tipo di problema l'ho già avuto e non ho capito come risolverlo sulla breadboard ho messo una resistenza tra il bottone e il filo che va all' entrata dell'Arduino.
Vi allego il codice:

int ledVerde=8;
int ledGiallo=9;
int ledRosso=10;
int richiesta;

void setup()
{
  pinMode(ledVerde,OUTPUT);
  pinMode(ledGiallo,OUTPUT);
  pinMode(ledRosso,OUTPUT);
  Serial.begin(9600);
  pinMode(2,INPUT);
}


void loop()
{
   digitalWrite(ledVerde,HIGH);
   digitalWrite(ledRosso,HIGH);
   digitalWrite(ledGiallo,HIGH);
   delay(1000);
   richiesta=digitalRead(2);
   if(digitalRead(2)==HIGH)
   {
     Serial.print(richiesta);
    digitalWrite(ledVerde,LOW);
    delay(1000);
   digitalWrite(ledRosso,LOW);
   delay(1000);
   digitalWrite(ledGiallo,LOW);
   delay(1000);
   }
}

Allora ... non hai pubblicato lo schema, ma provo a dare per scontato che tu non abbia messo alcuna resistenza di pull-down sul pin 2 il quale, probabilmente, si trova in uno stato ...non meglio definito (magari proprio HIGH) ... :roll_eyes:

Tu entri nel loop() e ad ogni giro, comunque riaccendi i led, poi, se il pin 2 è HIGH, li spegni uno per volta, ma come hai spento l'ultimo, il loop riprende e si riaccendono tutti ... è questo che volevi ???

E comunque, visto che lo stato del pin 2 lo hai già messo in richiesta ... perché nell'IF rileggi di nuovo il pin 2 ed invece non testi direttamente la tua variabile richiesta che ... hai appena riempito ???

Guglielmo

Edit : Ah ... risparmia memoria e definisci i numeri dei pin come costanti ... es. :

const byte ledVerde = 8;

e la variabile richiesta ... anche con essa puoi risparmiare memoria e dichiararla byte :

byte richiesta;

allora pubblico lo schema

Tu entri nel loop() e ad ogni giro, comunque riaccendi i led, poi, se il pin 2 è HIGH, li spegni uno per volta, ma come hai spento l'ultimo, il loop riprende e si riaccendono tutti ... è questo che volevi ???

Si volevo proprio questo......

E comunque, visto che lo stato del pin 2 lo hai già messo in richiesta ... perché nell'IF rileggi di nuovo il pin 2 ed invece non testi direttamente la tua variabile richiesta che ... hai appena riempito ???

l'idea iniziale era quella poi però quando ho visto che non funzionava ho iniziato a cambiare righe di codice

Grazie per i consigli per risparmiare memoria.

Ok, allora fai una cosa, inverti la logica, e controlli se il pin è LOW ... quindi il bottone lo colleghi NON al positivo ma a massa, e la resistenza attorno ai 2.2 o 3.3 KOhm. Poi cambi la pinmode così :

pinMode(2,INPUT_PULLUP);

e correggi l'IF in modo da verificare se è LOW (visto che abbiamo invertito la logica) ... :slight_smile:

Vedi come va ...

Guglielmo

pinMode(2,INPUT_PULLUP);

Questa istruzione non la conoscevo, grazie adesso mi informerò sul suo funzionamento :slight_smile:

e correggi l'IF in modo da verificare se è LOW (visto che abbiamo invertito la logica) ...

L'ho provato così e funziona alla perfezione grazie mille

Ma ho ancora 2 domande: Perché prima Arduino mi vedeva lo stato sempre alto? e poi ho fatto bene a mettere la resistenza dopo il bottone?

marcos93:
...
Ma ho ancora 2 domande: Perché prima Arduino mi vedeva lo stato sempre alto? e poi ho fatto bene a mettere la resistenza dopo il bottone?

  1. perché lo stato di un pin di input lasciato libero ... non sempre è determinato. L'istruzione "pinMode(2,INPUT_PULLUP);" ti permette proprio di collegare automaticamente il pin di input alla resistenza interna di pull-up fissando, a pin aperto, lo stato su HIGH :slight_smile:

  2. La resistenza serve normalmente a limitare la corrente che fai scorrere dentro Arduino (... anche se ... in questo caso, essendo il pin dichiarato come input, la cosa non era così importante) ... prova a dare un'occhiata QUI : 10 Ways to Destroy an Arduino — Rugged CircuitsRugged Industrial Arduino Microcontrollers ... :wink:

Guglielmo

Ma ho ancora 2 domande: Perché prima Arduino mi vedeva lo stato sempre alto? e poi ho fatto bene a mettere la resistenza dopo il bottone?

Per comprendere a fondo il motivo ti manca il concetto di impedenza e sensibilità derivante di una porta logica. Pensa ai pulsanti a sfioramento, se fossero troppo sensibili si attiverebbero al solo spostamente di aria che avviene quando passi davanti il sensore, e proprio questo che accade e per evitare si deve sempre stabilire uno stato ben preciso da assegnare ad una porta digitale impostata come ingresso.
Lo stato di una porta digitale con l'ingresso flottante non determinabile, il suo stato dipende dai segnali presenti nell'ambiente circostante, che non sono conosciuti.

Ciao.

Grazie a entrambi.