Go Down

Topic: problema con funzione " millis " (Read 1 time) previous topic - next topic

dieg93

ciao a tutti, sto provando la funzione "millis" ma nel mio semplice sketch per accendere in ritardo un led dopo la pressione di un pulsante,  ho qualcosa che non va ma non riesco a trovarla. In pratica si accende subito. grazie



Code: [Select]
const int button = 7;
const int led = 13;
unsigned long ledOn;

   void setup() {
 
   pinMode(led, OUTPUT);
   pinMode(button, INPUT);
 
   }
 
void loop(){
 if (digitalRead(button) == HIGH) {     
   
 ledOn =  millis();
 
  if  (millis() - ledOn > 15000) {
     
      digitalWrite(led, HIGH);
     
   } }}

gpb01

Tanto per cominciare usa la funzione di formattazione automatica del codice che ti mette a disposizione l'IDE (Tools -> Auto Format) perché, il codice come lo hai formattato tu, è inguardabile ...

Poi ... la condizione iniziale al pin del LED glie la vogliamo dare nel setup() ? Ovvero, oltre a dichiararlo OUTPUT, vogliamo metterlo LOW o no ?

Sistema queste cose e poi ne riparliamo ...

Guglielmo
Search is Your friend ... or I am Your enemy !

dieg93

#2
Mar 07, 2017, 06:07 pm Last Edit: Mar 07, 2017, 06:19 pm by gpb01
chiedo scusa le imprecisioni dell'inesperienza... ho sistemato lo stato iniziale del led ma è ancora ko. devo dichiarare in modo diverso la variabile ledOn ?  grazie

Code: [Select]
const int button = 7;
const int led = 13;
unsigned long ledOn;

void setup() {

  pinMode(led, OUTPUT);
  pinMode(button, INPUT);
  int led = LOW;
}

void loop() {
  if (digitalRead(button) == HIGH) {

    ledOn =  millis();

    if  (millis() - ledOn > 15000) {

      digitalWrite(led, HIGH);

    }
  }
}

gpb01

#3
Mar 07, 2017, 06:21 pm Last Edit: Mar 07, 2017, 06:24 pm by gpb01
NO, non ci siamo, per mettere HIGH o LOW un pin (che è stato definito di output) si usa la funzione digitalWrite(pin, HIGH o LOW); e non puoi farlo assegnado il valore ad una variabile.

Code: [Select]
void setup() {
  pinMode(led, OUTPUT);
  pinMode(button, INPUT);
  digitalWrite(led, LOW);
}


Mi sembra che ti manchino proprio le basi ... perché non dedichi un po' di tempo alla lettura di  QUESTO poi di QUESTO e/o acquistare e leggere qualche buon libro (es. QUESTO) ?

Guglielmo
Search is Your friend ... or I am Your enemy !

dieg93

...hai ragione seguo il tuo consiglio, ma mi sai dare un idea dell'errore ? ni sono scervellato un pomeriggio... grazie per la disponibilità

gpb01

#5
Mar 07, 2017, 06:42 pm Last Edit: Mar 07, 2017, 06:42 pm by gpb01
1. hai modificato il setup() come ti ho scritto ?

2. come hai collegato il bottone sul pin 7 ?    Hai usato una resistenza di pull-down per tenere il pin normalmente LOW e mandarlo HIGH solo quando premi il bottone ?

Guglielmo
Search is Your friend ... or I am Your enemy !

dieg93

setup modificato e pin 7 a massa con resistenza da 10 k ..

gpb01

#7
Mar 07, 2017, 07:06 pm Last Edit: Mar 07, 2017, 07:06 pm by gpb01
Ok, a questo punti dimmi esattamente cosa c'è che non va e quale è esattamente il comportamento ...

Guglielmo
Search is Your friend ... or I am Your enemy !

dieg93

premendo il pulsante mi aspetto che il led si accenda dopo alcuni secondi. Ma non succede nulla resta sempre spento. Se nel confronto millis-ledOn cambio il segno > con < il led si accende subito..   

Diego

-zef-

scusa se mi intrometto, sono un novellino di arduino anche io e quello che sto per scrivere potrebbe essere una stupidaggine pazzesca, ma guardando il tuo codice la prima cosa che mi salta all'occhio e non capisco è il fatto che tu assegni il valore di millis() a ledOn ad ogni ciclo e così facendo la differenza non sarà mai >15000.

gpb01

#10
Mar 07, 2017, 07:43 pm Last Edit: Mar 07, 2017, 07:44 pm by gpb01
>dieg93:  ... la condizione dell'IF non la devi modificare, la sua posizione ... prova a ragionare e vediamo se scopri da solo perché è mal posizionato ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

gpb01

#11
Mar 07, 2017, 07:44 pm Last Edit: Mar 07, 2017, 07:44 pm by gpb01
...  ma guardando il tuo codice la prima cosa che mi salta all'occhio e non capisco è il fatto che tu assegni il valore di millis() a ledOn ad ogni ciclo ...
NO zef, l'assegnazione è fatta all'interno del IF ed è corretta ... è altrove il suo problema ... vediamo se lo scopre :)

Guglielmo
Search is Your friend ... or I am Your enemy !

ORSO2001

scusate m'intrometto anch'io....piccolo suggerimeno... (if(if))...

dieg93

 funziona. trovato grazie a orso2001.... memorizzo il tempo ..ledOn=millis() alla fine del loop  altrimenti si modifica dopo il primo if .... grazie a tutti per la pazienza. Mi sono perso in un cucchiaio d'acqua.
Diego

brunello22

Quote
.......... memorizzo il tempo ..ledOn=millis() alla fine del loop............
???????

Go Up