Pages: [1]   Go Down
Author Topic: SOS senza delay (torcia led)  (Read 650 times)
0 Members and 1 Guest are viewing this topic.
Venice (IT)
Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti,
sto cercando di costruire una torcia led con driver programmabile in 4 mode:100% 50% 10% SOS.
(usero un attiny85 per questioni di spazio). i primi tre nessun problema con un semplice analogWrite si risolve. il problema é con l'SOS in quanto volendo avere sempre il loop in funzione per poter leggere il pulsante non volevo usare un delay() ma sfruttare l'esempio blink without delay adattandolo a diversi tempi. a tentoni sono riuscito a superare anche questo scoglio: funziona alla perfezione ma dopo 2-3 cicli la funzione SOS si blocca lasciando il led sempre acceso. non capisco dove posso aver sbagliato.


Di seguito la parte di codice dell'SOS:

Code:
if(millis() - oldmillis > Delay[i]) {
    // save the last time you blinked the LED
    oldmillis = millis();  
    i++;
    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // set the LED with the ledState of the variable:
    digitalWrite(led, ledState);
    if(i==18) i=0;
  }

Grazie a tutti in anticipo

[EDIT] non usare tt-Tag ma code-TAG. Grazie Ciao Uwe [/EDIT]
« Last Edit: January 12, 2014, 03:49:23 pm by UweFederer » Logged

Venice (IT)
Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

il Delay nella funzione if iniziale é un valore di un array Delay dichiarato all'inizio, con indice i.

in sostanza dovrebbe essere scritto: Delay
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Se non metti il codice tra i TAG code l'indice non viene visualizzato perche identificato come TAG per il carattere italico.
Regolamento punto 7 --> http://forum.arduino.cc/index.php?topic=149082.0

Da quanti elementi è composto il vettore? 18?
Se si vanno da 0 a 17, altrimenti sono 19.
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Venice (IT)
Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie per la dritta.
Comunque è formato da 19 elementi e quindi quando arriva al 19esimo i=18 lo faccio ricominciare. All'inizio avevo sbagliato ma anche correggendolo la situazione non cambia
Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 113
Posts: 5953
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pubblica il codice completo (fai copia/incolla) racchiudendolo negli appositi tag "CODE" (bottone # che vedi terzultimo da destra sulla seconda fila) ... così diamo un occhiata al tutto ...

Guglielmo
Logged

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

Venice (IT)
Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ecco il codice completo:


Code:
int var;
int led=0;
int b=1;
int oldmillis;
int ledState=LOW;
int i=0;
int Delay[]={250,250,250,250,250,250,750,750,750,750,750,750,250,250,250,250,250,250,1750};

void setup(){
  pinMode(led,OUTPUT);
  pinMode(b,INPUT);
  oldmillis=0;
}
void loop(){
  if(digitalRead(b)==HIGH && var!=4){
    var++;
    i=0;
    delay(500);
    oldmillis=millis();
  }
  else if(digitalRead(b)==HIGH && var==4){
    var=0;
    i=0;
    delay(500);
  }
  if(var==0){
    digitalWrite(led,LOW);
  } else if(var==1){
    analogWrite(led,255);
  } else if(var==2){
    analogWrite(led,127);
  } else if(var==3){
    analogWrite(led,5);
  } else if(var==4){
    if(millis() - oldmillis > Delay[i]) {
    // save the last time you blinked the LED
    oldmillis = millis();   
    i++;
    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // set the LED with the ledState of the variable:
    digitalWrite(led, ledState);
    if(i==18) i=0;
  }   
  }
  }
 
Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 113
Posts: 5953
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Attento ... non puoi dichiarare oldmillis di tipo int è a 16 bit (-32768 .. +32767) ... ci mette 32 secondi ad andare in overflow  smiley-lol

La funzione millis(), come da reference (... che sarebbe buona cosa studiarsi bene) ritorna un unsigned long ... ovvero 32 bit !!!

Correggi e vedi come va ... smiley-wink

Guglielmo

Edit : Cortesemente, usa anche la funzione dell IDE ... Tools -> Auto Format ... almeno mette a posto il codice con le giuste indentature e le parentesi incolonnate come si deve ... che quelle tre parentesi in fila alla fine ... non si possono vedere  smiley-twist
« Last Edit: January 12, 2014, 10:53:01 am by gpb01 » Logged

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

Venice (IT)
Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Svelato l'arcano. Grazie mille.
ma una domanda: in teoria l'attiny85 non viene mai scollegato dalla batteria quindi la funzione millis() va avanti per chi sa quanto. non rischia comunque di andare in overflow prima o poi? se si non é possibile azzerarla ad esempio quando vien epremuto il pulsante?

ps non sopporto nemmeno io la formattazione cosi approssimativa. ora che conosco questo strumento i miei sketch saranno molto piú ordinati
Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 113
Posts: 5953
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ma una domanda: in teoria l'attiny85 non viene mai scollegato dalla batteria quindi la funzione millis() va avanti per chi sa quanto. non rischia comunque di andare in overflow prima o poi ?

Certo che va in overflow ... dopo circa 49 giorni se ben ricordo, ma .. per come hai fatto l'IF ... la cosa non è rilevante ... puoi capire meglio la questione QUI smiley-wink

Guglielmo
« Last Edit: January 12, 2014, 04:38:50 pm by gpb01 » Logged

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

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Svelato l'arcano. Grazie mille.
ma una domanda: in teoria l'attiny85 non viene mai scollegato dalla batteria quindi la funzione millis() va avanti per chi sa quanto. non rischia comunque di andare in overflow prima o poi? se si non é possibile azzerarla ad esempio quando vien epremuto il pulsante?

ps non sopporto nemmeno io la formattazione cosi approssimativa. ora che conosco questo strumento i miei sketch saranno molto piú ordinati

e perché devi continuare a farla andare avanti non te l'ha ordinato mica il dottore   smiley-twist  ogni volta che millis ()  arriva a un ora o un giorno l'azzeri  e tutto ricomincia   
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 328
Posts: 22768
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Millis non l'azzeri  smiley-wink
Millis è una funzione e come tale è una routine che restituisce un valore. Casomai puoi azzerare il contatore nascosto che viene usato per conteggiare i millisecondi, indicandolo allo sketch di Arduino. Ma non è necessario se si fanno i confronti giusti.
Logged


Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

intendevo una cosa così 
http://forum.arduino.cc/index.php?topic=198388.msg1465282#msg1465282
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 328
Posts: 22768
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Intendevo proprio quello.
NON azzeri la millis() ma il contatore che viene letto dalla funzione.  smiley-wink
Logged


Pages: [1]   Go Up
Jump to: