Ardu-Aquarium Controller v. 3.3.1

Ciao Riccardo, complimenti per tutto quello che hai messo in piedi.
Sto seguendo con interesse questo topic e avrei una domanda da farti riguardante la gestione delle luci:
potresti spiegarmi meglio a cosa servono le varie impostazioni di accensione/spegnimento, durata fading, inizio tramonto, fine alba.
Ti faccio questa domanda perchè mi pare che i dati richiesti siano troppi:

  • se mi chiedi l'orario di accensione e l'orario di fine alba mi viene da dire che la durata del fading sia inutile visto che è il tempo trasscorso tra l'ora di accensione e l'ora di fine alba;
  • se mi chiedi l'orario di accensione e la durata del fading mi viene da dire che l'ora di fine alba è inutile visto che sarebbe l'ora di accensione più la durata del fading.
    Sto sicuramente interpretando male i dati che richiedi ed è per questo che chiedo spiegazioni.

Grazie

Ciao Pespes,
Possono sembrati inutili, in realtà rendono più confortevole ed agevole l'uso del controller:
Viene chiesto di impostare la durata del fading, ad ogni variarione del dato, visualizzo la durata dell'illuminazione al massimo dell'intensità della luce, un'acquariofilo questo lo vuole sapere...
Avrai notato che calcolo (non chiedo) anche inizio tramonto altre che fine alba, sono tutti e due dati facilmete deducibili è vero, servono però anche a controllare che alba e tramonto non si accavallino, troverai nello sketch una funzione che si chiama lucepiena, se restituisce un valore inferiore a zero, i due fading si accavallano e lo sketch si blocchherebbe perchè sarebbe nella condizione di eseguire down e up fading contemporaneamente.
Spero di essere stato chiaro, altrimenti fatti risentire.

Ciao Riccardo

ok, grazie 1000, sei stato chiarissimo.
Mi ero perso che i dati di inizio tramonto e fina alba vengono solo calcolati e non fatti intrudurre dall'utente.

Ciao Riccardo,
scusa la intromissione, ti faccio innanzitutto i complimenti per quello che stai realizzando è veramente un bel progetto.
Stavo dando un occhiata al tuo codice e mi chiedevo se posso estrapolare una parte di questo da adattare al mio progetto.
Sto cercando di far accendere e spegnere una plafoniera (commerciale) a led 6 x 3W a una data ora con l'effetto "alba-tramonto" solo con Arduino e la shield RTC, il più semplice possibile senza display ne tasti.
Visto che sono proprio un neofita in questo mi risulta difficile riuscire ad effettaure la scrittura del codice da 0.
Ti ringrazio anticipatamente e complmenti ancora.
Saluti

Ciao berba_blu,
puoi fare quello che vuoi con il codice, l'ho pubblicato per condividerlo e non ha nessun copyright, tieni conto che non è scritto da un professionista, ma per quel poco che ti posso dire funziona...
Come adattarlo poi è affare tuo, ma da come dici dovrai modificare il codice in modo che la variabili che ti interessano le dichiari con valore già assegnato.
Le procedure che ti interessano sono Statoluci() e Gestionefotoperiodo().
La prima permette ad arduino di far partire i fotoperiodi delle linee luci sempre dal punto giusto sia in caso di aggiornamento dei dati che in caso di mancanza di corrente, grazie all'uso di una variabile flag che in setup o in caso di modifica viene aggiornata; la seconda, gestisce i fotopeiodi a regime.
Troverai che sono scritte in modo abbastanza elementare e con variabili dal nome molto esplicito, spero che questo ti faciliti l'interpretazione del tutto.

Ciao Riccardo

Ciao Riccardo ho trovato molto interessante il tuo progetto e ti faccio veramente tantissimi complimenti per tutto e sopratutto per averllo condiviso.
Mi sono deciso anche io di automatizzare il mio bestione di acquario marino e volevo seguire il tuo progetto spero che accetterai.
Ho già acquistato tutto il materiale che ai elencato e sono pronto per assemblare il tutto , ti volevo chiedere se mi potevi aiutare se ai a disposizione un (disegno semplice) uno schema completo dove posso vedere come collegare il tutto , sei riuscito a fare la pcb finale ?

Ciao Riccardo,
non sarai un professionista come dici però a me sembra che hai fatto un lavoro più che professionale :).
Cmq sto provando ad adattare parte del tuo codice ma con scarsissimi risultati, ad essere sincero ci capisco molto poco... Sono totalmente a zero per quanto riguarda la programmazione, sto provando a leggermi qualche guida di Arduino ma non è facile.
Mi chiedevo come fare a capire quale sono le variabile che mi interessano ed assegnarli un valore.
Al momento ho ottenuto questo codice (vedi allegato)
Non so se ho messo dentro tutte le procedure ... sicuramente qualcosa manca.
Se hai tempo di darmi un aiuto te ne sarei molto grato.
Ti ringrazio in anticipo
Grazie.

Massimiliano

Alba_tramonto_acquario_ADA_completo.ino (9.94 KB)

simon77blitz:
Ciao Riccardo ho trovato molto interessante il tuo progetto e ti faccio veramente tantissimi complimenti per tutto e sopratutto per averllo condiviso.
Mi sono deciso anche io di automatizzare il mio bestione di acquario marino e volevo seguire il tuo progetto spero che accetterai.
Ho già acquistato tutto il materiale che ai elencato e sono pronto per assemblare il tutto , ti volevo chiedere se mi potevi aiutare se ai a disposizione un (disegno semplice) uno schema completo dove posso vedere come collegare il tutto , sei riuscito a fare la pcb finale ?

Ciao simon77blitz,
Chiunque può seguire i miei i miei casini, senza chiedere nessun permesso, per metterti in pari a quanto fatto fino ad ora, la cosa migliore forse è replicare i collegamenti della mia bread, nel secondo post all'inizio di questo topic, trovi tutte le foto, mentre se vuoi anche lo schema in allegato eccoti quello provvisorio:

In quanto al PCB, ancora non ho fatto nulla, avrai capito che il progetto è tutt'ora un work in progress, non avrebbe senso per il momento ma ci arriverò.
Ad ogni modo benvenuto.
Più tardi guardo anche la MP e ti rispondo anche li, ora sono un pò di corsa

Riccardo.

berba_blu:
Ciao Riccardo,
non sarai un professionista come dici però a me sembra che hai fatto un lavoro più che professionale :).
Cmq sto provando ad adattare parte del tuo codice ma con scarsissimi risultati, ad essere sincero ci capisco molto poco... Sono totalmente a zero per quanto riguarda la programmazione, sto provando a leggermi qualche guida di Arduino ma non è facile.
Mi chiedevo come fare a capire quale sono le variabile che mi interessano ed assegnarli un valore.
Al momento ho ottenuto questo codice (vedi allegato)
Non so se ho messo dentro tutte le procedure ... sicuramente qualcosa manca.
Se hai tempo di darmi un aiuto te ne sarei molto grato.
Ti ringrazio in anticipo
Grazie.
Massimiliano

Sul lavoro professionale, al posto tuo non mi sbilancerei così :astonished:
Sulla programmazione, invece ti invito ad insistere e perseverare, il metodo che uso io con il software degli altri è un pò antiquato, ma per quel principiante che sono funziona,
in pratica prendo carta e penna, individuo tutte le variabili, le incolonno e letteralmente leggo le righe delle procedure ed aggiorno le variabili per vedere cosa succede...
Googlare è sicuramente una buona cosa ed un buon libro fa altrettanto, la pratica poi è fondamentale, un semplice copia incolla invece non ti fa crescere, ad ogni modo più tardi do un'occhio a quello che hai fatto e vedo di darti una mano, ma ti prego prova ad impegnarti un pochino di più, non è che non voglia aiutarti, è che ho così poco tempo da dedicare al progetto che spenderne una parte per altri progetti mi riesce difficile, in fondo ho pubblicato tutto quello che ho fatto proprio perché venisse usato e saccheggiato da chiunque lo voglia...
A più tardi. :slight_smile:

Riccardo.

berba_blu:
Mi chiedevo come fare a capire quale sono le variabile che mi interessano ed assegnarli un valore.
Al momento ho ottenuto questo codice (vedi allegato)
Non so se ho messo dentro tutte le procedure ... sicuramente qualcosa manca.
Se hai tempo di darmi un aiuto te ne sarei molto grato.

Molto velocemente, ho aggiornato quello che hai fatto, do per scontato che tu abbia l'RTC
Così come è il codice che di suo all'origine è fin troppo elementare, rimane sporco dei comendi che ad esempio riguardano anche la scheda relè, a te la pulitura ]:smiley:

Leggi i commenti a riga 48 e 234...

Dovrebbe funzionare...

Ciao Riccardo

Alba_tramonto_acquario_ADA_completo_V2.ino (10.3 KB)

Ciao Riccardo,
hai perfettamente ragione sul fatto di impegnarsi un po di più, però sinceramente ci ho provato ma non avendo neanche una minima base di programmazione è veramente dura.
Magari facendo un bel corso di Arduino la cosa potrebbe cambiare un po.
Come ti dicevo ho trovato dei manuali in rete e sto cercando più informazioni possibili per vedere di capirci un po di più quando apro un codice.
Non voglio approfittare del tuo tempo e della tua disponibilità immagino che il tuo progetto sia di persè molto impegnativo, quindi non c'è problema se non riesci a dedicarmi tempo, veramente lo capisco e non pretendo che un'altra persona scriva il codice al posto mio.
Ti ringrazio ancora una volta per l'aiuto che mi hai dato non sono ancora riuscito a provarlo appena lo faccio ti dico il risultato.
Grazie mille
Ciao

Massimiliano

Tranquillo, ti ho aiutato volentieri, solo aspetto di saper se l'aiuto è stato efficace..

Ciao Riccardo

Ciao,
ho avuto bisogno di un pò di tempo, per raccogliere i dati, ho avuto problemi a mantenere le temperature, ma alla fine ho rilevato le misure per tutti e tre i sensori, S1 e S2 sono quelli che mi hanno rispedito in sostituzione di S3 che alla fine, non si è comportato poi così male, malgrado sia completamente fuori dai paramentri del data sheet.
Ho usato lo schema che segue:

Ho vvoluto abbassare le r del partitore, per poter usare un multigiri (20) da 2k ed aumentare la finezza delle regolazioni tutte le altre r sono con precisione 1% metalliche, solo che il segnale non è poi così stabile, come vedrete dalle tabelle, le letture a tutti i livelli oscillano secondo me un pochino troppo e per quello che ho visto dipende dall'Amp-op, forse ce ne sono che hanno un'uscita un pochino più stabile, solo che io non ne conosco.
Lo sketch usato è questo:

byte levelsensor = A0; 

void setup() {
   Serial.begin(9600);
   analogReference(INTERNAL);
}

void loop() {

  Serial.println(analogRead(levelsensor));
  delay(50);
            
}

Tutte le tabelle sono qui:

Ho calcolato solo per ogni tabella le medie lette, se dovo fare altro ditemi.

Grazie per l'aiuto.

Riccardo.

ecco la mia rialaborazione, solo sulle prime 2 tabelle.
Ho calcolato la differenza tra i due sensori e la % di influenza della differenza.

si nota come lo sfaso sulla temperatura varia sui 40 punti, 3% circa a 0cm e 10% circa a 20cm.

le due sonde hanno uno sfaso termico pressochè identico (errore di 10 punti, 0.6%), molto più grande è lo sfaso di profondità che tocca il 15%,ma diciamo che siu mantiene sull'8% ma in modo non lineare.. diventa lineare diciamo dai 2cm in poi: facendo y=mx+q con m=18/(523-1604), q=-1604m+2, x=valore di R, abbiamo un errore inferiore all'1% (tranne a 13 cm) tra la media delle letture e il valore calcolato. peccato poi che all'uso su S1 mantenga un'ottima precisione, ma scada all'uso su S2 con quasio 2 cm di errore..

Scusa Lesto,
ma faccio fatica ad interpretare quello che mi hai scritto, e scusami se non ho specificato che i nuovi dati, ovvero le letture AnalogRead() nuove che mi hai chiesto sono nel foglio 2, poi se avrai volgia ancora di giocare con le tabelle, forse sara bene considerare per tutti e tre i sensori, solo le letture dai 5cm compresi in poi, se infatti guardi il grafico in fondo alla pagina, vedi che tutti e tre iniziano a comportarsi in modo più o meno lineare tra i 5cm ed i 20.

Ciao Riccardo

Ciao Rici,
se vuoi nel primo post puoi aggiungere anche il link alla libreria OneWire per l'uso dei Dallas.
E' la versione 2.2, l'ultima al momento --> http://www.pjrc.com/teensy/arduino_libraries/OneWire.zip

Grazieeeee Paolo!!!
Sei grande, fatto.

Riccardo

Rici, parlo per la "mia" parte. Se ho ben capito alla fine con quei valori sei riuscito a lavorare con tutte e tre le sonde (ovviamente ognuna con la propria taratura), quindi era come pensavo, il sistema del trimmer di precisione funziona ed è affidabile.
Riguardo l'op-amp (è 358 non 328 vero?) non credo sia lui a dare le oscillazioni, sono invece proprio i valori resistivi che cambiano (non scordare che hai be due R variabili nel tuo sistema!), e lui non fa altro che riportare gli equivalenti valori in tensione, la stabilità ora la puoi ottenere solo via software, con uno dei vari sostemi noti, tipo la media di 20-30 letture, vedrai che la situazione cambierà decisamente in meglio; riguardo la linearità della risposta direi che andrebbe valutata dopo aver stabilizzato le letture col metodo di cui sopra; a quel punto certamente il grande Lesto saprà tirarti fuori un algoritmo di linearizzazione dei valori, ma devi farlo andare a colpo sicuro, cioè fornirgli dei valori certi e più volte verificati, anche in diversi momenti della giornata, alla fine la precisione aumenta per quanti più dati di lettura puoi fornire.

riciweb:
Tranquillo, ti ho aiutato volentieri, solo aspetto di saper se l'aiuto è stato efficace..

Ciao Riccardo

È tutto perfetto ..... sei un grande .... grazie veramente di tutto.
Ho cancellato anche le linee power che ovviamente non servivano :blush: e inserito gli orari a mio piacimento.
Funziona alla meraviglia ... ancora un grande grazie
Ciao

Massimiliano

riciweb:
Scusa Lesto,
ma faccio fatica ad interpretare quello che mi hai scritto, e scusami se non ho specificato che i nuovi dati, ovvero le letture AnalogRead() nuove che mi hai chiesto sono nel foglio 2, poi se avrai volgia ancora di giocare con le tabelle, forse sara bene considerare per tutti e tre i sensori, solo le letture dai 5cm compresi in poi, se infatti guardi il grafico in fondo alla pagina, vedi che tutti e tre iniziano a comportarsi in modo più o meno lineare tra i 5cm ed i 20.

Prove sensori di livello - Google Sheets

Ciao Riccardo

non l'ho visto e ora vado a letto.. magari domani.

FIGHISSIMO, ma quante letture sono per sensore? è ottimo! ora che hai le medie devi calcolare la varianza delle varie letture del sensore rispetto alla media (per la stessa temp alla stessa profondità), così hai l'errore di base della sonda.

Poi confronti la varianza alle varie profondità/temperature ed infine la varianza rispetto alle altre sonde (iniziamo con una, le altre vederemo poi). La varianza è di quanti punti si discostano dalla media.

La varianza è la radice quadrata ( ( ( somma di per ogni valore letto ( differenza tra valore letto e media) al quadrato ) ) fratto il numero di valori )

da Varianza - Wikipedia

Ciao stavo facendo un programma simile ma mi sono dovuto fermare non riesco a capire perchè la sonda del ph mi rileva solo 13 volte il valore poi si impalla. Qualcuno riesce a sistemarmi questo codice?????? =(...

/*
This software was made to demonstrate how to quickly get your Atlas Scientific product running on the Arduino platform.
An Arduino MEGA 2560 board was used to test this code.
This code was written in the Arudino 1.0 IDE
Modify the code to fit your system.
**Type in a command in the serial monitor and the Atlas Scientific product will respond.**
**The data from the Atlas Scientific product will come out on the serial monitor.**
Code efficacy was NOT considered, this is a demo only.
The TX3 line goes to the RX pin of your product.
The RX3 line goes to the TX pin of your product.
Make sure you also connect to power and GND pins to power and a common ground.
Open TOOLS > serial monitor, set the serial monitor to the correct serial port and set the baud rate to 38400.
Remember, select carriage return from the drop down menu next to the baud rate selection; not "both NL & CR".
*/


#include <glcd.h>
#include "fonts/allFonts.h"         // system and arial14 fonts are used
#include "bitmaps/allBitmaps.h"
#include <DallasTemperature.h>
#include <OneWire.h>


String inputstring = "";                                                       //a string to hold incoming data from the PC
String sensorstring = "";                                                      //a string to hold the data from the Atlas Scientific product
boolean input_stringcomplete = false;                                          //have we received all the data from the PC
boolean sensor_stringcomplete = false;                                         //have we received all the data from the Atlas Scientific product

// Data wire is plugged into port 42 on the Mega, if you use a different one change it here.
#define ONE_WIRE_BUS 42
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
unsigned int iSensor = 0;
unsigned int icount = 0;
float TempIn = 0.00;
char Temps[5];

  void setup(){                                                                //set up the hardware
      iSensor = 0;
     Serial.begin(38400);                                                      //set baud rate for the hardware serial port_0 to 38400
     Serial3.begin(38400);                                                     //set baud rate for software serial port_3 to 38400
     inputstring.reserve(5);                                                   //set aside some bytes for receiving data from the PC
     sensorstring.reserve(30);                                                 //set aside some bytes for receiving data from Atlas Scientific product

 GLCD.Init(NON_INVERTED);   // initialise the library, non inverted writes pixels onto a clear screen
 GLCD.ClearScreen(); 
 GLCD.DrawBitmap(ArduinoIcon64x64, 32,0, BLACK); //draw the bitmap at the given x,y position
 GLCD.SelectFont(System5x7); // switch to fixed width system font

  GLCD.ClearScreen();
 //Start up the Dallas Lib
  sensors.begin();
iSensor =  sensors.getDeviceCount(); //Get a count of the number of sensors on the wire
 
}
 
 
 
   void serialEvent() {                                                         //if the hardware serial port_0 receives a char              
               char inchar = (char)Serial.read();                               //get the char we just received
               inputstring += inchar;                                           //add it to the inputString
               if(inchar == '\r') {input_stringcomplete = true;}                //if the incoming character is a <CR>, set the flag
              }  


  void serialEvent3(){                                                         //if the hardware serial port_3 receives a char 
              char inchar = (char)Serial3.read();                              //get the char we just received
              sensorstring += inchar;                                          //add it to the inputString
              if(inchar == '\r') {sensor_stringcomplete = true;}               //if the incoming character is a <CR>, set the flag 
             }



 void loop(){                                                                   //here we go....
     
  if (input_stringcomplete){                                                   //if a string from the PC has been recived in its entierty 
      Serial3.print(inputstring);                                              //send that string to the Atlas Scientific product
      inputstring = "";                                                        //clear the string:
      input_stringcomplete = false;                                            //reset the flage used to tell if we have recived a completed string from the PC
      }

 if (sensor_stringcomplete){                                                   //if a string from the Atlas Scientific product has been recived in its entierty 
      Serial.println(sensorstring);                                            //send that string to to the PC's serial monitor
      //delay(2000);
      GLCD.CursorTo(0, 6);              // positon cursor 
      GLCD.Puts("Ph ");
      GLCD.print(sensorstring);
      sensorstring = "";                                                       //clear the string:
      sensor_stringcomplete = false;                                           //reset the flage used to tell if we have recived a completed string from the Atlas Scientific product
      }
   {   // run over and over again
  icount = 0;
  //Send a request to get the Temps on all Sensors
  sensors.requestTemperatures(); // Send the command to get temperatures
 
 
 
  //GLCD.ClearScreen();               // clear the screen 
  for(icount = 0; icount < iSensor; icount++){
     GLCD.CursorTo(0,icount + 4);              // positon cursor 
    GLCD.Puts("C ");
    GLCD.SetDot(7,32, BLACK);
    GLCD.SetDot(7,33, BLACK);
    GLCD.SetDot(7,34, BLACK);
    GLCD.SetDot(8,32, BLACK);
    GLCD.SetDot(9,34, BLACK);
    GLCD.SetDot(8,34, BLACK);
    GLCD.SetDot(9,32, BLACK);
    GLCD.SetDot(9,33, BLACK);
    GLCD.print( sensors.getTempCByIndex(icount),3); // 3 places after the decimal.
     delay(1000);
  }
}   
 }

vi prego!!!!!!