problema con timer luci


ciao ragazzi, come da titolo ho un problema con la temporizzazione di due luci, vi spiego, ho la necessità di fare accendere due luci ad un certo orario e dopo un tot di tempo si devono spegnere sole (la classica luce scala per intenderci in versione automatizzata) solo che non voglio bloccare il programma utilizzando la funzione delay, quindi leggendo anche gli articoli che ho visto postare diverse volte di leo72, ho deciso di optare per la funzione millis.
e qui ho trovato un intoppo dal quale no riesco ad uscirne...ovvero il tempo che io imposto come ritardo non riesco farlo partire solo dopo che le luci si sono effettivamente accese, ma inizia contare da quando alimento la scheda, con il risultato che appena le luci si accendo all'orario impostato si spengono anche subito perché il tempo di ritardo impostato è già passato!
vi posto lo sketck magari qualcuno mi riesce dare una mano...

code: [select]
#include <wire.h>
#include <time.h>
#include <timealarms.h>
#include <ds1307rtc.h>

#define ds1307_i2c_address 0x68

int luce1 = 6;
int luce2 = 7;

int statoluce1 = 0;
int statoluce2 = 0;

unsigned long previousmillis1 = 0;
unsigned long interval1 = 20000;
unsigned long previousmillis2 = 0;
unsigned long interval2 = 30000;

extern unsigned long timer0_millis;

void setup()
{
  lcd.begin(16, 2);
  lcd.setcursor(0, 0);
  serial.begin(9600);
  pinmode(luce1, output);
  pinmode(luce2, output);
 
 
  setsyncprovider(rtc.get);
  if(timestatus()!= timeset)
     serial.println("impossibile sincronizzare con rtc");
  else
     serial.println("ora sincronizzata con rtc");
 
  //impostare orari di accensioni
  alarm.alarmrepeat(21, 55, 0, prima);
  alarm.alarmrepeat(21, 55, 10, seconda);
 
 
}

void loop()
{
  accensioni();
  if(timestatus() == timeset){
     digitalclockdisplay();
     }
  alarm.delay(1000);
}

void accensioni()
{
  unsigned long currentmillis = millis();
  if(statoluce1 == 1){
    if(currentmillis - previousmillis1 > interval1) {
      previousmillis1 = currentmillis;
      digitalwrite(luce1, low);
      statoluce1 = 0;
      serial.println("primo spegnimento");
      }
    } 

  currentmillis = millis();
  if(statoluce2 == 1){
    if(currentmillis - previousmillis2 > interval2) {
      previousmillis2 = currentmillis;
      digitalwrite(luce2, low);
      statoluce2 = 0;
      serial.println("secondo spegnimento");
      }
    }
 
}
   
void digitalclockdisplay(){
 
  serial.print(hour());
  printdigits(minute());
  printdigits(second());
  serial.print(" ");
  serial.print(day());
  serial.print(" ");
  serial.print(month());
  serial.print(" ");
  serial.print(year());
  serial.println();
}

void printdigits(int digits){
  serial.print(":");
  if(digits < 10)
    serial.print('0');
  serial.print(digits);
}


// gestione luci
void prima(){
  serial.println("luce 1 accesa");
  digitalwrite(luce1, high);
  statoluce1 = 1;
  //timer0_millis = 0; //se includo l'azzeramento di millis mi crea un blocco di 20 secondi alla prima accensione
}

void seconda(){
  serial.println("luce 2 accesa");
  digitalwrite(luce2, high);
  statoluce2 = 1;
}




come vedete ho anche provato ad azzerare il contatore alla prima accensione,
code: [select]
//timer0_millis = 0; //se includo l'azzeramento di millis mi crea un blocco di 20 secondi alla prima accensione e in questo modo funziona, ma il programma va in blocco per 20 secondi e poi riprende...non più che prove fare... :smiley-eek-blue:  :smiley-eek:

grazie tutti!! :)

due suggerimenti ...

1. dimentica che esiste timer0_millis ... e dimentica dove hai letto di azzerarlo ... nel 99% dei casi è "ignoranza" nell'uso della funzione millis() dato che casi, in cui occorre realmente forzarne l'azzeramento sono estremamente rari e specifici ...

2. all'accensione millis() ovviamente parte da 0, ma te la cosa non deve preoccupare ...
... la logica è : al tuo "... certo orario" memorizzi in una variabile il valore di millis(), ad esempio la chiamiamo "partenza" dopo di che, con un if fatto più o meno come segue, spegni le luci ...

code: [select]
if ( millis() - partenza > tempoattesa ) {
  << spegni le luci >>
}


... in pratica il trucco è salvare in una variabile il millis() del momento dell'inizio del conteggio e poi fare il confronto come ti ho indicato.

vediamo se con queste indicazioni riesci farlo ... :)

guglielmo


Arduino Forum > International > Italiano > Software (Moderator: leo72) > problema con timer luci


arduino

Comments

Popular posts from this blog

VIDIOC_S_FMT error 16, Device or resource busy - Raspberry Pi Forums

using a laptop skeleton to build a pi laptop - Raspberry Pi Forums

Forum for Joomla? - Joomla! Forum - community, help and support