Go Down

Topic: Millis (Read 1 time) previous topic - next topic

ARDUIX

Ciao a tutti! ho una domanda apparentemente molto semplice ma che mi sta complicando notevolmente l'esistenza. devo accendere un led e dopo 5 secondi spengerlo usando il millis e nn il delay. Pensavo che come ho fatto io andasse bene ma non è così... spero in un vostro aiuto! posto il codice
Code: [Select]
#define LED 9

int stato;
int st;
int acceso=5000;
unsigned long tempo;
void setup() {
   pinMode(LED,OUTPUT);
   
   Serial.begin(9600);
}

void loop(){
st=digitalRead(LED);
if(st==0)
{
  digitalWrite(LED,HIGH);
  tempo=millis();
  st=1;
 

  if((millis()-tempo>=acceso)&&(st==1))
  {

    digitalWrite(LED,LOW);
   st=0;
  }

}

an_je

..e come si comporta? si accende e poi non si spegne più? oppure fa altro?

ARDUIX

il led una volta che rimane acceso per 5 secondi si deve spengere perchè successivamente devo fare lo stesso lavoro con altri 8 led, e una volta che finisce l'ultimo di spengersi riaparte il ciclo con il primo!

ovvero:

1 led acceso per 5 secondi poi si spenge; quando si spenge il primo led si accende il secondo per 5 secondi e poi si spenge, e cos' via fino all'ottavo!!

leo72

Ma perché cerchi di aprire la comunicazione seriale se poi non la usi?
Non puoi leggere lo stato del LED usando digitalRead(LED): non ha senso, quel pin è impostato in uscita. E' lo stato del LED che deve cambiare in base alla variabile st, non viceversa.

ARDUIX

La seriale l'avevo aperta perchè usavo il serial print di una variabile per vedere se mi entrava nel millis... non ho capito bene, in pratica cosa dovrei cambiare?

an_je

Come suggerito da Leo, poni:
int st =0;

e togli:
st=digitalRead(LED);

ARDUIX

Ho provato ma non fa ugualemente! mi resta acceso il led ma non si spenge..

Federico Vanzati

quale evento deve far scatenare l'accensione del led?

perché a parte quello che ha già detto leo72 mi sembra abbastanza giusto il codice.

una piccola nota: anche la variabile "acceso" dichiarala unsigned long
F

ARDUIX

in teoria dovrebbe partire al caricamento del programma. deve essere tutto in automatico. è possibile? o serve per forza un input?

ARDUIX

Anzi mi correggo! ho un input che se è zero deve fare il giro dei led come ho spiegato prima se invece 1 deve fare un altra cosa!

Federico Vanzati

allora usa quello, no?
Code: [Select]
st=digitalRead(input);
:)
F

ARDUIX

ma non è lo stesso che mettere st=0?? cmq questa cosa dell'input è successiva. ora cm ora devo fare il "giochino" dei led in sequenza... hai per caso qlc idea a riguardo?

lesto

#12
Apr 29, 2011, 05:16 pm Last Edit: Apr 29, 2011, 05:18 pm by lesto Reason: 1
if((millis()-tempo>=acceso)&&(st==1))

quindi in pratica, il led si spegne se dopo almeno 5 secondi st diventa 1... e st lo leggi ogni loop() con st=digitalRead(LED);
Quindi a quanto pare st NON diventa mai 1

edit: controlla i valori con una serial.println(), eppoi non puoi fare una read su un pin in output...
semmai togli quella read, e il secondo controllo nell'if, ovvero &&(st==1), e a questo punto il led ti si spegne dopo 5 secondi
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

ARDUIX

Ciao lesto! ho fatto cm dici te però nn funziona perchè il led rimane acceso. ti posto il codice
Code: [Select]
#define LED 9

int stato;
int st;
unsigned long acceso=5000;
unsigned long tempo;
void setup() {
   pinMode(LED,OUTPUT);
   
   Serial.begin(9600);
}

void loop(){

if(st==0)
{
  digitalWrite(LED,HIGH);
  tempo=millis();
  st=1;
  Serial.print(st);

  if(millis()-tempo>=acceso)
  {

    digitalWrite(LED,LOW);
   st=0;
  }

}

Federico Vanzati

il led rimane sempre acceso perchè aggiorni millis() ad ogni ciclo entrando nel primo if, il problema non è tanto che st non diventa 1.

Poi usando solo 2 valori, piccolo consiglio: dichiarala booleana.

nel setup metti anche tempo = millis();
F

Go Up