Data log tempo di accensione

Buongiorno a tutti,
sto cercando di utilizzare Arduino per gestire 10 termostati ambiente alimentati a batteria che vanno ad aprire delle valvole termostatiche e accendere 1 pompa. Nel frattempo vorrei creare un data log su SD per registrare il tempo di accensione di ciascun termostato.
Sto utilizzando Arduino mega 2560 e un shield Deek-Robot data logging che contiene RTC e SD.
Grazie per l'aiuto.
Francesco.

aiuto che consiste in cosa?
quele essere tuo problema? noi avere tutto per fare felice tu uomo, ma tu dire noi cosa desiderare.........

Standardoil:
aiuto che consiste in cosa?
quele essere tuo problema? noi avere tutto per fare felice tu uomo, ma tu dire noi cosa desiderare.........

Ahahahah, nella fretta ho dimenticato di concretizzare. Mi servirebbe un'aiuto a scrivere lo sketch per registrare i tempi di accensione di ogni singolo termostato su SD

Questa shield ? Se non metti un link al prodotto, chissà quale rtc usa, no ?

  • SD-Card Reader (kompatibel mit Arduino SD-Library, chipSelect = 10)
  • Batteriegepufferte Echtzeituhr mit DS1307 IC (Kompatibel mit DS1307RTC Library)
    Libreria per RTC 1307 e libreria SD standard, settando pin 10 come select nel software
    Di esempi per leggere ora da un RTC e per scrivere una frase (ora/data) su una SD ne trovi a caterve.

nid69ita:
Questa shield ? Se non metti un link al prodotto, chissà quale rtc usa, no ?
Play-Zone.CH DK Data Logging Shield V1.0

  • SD-Card Reader (kompatibel mit Arduino SD-Library, chipSelect = 10)
  • Batteriegepufferte Echtzeituhr mit DS1307 IC (Kompatibel mit DS1307RTC Library)
    Libreria per RTC 1307 e libreria SD standard, settando pin 10 come select nel software
    Di esempi per leggere ora da un RTC e per scrivere una frase (ora/data) su una SD ne trovi a caterve.

Si la shield è quella, per data/ora e datalog non ho problemi ho gia lo sketch funzionante, il problema è registrare i minuti di funzionamento di ogni singolo termostato per poi incrementarlo ogni volta che viene spento e poi riacceso.

delle variabili booleane (vero/falso) per ogni termostato e degli if ? :slight_smile:
senza sapere che sketch hai già come possiamo dirti cosa aggiungere ?

premettendo che è il mio primo sketch ed è un "taglia e cuci" di molti sketch presi in rete...

Attualmente questo codice:
-legge il valore di 3 sonde ntc (2 poste in ingreso e uscita di un bollitore e 1 per temperatura esterna) registrando su sd i valori misurati.
-legge la sonda pt100 nel bollitore che attiva e disattiva l'accensione della caldaia (relè)registrando la temperatura e lo stato del relè (acceso o spento) sempre su sd
-legge lo stato di 2 pulsanti (che sarebbero pompa primo piano e pompa piano terra) registrandone il valore (acceso spento) su sd.
-invia gli stessi dati del serial monitor sul serial bluethoot per controllare anche da telefono i valori.

adesso devo implementare questi famosi 10 termostati (7 che accenderanno pompa primo piano e 3 che accenderanno pompa piano terra) registrando per ogni termostato i minuti o ore di funzionamento per poter poi verificare le zone più fredde.
Allego file visto che il post eccede 9000 caratteri.

Caldaia_210218.ino (12.5 KB)

If your post are big you can attach code as a zip file

Se il tuo post è grande, puoi allegare il codice come file zip

robtillaart:
If your post are big you can attach code as a zip file

Se il tuo post è grande, puoi allegare il codice come file zip

editato, grazie.

ciccocioppo:
Ahahahah, nella fretta ho dimenticato di concretizzare. Mi servirebbe un'aiuto a scrivere lo sketch per registrare i tempi di accensione di ogni singolo termostato su SD

Cioè non sai come registrare i tempi su SD ti una parte di codice che non hai ancora realizzato ?
Vuoi che ti aiutiamo per il discorso di come implementare i 10 termostati o solo del salvataggio su SD ?

nid69ita:
Cioè non sai come registrare i tempi su SD ti una parte di codice che non hai ancora realizzato ?
Vuoi che ti aiutiamo per il discorso di come implementare i 10 termostati o solo del salvataggio su SD ?

Implementare i 10 termostati non dovrei avere problemi (li gestisco come pulsanti) mentre mi occorre aiuto su come registrare i minuti di funzionamento (termostato camera acceso x minuti, termostato cucina x minuti eccc..) praticamente dal momento che il contatto diventa High su SD verrà registrato per quanto tempo è High su SD per poi incrementare sempre il conteggio

secondo me, variabile long es. tempo1.
Se contatto low, vale 0, quando contatto high, ci metti dentro millis(). Quando il contatto ridiventa low e tempo1>0 allora fai la differenza mills()-tempo1, quello è il tempo da mettere su SD e rimetti subito dopo tempo1 a 0.

nid69ita:
secondo me, variabile long es. tempo1.
Se contatto low, vale 0, quando contatto high, ci metti dentro millis(). Quando il contatto ridiventa low e tempo1>0 allora fai la differenza mills()-tempo1, quello è il tempo e rimetti subito dopo tempo1 a 0.

Ma così facendo però non avrei il tempo di funzionamento su sd.
Praticamente vorrei avere un file su SD con scritto il totale delle ore e minuti di funzionamento così

Cucina 160min
Sala 130minuti
Ecc...

Ma le voci verranno aggiornate automaticamente da Arduino così da poterle visualizzare anche da bluetooth oltre che da sd

Ti devo dire ogni passo ? Se hai il tempo ci fai quello che vuoi, mettilo a monitor seriale, sbattilo su SD, un pò di intuito, no ? :wink:

Ma un file è testuale, i tempi saranno diversi e non c'e' un "momento" in cui tutti li puoi scrivere nello stesso istante. Un log è un file con dati continui, stile monitor seriale.
Se vuoi avere dentro al file solo 10 voci perché i termostati sono 10, la vedo dura.

nid69ita:
Ti devo dire ogni passo ? Se hai il tempo ci fai quello che vuoi, mettilo a monitor seriale, sbattilo su SD, un pò di intuito, no ? :wink:

Grazie Igor, ma il mio problema principale è proprio quello di recuperare un tempo registrato su sd e aumentarlo con quello rilevato cancellando quelli precedente. sulla funzione millis() mi ero già documentato

Ti sconsiglio di leggere il valore dal file e aggiornarlo (processo leeeento). Meglio averlo in memoria e scriverlo su SD.
Scriverlo ritornando sulla stessa riga è complicato e la SD non ha proprio i comandi "precisi" come su un file system di un PC.

Magari potresti tenere i 10 tempi e poi a intervalli regolari stampare dentro al file tutti e 10 i tempi, eliminando prima il file, su stessa ed unica riga.
Ricorda che la libreria è limitata, non sei su un PC. La open() del file permette solo di aprire in lettura oppure in scrittura in coda ai dati che hai già.
Potresti tornare a inizio con file.seek(0) ma leggendo nel forum, mi pare ci siano dei problemi.

va bene, si puo' fare. incomincia con uno solo di termostato, fai che ogn minuto leggi lo stato dell'ingresso, e attivi la uscita.
poi leggi un file ORETOTALI.TXT dalla scheda SD, leggi la prima riga, lunga 10 cratteri, esattamente 10, con il numero e tanti spazi 0 quanti servono per fare 10. Gli zeri mettili PRIMA del numero, che DOPO è meglio di no. leggi la riga e la scrivi in una stringa (arrai di char, non oggetti Stringa) poi con la atoi() ottieni ilnumero come intero
ci sommi uno e creu una stringa di 10 zeri, poi interpretando cifra a cifra ci scrivi a partire dal fondo il numero in ascii
chiudi il file ORETOTALI.TXT e lo riapri in scrittura, fai una seek a zero, per essere sicuro che sei nella giusta posizione del file e scrivi con una write, non con una print, la stringa nel file
Fatto per uno, sono sicuro che saprai farlo anche per il secondo terzo e cosi' via.

Standardoil:
va bene, si puo' fare. incomincia con uno solo di termostato, fai che ogn minuto leggi lo stato dell'ingresso, e attivi la uscita.
poi leggi un file ORETOTALI.TXT dalla scheda SD, leggi la prima riga, lunga 10 cratteri, esattamente 10, con il numero e tanti spazi 0 quanti servono per fare 10. Gli zeri mettili PRIMA del numero, che DOPO è meglio di no. leggi la riga e la scrivi in una stringa (arrai di char, non oggetti Stringa) poi con la atoi() ottieni ilnumero come intero
ci sommi uno e creu una stringa di 10 zeri, poi interpretando cifra a cifra ci scrivi a partire dal fondo il numero in ascii
chiudi il file ORETOTALI.TXT e lo riapri in scrittura, fai una seek a zero, per essere sicuro che sei nella giusta posizione del file e scrivi con una write, non con una print, la stringa nel file
Fatto per uno, sono sicuro che saprai farlo anche per il secondo terzo e cosi' via.

Standardoil a questo punto mi rendo conto di non avere le basi adeguate per procedere...e sull'argomento non trovo informazioni comprensibili.

Cominciamo: rispondere si/no prego
una SD la leggi, la scrivi, riesci a leggrei un file e a scrivere un file sulla SD a partire da Arduino?
untermostato, riesci a leggerlo da arduino, far accendere un led se il termostato è chiuso?
un tempo, riesci a fare una determinata azione solo dopo che è passato un tempo preffisato?
e a farlo SENZA usare la delay?
Se hai risposto tutti si sei prono, altrimenti studia i no
studiali UNO ALLA VOLTA, se serve siamo qui per aiutare

Non prendere le mie domande come offensive, non sempre ho molto tempo, è da smartphone scrivere è divertente come un maldidenti