[risolto] problema digitalRead su monitor seriale

Un saluto a tutta la comunita' di forum.arduino.cc questo e' il mio primo post.

Ho acquistato un SainSmart UNO R3 da un rivenditore su Amazon per imparare a programmare su Arduino e sto provando a programmare, devo dire che e' un'esperienza molto interessante.
Ho un problema con un esercizio che ho trovato in un tutorial su youtube. Questo e' il codice:

int x;

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

void loop()
{
x=digitalRead(12);
if (x==HIGH)
{
Serial.println("acceso");
}
else
{
Serial.println("spento");
}
}

Quando accedo al Monitor Seriale dopo aver mandato il programma compare la scritta ("acceso") ma in realta' non ho ancora premuto il pulsante che si trova tra
5v --> pulsante --> pin12(digitale)
il collegamento dovrebbe essere aperto, ho fatto diverse prove ma non ho ottenuto risultati, sembra tutto sia al posto giusto;

PS:
-non so se e' rilevante ma uso ubuntu 12.04 come s.o. e la versione di Arduino che utilizzo e' la 1.0.1 anche se ho fatto la stessa prova nella piu' recente 1.0.5.
-ho usato pin diversi dal 12 non ottenendo risultati, puo' essere un problema hardware?

Ringrazio in anticipo a chi vorra' consigliarmi

o metti una resistenza ( da 10 Kohm ) tra il pin di ingresso e la massa o cambi lo sketch

Mettendo il pulsante

GND --> pulsante --> pin12(digitale)

int x;

void setup()
{
Serial.begin(9600);
pinMode(12,INPUT_PULLUP); // Abilita resistenza di PullUp interna
}

void loop()
{
x=digitalRead(12);
if (x==LOW)
{
Serial.println("acceso");
}
else
{
Serial.println("spento");
}
}

Ciao,
il problema è che NON si può lasciare un pin di Arduino NON connesso ...
... difatti, causa l'alta impedenza, se lo lasci scollegato, basta un non nulla per fargli cambiare stato o per fargli leggere stati instabili ed inesistenti.

Quindi, tu metti una resistenza di pull-down (va bene una 10K) tra il tuo pin 12 e la massa e vedrai che tutto funziona :wink:

Guglielmo

P.S. : La pull-down ha lo scopo di tenere ad uno stato stabile prefissato (LOW) il piedino che tu poi mandi HIGH con il pulsante
P.P.S. : Ecco ,io e Brunello ci siamo sovrapposti ... XD XD XD

e Guglielmo ti ha pure spiegato perche'

ard_user:
Un saluto a tutta la comunita' di forum.arduino.cc questo e' il mio primo post.

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

@gpb01 @Brunello

Vi ringrazio per la risposta mi avete risolto il problema, spero di imparare in fretta!
Pensavo che la massa sarebbe stata il pin12 e che la tensione provenisse dai 5v (con una resistenza).
Credo di aver capito come renderlo funzionale anche se non mi e' ancora chiaro da dove viene la tensione che va al pin12 (collegando GND --> pulsante --> pin12), essendo un input dovrebbe entrare tensione, potreste spiegarmelo?

@nid69ita

Grazie per i link! Li consultero' sicuramente! Vado a presentarmi

Se usi la :

pinMode(12,INPUT_PULLUP);

... dici alla MCU di utilizzare le sue pull-up (resistenze verso il +Vcc) interne.

Direi che è il caso che ti studi bene il datasheet del ATmega328p ... :roll_eyes:

Guglielmo

P.S. : A pagina 76 trovi la struttura di come sono fatti i pin di I/O e leggiti anche bene il punto 14.2.6