Il codice entra nell' "if" anche se la condizione non si è verificata

buon giorno a tutti,
sono alle primissime armi in questo campo e in questi giorni sto tentando di creare un codice per far funzionare un cucù e mi sono imbattuto in questo problema:
la scheda mi esegue il codice all'interno dell'if anche se la condizione non si è verificata e non sto capendo il motivo ecco qui di seguito il codice

#define ora1 2   // fine corsa dell'orologio = clock di 1h
#define rintocco 10 // rintocco cucu
#define uscita 12 // uscita cucu          tramite intregrato  L293D (ponte H)
#define uscita2 11 // rientro cucu 

int t2 = 1000;   // settaggi pause
int t = 1000;
int reale = 0; // contatore ore

void setup(){
  pinMode(ora1,INPUT);
  pinMode(rintocco, OUTPUT);
  pinMode(uscita,OUTPUT);
  pinMode(uscita2,OUTPUT);
  Serial.begin(9600);
}

void loop(){
  if(digitalRead(ora1) == HIGH){       // IF IN QUESTIONE            
                                       // se l'orologio da l'imput tramite un fine corsa posto sull'ingranaggio di un orologio
    reale = reale + 1;               // aumenta la variabile reale di uno
    digitalWrite(uscita,HIGH);
    digitalWrite(uscita2,LOW);            // uscita uccellino
    delay(t2);
    digitalWrite(uscita,LOW);
    delay(t);
    for(int i = 0; i < reale; i++){    // rintocchi in base alle ore
    digitalWrite(rintocco,HIGH);
    delay(t);
    digitalWrite(rintocco,LOW);
    delay(t);
    }
    digitalWrite(uscita2,HIGH);
    digitalWrite(uscita,LOW);            // rientro uccellino
    delay(t2);
    digitalWrite(uscita2,LOW);
  }
  Serial.println(reale);    // controllo ora tramite seriale
  delay(1000);
  if(reale == 12){    // reset alla fine di 12 h
    reale = 0;
  }
}

ringrazio in anticipo chi mi risponderà

:warning:
Ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato. Grazie.

A quanto detto da UKHeliBob aggiungo ...

... cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO della sezione Italiana del forum, (... e, per evitare future possibili discussioni/incomprensioni, prestando sempre molta attenzione al punto 15), dopo di che, come da suddetto regolamento, fai la tua presentazione NELL'APPOSITA DISCUSSIONE spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

Grazie mille per avermi fatto notare ciò non avevo la minima idea di come funzionasse questo forum.
ho provveduto a presentarmi e a leggere il regolamento,
mi scuso per l'accaduto

un'ultima domanda,
quindi adesso, grazie al moderatore di lingua inglese sono nella sezione giusta?

Quindi adesso ti suona in continuazione e il cucu continua ad uscire...

Hai messo hardware per il debounce e il pull-down?

Se entra nell'if la condizione è verificata. Questo perché se vuoi collegare un pulsante devi ricordare che la porta in ingresso (INPUT) è "floating" e sei tu che dall'esterno devi portarla o a GND (quindi leggi LOW) o a +5V (quindi leggi HIGH).
Se la lasci scollegata è altamente probabile che "fluttuando" assuma un valore qualsiasi tra LOW e HIGH.

Devi usare una resistenza di pull-down esterna (resistenza da 10k dal pin a GND, pulsante dal piin a +5V) o usare la pull-up interna (definendola non INPUT ma INPUT_PULLUP, quindi il pulsante lo metterai tra il pin e GND, e la lettura sarà LOW quando il pulsante è premuto).
Infine ricorda che la loop() viene eseguita migliaia di volte al secondo, per cui tu dovresti attendere che venga rilasciato il pulsante prima di proseguire (anche per evitare i "rimbalzi" meccanici). Una cosa di questo tipo:

#define ora1 2   // fine corsa dell'orologio = clock di 1h
#define rintocco 10 // rintocco cucu
#define uscita 12 // uscita cucu          tramite intregrato  L293D (ponte H)
#define uscita2 11 // rientro cucu 

int t2 = 1000;   // settaggi pause
int t = 1000;
int reale = 0; // contatore ore

void setup(){
  pinMode(ora1,INPUT_PULLUP);
  pinMode(rintocco, OUTPUT);
  pinMode(uscita,OUTPUT);
  pinMode(uscita2,OUTPUT);
  Serial.begin(9600);
}

void loop(){
  if(digitalRead(ora1) == LOW){ 
    // se l'orologio da l'imput tramite un fine corsa posto sull'ingranaggio di un orologio
    reale = reale + 1;               // aumenta la variabile reale di uno
    digitalWrite(uscita,HIGH);
    digitalWrite(uscita2,LOW);            // uscita uccellino
    delay(t2);
    digitalWrite(uscita,LOW);
    delay(t);
    for(int i = 0; i < reale; i++){    // rintocchi in base alle ore
    digitalWrite(rintocco,HIGH);
    delay(t);
    digitalWrite(rintocco,LOW);
    delay(t);
    }
    digitalWrite(uscita2,HIGH);
    digitalWrite(uscita,LOW);            // rientro uccellino
    delay(t2);
    digitalWrite(uscita2,LOW);
    // Aspetto che venga rilasciato il pulsante
    delay(100);
    while (digitalRead(ora1) == LOW) { delay(50); }
  }
  Serial.println(reale);    // controllo ora tramite seriale
  delay(1000);
  if(reale == 12){    // reset alla fine di 12 h
    reale = 0;
  }
}
1 Like

ho lasciato direttamente staccato il jumper e forse come detto dopo da docdoc è proprio quello a darmi problemi.
Ora provo a inserire un pulsante.

... si, lo vedi in alto a sinistra, sotto il titolo ella tua discussione.

... chi ti ha parlato di pulsanti da inserire? Ti hanno detto che NON si deve lasciare flottante un pin e che quindi dovrai mettere una "resistenza" per forzare il valore ad un livello fisso.

Guglielmo

1 Like

grazie mille,
era questo che mi azionava if,
mi scuso per avervi disturbato ma devo ancora imparare tanto su questo dispositivo.

si esatto mi sono dimenticato di specificare cosa andavo a fare,
ho inserito un pulsante sulla breadboard e collegato ai 5V, nel piedino affianco messo una resistenza da 10 kilohom collegata al GND e preso il segnale in uscita dal pulsante e collegato a un pin di Arduino.
Questo in attesa di collegare un'orologio che con un fine corsa mi da un'input ogni 60 min.

Ringrazio tutti per i consigli ricevuti
Lorenzo

Prego

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.