modifica codice accensione led

Ciao a tutti ,comincio subito a rompervi le scatole con due domande.
La prima:
sto costruendo una plafoniera con led da 3 watt ( comandata in PWM ) , ho collegato tutto e ho scritto il codice ( rimasugli di c++ e ricerca on line ) e vorrei sapere se è giusto oppure ho commesso qualche errore ( devo ancora capire come metterlo a tendina :grin:):

int led1 = 9; // Dichiara il PIN (PWM) di arduino incaricato di gestire iled blue e royal blue
int led2 = 10; // Dichiara il PIN (PWM) di arduino incaricato di gestire i led 10000K
int led3 = 11; // Dichiara il PIN (PWM) di arduino incaricato di gestire i led 20000K

void setup()

{
pinMode(led1, OUTPUT); // imposta il pin digitale come output
pinMode(led2, OUTPUT); // imposta il pin digitale come output
pinMode(led3, OUTPUT); // imposta il pin digitale come output
}

void loop() {

// Esegue un aumento progressivo della luminosità da 0 a 255 (massimo) con step di 1 punti

for(int fadeValue = 0 ; fadeValue <= 145; fadeValue +=1) { // Invia il valore al mosfet (0-145):

analogWrite(led1, fadeValue);

delay(24828); // Con 24828 millisencondi, considerando che i cicli 145 avrai un ora perchè l'intensità arrivi al massimo

}

delay(36000000); // Questa pausa corrisponde a 10 ore, le luci rimarranno accese 10 ore per poi passare allo spegnimento
// Esegue una diminuzione progressiva della luminosità da 145 a 0 (massimo) con step di -1 punti
for(int fadeValue = 145 ; fadeValue >= 0; fadeValue -=1) {
// Invia il valore al mosfet (145-0):
analogWrite(led1, fadeValue);
delay(24828); // impiegherà un ora per spegnere i led
analogWrite(led1, LOW);

}

for(int fadeValue = 0 ; fadeValue <= 164; fadeValue +=1) { // Invia il valore al mosfet (0-164):

analogWrite(led2, fadeValue);

delay(10976); // Con 10976 millisencondi, considerando che i cicli sono 164 avrai 30 min perchè l'intensità arrivi al massimo

}

delay(36000000); // Questa pausa corrisponde a 10 ore, le luci rimarranno accese 10 ore per poi passare allo spegnimento

// Esegue una diminuzione progressiva della luminosità da 164 a 0 (massimo) con step di -1 punti
for(int fadeValue = 164 ; fadeValue >= 0; fadeValue -=1) {
// Invia il valore al mosfet (0-164):
analogWrite(led2, fadeValue);
delay(10976); // impiegherà 30 min per spegnere i led
analogWrite(led2, LOW);

}

for(int fadeValue = 0 ; fadeValue <= 185; fadeValue +=1) { // Invia il valore al mosfet (0-185):

analogWrite(led3, fadeValue);

delay(4865); // Con 4865 millisencondi, considerando che i cicli sono 185 avrai 15 min perchè l'intensità arrivi al massimo

}

delay(36000000); // Questa pausa corrisponde a 10 ore, le luci rimarranno accese 10 ore per poi passare allo spegnimento

// Esegue una diminuzione progressiva della luminosità da 185 a 0 (massimo) con step di -1 punti
for(int fadeValue = 185 ; fadeValue >= 0; fadeValue -=1) {
// Invia il valore al mosfet (0-185):
analogWrite(led3, fadeValue);
delay(4865); // impiegherà 15min per spegnere i led
analogWrite(led3, LOW);
}
}

seconda domanda:
volendo impostare l'ora di accensione per ognuno dei codici devo ovviamente utilizzare un RTC ( l'ho gia comprato e montato ma devo installare le librerie e settarlo con data e ora corretta ) il codice ( che devo ancora scrivere ) lo devo inserire all'interno di quello postato oppure è possibile scriverlo a parte e poi includerlo come libreria ? Inoltre , qualche suggerimento da cui partire ????

grazie a tutti :grin: :grin: :grin: :grin: :grin: :grin:

Per primo non usare il delay() e sopratutto non usarlo per tempi cosí lunghi (36000000 msec perché credo che é un numero troppo grande per il delay).
Usa per i tempi l' ora del RTC per l' accensione e spegnimento delle luci e il millis() per il fade. Non ho capito perché non usi tutto la luminaositá dei led ma li tieni a quasi metá.
Ciao Uwe

uwefed:
Per primo non usare il delay() e sopratutto non usarlo per tempi cosí lunghi (36000000 msec perché credo che é un numero troppo grande per il delay).
Usa per i tempi l' ora del RTC per l' accensione e spegnimento delle luci e il millis() per il fade. Non ho capito perché non usi tutto la luminaositá dei led ma li tieni a quasi metá.
Ciao Uwe

Ok, allora appena ho tempo modifico il codice con il millis e mi sbatto un po per cercare di capire come usare l'ora del RTC.
Li uso quasi a metà perchè non mi serve spingerli al massimo, al limite poi modifico il codice e cerco un metodo per cambiare i settaggi tramite tastierino o i pulsanti del display.

marco7879

per favore modifica il titolo the topic cercando di sintetizzare la tua domanda...
te lo immagini un forum in cui tutti i post si intitolano "prima domana" , "aiutino urgente", "ho bisogno di una mano" etc :slight_smile:

m

marco7879:
Ok, allora appena ho tempo modifico il codice con il millis e mi sbatto un po per cercare di capire come usare l'ora del RTC.
Li uso quasi a metà perchè non mi serve spingerli al massimo, al limite poi modifico il codice e cerco un metodo per cambiare i settaggi tramite tastierino o i pulsanti del display.

Usa la libreria per quel modello di RTC. Lí annessi ci sono anche gli esempi come usarla.
Ciao Uwe

@Uwe:
delay() in "teoria" accetta dati di tipo unsigned long, quindi 36.000.000 ci starebbe come valore. Ma, come dici giustamente tu, è fuori logica usare tempi così lunghi in un delay.

@Marco:
che RTC hai? Un DS1307 o un PCF8563? Cmq esistono librerie per entrambi i chip. Importi le librerie nel tuo sketch e poi crei un'istanza della lib per accedere all'RTC. Basta leggere l'ora, vedere quando devi accendere o spengere e fare il fading.

Lo faccio subito( se scopro come si fa )

Modifica il titolo del tuo primo messaggio (quello di apertura del thread).

Allora, ho modificato il codice nella maniera seguente e sinceramente è il meglio che sono riuscito a fare per ora.
Più avanti cercherò di aggiungere l'ora di accensione tramite l'ora prelevata dal RTC ( DS1307 ).
Adesso veniamo alle critiche e ai suggerimenti per snellire il codice ( che sicuramente è più che migliorabile ) :grin: :grin: :grin::

#define led1 9
#define led2 10
#define led3 11

long waitUntil=0;

int k1;
int k2;
int k3;
int j1;
int j2;
int j3;

unsigned long time1;
unsigned long time2;
unsigned long time3;

unsigned long led_blue;
unsigned long led_10k;
unsigned long led_20k;


void setup()      {  
          pinMode(led1, OUTPUT);   // imposta il pin digitale come output 
          pinMode(led2, OUTPUT);   // imposta il pin digitale come output
          pinMode(led3, OUTPUT);   // imposta il pin digitale come output

          time1=millis();
          time2=millis();
          time3=millis();

          led_blue=millis();
          led_10k=millis();
          led_20k=millis();

          k1=0;
          j1=145;
          k2=0;
          j2=164;
          k3=0;
          j3=185;
    }  

void loop(){
          time1=millis();
          time2=millis();
          time3=millis();

          if(time1>led_blue+24828){  
          k1=k1++; 
           }

          if(k1==j1) {
          waitUntil=millis()+3600000;
    }          
      
          if(time2>led_10k+10976){  
          k2=k2++; 
           }

          if(k2==j2) {
          waitUntil=millis()+3600000;
    }
      
          if(time3>led_20k+4865){  
          k3=k3++; 
           }

          if(k3==j3) {
          waitUntil=millis()+3600000;
    }
}

k1=k1++;
é inutilmente complicato, basta:
k1++;

Definisci il waitUntil ma non lo controlli mai.

Ciao Uwe

uwefed:
k1=k1++;
é inutilmente complicato, basta:
k1++;

Definisci il waitUntil ma non lo controlli mai.

Ciao Uwe

Ok, allora metto k1++.
Per quello che riguarda il waitUntil non so come controllarlo, l'unica cosa che mi viene in mente è usare un long sequenceDelay con una certa durata, ma anche in questo caso brancolo nel buio. Mi strizzo un po le meningi e posto quello che riesco a tirar fuori.

grazie mille per i suggerimenti

Allora, sono riuscito a tirare fuori questo

#define led1 9

#define led2 10

#define led3 11

long pauseDelay = 3600000;

long pause_1=0;

long pause=pauseDelay;

int k1;

int k2;

int k3;

int j1;

int j2;

int j3;

unsigned long time1;

unsigned long time2;

unsigned long time3;

unsigned long led_blue;

unsigned long led_10k;

unsigned long led_20k;

void setup()

{
pinMode(led1, OUTPUT); // imposta il pin digitale come output

pinMode(led2, OUTPUT); // imposta il pin digitale come output

pinMode(led3, OUTPUT); // imposta il pin digitale come output

time1=millis();

time2=millis();

time3=millis();

led_blue=millis();

led_10k=millis();

led_20k=millis();

k1=0;

j1=145;

k2=0;

j2=164;

k3=0;

j3=185;

}

void loop(){

time1=millis();

time2=millis();

time3=millis();

if(time1>led_blue+24828){

k1++;

}

if(k1==j1) {

pause_1=millis()+pause;

}

if(time2>led_10k+10976){

k2++;

}

if(k2==j2) {

pause_1=millis()+pause;
}

if(time3>led_20k+4865){

k3++;

}

if(k3==j3) {

pause_1=millis()+pause;
}
}

Non so se usare pauseDelay sia giusto o meno ma non mi viene in mente altro.
Attendo consigli. XD XD XD XD XD XD XD XD XD XD XD XD