0 RX e 1 TX

int x=0;

pinMode(0, INPUT);
pinMode(1, OUTPUT);

if(digitalRead(0==1) and (X==0))
{ X=1;
digitalWrite(1, HIGH);
delay(1000);}

else if(digitalRead(0==1) and (X==1))
{ X=0;
digitalWrite(1,LOW);
delay(1000);}

Ciao a tutti,
sto cercando di far funzionare questo semplicissimo sketch,

il codice con un pulsante accende e spegne un led

i pin 0 e 1 sono gli unici liberi che mi sono rimasti...

PS: in altri pin, funziona perfettamente.

Come fare?

... ho idea che ti devi andare a ristudiare come funziona la digitalRead() perché, come l'hai messa tu negli IF ... difficilmente farà quello che vuoi tu ::slight_smile:

Inoltre è sempre buona cosa metter tutto il codice perché altrimenti ... diventa di difficile comprensione.

Guglielmo

Probabilmente il codice è sbagliato, dato che ho provato in tutti i modi, a farlo funzionare.

il codice giusto dato che sono alle prime armi credo sia questo.

int X=0;
int pulsante;
void setup() {
pinMode(0, INPUT);
pinMode(1, OUTPUT);
}

void loop() {
pulsante = digitalRead(0);
if((pulsante == HIGH) and (X==0))
{
digitalWrite(1, HIGH);
X=1;
delay(1000);}
else if((pulsante == HIGH) and (X==1))
{
digitalWrite(1,LOW);
X=0;
delay(1000);}

}

il resto del codice non riguarda con questo, dato che l'ho provato anche da solo e non va lo stesso.

Devi tenere conto di alcune cose ...

... primo, un pulsante reale NON è un pulsante "ideale" e, ogni volta che lo premi, in realtà sul pin di Arduino arriva questo:

e quindi DEVI adottare tecniche di "debouncing".

... secondo, un pin in input, lasciato flottante, data la sua alta impedenza, capta un'infinità di disturbi, quindi, a secondo se il tuo pulsante chiude verso massa o verso il positivo, dovrai mettere rispettivamente una resistenza di pull-up o di pull-down.

... terzo, sei conscio che, durante il delay(), il programma resta fermo li dove è e non può fare altro (... quindi se durante il delay pigi e lasci il bottone NON viene letto da nessuno)?

Sistemate/verificate tutte queste problematiche, potrai passare e capire cosa non va nel codice, prima ...
... è più difficile per te capire cosa succede :wink:

Guglielmo

Il problema sembra essere nel D0 RX, PS: la resistenza a massa c'è.

lasciando il led su D1 TX e spostando il pulsante su D2 "con la resistenza!!"
tutto funziona perfettamente.

Il delay serve semplicemente per non fare accende e spegnere il led se si tiene troppo premuto il pulsante.

e quell' "AND"??????
da dove l'hai tirato fuori?

l'IF chiede due condizioni una se il pulsante è premuto l'altra "AND" chiede il valore di int 0 o 1,
questa variante serve per accendere o spegnere il led con lo stesso pulsante.

comunque ho risolto, facendo vari tentativi magari anche sbagliati dato che sto imparando adesso.
Ho risolto in questo modo, a me sembra sbagliato ma funzione bene.

void setup() {
pinMode(0, OUTPUT);
pinMode(1, OUTPUT);

digitalWrite(0,LOW);
}

void loop() {

if(digitalRead(0==1) and (X==0))
{
digitalWrite(1, HIGH);
X=1;
delay(1000);}
else if(digitalRead(0==1) and (X==1))
{
digitalWrite(1,LOW);
X=0;
delay(1000);}

}

si ma in C/C++ non esiste il token AND ma &&, quindi mi chiedevo se fosse una macro di Arduino.
Il codice va inserito all'interno dei tag code.
Quel digitaleRead è assurdo!

int X=0;
int pulsante;
void setup() {
pinMode(0, INPUT);
pinMode(1, OUTPUT);
}

void loop() {

   if( digitalRead(0) )
      {  
          delay(150);
          if (!digitalRead(0)) return;
          X = !X
          digitalWrite(1, X);
        delay(1000);
    }  
}

sicuramente è un codice assurdo da tutti i punti di vista.
ma funziona alla grande!!!! per me è questo che conta..

vbextreme:
e quell' "AND"??????
da dove l'hai tirato fuori?

@VB ... purtroppo è una PESSIMA abitudine che si sta diffondendo ... leggi da QUI in poi :confused: :confused: :confused:

Guglielmo

che obrobrio! per di più dichiarata male! le macro andrebbero sempre dichiarate in maiuscolo!

Ripeto sono agli inizi e i vostri commenti mi arricchiscono, ma mi chiedo, che importanza ha sul funzionamento di un circuito?

Dichiari output e metti a zero un pin che è in input.

Ma i led che ci sono su quei pin non ne influenzano il comportamento?

Sto usando Arduino Nano, il led rosso (presente sulla scheda di arduino) collegato al pin D0 RX rimane acceso e si spegne appena premo il pulsante, sul pin D1 TX è collegato un led che si accende e si spegne perfettamente

I pin 0 e 1 servono per la comunicazione attraverso la USB e il carico dello Sketch.
Usa come out ul pin 13 e come entrata qualsiasi altro pin che non sia 0 e 1.

Da quel codice che hai scritto devo dirti che Arduino si programma in C e conosce anche una parte di C++.
Quel codice non é ne uno né l' altro.

Ciao Uwe

se il codice che ho scritto non è ne uno nè l'altro, perchè funziona?

come ho detto all'inizio, gli unici pin liberi che mi sono rimasti sono 0 e 1

come ho detto all'inizio, gli unici pin liberi che mi sono rimasti sono 0 e 1

Le entrate analogiche sono libere? usa quellecome pin digitali.

se il codice che ho scritto non è ne uno nè l'altro, perchè funziona?

Forse non da errori ma siccuramente non fa quello che Tu vuoi.

if(digitalRead(0==1) and (X==0))

0==1 da il risultato 0 e Tu leggi lo stato del pin 0 e se quello é HIGH la condizione if é vera.

questo non é la stessa cosa come
if (digitalRead(0)==1...)

Funziona per caso perché usi il pin 0. Se usi qualsiasi altro pin non funziona.

Ciao Uwe

tutti occupati anche le entrate analogiche, nel progetto c'è anche un lcd 16x2 e un ds1307, quindi ne rimangono ben pochi liberi, aggiungi qualche pulsante, risultato solo 0 e 1 liberi.

Anch'io credo che sia un caso, sono andato a tentativi fin che ho trovato questa soluzione, il pin 0 che dovrebbe essere impostato come INPUT dato che c'è collegato un pulsante per caso l'ho impostato in OUTPUT e voilà funziona, non so perché, questo lo chiedo a voi esperti....

ommu:
Anch'io credo che sia un caso, sono andato a tentativi fin che ho trovato questa soluzione, il pin 0 che dovrebbe essere impostato come INPUT dato che c'è collegato un pulsante per caso l'ho impostato in OUTPUT e voilà funziona, non so perché, questo lo chiedo a voi esperti....

Non rispondo a questa domanda.

Tu impara il C per scrivere dei sketch corretti. Solo questo é la solzione.

Ciao Uwe

uwefed:
Non rispondo a questa domanda.
Tu impara il C per scrivere dei sketch corretti. Solo questo é la solzione.

@Uwe : Questa sua frase ...

ommu:
sicuramente è un codice assurdo da tutti i punti di vista.
ma funziona alla grande!!!! per me è questo che conta.

... dice tutto :smiling_imp: :smiling_imp: :smiling_imp:

Guglielmo