5 Canali indipendenti per Strisce LED

Ciao a tutti
premetto che, come da mia presentazione, sono uno zero anzi meno di zero.
Il mio obbietttivo è riuscire a pilotare strisce led bianche e rgb facendo una specie di alba/tramonto.
Sono 5 canali separati che grazie a 5 mosfet piloteranno i vari strip led.
Ad una certa ora impostabile (step 1) vorrei impostare il valore d'intensità del canale 1 - 2 - 3 - 4 e 5 in modo indipendente.
Avrei pensato a 10 step ora per l'accensione e 10 step per lo spegnimento. Faccio un esempio per spiegarmi meglio.

Step1 Ora 07:10 CH1 = 10 CH2 = 10 CH3 = 10 CH4 = 0 CH5 = 0
Step2 Ora 07:20 CH1 = 20 CH2 = 20 CH3 = 15 CH4 = 10 CH5 = 5
Step3 Ora 07:40 CH1 = 30 CH2 = 30 CH3 = 25 CH4 = 20 CH5 = 8
Step4 Ora 08:00 CH1 = 100 CH2 = 150 CH3 = 130 CH4 = 200 CH5 = 255
.... fino a 10 accensione

Step1 Ora 19:00 CH1 = 255 CH2 = 200 CH3 = 100 CH4 = 200 CH5 = 255
Step2 Ora 19:30 CH1 = 150 CH2 = 80 CH3 = 50 CH4 = 70 CH5 = 100
Step3 Ora 20:00 CH1 = 0 CH2 = 0 CH3 = 0 CH4 = 0 CH5 = 0
.... fino a 10 spegnimento

Ho iniziato a mettere giù lo sketch che fa il suo dovere (non c'è uscita e nessun comando) solo uno step orario.
Ora viene il mio dubbio e qui vi chiedo lumi, ho intrapreso la strada giusta ?
Devo fare tutto il codice per i 10 step in accensione e i 10 in spegnimento ? Quanto sarà lungo sto codice ???
C'è un altra via ? o posso ottimizzarlo ?

Allego codice e ora potete massacrami...
Grazie in anticipo a tutti

#include <LCD.h>
#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>

const int butUp = 8;
const int butDown = 9;
const int enter = 10;
const int butP = 11;
const int butM = 12;
char OraAlba[] = "  :    CH1:",
     canali[] = "CH2:      CH3:    ",
     canali1[] = "CH4:      CH5:    ";
int  i, AlbaH1, AlbaM1, Vch1, Vch2, Vch3, Vch4, Vch5;

LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

void setup() {
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(11, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);
  lcd.begin(20, 4);
  AlbaH1 = EEPROM.read(15);
  AlbaM1 = EEPROM.read(16);
  Vch1 = EEPROM.read(17);
  Vch2 = EEPROM.read(18);
  Vch3 = EEPROM.read(19);
  Vch4 = EEPROM.read(20);
  Vch5 = EEPROM.read(21);
}

void Blink(){
  int j = 0;
  while(j < 10 && digitalRead(enter) && digitalRead(butP) && digitalRead(butM)){
    j++;
    delay(50);}
}

int edit(int x, int y, int parameter){
  char text[3];
  while(!digitalRead(enter));
  while(true){
    while(!digitalRead(butP)){
      parameter++;
      if(i == 0 && parameter > 23)
        parameter = 0;
      if(i == 1 && parameter > 59)
        parameter = 0;
      if(i == 2 && parameter > 255)
        parameter = 255;
      if(i == 3 && parameter > 255)
        parameter = 255;
      if(i == 4 && parameter > 255)
        parameter = 255;
      if(i == 5 && parameter > 255)
        parameter = 255;
      if(i == 6 && parameter > 255)
        parameter = 255;
      sprintf(text,"%02u", parameter);
      lcd.setCursor(x, y);
      lcd.print(text);
      delay(150);
    }
    while(!digitalRead(butM)){
    parameter--;
      if(i == 0 && parameter < 0)
        parameter = 23;
      if(i == 1 && parameter < 0)
        parameter = 59;
      if(i == 2 && parameter <= 0)
        parameter = 0;
      if(i == 3 && parameter <= 0)
        parameter = 0;
      if(i == 4 && parameter <= 0)
        parameter = 0;
      if(i == 5 && parameter <= 0)
        parameter = 0;
      if(i == 6 && parameter <= 0)
        parameter = 0;
      sprintf(text,"%02u", parameter);
      lcd.setCursor(x, y);
      lcd.print(text);
      delay(150);
    }
  lcd.setCursor(x, y);
  lcd.print("  ");
  if(i >= 2) lcd.print(" ");
  Blink();
  sprintf(text,"%02u", parameter);
  lcd.setCursor(x, y);
  lcd.print(text);
  Blink();
  if(!digitalRead(enter)){
      i++;
      return parameter;
      }
  }
}

void loop()
{
  lcd.clear();
  Blink();
  while(1){
  if(!digitalRead(enter))
  {
  i = 0;
  AlbaH1 = edit(5, 1, AlbaH1);
  AlbaM1 = edit(8, 1, AlbaM1);
  Vch1 = edit(17, 1, Vch1);
  Vch2 = edit(5, 2, Vch2);
  Vch3 = edit(15, 2, Vch3);
  Vch4 = edit(5, 3, Vch4);
  Vch5 = edit(15, 3, Vch5);
  EEPROM.write(15, AlbaH1);
  EEPROM.write(16, AlbaM1);
  EEPROM.write(17, Vch1);
  EEPROM.write(18, Vch2);
  EEPROM.write(19, Vch3);
  EEPROM.write(20, Vch4);
  EEPROM.write(21, Vch5);
  delay(200);
  break;
  }
  lcd.setCursor(0, 1);
  lcd.print("Ora: ");
  lcd.print(OraAlba);
  lcd.setCursor(0, 2);
  lcd.print(canali);
  lcd.setCursor(0, 3);
  lcd.print(canali1);  
  }
}

Ho dato una lettura al codice, ma devo dire che non mi ha chiarito le idee, anzi le ha rese più confuse. Potresti spiegare in italiano quello che vuoi ottenere (passo dopo passo) e dove si trova il problema, per favore?
Successivamente ti consiglio xi riscrivere lo scatch leggendo gli usi degli array e dei cicli for, che sekplificano molto la vita.
Inoltre consiglio di usare variabili const di tipo byte per i pin e di non usare mai numeri puri, ma sempre variabili (dichiarate costanti o #define se non devono modificare il loro valore)

Innanzitutto grazie

ho cercato di spiegare il codice e riallego (ho modificato in byte i pin dei tasti)

Il problema è che il codice fino a qui serve solo per fare uno step Alba Ora/Minuti1 e valori ch1....ch5

Io gradirei fare 10 step Alba Ora/Minuti e altri 10 step Tramonto Ora/Minuti con la possibilità di configurare liberamente e indipendentemente ora, minuti e valore dei 5 canali per poi confrontare ora e minuti con un real clock DS3231 e pilotare l'uscita dei mosfet e quindi l'intensità delle strisce led.

Ma qui nasce il mio dubbio se questo codice fa solo ed esclusivamente uno step, devo rifare/ricopiare il codice per altre 19 volte ? Non diventa un codice da enciclopedia ?

Ad esempio solo per Alba integer diventa allucinante

int i, AlbaH1, AlbaM1, Vch1_1, Vch2_1, Vch3_1, Vch4_1, Vch5_1, AlbaH2, AlbaM2, Vch1_2, Vch2_2, Vch3_2, Vch4_2, Vch5_2, AlbaH3, AlbaM3, Vch1_3, Vch2_3, Vch3_3, Vch4_3, Vch5_3, AlbaH4, AlbaM4, Vch1_4, Vch2_4, Vch3_4, Vch4_4, Vch5_4, AlbaH5, AlbaM5, Vch1_5, Vch2_5, Vch3_5, Vch4_5, Vch5_5, AlbaH6, AlbaM6, Vch1_6, Vch2_6, Vch3_6, Vch4_6, Vch5_6, AlbaH7, AlbaM7, Vch1_7, Vch2_7, Vch3_7, Vch4_7, Vch5_7, AlbaH8, AlbaM8, Vch1_8, Vch2_8, Vch3_8, Vch4_8, Vch5_8, AlbaH9, AlbaM9, Vch1_9, Vch2_9, Vch3_9, Vch4_9, Vch5_9, AlbaH10, AlbaM10, Vch1_10, Vch2_10, Vch3_10, Vch4_10, Vch5_10;

a questo devo aggiungere tutto il tramonto.

Speravo che ad esempio potessi fare degli switch dichiarando le variabili che cambiano ed accorciare il codice o seguire un altra strada.

Grazie ancora e spero di aver spiegato il mio obbiettivo ed il problema

#include <LCD.h>
#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>

const byte butUp = 8;         //Tasti su, giu, conferma enter, piu e meno
const byte butDown = 9;
const byte enter = 10;
const byte butP = 11;
const byte butM = 12;
char OraAlba[] = "  :    CH1:",            //Visualizza su display LCD 20x4 Ora e CH1
     canali[] = "CH2:      CH3:    ",      //Visualizza su display CH2 e CH3
     canali1[] = "CH4:      CH5:    ";     //Visualizza su display CH4 e CH5
int  i, AlbaH1, AlbaM1, Vch1, Vch2, Vch3, Vch4, Vch5;  //dichiaro variabili da impostare

LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

void setup() {
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(11, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);
  lcd.begin(20, 4);
  AlbaH1 = EEPROM.read(15);      //Metto in eeprom i valori delle variabili
  AlbaM1 = EEPROM.read(16);      //in modo tale che se va via alimentazione
  Vch1 = EEPROM.read(17);        //i valori di accensione e spegnimento
  Vch2 = EEPROM.read(18);        //restano memorizzati e veranno confrontati
  Vch3 = EEPROM.read(19);        //con il clock del DS3231
  Vch4 = EEPROM.read(20);
  Vch5 = EEPROM.read(21);
}

void Blink(){     //funzione blinking per le variabili in fase di impostazione
  int j = 0;
  while(j < 10 && digitalRead(enter) && digitalRead(butP) && digitalRead(butM)){
    j++;
    delay(50);}
}

int edit(int x, int y, int parameter){       //edit dei parametri di configurazione
  char text[3];                              //dichiaro 2 cifre + null per tutti i text
  while(!digitalRead(enter));                //premo tasto enter entro in configurazione
  while(true){                               //appare ora sul display richiamata da eeprom
    while(!digitalRead(butP)){               //con tasto piu aumento il parametro
      parameter++;
      if(i == 0 && parameter > 23)           //parametro Ora quanto a 23 passa a 0
        parameter = 0;
      if(i == 1 && parameter > 59)           //parametro Minuti quanto a 59 passa a 0
        parameter = 0;
      if(i == 2 && parameter > 255)          //parametro CH1 quando raggiunta max luminosità si ferma a 255
        parameter = 255;
      if(i == 3 && parameter > 255)          //parametro CH2 come Ch1
        parameter = 255;
      if(i == 4 && parameter > 255)          //parametro CH3 come Ch1
        parameter = 255;
      if(i == 5 && parameter > 255)          //parametro CH4 come Ch1
        parameter = 255;
      if(i == 6 && parameter > 255)          //parametro CH5 come Ch1
        parameter = 255;
      sprintf(text,"%02u", parameter);       //visualizzo sempre due cifre 00 o 03 o 19 etc...
      lcd.setCursor(x, y);                   //dichiaro le posizioni per lcd 
      lcd.print(text);                       //visualizzo su LCD i text dichiarati in chart
      delay(150);
    }
    while(!digitalRead(butM)){               //stessa funzione ma per il tasto meno
    parameter--;
      if(i == 0 && parameter < 0)
        parameter = 23;
      if(i == 1 && parameter < 0)
        parameter = 59;
      if(i == 2 && parameter <= 0)
        parameter = 0;
      if(i == 3 && parameter <= 0)
        parameter = 0;
      if(i == 4 && parameter <= 0)
        parameter = 0;
      if(i == 5 && parameter <= 0)
        parameter = 0;
      if(i == 6 && parameter <= 0)
        parameter = 0;
      sprintf(text,"%02u", parameter);
      lcd.setCursor(x, y);
      lcd.print(text);
      delay(150);                           //chiudo funzione tasto meno
    }
  lcd.setCursor(x, y);                      //mi serve per fare blinking
  lcd.print("  ");                          //quando ho due cifre ora e minuti due spazi bianchi
  if(i >= 2) lcd.print(" ");                //quando 3 cifre valore CH max 255 aggiungo spazio bianco
  Blink();                                  //chiamo void blink per lampeggio cifra
  sprintf(text,"%02u", parameter);          //come prima desidero sempre doppia cifra
  lcd.setCursor(x, y);
  lcd.print(text);
  Blink();
  if(!digitalRead(enter)){                 //se premo enter passo a parametro successivo
      i++;
      return parameter;                    //fino all'ultimo ed esco con return
      }
  }
}

void loop()
{
  lcd.clear();
  Blink();
  while(1){
  if(!digitalRead(enter))                  //quando premo enter edit dei parametri
  {
  i = 0;
  AlbaH1 = edit(5, 1, AlbaH1);             //dichiaro coordinate LCD per parametro Ora Alba step 1
  AlbaM1 = edit(8, 1, AlbaM1);             //dichiaro coordinate LCD per parametro Minuti Alba step 1
  Vch1 = edit(17, 1, Vch1);                //dichiaro coordinate LCD per parametro Canale 1
  Vch2 = edit(5, 2, Vch2);                 //idem per Canale2
  Vch3 = edit(15, 2, Vch3);                //idem per Canale3
  Vch4 = edit(5, 3, Vch4);                 //idem per Canale4
  Vch5 = edit(15, 3, Vch5);                //idem per Canale5
  EEPROM.write(15, AlbaH1);                //salvo in eeprom il valore Ora Alba step 1
  EEPROM.write(16, AlbaM1);                //salvo in eeprom il valore Minuti Alba step 1
  EEPROM.write(17, Vch1);                  //salvo in eeprom il valore Canale1
  EEPROM.write(18, Vch2);                  //idem come sopra Canale2
  EEPROM.write(19, Vch3);
  EEPROM.write(20, Vch4);
  EEPROM.write(21, Vch5);
  delay(200);
  break;                                   //esco dal while
  }
  lcd.setCursor(0, 1);                     //visualizzo su LCD i vari text dichiarati in chart all'inizio
  lcd.print("Ora: ");
  lcd.print(OraAlba);
  lcd.setCursor(0, 2);
  lcd.print(canali);
  lcd.setCursor(0, 3);
  lcd.print(canali1);  
  }                        //manca tutta la parte di comando ad accendere e spegnere i mosfet
}                          //ma questa la farò dopo, prima gradirei capire se sono sulla strada giusta

Datalife:
Ad esempio solo per Alba integer diventa allucinante

int i, AlbaH1, AlbaM1, Vch1_1, Vch2_1, Vch3_1, Vch4_1, Vch5_1, AlbaH2, AlbaM2, Vch1_2, Vch2_2, Vch3_2, Vch4_2, Vch5_2, AlbaH3, AlbaM3, Vch1_3, Vch2_3, Vch3_3, Vch4_3, Vch5_3, AlbaH4, AlbaM4, Vch1_4, Vch2_4, Vch3_4, Vch4_4, Vch5_4, AlbaH5, AlbaM5, Vch1_5, Vch2_5, Vch3_5, Vch4_5, Vch5_5, AlbaH6, AlbaM6, Vch1_6, Vch2_6, Vch3_6, Vch4_6, Vch5_6, AlbaH7, AlbaM7, Vch1_7, Vch2_7, Vch3_7, Vch4_7, Vch5_7, AlbaH8, AlbaM8, Vch1_8, Vch2_8, Vch3_8, Vch4_8, Vch5_8, AlbaH9, AlbaM9, Vch1_9, Vch2_9, Vch3_9, Vch4_9, Vch5_9, AlbaH10, AlbaM10, Vch1_10, Vch2_10, Vch3_10, Vch4_10, Vch5_10;

Già, ed è per questo che hanno inventato gli array e le struct :wink:

Sono in totale 20 serie di 7 valori (tra l'altro i valori possono essere tutti di tipo byte perché non superano mai il valore 255)

Una serie di 7 valori può essere rappresentata con un array di byte, chiamiamolo ad esempio 'record'

byte record[7];

Dove:
record[0] contiene l'ora
record[1] contiene i minuti
record[6] contiene Vch5

In EEPROM andranno memorizzati in sequenza 20 di questi record, il primo inizia all'indirizzo 0, il secondo al 7, il terzo al 14 e così via (per un totale di 140 byte dati).

byte startAddr = (numRecord - 1) * 7  // numRecord va da 1 a 20

A questo punto leggere e scrivere il record su EEPROM diventa "banale":

void readRecord(byte numRecord)
{
    byte startAddr = (numRecord - 1) * 7;
    for(byte j=0; j<7; j++)
        record[j] = EEPROM.read(startAddr + j);
}
void writeRecord(byte numRecord)
{
    byte startAddr = (numRecord - 1) * 7;
    for(byte j=0; j<7; j++)
        EEPROM.write(startAddr + j, record[j]);
}

Il programma dovrà quindi selezionare il record attuale con cui lavorare, leggerlo da EEPROM, editarlo, ed infine salvarlo:

record[0] = edit(5, 1, record[0]);   // edito ora
record[1] = edit(8, 1, record[1]);   // edito minuti
record[2] = edit(17, 1, record[2]);  // edito canale 1
record[3] = edit(5, 2, record[3]);
record[4] = edit(15, 2, record[4]);
record[5] = edit(5, 3, record[5]);
record[6] = edit(15, 3, record[6]);

Tralascio le struct per non mettere troppa ciccia la fuoco, ma renderebbero il tutto ancora più leggibile (fermo restando il concetto di un record dati alla volta su cui lavorare).

Grazie per le dritte

E allora vado a studiare gli array e i cicli for

Tra qualche giorno vi farò sapere

Grazie veramente grazie :wink:

Ho visto come sono strutturati gli array
quindi come suggerito da @Claudio_FF

byte record[7]; creo un array chiamato record e dichiaro che a dimensione di 7

poi il void readRecord e void writeRecord ho capito la funzione, ma non essendomi chiaro il passaggio

Claudio_FF:
In EEPROM andranno memorizzati in sequenza 20 di questi record, il primo inizia all'indirizzo 0, il secondo al 7, il terzo al 14 e così via (per un totale di 140 byte dati).

byte startAddr = (numRecord - 1) * 7  // numRecord va da 1 a 20

numRecord ?

capisco che se ha valore 1 il risultato è 0 quindi fa i primi 7 valori da 0 a 6 e se ha valore 2 fa da 7 a 13 e cosi via.

Non ho capito anche "in EEPROM andranno memorizzati in sequenza 20 di questi record" cosa significa che devo creare i 20 record e come ?

Dato che credo, scusate la mia ignoranza, è qui la chiave è il passaggio fondamentale vorrei capire.

Grazie

Io opterei per una matrice bidimensionale

esempio

byte accensione [10][5] =
{
  {10, 10, 10, 0, 0},
  {20, 20, 15, 10, 5},
  {30, 30, 25, 20, 8},
  {40, 150, 130, 200, 255},
  {50, 150, 130, 200, 255},
  {60, 150, 130, 200, 255},
  {70, 150, 130, 200, 255},
  {80, 150, 130, 200, 255},
  {90, 150, 130, 200, 255},
  {100, 150, 130, 200, 255},
} ;

void setup() {
  Serial.begin(9600);
    for ( int a = 0; a < 10; a++) {
    Serial.print(accensione[a][0], DEC);
    Serial.print("  ");
    Serial.print(accensione[a][1], DEC);
    Serial.print("  ");
    Serial.print(accensione[a][2], DEC);
    Serial.print("  ");
    Serial.print(accensione[a][3], DEC);
    Serial.print("  ");
    Serial.print(accensione[a][4], DEC);
    Serial.println();
  }
}

void loop() {
}

Datalife:
"in EEPROM andranno memorizzati in sequenza 20 di questi record" cosa significa che devo creare i 20 record e come ?

Ci sono da gestire 20 serie di dati, ciascuna di 7 elementi (totale 140 byte in EEPROM, ogni serie inizia ad un indirizzo sette byte più avanti rispetto alla precedente, partendo dall'indirizzo zero per la prima).

L'array record (in RAM) è uno solo, lungo 7 byte, serve a contenere temporaneamente la serie su cui si lavora al momento, caricata nell'array con readRecord o trasferita in EEPROM con writeRecord.

Il parametro numRecord serve a selezionare a quale porzione di EEPROM (cioè a quale serie tra quelle memorizzate) accedere.

Una EEPROM vuota dovrebbe contenere tutti i byte a 255, per cui volendo inizializzare una sola volta la parte per i nostri dati basterebbe scrivere zero nei primi 140 indirizzi, questo in pratica significa scrivere 20 serie di sette zeri, serie che poi possono essere editate una alla volta con la procedura già sperimentata.

Il programma va naturalmente modificato per selezionare la serie che si vuole modificare.

Ma poi, tra parentesi, a parte il volerlo fare, è così frequente e necessario dover editare a mano tutti i valori su LCD? Una trasmissione da PC sarebbe troppo brigosa?

Claudio_FF:
Il parametro numRecord serve a selezionare a quale porzione di EEPROM (cioè a quale serie tra quelle memorizzate) accedere.

OK mi è chiaro il discorso delle venti serie da 7 elementi
int i..... va eliminato

ma va dichiarato numRecord uguale a qualcosa ?

se elimino int i,AlbaH1..... poi devo riferire edit dei parametri di configurazione quando premo i tasti più e meno
e che riferimenti gli do ?

mi sa che è troppo complesso...

#include <LCD.h>
#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>

const byte butUp = 8;         //Tasti su, giu, conferma enter, piu e meno
const byte butDown = 9;
const byte enter = 10;
const byte butP = 11;
const byte butM = 12;
char OraAlba[] = "  :    CH1:",            //Visualizza su display LCD 20x4 Ora e CH1
     canali[] = "CH2:      CH3:    ",      //Visualizza su display CH2 e CH3
     canali1[] = "CH4:      CH5:    ";     //Visualizza su display CH4 e CH5
int  i, AlbaH1, AlbaM1, Vch1, Vch2, Vch3, Vch4, Vch5;  //dichiaro variabili da impostare

byte record[7];
byte startAddr = (numRecord - 1) * 7  // numRecord va da 1 a 20 

LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

void readRecord(byte numRecord)
{
    byte startAddr = (numRecord - 1) * 7;
    for(byte j=0; j<7; j++)
        record[j] = EEPROM.read(startAddr + j);
}

void writeRecord(byte numRecord)
{
    byte startAddr = (numRecord - 1) * 7;
    for(byte j=0; j<7; j++)
        EEPROM.write(startAddr + j, record[j]);
}

void setup() {
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(11, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);
  lcd.begin(20, 4);
  readRecord();

/*  AlbaH1 = EEPROM.read(15);      //Metto in eeprom i valori delle variabili
  AlbaM1 = EEPROM.read(16);      //in modo tale che se va via alimentazione
  Vch1 = EEPROM.read(17);        //i valori di accensione e spegnimento
  Vch2 = EEPROM.read(18);        //restano memorizzati e veranno confrontati
  Vch3 = EEPROM.read(19);        //con il clock del DS3231
  Vch4 = EEPROM.read(20);
  Vch5 = EEPROM.read(21);*/
}



void Blink(){     //funzione blinking per le variabili in fase di impostazione
  int j = 0;
  while(j < 10 && digitalRead(enter) && digitalRead(butP) && digitalRead(butM)){
    j++;
    delay(50);}
}

int edit(int x, int y, int parameter){       //edit dei parametri di configurazione
  char text[3];                                     //dichiaro 2 cifre + null per tutti i text
  while(!digitalRead(enter));                 //premo tasto enter entro in configurazione
  while(true){                                      //appare ora sul display richiamata da eeprom
    while(!digitalRead(butP)){                //con tasto piu aumento il parametro
      parameter++;
      if(i == 0 && parameter > 23)           //parametro Ora quanto a 23 passa a 0
        parameter = 0;
      if(i == 1 && parameter > 59)           //parametro Minuti quanto a 59 passa a 0
        parameter = 0;
      if(i == 2 && parameter > 255)          //parametro CH1 quando raggiunta max luminosità si ferma a 255
        parameter = 255;
      if(i == 3 && parameter > 255)          //parametro CH2 come Ch1
        parameter = 255;
      if(i == 4 && parameter > 255)          //parametro CH3 come Ch1
        parameter = 255;
      if(i == 5 && parameter > 255)          //parametro CH4 come Ch1
        parameter = 255;
      if(i == 6 && parameter > 255)          //parametro CH5 come Ch1
        parameter = 255;
      sprintf(text,"%02u", parameter);       //visualizzo sempre due cifre 00 o 03 o 19 etc...
      lcd.setCursor(x, y);                          //dichiaro le posizioni per lcd 
      lcd.print(text);                                 //visualizzo su LCD i text dichiarati in chart
      delay(150);
    }
    while(!digitalRead(butM)){                 //stessa funzione ma per il tasto meno
    parameter--;
      if(i == 0 && parameter < 0)
        parameter = 23;
      if(i == 1 && parameter < 0)
        parameter = 59;
      if(i == 2 && parameter <= 0)
        parameter = 0;
      if(i == 3 && parameter <= 0)
        parameter = 0;
      if(i == 4 && parameter <= 0)
        parameter = 0;
      if(i == 5 && parameter <= 0)
        parameter = 0;
      if(i == 6 && parameter <= 0)
        parameter = 0;
      sprintf(text,"%02u", parameter);
      lcd.setCursor(x, y);
      lcd.print(text);
      delay(150);                                      //chiudo funzione tasto meno
    }
  lcd.setCursor(x, y);                              //mi serve per fare blinking
  lcd.print("  ");                                      //quando ho due cifre ora e minuti due spazi bianchi
  if(i >= 2) lcd.print(" ");                        //quando 3 cifre valore CH max 255 aggiungo spazio bianco
  Blink();                                               //chiamo void blink per lampeggio cifra
  sprintf(text,"%02u", parameter);          //come prima desidero sempre doppia cifra
  lcd.setCursor(x, y);
  lcd.print(text);
  Blink();
  if(!digitalRead(enter)){                 //se premo enter passo a parametro successivo
      i++;
      return parameter;                    //fino all'ultimo ed esco con return
      }
  }
}

void loop()
{
  lcd.clear();
  Blink();
  while(1){
  if(!digitalRead(enter))                              //quando premo enter edit dei parametri
  {
  i = 0;
  record[0] = edit(5, 1, record[0]);             //dichiaro coordinate LCD per parametro Ora Alba step 1
  record[1] = edit(8, 1, record[1]);             //dichiaro coordinate LCD per parametro Minuti Alba step 1
  record[2] = edit(17, 1, record[2]);               //dichiaro coordinate LCD per parametro Canale 1
  record[3] = edit(5, 2, record[3]);                 //idem per Canale2
  record[4] = edit(15, 2, record[4]);               //idem per Canale3
  record[5] = edit(5, 3, record[5]);                 //idem per Canale4
  record[6] = edit(15, 3, record[6]);               //idem per Canale5
  writeRecord();

/*  EEPROM.write(15, AlbaH1);            //salvo in eeprom il valore Ora Alba step 1
  EEPROM.write(16, AlbaM1);               //salvo in eeprom il valore Minuti Alba step 1
  EEPROM.write(17, Vch1);                  //salvo in eeprom il valore Canale1
  EEPROM.write(18, Vch2);                  //idem come sopra Canale2
  EEPROM.write(19, Vch3);
  EEPROM.write(20, Vch4);
  EEPROM.write(21, Vch5);*/

  delay(200);
  break;                                   //esco dal while
  }
  lcd.setCursor(0, 1);                //visualizzo su LCD i vari text dichiarati in chart all'inizio
  lcd.print("Ora: ");
  lcd.print(OraAlba);
  lcd.setCursor(0, 2);
  lcd.print(canali);
  lcd.setCursor(0, 3);
  lcd.print(canali1);  
  }                              //manca tutta la parte di comando ad accendere e spegnere i mosfet
}                                //ma questa la farò dopo, prima gradirei capire se sono sulla strada giusta

Datalife:
ma va dichiarato numRecord uguale a qualcosa ?

È una variabile che deve valere da 1 a 20, quindi di tipo byte è sufficiente, all'inizio (nella dichiarazione) potrebbe essere preimpostata a 1.

Invece startAddr è una variabile dichiarata e usata solo dentro (locale) le funzioni readRecord writeRecord, non serve a niente dichiararla all'esterno (globale) dove non viene usata.

La lettura record iniziale nella setup non legge alcun dato, perché nella chiamata della funzione va passato (come argomento tra le parentesi) il numero della serie da leggere. Quindi ad esempio readRecord(1) leggerebbe la prima serie e la caricherebbe nell'array. La stessa cosa vale per il writeRecord.

se elimino int i,AlbaH1..... poi devo riferire edit dei parametri di configurazione quando premo i tasti più e meno
e che riferimenti gli do ?

Si editano gli elementi dell'array, AlbaH corrisponde a record[0] ecc.

L'array va prima caricato con i dati letti dalla EEPROM (selezionati dal valore di numRecord), e poi riscritto.

Il problema è che prima bisogna selezionare la serie voluta (cioè il valore di numRecord da 1 a 20), poi confermare, leggere / editare / riscrivere, e a questo punto si deve selezionare un'altra serie ecc.

In sostanza la logica di gestione può trovarsi in diverse "situazioni" (schermata principale, selezione serie, edit valori, eventuale altro) che vanno "impostate" e "riconosciute" usando un'ulteriore variabile di stato, il cui valore indica in ogni momento la situazione attuale (e quindi con una struttura if/else if si seleziona la parte di programma da eseguire nella specifica situazione).

Aspetta, fammi capire
tu vorresti simulare alba e tramonto, ho capito bene?
quindi devi tenere "a mente" l'ora di inizio, e tutte le ore di "progressione", oltre che le singole configurazioni dei passi di "alba" e "tramonto"
scusa se la domanda ti sembrerà banale, ma non potresi semplicemente accendere in progressione lineare da led 1 a led 5 e spegnere in progressione lineare inversa da led 5 a led 1?
voglio dire una cosa di questo tipo:

se crei l'array di pin

int pin[5]={ e qui scrivi i 5 pin usati per comandare i led};

questa funzione dovrebbe accenderti in sequenza e gradualmente i 5 led, cominciando dal primo
quando il primo è al 20% inizia ad accendere il secondo
quando il secondo è al 20% inizia col terzo, e via così
e quando il primo è al 100% non lo incrementa più

accendi()
{
for (int i=0; i<512; i++)
   {
   // 512 passi
   // 5 led sfalsati di 50 passi
   for (byte j=0; j<5;j++)
      {
       if (i>j*50 && i<= (255+j*50))
         {
          analogWrite(pin[j], i-j*50);
         }
      }
   delay(10); // o ogni altro valore
   }
}

va che te la ho buttata qui al volo, non la posso compilare da questo PC
ma potrebbe servire da ispirazione
poi ne fai una gemella per il tramonto.....

Claudio_FF:
Il problema è che prima bisogna selezionare la serie voluta (cioè il valore di numRecord da 1 a 20), poi confermare, leggere / editare / riscrivere, e a questo punto si deve selezionare un'altra serie ecc.
In sostanza la logica di gestione può trovarsi in diverse "situazioni" (schermata principale, selezione serie, edit valori, eventuale altro) che vanno "impostate" e "riconosciute" usando un'ulteriore variabile di stato, il cui valore indica in ogni momento la situazione attuale (e quindi con una struttura if/else if si seleziona la parte di programma da eseguire nella specifica situazione).

E quindi mi diventa veramente complesso, vedo come andare avanti dato che per la mia ignoranza è molto arduo ci provo e non mollo.

Standardoil:
Aspetta, fammi capire
tu vorresti simulare alba e tramonto, ho capito bene?

Si ma vorrei gestire liberamente ed indipendentemente tutto ora - minuti e i 5 canali in uscita
desidererei impostare ora con valori intensità uscite a mio piacimento
e questo lo vorrei fare per 10 step come alba e 10 come tramonto

Ok capito