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;
}
}
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.
... 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.
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
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;
}
}
... 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.
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.