Greenhouse Project v 0.5 Final rev5 IDE 1.0

leo72:
E riducendo il nome ad un max di 8.3 caratteri?
LOG/0000.TXT

era esattamente quello che mi accingevo a provare :slight_smile:
Pero cavoletti, cosi non posso fare timestamp... cmq provo e riporto :slight_smile:

Li puoi fare, come già ti avevo suggerito:

leo72:
Forse ti converrebbe quindi creare file il cui nome riprenda il mese/anno e poi riversarci dentro le letture.
Ad esempio il file 201112 conterrà le letture di dicembre 2011 mentre il file 201201 le letture di gennaio 2012 ecc...

Quindi crei dei file mensili e dentro tutte le letture di quel mese.

leo72:
Ad esempio il file 201112 conterrà le letture di dicembre 2011 mentre il file 201201 le letture di gennaio 2012 ecc...
Quindi crei dei file mensili e dentro tutte le letture di quel mese.

Funzionasse lo farei, anzi avevo già intenzione di farlo per il logging a lungo termine.
Cmq ci sarebbero problemi in ogni caso log/201201.csv sono 10.3
Certo si potrebbe cmq trovare qualche formato tipo aamm, però cmq non funziona a monte :slight_smile:
Domanda:
ma è normale che quando apro il serial monitor, l'arduino fa reboot? è la prima volta che lo noto...

Non ho capito se hai già provato con path/nome max ad 8 caratteri.
Comunque puoi risolvere con Log/1112.txt per 2011/dicembre, Log/1201.txt per 2012/gennaio.

E' normale, ogni volta che apri la seriale il PC invia un segnale di DTR che fa resettare l'Arduino perché è progettato per fare così. Serve a mettere l'Arduino in modalità di programmazione per flashare sull'Atmega328 eventuali sketch in arrivo dal computer.

leo72:
Non ho capito se hai già provato con path/nome max ad 8 caratteri.

Mea culpa, ho utilizzato l'edit del forum al posto di fare un nuovo post, non volevo la discussione si allungasse troppo ma vedo che crea solo confusione.
Quindi:
Si ho provato, No non funziona.

Con il codice che segue, ne a schermo ne a seriale appare nulla.
Dentro la SD nella cartella log, nessun file.

// funzione creazione timestamp file di log
void getFilename(char *filename) {
  DateTime now = RTC.now(); 
  int month = now.month(); 
  int day = now.day();
  filename[0] = 'L';
  filename[1] = 'O';
  filename[2] = 'G';
  filename[3] = '/';
  filename[4] = month/10 + '0';
  filename[5] = month%10 + '0';
  filename[6] = day/10 + '0';
  filename[7] = day%10 + '0';
  filename[8] = '.';
  filename[9] = 'c';
  filename[10] = 's';
  filename[11] = 'v';
  return;
}

void loop () {

  // Verifica presenza file di log formattato in TimeStamp:
  char filename[] = "LOG/0000.csv";
  getFilename(filename);
  if (SD.exists(filename)) {
    Serial.print(filename);
    Serial.println(" esiste.");
  }
  else {
    Serial.println("File di Log non presente."); 
    lcd.clear ();
    lcd.setCursor(0, 0);
    lcd.print("FileLog Missing."); 
    // Se il file di log non esiste viene creato:
    Serial.println("Creazione File di Log...");
    lcd.setCursor(0, 1);
    lcd.print("Building FileLog...");
    myFile = SD.open(filename, FILE_WRITE);
    // Scrittura dell'Header del file di Log e successiva chiusura:
    myFile.println("millis, date, t_out, rh_out, t_in, rh_in, t_h20, t_heat, hz, heat");
    myFile.close(); 
    delay(1000);
    lcd.clear ();
  }

Rimettendo il codice precedente, con log file in root funziona normalmente.
Non ho idee, voi?

L'ultimo suggerimento è quello di mettere la cartella radice all'inizio del path, cioè "**/**log/1112.txt"

leo72:
L'ultimo suggerimento è quello di mettere la cartella radice all'inizio del path, cioè "**/**log/1112.txt"

Già provato, ma nulla. Cmq ho fatto dei passi avanti, anche se sono arrivata a qualcosa di ancora più ridicolo.
Sono ripartita da zero, ho scritto un codice solo per il file sulla sd, l'ho integrato ecc.
Ed ecco i risultati.
Questo codice, funziona.
Crea un file di log aaaammgg.csv nella dir LOG sulla sd. Tutti i dati vengono normalmente loggati, da seriale si vede tutto, su LCD i dati dei sensori vengono mostrati correttamente.

void loop () {
// Verifica presenza file di log formattato in TimeStamp:
  char filename[] = "LOG/00000000.csv";
  getFilename(filename);
  if (SD.exists(filename)) {
    Serial.print(filename);
    Serial.println(" esiste.");
  }
  else {
    Serial.println("File di Log non presente."); 
    // Se il file di log non esiste viene creato:
    Serial.println("Creazione File di Log...");
    myFile = SD.open(filename, FILE_WRITE);
    // Scrittura dell'Header del file di Log e successiva chiusura:
    myFile.println("millis, date, t_out, rh_out, t_in, rh_in, t_h20, t_heat, heat");
    myFile.close(); 
  }

Adesso a questo codice voglio aggiungere un paio di righe, per mostrare su LCD la creazione del file di log quando avviene.
Scrivo questo:

void loop () {
// Verifica presenza file di log formattato in TimeStamp:
  char filename[] = "LOG/00000000.csv";
  getFilename(filename);
  if (SD.exists(filename)) {
    Serial.print(filename);
    Serial.println(" esiste.");
  }
  else {
    Serial.println("File di Log non presente."); 
    lcd.clear ();
    lcd.setCursor(0, 0);
    lcd.print("FileLog Missing.");
    // Se il file di log non esiste viene creato:
    Serial.println("Creazione File di Log...");
    lcd.setCursor(0, 1);
    lcd.print("Building FileLog...");
    myFile = SD.open(filename, FILE_WRITE);
    // Scrittura dell'Header del file di Log e successiva chiusura:
    myFile.println("millis, date, t_out, rh_out, t_in, rh_in, t_h20, t_heat, heat");
    myFile.close(); 
    delay(1000);
    lcd.clear ();
  }

Non funziona nulla. La seriale smette di dar segni di vita dopo i mess del setup.
Lo schermo LCD è vuoto e non vengono loggati dati.
Paradossalmente se avvio questo secondo codice senza sd inserita, i messaggi appaiono corretti, la seriale va e i dati appaiono sullo schermo.
Perché due righe di lcd.print fanno questo??
ed anche verrebbe da chiedersi, perché fanno questo solamente quando vado a creare un file in sottodir, mentre in root non ci sono problemi?
Mboh.

Mi viene da pensare che le 2 lib insieme possano ad esempio consumare la memoria a disposizione oppure la lentezza di scrittura della SD pianti. Se no ricordo male c'era un bug sulla SD che la rendeva lenta, forse si bloccano insieme

leo72:
Mi viene da pensare che le 2 lib insieme possano ad esempio consumare la memoria a disposizione oppure la lentezza di scrittura della SD pianti. Se no ricordo male c'era un bug sulla SD che la rendeva lenta, forse si bloccano insieme

O bella. Vuol dire che sono qua da due settimane ed ho già trovato il primo bug della mia vita?
che tra l'altro non accade in root?
Ma non c'è qualcuno con lcd e sd che abbia voglia di provare a riprodurre l'errore?
chissa se si risolve spostando i comandi lcd dopo quelli sd e mettendo un delay dopo che la sd ha chiuso il file... mumble.
Vabbeh, ora provo, poi per oggi basta che mi è venuto il malditesta :
cmq leo, grazie di esserci stato :slight_smile:

Aggiungere un delay dopo la chiusura non cambia nulla.
500ms e continua a non funzionare. Non so se si tratti di bug od altro tuttavia, fin tanto che qualche genio non comprenderà l'arcano, ci rinuncio :slight_smile:
Quindi, nell'ottica del progetto finale: un timestamp mensile aaaamm.csv, nella sottodirectory /LOG, senza -purtroppo- messaggio su LCD alla creazione del file. Essendo un evento che capita una volta al mese, a mezzanotte... posso sopravvivere.
Dovrò però vedere di postare su LCD qualche debug per la SD, giusto come promemoria se faccio partire tutto senza scheda inserita :slight_smile:

scusate l'intromissione aggiungendo una cosa che attualmente non è ciò di cui state parlando XD

invece che gestire l'LCD con uno shift register usa un pcf8574 se hai ancora A4 e A5 liberi.

la gestione è molto più facile inoltre conosco una libreria che ho usato più volte che ti permette di lavorare semplicemente nel codice cambiano la riga di inizializzazione del display :wink:

superlol:
scusate l'intromissione aggiungendo una cosa che attualmente non è ciò di cui state parlando XD

invece che gestire l'LCD con uno shift register usa un pcf8574 se hai ancora A4 e A5 liberi.

Ma figurati, ogni intervento è sempre utile :slight_smile:
Premettendo che A4 ed A5 li ho occupati con l'RTC e che quindi, forse, non posso usare la tua opzione... hai link a guide/tut per capire di cosa stai parlando?

Ecco qua l'aggiornamento del progetto!
Per chi fosse interessato o per chi ne avesse bisogno in futuro.
Il punto a cui sono arrivata sembra abbastanza stabile e, per una serie di ragioni che spiegherò dopo, sembra essere un punto di arrivo con l'attuale configurazione.


Greenhouse Project v 0.4d

Monitoraggio temperatura ed umidità, interne ed esterne, con due sensori DHT22.
Monitoraggio intensità luminosa con sensore TSL235R - pin 5.
Monitoraggio temperatura riscaldatore e acqua di irrigazione con due sensori DS18S20.
Indicazione stato relé su Pin A0.

LCD 2 WIRES: DATAPIN D2 - CLKPIN D3
Aggiunto carattere speciale per il grado centigrado °

File di log nella cartella ROOT, timestamp mensile aaaamm.csv
Loop di 1 secondo, datalogging MILLS ogni 60secondi
Marcatore di avvenuto log su LCD - (2,0)
Codice per calcolare la media delle luminosità all'interno del periodo di log
Diplay ad Lcd della mediaHz quando viene calcolata.


Ho implementato l'hardware ed il software per LCD 2 wires con 74LS164. Una figata.
Funziona esattamente come prima, lo sketch ha le medesime dimensioni e tutto utilizzando solo due pin dell'arduino.

Il datalogging è completato.
Il file di log, con cadenza mensile, è creato nella root. Se assente viene creato ed inizializzato con l'header corretto per il timestamp dei sensori in csv.

I dati dei sensori vengono mostrati sull'LCD con un refresh di 1 secondo e per sfizio ho aggiunto anche il carattere del grado centigrado.
Il log invece viene fatto attraverso un ciclo interno ogni minuto circa.

Il sensore di luminosità TSL235R è impressionante. Ha una sensibilità pazzesca, rileva le minime fluttuazioni di luminosità.
Decisamente mi sento di consigliarlo, sebbene questa sensibilità sia un problema.
Loggando ogni minuto, se all'atto del Log c'è una schiarita, un fulmine od altro... viene segnato un valore che non è, necessariamente, rappresentativo dell'effettiva luminosità.
Per ovviare a questo problema ho scritto due righe di codice che fanno la media della luminosità nel periodo di log. Il datalogging avviene sulla media e non sulla frequenza istantanea.
La media è "intelligente" significa che, se inserite un delay maggiore nel ciclo principale, comunque la media sarà corretta al periodo di log.
Il sensori di temp ed umidità hanno invece una risposta più lenta, quindi un discorso simile è superfluo.

L'indicazione stato relè su A0 è attiva, ma non c'è ancora il codice per il relè.
La configurazione dell'LCD 2 wires libera molti pin che, tuttavia, non credo siano utilizzabili allo stato attuale.
Lo sketch occupa quasi la totalità della memoria SRAM, aggiungere ulteriori funzioni sembra rendere instabile l'arduino. Direi che siamo al limite :slight_smile:
Quindi salvo colpi di genio, direi che questo sketch è il massimo che si possa implementare su un 2009.

E' tuttavia un buon punto di arrivo, sensori, display e datalogging sono una configurazione accettabile per un progetto.
Al momento l'arduino sta funzionando da 24 ore senza interruzione, senza apparenti problemi. Quindi dovrebbe reggere :slight_smile:

Nella mia tabella di marcia c'è ancora il web server.
Considerato il punto di arresto, probabile causa ram overflow, a cui sono arrivata... dovrò prendere una piccola deviazione.

Il progetto quindi si svilupperà nell'ottica multiprocessore con due 328 standalone che comunicano tra loro.
Il master si occuperà di sensori ed lcd, lo slave riceverà i dati e tramite la ethernet shield li loggherà sulla sd e farà da web server.
In questo modo la distribuzione delle librerie sarà ottimizzata.
Il web server richiede la SDFAT che è la stessa necessaria per il datalogging. Mettendo le funzioni insieme, posso eliminare la libreria dal master che supporta sensori ed lcd.

Non ho ancora studiato bene il protocollo di comunicazione che probabilmente sarà I2C anche se stamattina ho trovato una libreria che se funziona... :stuck_out_tongue:
(poi leo mi cazzia)

A seguire fotina e codice completo.
Il codice è ultracommentato e un po' disordinato... abbiate pazienza :slight_smile:

Greenhouse_Project_v_0_4d_LCD2Wires.pde (13.2 KB)

volevo solo farti i complimenti per il tuo progetto, se un giorno mi costruisco una serra sarà utile (qualche piantina strana da serra in mente c'è l'ho umh! :smiley: )

volevo solo farti i complimenti per il tuo progetto, se un giorno mi costruisco una serra sarà utile (qualche piantina strana da serra in mente c'è l'ho umh! smiley-grin )

Salve, sono della finanza, il suo IP ci è noto, la teniamo d'occhio :smiley:

mauroz:
volevo solo farti i complimenti per il tuo progetto, se un giorno mi costruisco una serra sarà utile (qualche piantina strana da serra in mente c'è l'ho umh! :smiley: )

Non è nulla di che... fuori è pieno di progetti arduino per serre.
Mi pare vendano pure un garduino!
Io sono arrivata all'arduino proprio seguendo quei progetti :slight_smile:
Sulle piante strane non commento... ^___^

Aggiornamento.
Da sx a dx, dall'alto in basso.
Panduino, controller lcd 2 pin versione compatta, monofaccia e senza ponticelli, shield sensori.
Pcb per astro e secondo panduino.
Certo che questo fatto che non si possono allegare immagini... mah. Cmq tinypic non fa il resize.

Complimenti, bellissimo progetto.

si vede che sotto c'è una mano femminile, quasi quasi invidio quelle piantine, chissà come saranno amorevolmente curate... (sempre che l'arduino non prenda fuoca e trasformi la serra in un bel forno! ]:smiley: )

Aggiornamento:
Finita la costruzione del/dei Panduino.
Finita la costruzione della shield con i connettori per i sensori
Finita la costruzione per il modulo shift register lcd... scendendo con la dimensione delle piste sono riuscita a fare un monofaccia che si attacca dietro all'lcd. Molto bellino :slight_smile:
Caricato lo sketch nel Panduino standAlone.

Per la realizzazione dei pcb cfr qui:
http://arduino.cc/forum/index.php/topic,85424.0.html
http://arduino.cc/forum/index.php/topic,86397.0.html
Per la laccatura cfr qui:
http://arduino.cc/forum/index.php/topic,86134.0.html
Per la programmazione del chip in standalone cfr guida del prof. Menniti e qui:
http://arduino.cc/forum/index.php/topic,87754.0.html