buona sera a tutti, ho programmato arduino per avere un rele' tipo passo passo con lo spegnimento
ad un tempo programmato.
gli ho messo una inibizione del pulsante , in modo che per 3 secondi non riceve alcun input , ma ho sbagliato.
ma non riesco a farlo funzionare come devo.
non sono una cima ed ho cercato di capire qualcosa leggendo qua e la ma non riesco a capire bene la funzione millis.
dove sbaglio?
grazie mille
#define ingresso 2
#define uscita 13
#define duratadeltimer 5000 // millisecondi per autospegnimento
int i;
unsigned long timer;
long oldMillis =0;
void setup()
{
pinMode(ingresso, INPUT_PULLUP);
pinMode(uscita, OUTPUT);
}
// Add the main program code into the continuous loop() function
void loop()
{
i = digitalRead(8);
if ((i == LOW) && (millis() - oldMillis > 3000) ){
oldMillis = millis();
if (digitalRead(uscita)==HIGH) {
//Il led � gi� acceso
digitalWrite(uscita, LOW); //Accendi il led
}
else {
//Il led � spento
digitalWrite(uscita, HIGH); //Accendi il led
timer = millis() + duratadeltimer;
}
}
if (digitalRead(uscita) == HIGH) {
//Il led � acceso, verifica il tempo
if (millis() > timer) {
digitalWrite(uscita, LOW); //Spegni il led
}
}
}
Cos'è digitalRead( 8 )
?
Un commento è errato.
Nel programma e nei commenti meglio non usare mai lettere accentate
e altri caratteri diversi dall' ASCII di base
Più che inibire il pulsante mi sembra che così venga semplicemente
letto una volta ogni ogni 3 secondi, è questo che volevi ottenere?
L'uso di millis
è corretto come scritto nella prima condizione in alto,
ma la variabile oldMillis
deve essere unsigned long
.
Anche l'uso di millis
per il timer spegnimento deve seguire la stessa forma
if (millis()-timer > duratadeltimer)
ciao, grazie del tuo commento, a me occorre che per 3 secondi successivi alla pressione venga ignorata la pressione del tasto e di conseguenza, se entro i 3 secondi dal cambio di stato non avviene nulla
ora lo correggo come da tuo consiglio lo riposto
fatto corretto come da tuo consiglio.
non e' ancora ok, perche ' non vede l input ed il led lampeggia comunque sia l ingresso
sarebbe a dire, che il cambio da uno stato all' altro, il tempo minimo sia 3 secondi
#define ingresso 2
#define uscita 13
#define duratadeltimer 15000 // millisecondi per autospegnimento
int i;
unsigned long timer;
unsigned long oldMillis =0;
void setup()
{
pinMode(ingresso, INPUT_PULLUP);
pinMode(uscita, OUTPUT);
}
// Add the main program code into the continuous loop() function
void loop()
{
if ((digitalRead(8)== LOW) && (millis() - oldMillis > 5000) ){
oldMillis = millis();
if (digitalRead(uscita)==HIGH) {
//Il led acceso
digitalWrite(uscita, LOW); //Accendi il led
}
else {
//Il led spento
digitalWrite(uscita, HIGH); //Accendi il led
timer = millis() + duratadeltimer;
}
}
if (digitalRead(uscita) == HIGH) {
//Il led acceso, verifica il tempo
if (millis() > timer>duratadeltimer) {
digitalWrite(uscita, LOW); //Spegni il led
}
}
}
daniele999:
non vede l input
Per quello avevo scritto la domanda: "[color=red]cos'è digitalRead( 8 ) ?[/color]
"
La risposta a quella domanda è la soluzione al problema dell'input.
Per il resto la modifica all'uso di millis l'hai fatto solo a metà, il caricamento della variabile 'timer' non va bene. Come già detto l'uso di millis con la variabile 'oldMillis' è corretto, è da fare la stessa cosa (caricamento e condizione di controllo) anche con la variabile 'timer'.