accenzione led con pulsante funziona al contrario

Ciao a tutti sto iniziando ad usare un kit per arduino alla quarta lezione il programma fa il contrario di quello che dovrebbe fare :smiley:

http://wiki.epalsite.com/index.php?title=Starter_Kit_for_Arduino#Lesson_4_Button_Controlled_LED

quando provo a fare questo schema elettrico e faccio l'upload del programma il led parte acceso e se premo il pulsante si spegne. In realtà dovrebbe partire spento e accendersi quando premo il pulsante.

Cosa ne dite? dove sbaglio? lo schema elettrico è sicuro fatto bene sulla bread board.
Possibile un errore nel programma della lezione 4?

grazie

Salve,
Prima di tutto ti consiglio di presentarti nel forum apposito (primo in alto sezione generale) spiegando le tue conoscenze in materia Arduino ed elettronica. Poi ti consiglio di darti una lettura al regolamento, che qui i moderatori sacagnano.
Infine non c'è un problema, il codice è fatto che il pulsante spenga il diodo. Se si vuole invertirne il funzionamento bisogna negare l'if che controlla la pressione del pulsante nella loop. È sufficiente o invertire il corpo dell'if {} con quello dell'else {}, o negare con un punto esclamativo nell'if (). Non ho sbagliato le parentesi. Infatti i pin dichiarati come INPUT_PULLUP funzionano invertiti (sentono alto a contatto aperto, e basso a contatto chiuso)

Ciao e grazie per il consiglio presentazione fatta.
Ascolta ma quindi è sbagliata la descrizione del programma? in quanto dice

Button Controlled LED
Turns on an LED when push the button.

mentre in realtà spegne un led quando si preme il pulsante?

grazie

SE il codice è quello del sito E SE lo schema è montato giusto, allora l'unica spiegazione è che il pulsante sia del tipo normalmente chiuso invece che normalmente aperto.

no ho controllato con un tester e il pulsante è come lo richiama il sito e cioè normalmente aperto.
Ho provato a negare la if con il punto esclamativo ed effettivamente funziona al contrario spento inizialmente e se premo il pulsante si accende. Provato anche a scambiare le righe di comando della if ed è come mettere la negazione di prima.

Non so io mi sono convinto che hanno sbagliato la negazione.

zaqsedc:
Non so io mi sono convinto che hanno sbagliato la negazione

E hai fatto bene! Sono riuscito a perdermi in una sciocchezza :slight_smile: È giusto il comportamento che vedi, con il pulsante aperto (non premuto) legge 1, pertanto il LED è acceso. Premendo legge zero e il LED si spegne.

Per evitare fraintendimenti come questi (magari in programmi lunghi centinaia di righe) io cerco di definire all'inizio tutto quello che riguarda l'hardware, in modo che nel resto del programma non devo più preoccuparmi di numeri o HIGH/LOW.

Il codice diventa più "parlante" (non servono neppure i commenti per capire cosa sta facendo), e se cambio i collegamenti hardware basta cambiare i valori delle define.

#define  PRESSED_LEVEL  LOW    // il pulsante premuto e` LOW
#define  PULSANTE       2      // pin usato per il pulsante
#define  LED            5      // pin usato per il LED
#define  LED_ON         HIGH   // il LED si accende con HIGH
#define  LED_OFF        LOW    // il LED si spegne con LOW

void setup() {                
    pinMode(PULSANTE, INPUT_PULLUP); 
    pinMode(LED, OUTPUT);     
}

void loop() {
    int sensorValue = digitalRead(PULSANTE);
    if(sensorValue == PRESSED_LEVEL)
        digitalWrite(LED, LED_ON);
    else
        digitalWrite(LED, LED_OFF);
}

NOTA: ho definito anche LED_ON e LED_OFF perché anche l'accensione di un LED può essere "invertita" se invece che tra Arduino e GND viene collegato tra Arduino e Vcc. Ma stabilendo tutto nelle define iniziali il programma successivo non cambia e continua a funzionare regolarmente :wink:

Spettacolo penso che si possa chiudere problema risolto grazie Silente e Claudio per il vostro supporto.

Peccato che non ci sia un canale di comunicazione con quella guida altrimenti segnalerei l'errore per gli altri utenti.

Ciauz