Sw fotoperiodo allevamento Uccelli

Ragazzi tranquilli questo è solo un esempio che ho trovato in rete

marco076:
No la mia teballa è indipendete all'ora solare è tipo questa:

DATA Alba Tramonto Tot
1 GENNAIO 06:19 01:50 19:31

Non mi sono spiegato bene ma tu hai messo una tabella per cui posso fare una domanda più precisa.
Gli orari del primo gennaio a cosa sono riferiti? Ad un orario convenionale completamente slegato dall'orario degli altri orologi?
Cosa sono i 3 orari?

Allora mi spiego meglio nella prima colonna c'è il giorno poi messa seconda colonna l''ora in cui la luce si accende la luce e successivamente l'orario di spegnimento. L'ultima colonna indica solo l'ammontare di ore in cui la luce rimane accesa

Quindi gli orari sono effettivamente legati all'ora locale. Il primo gennaio accendo alle 06:19 e spengo all' 01:50 del giorno dopo. Faccio lo stesso fino al 14 gennaio quando scatta il nuovo orario.

Io userei una matrice mettendo nel primo campo la data, nel secondo l'alba e nel terzo il tramonto.
Quindi alla partenza caricherei la data dall'RTC e scorrerei la tabella alla ricerca della data uguale o precedente (immediatamente precedente) qiindi in base all'orario stabilirei se devo aspettare per accendere o debba accendere.
Una volta acceso aspetto lo spegnimento
Una volta spento controllo la data e se è uguale ad 1 o a 15 leggo nella tabella i nuovi orari.

Da questo ragionamento ancora rimane in sospeso cosa succede al passaggio all'ora estiva.

Matrice con 3 colonne, ogni colonna un numero.
Per la data la memorizzi come AAAAMMGG e le ore come HHMMSS
HHMMSS= ora1000+minuti100+secondi ed ottieni un numero facilmente memorizzabile in una unica variabile/cella. Inoltre è anche facile fare confronti nei test di una if

Grazie mille per le info, ora devo attivarmi per creare la tabella.
N.b: nell'esempio tra le 2 date sempra che l'orario non cambio in realtà dovrei variare l'ora d'accensione da 6:19 a 6:25
Per il cambio dell'ora non viene calcolata in quanto gli animali non hanno ora legale/solare.

Per il confronto date io userei la libreria time.h o analoga, ossia i secondi a partire dal primo gennaio 1970. Poi la libreria ti fornisce tutti i dati che ti servono.
Nella matrice metterei le date sempre in secondi a partire da gennaio, poi prendi la data attuale, sottrai gli anni, e fai il confronto diretto.
Magari la libreria permette di gestire anche le date senza anno.
Mai fatto una cosa del genere con Arduino, però.

@marco076,
la questione ora estiva o invernale non si pone per gli animali ma per il calcolo dell'orario.
Noto che il fotoperiodo è invertito ripetto alle nostra stagione.

Si è una cosa un po' strana

zoomx:
Per il confronto date io userei la libreria time.h o analoga, ossia i secondi a partire dal primo gennaio 1970. Poi la libreria ti fornisce tutti i dati che ti servono.

Solo attenzione che la libreria memorizza tutto, data e ora in un unico valore. Potrebbe non essere comodo in alcuni casi.

Usare i secondi dal 1/1/1970 è scomodo perché ti obbligherebbe ogni anno ad aggiornare la tabella. Io farei una cosa un po' diversa. Intanto userei una struct per la singola voce della tabella, tipo:

struct TableEntry {
  unsigned int day;
  unsigned int start;
  unsigned int end;
};

Giorno e ora li esprimerei come proposto da nid. Per facilitare la creazione della tabella creerei un paio di macro:

#define _D(d, m) ((m) * 100 + (d))
#define _T(h, m) ((h) * 100 + (m))

A questo punto la tabella è facilmente definibile come:

const TableEntry timeTable[] = {
    {_D(01,01), _T(06,19), _T(01,50)},
    {_D(15,01), _T(06,25), _T(02,18)},
    /* ... */
    {0, 0, 0}        // Marcatore fine tabella
};

Oppure, se preferisci:

const TableEntry timeTable[] = {
    {0101, 0619, 0150},
    {0115, 0625, 0218},
    /* ... */
    {0, 0, 0}        // Marcatore fine tabella
};

E trovare la entry del giorno corrente è banale:

const TableEntry& getTodaysEntry () {
    unsigned long today = _D(day(), month());

    unsigned int i;
    for (i = 1; timeTable[i].day != 0 && timeTable[i].day < today; i++)
        ;

    return timeTable[i - 1];
}

Potrebbe anche funzionare :D. Però restano da risolvere un paio di problemi:

  • Gestire gli anni bisestili
  • Gestire il fatto che nella tabella gli orari a volte si riferiscono al giorno successivo.

Insomma, è un'idea da ampliare un po'!

Sukko, se si scrivono anni e mesi come da me indicato, le costanti sono del tipo 20161202 e 123000 ovvero molto leggibili, senza tanto codice di mezzo.

Sì, forse in effetti è pure più semplice :D. Ho ridefinito le macro _D() e _T() per usare la tua rappresentazione, per quanto ora la tabella sia esprimibile pure più facilmente.

Però l'anno non serve, il ciclo è lo stesso indipendentemente dall'anno corrente (penso).

Penso anche i secondi non servono.
Sukko, ma nella getTodaysEntry() non manca un controllo se today non lo trovi in tabella ?

Infatti i secondi non li ho messi :).

Non mi pare, è fatta per ritornare comunque i dati della prima (se non inizia dal 1/1) o dell'ultima voce. L'unica attenzione è che almeno una riga, oltre al terminatore, deve esserci.

Poi, non ho capito una cosa, quella tabella, da una riga all'altra... è un range giusto?
1 GENNAIO 06:19 01:50 19:31
15 GENNAIO 06:25 02:18 19:53
1 FEBBRAIO 06:30 00:50 18:20
Cioè tra 1 gen fino al 14 gen valgono i valori del 1 gen, poi dal 15 gen fino al 31 gen valgono valori del 15 gen , giusto ?

EDIT: ah, okay Sukko la tua funzione fa quello, trova fino al minore. Ok ^-^

Io l'ho interpretata così, sì.

Grazie mille per tutte le info, ora sono al lavoro e non riesco a controllare tutto al meglio, alla fine del progetto il sistema dovrebbe prendere gli orari del 1 gennaio e del 15 gennaio subbividerli per i 15 gg. È variare in autonomia l'ora accensione e spegnimento.....:
Só che è un po' complicato se fosse stato un plc sarei stato capace di generare un codice, solo che il prezzo sarebbe moltooooo più alto

nid69ita:
Solo attenzione che la libreria memorizza tutto, data e ora in un unico valore. Potrebbe non essere comodo in alcuni casi.

C'è il trucco.

SukkoPera:
Usare i secondi dal 1/1/1970 è scomodo perché ti obbligherebbe ogni anno ad aggiornare la tabella.

No. La tabella la riferisco al 1970. Alla data di oggi sottraggo il primo gennaio dell'anno corrente (oppure la calcolo sempre al 1970) e ottengo un numero che è direttamente confrontabile con quello della tabella.
L'unico problema forse si presenta con i bisestili.

Su NET ci sono funzioni per cui non devo usare il 1970, non so se ci sono anche nella time.h

Potrebbe anche funzionare, ma mi sembra che complichi le cose senza fornire alcun Pro. Un po' come avevo fatto io nella prima proposta :D.

Di funzionare funziona sicuramente tranne per il bisestile dove il 19 febbraio è uguale al 1 marzo della tabella. Scorre tutto di un giorno. Si può correggere, ovviamente, ma bisogna decidere come.
Il problema del 29 febbraio si presenta anche con il metodo da te proposto, si allunga il ciclo del 15 febbraio di un giorno.
Il pro è unicamente ragionare con un singolo numero invece di tenere conto di mese giorno ora e minuti.
Difatti tutte le librerie che hanno a che fare con le date e con i calcoli su date le trasformano in un unico numero. NEi PC si usano i secondi, gli astronomi usano le date giuliane (di cui esistono librerie e routine), Excel usa date giuliane modificate, parte dal 1900.