Ardu-Aquarium Controller v. 3.3.1

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!!!!!!

prova a rimuovere

GLCD.DrawBitmap(ArduinoIcon64x64, 32,0, BLACK); //draw the bitmap at the given x,y position

ed anche

#include "bitmaps/allBitmaps.h"

così dovresti risparmare lo spazio (credo in ram) di quella immagine 64*64, e vediamo se hai ancora problemi

Ho provato ma non cambia nulla fa le sue solite 13 misure poi tutto tace...il led sulla stamp lampeggia quindi comunica ma non stampa nè sul monitor seriale nè sul GLCD...lo sketch dell'atlas funziona bene su entrambi i video anche se ha la noia di dare l'input dal monitor e io non so riscriverlo come fosse una sonda di temperatura non sono in grado. Ho pensato ma non può cancellare dalla ram il dato ad ogni rilevazione? E come mai stampa su entrambi i monitor lentamente invece che ogni 262 millisecondi come fa normalmente? Scusate la mia ignoranza assoluta!!!!!

la ram è occupata dalle variabili. Il semplice sketch della sonda non crea nuove variabili, quindi non accumula ram.

o meglio, usano della ram temporaneamente che poi viene liberata. evidentemente però la GLCD usa tanta ram e probabilmente in un momento in cui anche quella del sensore la richiede, andando in errore (che poi l'errore avvenga sempre ogni tot è un buon segno, vuol dire che una volta risolto sai come controllare di averlo effettivamente risolto)... infatti la sonda via seriale funziona bene. (giusto?)

Per il fatto che ci metta tanto devi considerare che arduino fa molta fatica ad elaborare immagini, anche se semplici come caratteri da stampare. ecco dove se ne va il tuo tempo in più

Ho provato a togliere tutte le righe per fare il simbolo del grado la "C" e "Ph" per risparmiare ram ho lasciato le rilevazioni pure ma senza guadagno sempre 13 rilevazioni poi stop....eppure questo codice

#include <glcd.h>
#include "fonts/allFonts.h"         // system and arial14 fonts are used
#include "bitmaps/allBitmaps.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


  void setup(){                                                                //set up the hardware
     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();}
 
 
 
   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
      }
 }

funziona perfettamente. Questo è il codice del Ph su GLCD senza temperatura....come faccio a sapere quanta ram usa il mio sketch?

ho eseguito il memoryfree e mi restituisce 7305...quindi la ram dovrebbe essere a posto...giusto? Non potrebbe essere un conflitto fra le sonde? Con il GLCD non dovrebbe perchè lo sketch che ho postato prima funziona perfettamente...help!!!! =(

buona sera a tutti ho cercato di riprodurre il circuito di riccardo
non lo ho finito del tutto ma volevo un consiglio da voi se quello che ho fatto fino ad ora potrebbe andare bene,
spero che si riesca a capire bene se è si logicamente poi andra finito e rifatto in un modo migliore nel frattempo aspetto vostre notizie
grazie
simone

nuovo circuito stampato.fcd (11.8 KB)

Per pubblicare un file sarebbe il caso usare un formato più diffuso...
Allega un file Eagle, un file PDF o un'immagine.

buongiorno
ora ci riprovo a caricare il file e spero che si veda e che possiate consigliarmi e dirmi se per ora vanno bene i collegamenti ,
è ancora da finire e poi andra risistemato
grazie
simone

Ciao Simon,
nel tuo precedente post, insieme al file .fdc allegato, potresti mettere il link al programma utilizzato?

Ciao Michele,
grazie sempre per il tuo tempo, Hai ragione l'op-amp è il 358, ho sbagliato, inoltre è vero, sono riuscito a far lavorare tutte e tre le sonde con il circuito che ho messo su grazie a te, sul fatto della stabilità, però pensavo che si è vero che ho due resistenze variabili, ma a parte il trimmer multigiro che una volta tarato non cambia più, pensavo che la Rsens a livello dell'acqua stabile e temperatura stabile, mi fornisse un analogread() più stabile cosi come era quando la leggevo direttamente, però giustamente anche quello che dici sulla stabilizzazione via software è un'ulteriore step da fare.

Per quello che riguarda Lesto e le sue elaborazioni...

lesto:
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

Dunque, ho campionato scartando sermpre le prime (100 circa) 100 letture per ogni profondità a 4 temperature diverse ossia 30, 25, 20 e 15 gradi, il tutti per tutti e tre i sensori, ho avuto premura di tenere il più possibile le temperature il più stabile possibile, alla fine quindi abbiamo
per ogni sensore un bel pò di dati.
Oggi pomeriggio ho studiato un pò come funziona la varianza, non credo di aver capito fino in fondo, però l'ho applicata alle tabelle, fortunatamente esisteva già come funzione, vedi se ho fatto bene i compiti se ne hai tempo, ad ogni modo ho calcolato
per ogni profondità la varianza,
quindi la varianza delle varianze,
ed in fondo al foglio la varianza delle varianze precedenti.

tra l'altro questo mi ha permesso di accorgermi di alcuni dati incongruenti che ho rimisurato, ricostruendo però mi sono accorto che avevo semplicemente sbagliato i copia/incolla... troppi dati :cold_sweat:

andysirio11:
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?????? =(...
vi prego!!!!!!

Ciao, non so se hai risolto, ho visto che Lesto ha provato ad aiutarti, io ho dato un'occhiata veloce ma sinceramente, non riesco a capire cosa possa succedere, l'unica cosa che mi viene in mente è che forse sia impostato troppo veloce la seriale, è vero che il PH può avere variazioni "repentine" in casi limite, ma quella velocità mi sembra veramente eccessiva, non mi viene in mente altro, ma fammi sapere come va e se risolvi, perché quel sensore lo avevo già adocchiato. :wink:

simon77blitz:
buongiorno
ora ci riprovo a caricare il file e spero che si veda e che possiate consigliarmi e dirmi se per ora vanno bene i collegamenti ,
è ancora da finire e poi andra risistemato
grazie
simone

Ciai Simone,
apprezzo davvero tanto il tuo aiuto, ma credo sia prematuro disegnare il pcb ora, tutto il progetto è ancora un work in progres, rischi di lavorare tanto per poi dover modificare ogni volta tutto, poi fai tu, io ti sono comunque grato.
L'unica cosa è che se proprio vuoi disegnarlo, allora ti inviterei ad usare kicad, che è il programma che ho usato per disegnare lo schema, se vuoi ti mando il file originale, così puoi passare più facilmente al PCB.

Ciao a tutti e di nuovo grazie per il supporto che mi state dando. :slight_smile:

Riccardo

PaoloP:
Ciao Simon,
nel tuo precedente post, insieme al file .fdc allegato, potresti mettere il link al programma utilizzato?

Dovrebbe essere l'estensione dei file di FidoCad:

Quel software ha alcuni problemi:

  1. è solo per Windows;
  2. salva in un formato proprietario che non è apribile da Eagle;
  3. non mi sembra più sviluppato.

Esiste FidoCadJ, scritto in Java e quindi multipiattaforma. Mi pare abbia uno script per poter esportare almeno i componenti più comuni per Eagle (non lo so per certo, leggo quello che c'è scritto sul forum). Ma se si deve imparare un Cad, tanto vale iniziare con Eagle, difficoltà per difficoltà...

Interessante FidoCadJ. :wink: