Per offrirti il miglior servizio possibile RareAquaticPlants utilizza cookies. Continuando la navigazione nel sito autorizzi l’uso dei cookies |Maggiori Informazioni


RAP Forum

RAP Shop
Info
Contacts
Forum
Collaboratori di RAP
English Articles
Siti Amici
Wabikusa
Schede Piante
Articoli Tecnici
Tecniche Riproduzione
Foto Piante
Alghe
RAP Algae
Coltivazione Emersa
Allestimenti
Layout & Manutenzione
Illuminazione
Allevamento Caridine
YouTube Channel
Le News

Share on Facebook

Link nel forum di RAP dove si parla di questo progetto


Premessa

Il documento vuole essere una mini guida alla sperimentazione, implementazione ed ampliamento di un progetto che non ha limiti nella gestione e automazione di un acquario. Tuttavia la versione che propongo è la base sulla quale costruire ben altro e allo stato attuale permette la gestione di un acquario solo per le seguenti procedure:

- Accensione/spegnimento Luci

- Accensione/spegnimento CO2

- Rabbocco automatico acqua Evaporata

L'idea

Il tutto è nato dall'esigenza di dotare il mio piccolo acquario di un sensore per il rabbocco dell'acqua evaporata che avesse un bassissimo impatto estetico e quindi utilizzare il solito galleggiante interruttore non sarebbe andato bene sia per dimensioni sia per estetica. Tempo fa ho realizzato un sistema domotico per la mia casa: accendo/spengo le luci con un telecomando o al mio passaggio, entro dentro casa leggendo l'impronta biometrica del mio dito e disattivo l'antifurto auto costruito, accendo i termosifoni con un sms e la televisione quando mi siedo sul divano, leggo la temperatura esterna e le condizioni meteo, scrivo tutto in un database e la mattina quando mi sveglio arriva un sms che mi dice se prendere la moto o la macchina per andare a lavorare, e tanto altro ancora. E' nato tutto per gioco ma oggi mi scoccerebbe alzarmi per premere un interruttore mentre magari sto guardando il mio film preferito. forse vi sembrerò un magnate dell'elettronica o un ottico sviluppatore, ma in realtà, pur avendo un'estrazione informatica non serve essere degli specialisti per fare tutto ciò, basta una piccola scheda elettronica ed una manciata di sensori vari per realizzare il tutto. Parliamo di Arduino (progetto open source, e tutto Italiano)

Cosa è Arduino

Arduino è un framework open source che permette la prototipazione rapida. Questo è composto da un circuito stampato che integra un microcontrollore con pin connessi alle porte I/O, un regolatore di tensione e quando necessario un'interfaccia USB che permette la comunicazione con il computer. A questo hardware viene affiancato un ambiente di sviluppo integrato (IDE) multipiattaforma. Questo software permette anche ai novizi di scrivere programmi con un linguaggio semplice e intuitivo derivato da C e C++ chiamato Wiring.

(Fonte Wikipedia)

Sensore rabocco ultrasuoni domenico feerrari rareaquaticplants massimo iannella

Arduino UNO

Principio di funzionamento

Con Arduino, i suoi sensori e poche righe di codice si riescono a pilotare delle uscite (Digitali e Analogiche) al verificarsi di determinate condizioni da noi definite. Per pilotare le Luci basta dire al software di porre il pin dove è collegato un relè nello stato HIGH per fare eccitare lo stesso e accendere quindi la luce; il pin ovviamente si pone nello stato HIGH solo in determinate fasce orarie. Per attivare la CO2 si possono seguire tante vie, la prima ad esempio, come nel mio caso, segue il principio della luce, si attiva in determinate ore che coincidono con il fotoperiodo, ma il tutto potrebbe essere gestito (in particolare nel marino) anche associando ad Arduino una sonda per il pH che all'assumere di determinati valori apre o chiude l'elettrovalvola. Nel caso del sensore ad ultrasuoni basta dire ad Arduino di leggere la distanza tra il pelo dell'acqua e il sensore (posto sopra la luce), se l'acqua scende al di sotto di una data soglia, il sensore comunica ad Arduino che la distanza tra lo stesso sensore e il pelo dell’acqua è aumentata e il software elaborando il dato attiva un relè che aziona la pompa del ripristino. Nel momento in cui l’acqua pompata nell’acquario raggiunge nuovamente la soglia impostata a vasca piena, nella stessa maniera, il sensore comunica ad Arduino il valore e il software elaborando il dato disattiva il relè che ferma la pompa di ripristino. Il tutto avviene in pochi secondi. Arduino deve porre il pin dove collegato un relè e la sua pompa nello stato HIGH e azionare la stessa, sino a quando il livello dell'acqua non risale e lo stesso sensore ritorna al valore di partenza. Per farvi capire le tante possibilità, si potrebbe anche inserire un sensore di peso sotto l'acquario, allo scendere del quale (acqua evaporata) attiva il solito relè.

Dettagli Tecnico

Per quanto riguarda la parte di illuminazione sorvolo, cercherò di allegare il codice sorgente ben commentato in modo che si capisca bene. Per il sensore ad ultrasuoni brevemente spiego cosa ho cercato di fare premettendo che nella mia vasca funziona molto bene. Innanzitutto il sensore si attiva solo tra le 12.00 e le 12.10 di ogni giorno e in tale breve periodo esegue le seguenti operazioni:

- esegue 10 letture a intervalli di 5 secondi del valore che c'e tra il pelo dell'acqua e la luce sopra la vasca

- inserisce in un Array i valori letti ed esegue la media degli stessi in modo da escludere le false letture dovute al movimento dell'acqua o ad un pesce che sguazza sotto il sensore

- al verificarsi di un ritorno di risultato maggiore di un dato valore che imposto in fase di calibrazione del sensore, attiva, attraverso un relè, la pompa di risalita che pesca da una tanica sotto il mobile e ripristina l'acqua

- la lettura dei valori non viene sospesa prima di 10 minuti e nel momento in cui l'acqua riporta la lettura al valore di inizio (distanza che diminuisce tra il pelo dell'acqua e la plafoniera), Arduino diseccita il relè e quindi spegne la pompa.

1 Sensore rabocco ultrasuoni domenico feerrari rareaquaticplants massimo iannella2 Sensore rabocco ultrasuoni domenico feerrari rareaquaticplants massimo iannella

                                                                  Scheda Relè                                      Sensore ad Ultrasuoni

Il posizionamento del sensore non è stato particolarmente complicato. Dopo aver sostituito il filo nero che alimenta la luce ADA con uno trasparente, ho applicato al sensore ad ultrasuoni un piccolo quadratino di nastro biadesivo imbottito (è un nastro che ha una struttura morbida come fosse gomma piuma dello spessore di 2mm) e ho applicato il sensore, senza coprire il led della plafoniera, nell’unico spazio disponibile a destra della stessa come mostrato in foto.

5 Sensore rabocco ultrasuoni domenico feerrari rareaquaticplants massimo iannella

Particolare del Sensore ad Ultrasuoni montato sotto la plafoniera ADA

Cablaggi

In questo paragrafo cerco di riassumere i cablaggi relativi al sensore ad ultrasuoni, certamente non è mia pretesa spiegare il funzionamento di Arduino con poche righe di testo, infatti su internet esistono svariate guide anche in Italiano che spiegano bene il tutto. Vi illustro comunque come cablare il sensore ad ultrasuoni sulla scheda

6 Sensore rabocco ultrasuoni domenico feerrari rareaquaticplants massimo iannella

Cablaggio sensore ad ultrasuoni

I collegamenti da eseguire sul sensore sono tre ovvero:

-Il pin 1 del sensore a ultrasuoni è la massa sul retro del sensore è riportata la dicitura GND questa deve essere collegata al pin GND dell’arduino;

-Il pin 2 del sensore ad ultrasuoni è l’alimentazione a 5 volt, questo deve essere collegato al pin 5 volt dell’arduino (pin vicino al GND);

-Il pin 3 del sensore a ultrasuoni non va collegato;

-Il pin 4 del sensore a ultrasuoni non va collegato;

-Il pin 5 del sensore a ultrasuoni è la ricezione dei dati, questo va collegato al pin 7 dell’arduino, uso il pin 7 ma puo’ essere collegato a qualsiasi pin che deve essere definito nel software di gestione;

-Il pin 6 del sensore a ultrasuoni non va collegato;

-Il pin7 del sensore a ultrasuoni non va collegato.

Per terminare i cablaggi e rendere funzionale il tutto bisogna collegare la pompa di risalita ad Arduino. Questa deve essere gestita tramite un relè, il relè viene collegato ad Arduino al posto del led rosso come nella figura sopra. Il relè deve essere alimentato a 5 volt, su di esso sono presenti tre pin che gestiscono il controllo dello stesso e tre pin per la gestione del carico, nel nostro caso la pompa. I tre pin del controllo sono: Controllo, da collegare al pin A2 di Arduino come da figura sopra. GND, da collegare al GND di Arduino, 5 volt da collegare ai 5 volt di Arduino. I tre pin per la gestione del carico servono alla gestione della pompa di risalita. La pompa di risalita funziona a 220 V e quindi vi invito a prestare la massima attenzione nell’effettuare il cablaggio.

7 Sensore rabocco ultrasuoni domenico feerrari rareaquaticplants massimo iannella

Cablaggio relè pompa di risalita


Invio Software Ad Arduino

L’IDE di Arduino è gratuito e molto semplice da utilizzare, è disponibile al download all’indirizzo web: http://arduino.cc/en/Main/Software. Di seguito elenco i passaggi che devono essere compiuti per installare il software:

-Aprire L’IDE;

-Collegare Arduino al PC/MAC tramite USB;

-Nel menù dell’IDE "Strumenti/Tipo di Arduino" impostare il modello di Arduino che è in vostro possesso (Figura sotto);

8 Sensore rabocco ultrasuoni domenico feerrari rareaquaticplants massimo iannella

-Nel menù dell’IDE "Strumenti/PortaSeriale" selezionare la porta seriale alla quale è collegato Arduino (Figura sotto).

9 Sensore rabocco ultrasuoni domenico feerrari rareaquaticplants massimo iannella

-Copiare il testo Codice sorgente allegato al presente documento (in fondo all'articolo) all’interno della finestra dell’IDE e caricare il software su Arduino cliccando sulla freccia in alto a sinistra della finestra principale dell’IDE stesso (Figura sotto).

10 Sensore rabocco ultrasuoni domenico feerrari rareaquaticplants massimo iannella

Test da Console

Al termine della procedura aprire dal menù "Strumenti/Monitor seriale" la Console. I dati che si vedranno scorrere indicano che il software è stato inviato ad Arduino e che il tutto sta funzionando. Non rimane che impostare il valore soglia rabocco in base alle proprie necessità e ripetere le operazioni di caricamento ad ogni modifica. Un consiglio: prima di provare con l’alta tensione attaccare solo il relè senza la corrente elettrica 220V, potrete verificare che il tutto funzioni mettendo una mano vicino il sensore e verificando di udire un clic del relè; il clic indica che il relè si attiva e che la pompa se fosse collegata inizierebbe ad erogare acqua.

11 Sensore rabocco ultrasuoni domenico feerrari rareaquaticplants massimo iannella


Codice Sorgente

Nel codice che allego ho cercato di commentare il tutto in modo che possa essere comprensibile, ma ripeto, non è niente di troppo complesso anzi è intuitivo. Devo comunque fare qualche osservazione. Essendo nata come sperimentazione non avevo a disposizione tutti i componenti in particolare Arduino non è in grado di sapere l'ora in autonomia, nel senso che l'orario nel mio caso (ma per poco ancora) è stato impostato manualmente e Arduino attraverso una funzione incrementa un timer che manda avanti e che permette di simulare un orologio. Questo metodo comporta che nel momento in cui si invia il codice al dispositivo bisogna definire preventivamente l'orario attuale, se manca la corrente e non si ha una batteria tampone collegata al dispositivo il software riprende a conteggiare il tempo assumendo il valore impostato la prima volta. Esempio: invio il codice alle ore 12.00 - tutto inizia a funzionare - tre giorni dopo alle 02:00 di notte manca la corrente che torna alle 03:00 - Arduino riparte alle 03:00 ma per lui saranno le 12.00. Per ovviare al problema esiste un piccolo modulo che si chiama RTC, che permette di dotare Arduino di un orologio interno che anche in caso di mancata energia riesce a mantenere l'ora  addirittura per 10 anni. Il codice da me scritto attualmente non prevede l'utilizzo dell'RTC ma sarà mia cura fornire l'aggiornamento appena mi arriva il pezzo.

3 Sensore rabocco ultrasuoni domenico feerrari rareaquaticplants massimo iannella

IDE di sviluppo


INIZIO CODICE SORGENTE

Copiare da dopo questa riga:

/*

Ciao mettiamo qui tutte le varie versioni modificate cambiando la data e aggiungendo il nostro nome se modifichiamo migliorando il software.

Sperando che possa il software possa  piacervi e che possa migliorare grazie a noi tutti.

Rareaquaticplants Automazione in acquario versione beta 1 del 12/02/2013

I nomi degli sviluppatori e appassionati che hanno collaborato al progetto:

  Domenico Ferrari

  Nome

  Nome

  Nome

*/

#include <Time.h>           // Libreria per gestire l'orario

#include <TimeAlargms.h>    //Altra libreria per gestire l'orario

//DEFINISCO ORA E DATA CORRENT

//setTime(12,8,0,1,21,13); // set time to 8:29:00am Jan 1 2010

#define ORE           14    // sono le ore 14

#define MINUTI        30    // sono i minuti 30

#define SECONDI       0     // sono i secondi 0

#define MESE          1     // è il mese di gennaio

#define GIORNO        21    // è il giorno 21

#define ANNO          13    // è l'anno 2013

// Definisco i pin di out per pilorare i relè nel caso la co2 si deve accendere durante il fotoperiodo basta usare un solo relè che pilota Luci e elettrovalvola co2

#define LUCI   8    //uso il pin numero 8         

#define CO2    9    // uso il pin numero9

// DEFINISCO ORARI ACCENSIONE E SPEGNIMENTO per i test le luci si accendono 2 ore

#define ORELUCION       13  //le luci si accendono alle ore  13

#define MINUTILUCEON    00  // le luci si accendono al minuto 0

#define ORELUCIOFF      15  //le luci si spengono alle ore  15

#define MINUTILUCEOFF   00  // le luci si spengono  al minuto 0

#define ORECO2ON        13  //la co2 si accende alle ore  13

#define MINUTICO2ON     00  //la co2 si accende al minuto  00

#define ORECO2OFF       15  //la co2 si spegne alle ore  15

#define MINUTICO2OFF    00  //la co2 si accende alle ore  00

// definisco le variabile relative alla gestione dell'orario

unsigned int seconds = 0;

unsigned int minutes = 0;

unsigned int hours = 0;

// Definisco le variabili del sensore a ultrasuoni

int arraysize = 9;                                //valori dell'array 9 letture

int rangevalue[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0};  // devinisco il valore dell'arei

long pulse;  

int modE;                                          // la variabile modE è la variabile della media letta dal sensore a ultrasuoni

int ledPin = 13; // PIN ATTIVATO DA ULTRASUONI      // definisco il pin che il sensore a ultrasuoni attiva (qui collego il rele della pompa)

const int pwPin = 7; //PIN RICEZIONE DA ULTRASUONI   // su questo pin collego il sensore a ultrasuon, mi serve per leggere i valori

#define rabbocco = 20  // assegno valore a variabile che è la soglia quando acquario è pieno

void setup() {

  //Apro una connessione seriale

  Serial.begin(9600);

  //Attendo apertura connessione

  delay(500);

  pinMode(ledPin, OUTPUT);      // definisco il pin del relè della pompa come pin di out

  

  //INIZZIALIZZO USCITE

  pinMode(LUCI,OUTPUT);         // definisco i pin delle luci e co2 come pin di out 

  pinMode(CO2,OUTPUT);

  

  // imposta l'ora di arduino.

  setTime(ORE,MINUTI,SECONDI,MESE,GIORNO,ANNO); 

  hours=hour();;

  minutes=minute();

  seconds=second();

}

//Questo è il loop non toccare nulla

void loop() {

  

  hours=hour();;

  minutes=minute();

  seconds=second();

  AccendoLuce();

  AccendoCo2();

  

  pinMode(pwPin, INPUT);

  for(int i = 0; i < arraysize; i++)

  {    

    pulse = pulseIn(pwPin, HIGH);

    rangevalue[i] = pulse/58;

    delay(10);

  }

  // qui stampo le informazioni lette potrei collegare a Arduino un display che mi fa vedere tutto quello che sta facendo

  Serial.print("U: ");

  printArray(rangevalue,arraysize);

  isort(rangevalue,arraysize);

  Serial.print("S: ");

  printArray(rangevalue,arraysize);

  modE = mode(rangevalue,arraysize);

  Serial.print("La media dei valori letti è: ");

  Serial.print(modE);

  Serial.println();

  delay(1000);

  

  //Qui attivo la pompa per il rabbocco 

    if(modE > rabbocco) {        // se il valore modE (media dei valore letti dal sensore) è maggiore di rabbocco (rabbocco è stta definita sopre = a 20)

    digitalWrite(ledPin, HIGH);  // attivo rele pompa

    }

    else {                        // se modE è minore di rabbocco

    digitalWrite(ledPin, LOW);    //allora spegni la pompa

    }

}

  // questo mi permette di accendere le luci 

void AccendoLuce()

{

  

    hours=hour();;

    minutes=minute();

    seconds=second();

    

      if (hours >= ORELUCION && minutes == MINUTILUCEON && hours <= ORELUCIOFF && minutes == MINUTILUCEOFF){  //condizione temporate se l'orario è compreso tra.....

     Serial.println("ACCENDO_LUCI");    // stampo sulla console accendo le luci

     Serial.print(hour());              // stampo sono le ore...

     Serial.print(":");

     Serial.print(minute());            // stampo sono i minuti

     Serial.print(":");

     Serial.println(second());

     digitalWrite(LUCI,HIGH);           // dico a arduino di attivare il rele' e le luci si accendono

     delay(1000);

    }

    else {                              // se le condizioni temporali non sono rispettate spegni la luce          

     Serial.println("SPENGO_LUCI");      // stampo a console il messaggio spengo la luce

     Serial.print(hour());

     Serial.print(":");

     Serial.print(minute());            // stampo i minuti a console

     Serial.print(":");

     Serial.println(second());

     digitalWrite(LUCI, LOW);          // dico a arduino di spegnere le luci

     delay(1000);

    } 

}

// la funzione gestisce la co2 è inutile commentare basta vedere sopra come gestiamo le luci

void AccendoCo2()

    {

    hours=hour();;

    minutes=minute();

    seconds=second();

    

    if (hours >= ORECO2ON && minutes == MINUTICO2ON && hours <= ORECO2OFF && minutes == MINUTICO2OFF ){

     Serial.println("ACCENDO_CO2");

     Serial.print(hour());

     Serial.print(":");

     Serial.print(minute());

     Serial.print(":");

     Serial.println(second());

     digitalWrite(CO2,HIGH);

     delay(1000);

    }

    else {

    digitalWrite(CO2, LOW);

     Serial.println("SPENGO_CO2");

     Serial.print(hour());

     Serial.print(":");

     Serial.print(minute());

     Serial.print(":");

     Serial.println(second());

     delay(1000);

    }

}

// Funzione che mi permette di stampare l'array a console non toccare

void printArray(int *a, int n) {

  for (int i = 0; i < n; i++)

  {

    Serial.print(a[i], DEC);

    Serial.print(' ');

  }

  Serial.println();

}

// Riordino valoriletti, non toccare

void isort(int *a, int n){

  for (int i = 1; i < n; ++i)

  {

    int j = a[i];

    int k;

    for (k = i - 1; (k >= 0) && (j < a[k]); k--)

    {

      a[k + 1] = a[k];

    }

    a[k + 1] = j;

  }

}

//Funzione che mi ritorna la media dei valori letti.

int mode(int *x,int n){

  int i = 0;

  int count = 0;

  int maxCount = 0;

  int mode = 0;

  int bimodal;

  int prevCount = 0;

  while(i<(n-1)){

    prevCount=count;

    count=0;

    while(x[i]==x[i+1]){

      count++;

      i++;

    }

    if(count>prevCount&count>maxCount){

      mode=x[i];

      maxCount=count;

      bimodal=0;

    }

    if(count==0){

      i++;

    }

    if(count==maxCount){

      bimodal=1;

    }

    if(mode==0||bimodal==1){

      mode=x[(n/2)];

    }

    return mode;

  }

}

FINE SORGENTE


Lista dei materiali

Arduino non costa molto, circa 20,00€, il sensore ad ultrasuoni deve essere buono e questo costa circa 40,00€: con meno di 100,00€ Euro si può realizzare il tutto compresa l'implementazione della gestione dell'orario senza workaround provvisori. Di seguito la lista dove reperire il materiale:

- Sensore ad Ultrasuoni - MB1030 LV-MaxSonar-EZ3 - http://www.robot-italy.com/it/mb1030-lv-maxsonar-ez3-ultrasonic-sensor.html - http://www.maxbotix.com/documents/MB1030_Datasheet.pdf 

- Modulo RTC - DeadOn RTC - DS3234 Breakout http://www.robot-italy.com/it/deadon-rtc-ds3234-breakout.html

- Arduino UNO SMD Rev3 http://www.robot-italy.com/it/arduino-uno-smd-rev3.html

- Scheda Relè due relè - Dual Relay Board http://www.robot-italy.com/it/3051-dual-relay-board.html

Osservazioni

Sicuramente esiste qualcosa di già fatto in giro, ma fa solo da osmoregolatore, non gestisce luci CO2 e quant’altro. Arduino inoltre è particolarmente scalabile e permette la gestione anche di più acquari contemporaneamente. Inoltre tutti i valori e le impostazioni possono essere memorizzate in un database, il tutto può essere governato da un cellulare o da un tablet, insomma Arduino può fare anche il caffè, o quasi!


Immagini: le foto presenti nell'articolo sono state prese dal sito www.robot-italy.com 

TUTTO L'ARTICOLO IN OGNI SUA PARTE E' DI PROPRIETA' ESCLUSIVA DI DOMENICO FERRARI E MASSIMO IANNELLA, TUTTI I DIRITTI RISERVATI - QUALSIASI USO PARZIALE O TOTALE DOVRA' ESSERE AUTORIZZATO