Pages: [1] 2   Go Down
Author Topic: Millis  (Read 1044 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 95
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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;
  }

}
Logged

Torino
Offline Offline
Full Member
***
Karma: 0
Posts: 133
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 95
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!!
Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 313
Posts: 21651
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 95
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Torino
Offline Offline
Full Member
***
Karma: 0
Posts: 133
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

e togli:
st=digitalRead(LED);
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 95
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Global Moderator
Milano, Italy
Offline Offline
Edison Member
*****
Karma: 15
Posts: 1163
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

F

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 95
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 95
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
Logged

Global Moderator
Milano, Italy
Offline Offline
Edison Member
*****
Karma: 15
Posts: 1163
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

allora usa quello, no?
Code:
st=digitalRead(input);
smiley
Logged

F

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 95
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

0
Online Online
Shannon Member
****
Karma: 117
Posts: 10112
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 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
« Last Edit: April 29, 2011, 10:18:38 am by lesto » Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 95
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao lesto! ho fatto cm dici te però nn funziona perchè il led rimane acceso. ti posto il codice
Code:
#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;
  }

}
Logged

Global Moderator
Milano, Italy
Offline Offline
Edison Member
*****
Karma: 15
Posts: 1163
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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();
Logged

F

Pages: [1] 2   Go Up
Jump to: