Ardu-Aquarium Controller v. 3.3.1

Ciao,
il controller è per un acquario marino, per il momento servirà solo per le funzioni base:

  • Controllo luci Led con PWM
  • Rabbocco automatico
  • Alternanza pompe movimento
  • Controllo temperatura

Hardware:

  • Arduino Mega
  • Display
  • Scheda relè (4)
  • RTC
  • Sensore livello
  • Sensore temperatura
  • 6 pulsanti
  • 4 deviatori
  • Varie (scatola quadro elettrico, connettori, alimentatore, ecc.)

Utilizzerò la libreria MENWIZ per creare menù su LCD.
E' una libreria veramente fatta bene, facile da usare, con molte opzioni che possono essere utili.

Gli schemi per il momento li ho solo in testa e devo ancora scriverli.
Ci saranno 4 prese controllate da Arduino (pompa movimento Sx, pompa di movimento DX, pompa rabbocco, Termoriscaldatore).
Il segnale di comando proveniente da Arduino sarà interrotto da un deviatore per avere la possibilità di controllare il relè dal controller, manuale ON e manuale OFF.

I sensori temperatura per l'acqua e forse per la plafoniera saranno tipo DS18B20.
Il sensore di livello è quello utilizzato in questo progetto :
http://www.acquaportal.it/nanoportal/Articoli/fai_da_te/FDTOsmoregolatoreAresistenza/default.asp

Questo è quello che ho in mente, se vuoi sapere altro chiedi pure.

Ciao
Marco

Ciao a tutti,
abbiamo fatto dei passi avanti, sia sul lato HW che SW, così volevo aggiornarvi e chiedere alcune delucidazioni e consigli…

Per cominciare, si è formato un allegro gruppetto di persone, che via whatsapp comunica senza inquinare questo topic con post superflui, ma che tra fare solo test, proporre modifiche, ma anche intervenendo sul codice ha fatto si che il progetto sia andato avanti.

Sul lato HW, abbiamo seguito le segnalazioni di brunello sull’utilizzo del 7805, ed effettivamente tutti quei fotoaccoppiatori, lo mettevano a dura prova, provando ad attivarli tutti, diventava una vera e propria stufetta, anche aumentando il valore delle R, migliorava solo leggermente, così ho ordinato gli IC-inverter che mi ha segnalato i 74HC540N ed effettivamente è tutta un’altra cosa, sia come semplificazione circuitale che come assorbimenti. Grazie Brunello! XD

Abbiamo poi deciso di aumentare a tre il numero delle linee luci.

E di aggiungere un 6° tasto per l'ESC per migliorare l'utilizzo del controller :wink:

Sul lato SW, invece si può dire che siamo a dama sulla gestione delle luci:
Abbiamo semplificato e snellito la funzione di acquisizione dei dati utili/necessari e trovato un buon compromesso poi per la gestione dei singoli fotoperiodi, in pratica inizialmente abbiamo cercato di usare una funzione che in ogni momento in base all’ora corrente fosse in grado di calcolare e decidere cosa e quanto accendere per tutte e tre le linee, ma il povero Arduino sudava ben più delle proverbiali 7 camice, così abbiamo scritto una funzione che in caso di cambiamento dei dati da parte dell’utente o di riavvio/reset/black-out, ricalcola i valori di fading, di intervallo di fading ed altro e da poi in pasto i dati ad un’altra funzioncina che a questo punto esegue semplicissimi confronti temporali utilizzando millis(), che non ci fa più paura con i suoi overflow, dopo aver letto l’articolo di Leo72 http://www.leonardomiliani.com/2012/come-gestire-loverflow-di-millis/ :wink:
Abbiamo anche aggiunto una schermata per monitorare lo stato delle luci, e nella schermata principale visualizziamo la media in percentuale dei fading sulle tre linee.

Per la temperatura dell’acqua invece, abbiamo scritto due righe di codice per far si che se la temperatura sale o scende oltre un certo range (1,5°), il valore della temp inizi a lampeggiare sul display e si senta un allarme sonoro, disattivabile quest’ultimo premendo ESC.
Purtroppo siamo quasi al limite con la flash, pensando anche a quanto ancora vogliamo far fare al controller, così in questo momento oltre a pensare di implementare altre funzioni, stiamo cercando di capire come riscrivere tutto, mantenendo la funzionalità del codice ed allo stesso tempo alleggerendolo….

Più tardi uno di noi proverà a spiegare meglio che strada stiamo cercando di percorrere…

Nel frattempo allego sia qui che nei post di presentazione lo sketch ed il nuovo schema, dove è ancora in sospeso l’uso del trimmer sulla backlight del display.

Grazie in anticipo a chiunque voglia perdere un po’ di tempo per aiutarci a migliorare :slight_smile:

Riccardo.

EDIT 27/02/2013 19,07: Caricato per errore uno sketch errato, ora è giusto... :blush:

acquarium_controller_v2_1.ino (54.8 KB)

Ho aperto un topic nella sezione Software per riuscire a sistemare l'acquisizione dei dati Luci utilizzando array.
Link http://arduino.cc/forum/index.php/topic,151218.0.html

il tutto per rendere il tutto più comodo e facilmente gestibile. :stuck_out_tongue:

Ciao a tutti,
ho un problemino, sto cercando di usare questo sensore di livello:
http://www.milonetech.com/About_eTape.php
e di fatto ho già letto, utilizzando il circuito con divisore di tensione, i valori in analogread ed ho ottenuto già dei buoni risultati, nel senso che usando una R da 560 Ohm, le letture variano da 790 (acqua a livello minimo) a 512 (acqua a livello 20cm del sensore), quindi 278 rampe pari ad una rampa ogni 0,71mm che già è una buona precisione, solo che siccome usero il sensore in acquario, con acqua relativamente calda circa 28/29°, vorrei usarei il cicuito con amplificatore operazionale, che mi permette di usare anche la rref per compensare la temperatura ed anche per aumentare il range di lettura in modo da ottenere una precisione maggiore ( il terzo circuito)

il problema è che non ho la più pallida idea di quale ic dovrei usare, mi aiutate per favore? :smiley:

il datasheet: http://www.milonetech.com/uploads/eTape_Datasheet_12110215TC-8.pdf

Grazie Riccardo.

L'LMV358 (disponibile sia in PDIP che in SOIC) va più che bene per questa applicazione, è lo stesso usato su Arduino per la com parazione di tenzione per la selezione della fonte di alimentazione.

Ciao Michele,
grazie infinite per la segnalazione, sto cercando, ma in formato dip è introvabile, mi hanno proposto in alternativa l'NE5532AP o N finale, può andare bene?

Poi ho visto che vengono alimentati con vcc+ e vcc- , significa che ho bisogno anche dei -5v?
O lo collego a massa?

:blush:Perdonatemi, ma non capisco molto/niente di queste cose...

Riccardo

s', quella 'A' in più significhe che è più immine al rumore (magari ti costa anche qualche centesimo iin più..)

infatti mike è un buon comporatore di tenZione!! :stuck_out_tongue_closed_eyes:

lesto:
s', quella 'A' in più significhe che è più immine al rumore (magari ti costa anche qualche centesimo iin più..)

Si anche per la domanda sull'alimentazione? ovvero vanno alimentati a +5 e -5 ?

Grazie :blush:

Ok, mi rispondo da solo e mi scuso per la domanda inutile, i datasheet sia del lmv358 che del NE5532AP parlano chiaro,
ora però ho un'altro problema, nel senso che ho i +12v ed i +5v, quindi non saprei da dove tirar fuori i meno -5v, a furia di googlare, avrei trovato il TC660, seccondo voi può fare al caso mio? (datasheet in allegato)
Altrimenti che alternativa avrei?

:blush: Scusate ma sono in confusione, sono veramente ignorante in materia...

Grazie in anticipo per il tempo che vorrete dedicarmi

Riccardo

TC7660.pdf (83 KB)

riciweb:
Ciao Michele,
grazie infinite per la segnalazione, sto cercando, ma in formato dip è introvabile

hai ragione, scusa, una mia svista; allora puoi:
1 - usare un adattatore SOIC->PDIP (ma in genere costa più dell'integrato)
2 - prendere l'LM358 standard, dovrebbe comunque andare più che bene per le tue esigenze (RS codice 810-194)

mi hanno proposto in alternativa l'NE5532AP o N finale, può andare bene?

ne ho sentito parlare bene, ma non l'ho mai usato

Poi ho visto che vengono alimentati con vcc+ e vcc- , significa che ho bisogno anche dei -5v?
O lo collego a massa?

queste le caratteristiche da data-sheet dell'LM358 (che contiene due op-amp):
Wide power supply range:
— Single supply: 3V to 32V
— or dual supplies: ±1.5V to ±16V
— Very low supply current drain (500 ?A)
— essentially independent of supply voltage
— Low input offset voltage: 2 mV
— Input common-mode voltage range includes ground
— Differential input voltage range equal to the power supply voltage
— Large output voltage swing
a mio modestissimo parere sono di tutto rispetto (l'LMV ha in più fondamentalmente il fatto di essere un rail-to-rail, se non ricordo male) e sufficienti per il tuo scopo.

@ mad: mi stai chiamando ignorante? in quella frase ci sono ben 4 "zione", è come la storia della panca e della capra. Invece spiegami tu cos'è un

buon comporatore

, io almeno scrivo cose buone oltre a commettere qualche errore veniale, tu la cag.. perfino con le strnzt :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

l'LMV358 opera a 2,7-5V tensione singola, ho detto che è usato su Arduino, dove la trovi su Arduino una tensione duale, Lesto è un seminatore di zizzania :grin:

Grazie infinite Michele,
mi rimetto a caccia e a breve come mia abitudine ormai vi metto al corrente dei miei strafalcioni XD

Riccardo.

Un op-amp valido che si trova in formato DIP8 è il TLC2262, è rail-to-rail e può lavorare anche con una tensione singola.
Lavora a 5V senza problemi.

io mi riferivo al NE5532AP vs NE5532P

Ciao a tutti,
ho provato ad usare l'LM358, con il circuito consigliato dal datasheet, pensavo di ottenere un aumento del range di lettura, ma non è cambiato nulla, prima in analogread
con circuito divisore di tensione leggevo da 790 (acqua a livello minimo) a 512 (acqua a livello 20cm del sensore), quindi 278 rampe pari ad una rampa ogni 0,71mm con tensione che variava da 2,5v a 1,25
con circuito op-amp leggo da 3 (acqua a livello minimo) a 252 (acqua a livello 20cm del sensore), quindi 249 rampe pari ad una rampa ogni 0,8mm con tensione che varia da 0,.03v a 1,20v
Da quel poco che ho capito però con l'amp-op avrei dovuto avere in uscita un guadagno pari almeno alla tensione di alimentazione, ma non è così dove sbaglio?
Cosa devo fare per arrivare a sfruttare il più possibile tutte le rampe di lettura in analogread?

Ho usato i circuiti che metto qui sotto:

nel circuito con op-amp, ho usato valori per r1 e r2 pari per entrambe e corrispondenti a 560, 1k, 1,5k, 2,2k ma il risultato è sempre lo stesso.

Non so cosa fare... :roll_eyes:

L'amplificatore differenziale amplifica la differenza di potenziale che cè tra i due rami. Se ho ben capito la RRef deve avere il valore di partenza della RSense ed R1-R2 devono essere uguali e rapportate a RRef-RSense. Io proverei con due da 10k, mentre la RRef deve corricpondere al valore di partenza del sensore.
Ciò detto a me pare che le due R finali da 100k rappresentino un guadagno unitario, quindi questo circuito ti porta in uscita solo la differenza di potenziale tra i due ingressi. Poiché disponi di un secondo op-amp nel 358 potresti usarlo come amplificatore vero e proprio del segnale in uscita da primo o, più semplicemente, la prova che farei io è quella di aumentare la R da 100k posta tra - e Vout, che dovrebbe generare il rapporto di amplificazione; metti una 330k e dovresti avere una amplificazione di circa 3 volte, ma fino al limite della tensione di alimentazione (credo un poò meno in realtà, mi pare che quella sia una caratteristica essenziale dei modelli rail-to-rail). Per la verità la formula che mi ritrovo sembrerebbe richiedere un valore inferiore rispeto a quello iniziale, quindi se ottieni un risultato attenuato invece che amplificato, prova a mettere una 33k.
Le mie conoscenze sugli op-amp sono minime e scadenti, ho iniziato a leggere qualcosa, ma mille altri impegni mi hanno impedito di approfondire e soprattutto di sperimentare. Prova, male che vada non succede nulla e proviamo ad aggiungere un secondo stadio :sweat_smile:

Ciao Michele, grazie per il tempo che mi stai dedicando, :slight_smile:
ho avuto tempo di fare un pò di prove ed ecco i risultati:

Rsens al minimo = 2k Rref = 2K

R sul vout 330K
R1 e R2 liv min liv max Vliv min Vliv max
1K 686 402 1,37 2,33
1,5K 587 309 2,00 0,97
2,2K 489 230 1,66 0,85
10,0K 230 60 0,57 0,2

Il bello è che cambiando la R sul Vout e mettendola 33K il risultato non cambia. :blush:

P. S. Oggi a furia di googlare sono incappato in questi due link

null - YouTube Video lezioni di elettrotecnica
null - YouTube Video lezioni di elettronica applicata

Magari possono tornare utili nel tuo post sui link, ho iniziato a guardarli...

Ma la RRef te la sei calcolata? non la riporti nei tuoi esperimenti, invece è un fattore fondamentale, perché in pratica stabilisce il punto di partenza del tuo sensore.
La tua tabella è fatta bene, ma io come la leggo? alla prima riga quei 686 e 402 sono dei valori che corrispondono ai livelli minimo e massimo, ma la loro unità di misura qual'è? e dove rilevi questi valori?
Come detto non sono praticissimo di op-amps, sicuramente quel circuito è un amplificatore differenziale, ma i componenti devono essere correttamente "tarati", altrimenti puoi avere comportamenti strani in uscita.

Ciao,
La RRef, l'ho misurata, così come la RSens, anche se sul datasheet la danno per 1,5k bho!!!
Mentre i valori di cui parli li leggo in analogread() perdonami, dovevo specificarlo :blush:

byte levelsensor = A0; 
int levelvalue = 0;
void setup() {
   Serial.begin(9600);  
}

void loop() {

  levelvalue = analogRead(levelsensor);    
  Serial.println(levelvalue);
            
}

Nel file in allegato, c'è un circuito che sfrutta un operazionale, ma utilizzando "virtual ground", da quello che ho capito però serve per gli operazionali a doppia alimentazione...

Riccardo

eTape_AppNotes.pdf (512 KB)