Ciao, comincio io, allora, nella speranza di suscitare interesse e che qualcuno suggerisca a me come andare avanti...
Lista della spesa:
- Arduino Mega 2560 (27€ dalla Cina)
- LCD Shield + Keypad + LCD 2x16 (18€ dalla Cina)
- Modulo 8 relais 5v (15€ dalla Cina)
- RTC 1307 I2C x Arduino (5€ dalla Cina)
- Connettori VGA 15 pin femmina da scatola (5€)
- Sensore temperatura DS18B20 (8,5€)
- Sensore distanza sharp GP2Y0A02YK (28€ su rs)
- Alimentatore esterno per Arduino (9v DC)
- Alimentatore esterno per banco Relais (5v DC, io ho usato un caricabatteria USB, piccolo e con la tensione corretta)
- Saldatore, stagno ecc
- fili elettrici vari (0,25mm io li ho recuperati da un vecchio alimentatore per PC)
- Scatola 8 posti gewiss IP40
- 8 prese per la scatola gewiss
- connettori maschio passo 2,5mm
- resistenza 4,7k
- Tubo PCV 4cm
- Forex per la costruzione della scatola
- Molta pazienza
La realizzazione del mio aquacontroller (v2.1 al momento) mi è costata circa 4 mesi di lavoro nel tempo libero, per prove, fallimenti, vittorie, tutte fatte "offline" mentre acquistavo le parti della vasca e prima della sua partenza. Ora è in funzione da 6 mesi, durante i quali non sono mancati aggiornamenti e modifiche. La versione iniziale non consentiva di modificare gli orari, che andavano impostati hard-coded via USB, ho cambiato ben tre diversi sensori di temperatura prima (LM35, termistore e poi DS18B20) prima di trovare quello migliore, ho fatto l'esperienza degli interruttori galleggianti, poi abortita a causa della scarsa affidabilità...insomma c'è sempre stato da divertirsi.
Nella realizzazione del circuito ho cercato di collegarmi ove possibile ai pin di arduino con un connettore maschio, ma in alcuni casi, ad esempio per Vcc e GND che sono comuni a molte parti, ho preferito saldare un filo direttamente all'Arduino e poi utilizzare del morsetti internamente alla scatola. Nella versione 3 userò maggiormente le saldature per problemi logistici (poco spazio rimasto libero con lo shield TFT)
La realizzazione è "semplice", sotto una immagine a pancia in giù:
1. lo shield LCD si monta sull'Arduino, non si può sbagliare
2. il RTC si collega a Vcc, GND e ai pin SDA e SCL che nel Mega sono i pin digitali 20 e 21.
3. Si sceglie poi un pin per il sensore di temperatura (io ho scelto il 19) e ci si collega il segnale, mentre gli altri due fili del sensore vanno collegati a Vcc e GND. Attenzione a mettere una resistenza di pullup da 4,7k tra Vcc e segnale. Io l'ho saldata direttamente sui fili in prossimità del morsetto interno.
4. Il sensore di distanza va collegato a Vcc, GND, e il segnale ad un pin analogico, io ho scelto il 15. Durante i miei test ho evidenziato alle volte una certa variabilità nella misurazione e ho inserito un piccolo condensatore tra Vo e GND, ma poi l'ho tolto, e compenso via codice l'eventuale variabilità, andando a considerare solo due letture consecutive prima di attivare il rabbocco.
Quando l'ho acquistato speravo che il sensore ad infrarossi vedesse la superficie dell'acqua. Prove empiriche suggeriscono che così non funziona, e allora ho dovuto ricorrere ad un galleggiante. Ho montato il sensore su un tubo di pvc attaccato alla parete della sump, e all'interno c'è un galleggiante (un tappo di silicone) che viene letto dal sensore.
5. Armarsi di molta pazienza e collegare tutti i pin per il pilotaggio dei relais al connettore VGA. IO ho usato sull'arduino i pin da 39 a 53, comodi per la posizione. Ho saldato gli 8 fili ad un connettore maschio, con una striscia di basetta millefori per dare stabilità e poi l'altro capo alla fila superiore e inferiore del connettore VGA. GLi altri due collegamenti sono per Vcc e GND, in totale 10 pin collegati al connettore.
6. Stessa procedura di cui sopra per la connessione del banco relais al connettore che collegherà la scatola con le prese. La scatola stessa va "bucata" sul fondo per poter alloggiare il banco relais, perchè altrimenti non si chiude. Si buca poi a misura (io l'ho fatto sopra) per il passaggio del connettore e si montano le prese collegandone ciascuna ad un relais (moolta pazienza qui)
Serve anche una apertura per l'ingresso dell'alimentazione al banco relais. Questa alimentazione, che io fornisco con un alimentatore USB, potrebbe non servire utilizzando direttamente quella presa dall'Arduino. Esiste un jumper sul banco relais che sceglie se avere alimentazione esterna o usare quella dell'arduino, ma mi sono accorto che usando l'arduino l'assorbimento di corrente era eccessivo e mi si scaldava troppo. Da qui la scelta di una seconda alimentazione esterna.
7. Io ho anche realizzato una piccola scatola su misura per il mio controller. L'ho fatta utilizzando del Forex (regalatomi da un amico tipografo) da 5mm. Facile da tagliare con un taglierino, leggero e resistente.
Veniamo ora al software. Arduino si programma con la sua applicazione. Io uso l'applicazione arduino 0023, scaricabile gratuitamente. Nel mio software faccio largo uso della libreria Alarm, usata per settare tutti gli orari di accensione/spegimento. Servono poi altre librerie aggiutive per la gestione dei componenti esterni:
codice:
#include <LCD4Bit_mod.h> //gestione del display
#include <OneWire.h> //gestione del sensore temp
#include <Wire.h> //gestione del sensore temp
#include "RTClib.h" //gestione dell'RTC
#include <Time.h> //per gli allarmi
#include <TimeAlarms.h> //per gli allarmi
#include <stdio.h>
#include <EEPROM.h> //per memorizzare stato e orari
Nella libreria TimeAlarms ho definito USE_SPECIALIST_METHODS per avere a disposizione il metodo free().
Nella parte iniziale del codice troviamo tutte le variabili e le costanti utilizzate dal programma. Sono principalmente di quattro categorie:
- costanti per la definizione dei pin i/o. Per esempio neon_pin
- costanti per la posizione in memoria EEPROM dei valori. Per esempio NeonOnHourMem
- flag di stato. Per esempio neon_fl
- variabili globali per il funzionamento. Per esempio NeonOnHour
la funzione setup() inizializza le variabili recuperandole dalla memoria EEPROM. Alla prima partenza mette dei valori di default.
Il ciclo loop() pilota il menu: attende input dall'utente sul tastierino e consente la navigazione tra le funzioni disponibili, invocando poi specifici sottomenu alla bisogna.
Abbiamo poi una serie di funzioni che settano i flag vari per l'accensione o lo spegnimento dei dispositivi, e che sono invocate dagli allarmi oppure dalle funzioni manuali.
La funzione SetStatus() viene richiamata ogni 10 secondi, fa le verifiche sullo stato dei sensori (termico e distanza) e imposta i relativi dispositivi, dopodichè a second adello stato di tutti i flag accende o spegne il relais relativo.
Il rabbocco viene avviato solo se per due volte consecutive il lettore di distanza misura un livello troppo basso, e ogni volta solo per 10 secondi. Forse così faccio male alla pompa ma sono ragionevolmente sicuro di non fare overfill.
Il cooler invece viene attivato se la temperatura supera una certa soglia hi_temp e disattivato quando è sotto un'altra soglia lo_temp, per avere una sorta di ciclo di isteresi.
Neon, HQI e lunari hanno solo un accensione e spegnimento al giorno, mentre le pompe al momento si switchano ogni 6 ore. Potenzialmente si potrebbe fare un sistema tipo wavemaker, accorciando l'intervallo tra SetStatus successivi, ma sinceramente non so se serve veramente e credo rovini le pompe quindi per ora soprassiedo.
il programma lo potete trovare qui:
http://code.google.com/p/aquacontrol...e/#svn%2Ftrunk
L'ho descritto molto velocemente, ma se qualcuno vuole fare approfondimenti o ha domande specifiche sono a disposizione.
Piani per il futuro ne ho tanti, sto ancora testando il corretto funzionamento del rabbocco, e ho quasi pronta la versione 3 dell'aquacontroller, con un display TFT touch. Inoltre vorrei aggiungere sensore di ph e salinità (suggerimenti??) e infine collegarlo al web per poter leggere lo stato e eventualmente pilotarlo da remoto. Ieri poi mi sono accorto che manca anche il cambio dell'ora, che ho dovuto fare riprogrammandolo da PC.