Progetto controllo acquario

Ciao a tutti,
sono ignorante in materia, da qualche tempo provo a documentarmi e prendere spunto da articoli su internet e progetti già realizzati per automatizzare in parte il mio acquario.
E' il primo post che apro su questo forum e spero di non aver sbagliato sezione, detto ciò vorrei spiegarvi il mio progetto e avere consigli da parte vostra su come procedere.
Vorrei, tramite arduino uno, avere il controllo dell'acqua evaporata, della gestione della temperatura e della visualizzazione a schermo dei parametri letti.
Per fare ciò ho acquistato tre sensori galleggianti, due di questi usati per avere una doppia lettura della vasca principale(semmai uno dovesse bloccarsi per svariati motivi) e uno da inserire nella vasca di rabbocco per evitare che la pompa si bruci se si finisce l'acqua.
Per la temperatura vorrei comandare il riscaldatore(220v 250W) tramite relay https://it.aliexpress.com/item/5V-30A-Two-way-isolation-relay-module-High-low-level-trigger-5V-30A-1-Channel-Relay/32717908978.html?spm=2114.13010608.0.0.pevPtQ e un altro relay a due canali che mi servirà per comandare la pompa di rabbocco e la ventola per il raffrescamento https://it.aliexpress.com/item/2PCS-LOT-New-5V-2-Channel-Relay-Module-Shield-for-Arduino-ARM-PIC-AVR-DSP-Electronic/1356430969.html?spm=2114.13010608.0.0.uHqCDa
Ho messo un buzzer passivo per segnalare la mancanza dell'acqua o il malfunzionamento dei sensori galleggianti, solamente che ho notato che scalda un pò e si sente un fioco "fruscio" anche quando dovrebbe essere inattivo.
Vi posto l'immagine dei collegamenti, li ho già provati e il circuito mi funziona, solamente che vorrei capire come alimentare il tutto perchè arduino non ce la fa ad alimentare contemporaneamente i relay e lcd(20x4 con interfaccia i2c). Ho pensato di mettere tutto all'interno di una pulsantiera per esterni a 6 posti.

/*
  Codice controllo acquario marino 08.04.2017 v. 1.1.1
  futura implementazione:
  -lettura 2 sensori temp+visualizzazione a LCD
  -inserimento sonda PH
  -inserimento redox
*/

#include <Wire.h>  // Comes with Arduino IDE
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include "RTClib.h"
#define ONE_WIRE_BUS 2
#define buzzer 3
OneWire ourWire(ONE_WIRE_BUS);
DallasTemperature sensors(&ourWire);

// set the LCD address to 0x27 for a 20 chars 4 line display
// Set the pins on the I2C chip used for LCD connections:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address
RTC_DS1307 rtc;    // Create a RealTimeClock object

//imposto le variabili gestione temperatura
int riscaldatore = 12;  //riscaldatore
int tempoTemp = 0;    //imposto il ritardo di lettura temperatura
int fan = 11;           //ventilatore
float Tmax = 25.5;      //imposto la Temperatura max
float Tmin = 22.5;      //imposto la Temperatura min

//imposto le variabili rabbocco osmosi
int pompa = 7;    //pompa rabbocco 5v
int galle1 = 8;   //sensore galleggiante 1 livello acqua bassa sump
int galle2 = 9;   //sensore galleggiante 2 livello acqua bassa sump
int galle3 = 10;  //sensore galleggiante 3 livello acqua bassa sump
int led = 13;     //led controllo lampeggiante
int tempo = 200;  // tempo lampeggio led controllo

void setup()
{
  //imposto gli input
  pinMode(riscaldatore, OUTPUT); //riscaldatore
  pinMode(fan, OUTPUT);          //ventilatore
  pinMode(galle1, INPUT);        //galleggiante 1
  pinMode(galle2, INPUT);        //galleggiante 2
  pinMode(galle3, INPUT);        //galleggiante 3
  pinMode(led, OUTPUT);          //led controllo
  pinMode(pompa, OUTPUT);        //pompa rabbocco
  pinMode(buzzer, OUTPUT);       //suoneria

  Serial.begin(9600);
  Serial.println("Gestione Acquario 1.1.1");
  Serial.println("Lettura temperatura e gestione rabbocco");
  sensors.begin();           //inizializzo il sensore temp
  sensors.setResolution(11); //imposto la risoluzione;
  rtc.begin();               // inizializzo l'RTC
lcd.begin(20, 4);            //inizializzo lcd
  /*
     avvio display
  */
  lcd.setCursor(0, 0);
  lcd.print("Automazione Acquario");
  lcd.setCursor(5, 1);
  lcd.print("Reef Tank");
  delay(800);
  lcd.setCursor(11, 2);
  lcd.print("F.Scucces");
  delay(1200);
  lcd.setCursor(0, 3);
  lcd.print("Loading.");
  delay(300);
  lcd.setCursor(0, 3);
  lcd.print("Loading..");
  delay(300);
  lcd.setCursor(0, 3);
  lcd.print("Loading...");
  delay(200);
  lcd.setCursor(0, 3);
  lcd.print("Loading....");
  delay(3000);
  lcd.clear();

  /*
    ( SET the date and time.  Comment OUT these lines after setting )
  */
  // Put these "//" in front of the line you do NOT want to use
  // following line sets the RTC to the date & time this sketch was compiled
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  // This line sets the RTC with an explicit date & time, for example to set
  // May 21, 2015 at 6pm you would call: (use 24 hour time)
  //    rtc.adjust(DateTime(2015, 5, 21, 18, 0, 0));
  /*
    avvio il buzzer
  */
  for (int i = 0; i < 100; i++) {
    digitalWrite(buzzer, HIGH);
    delay(1);
    digitalWrite(buzzer, LOW);
    delay(1);
  }
}

void loop() {
  /*
       codice per rtc
  */
  DateTime now = rtc.now();  // Read data from the RTC Chip
  if (now.day() < 10) Serial.print("0");
  Serial.print(now.day(), DEC);
  Serial.print('.');
  if (now.month() < 10) Serial.print("0");
  Serial.print(now.month(), DEC);
  Serial.print('.');
  if (now.year() < 10) Serial.print("0");
  Serial.print(now.year(), DEC);

  Serial.print(' ');
  if (now.hour() < 10) Serial.print("0");
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  if (now.minute() < 10) Serial.print("0");
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  if (now.second() < 10) Serial.print("0");
  Serial.print(now.second(), DEC);
  Serial.println();

  lcd.setCursor(0, 0);
  if (now.day() < 10) lcd.print("0");
  lcd.print(now.day(), DEC);
  lcd.print('.');
  if (now.month() < 10) lcd.print("0");
  lcd.print(now.month(), DEC);
  lcd.print('.');
  if (now.year() < 10) lcd.print("0");
  lcd.print(now.year(), DEC); //
  lcd.print("  ");
  if (now.hour() < 10) lcd.print("0");
  lcd.print(now.hour(), DEC);
  lcd.print(':');
  if (now.minute() < 10) lcd.print("0");
  lcd.print(now.minute(), DEC);
  lcd.print(':');
  if (now.second() < 10) lcd.print("0");
  lcd.print(now.second(), DEC);

  /*
     codice per gestione temperatura
  */
  sensors.requestTemperatures();  //misuro la temp
  Serial.print("Temperatura= ");
  float temp = (sensors.getTempCByIndex(0));
  Serial.print(temp);
  Serial.println(" C");
  lcd.setCursor(0, 1);
  lcd.print("T:");
  lcd.print(temp);

  if (temp >= Tmax) {          //temperatura ALTA
    digitalWrite(fan, LOW);   //accendo il ventilatore
    delay(tempoTemp);
    lcd.setCursor(0, 3);
    lcd.print("Fan  ON");
    Serial.print("Ventilatore  ON");
    Serial.print("   ");
  }
  else {
    (temp <= Tmax);
    digitalWrite(fan, HIGH) ;   //temperatura BASSA
    delay(tempoTemp);         //spengo il ventilatore
    lcd.setCursor(0, 3);
    lcd.print("        ");
    Serial.print("Ventilatore OFF");
    Serial.print("   ");
  }

  if (temp >= Tmin) {                  //temperatura ALTA
    digitalWrite(riscaldatore, LOW);   //spengo il riscaldatore
    delay(tempoTemp);
    Serial.println("Riscaldatore OFF");
  }
  else {
    (temp <= Tmin);
    digitalWrite(riscaldatore, HIGH) ;   //temperatura BASSA
    delay(tempoTemp);                  //accendo il riscaldatore
    lcd.setCursor(0, 3);
    lcd.print("Heat ON          ");
    Serial.println("Riscaldatore ON");
  }

  /*
     codice per rabbocco osmosi
  */
  int valgalle1 = digitalRead(galle1); //legge valore sensore galleggiante 1 sump
  int valgalle2 = digitalRead(galle2); //legge valore sensore galleggiante 2 sump
  int valgalle3 = digitalRead(galle3); //legge valore sensore galleggiante 3 sump

  if (digitalRead(galle3) == LOW) {  //livello acqua sump basso e livello osmosi basso
    digitalWrite(pompa, HIGH); //pompa spenta
    lcd.setCursor(0, 3);
    lcd.print("Aggiungere OSMOSI");
    Serial.print("Pompa osmosi OFF");
    Serial.print("  ");
    Serial.println("livello osmosi Basso");
    digitalWrite(buzzer, HIGH);      //attivo la suoneria
    delay(1);
    digitalWrite(buzzer, LOW);
    delay(1000);
  }
  else if (digitalRead(galle1) == HIGH && digitalRead(galle2) == HIGH) {//livello acqua sump OK e livello osmosi OK
    digitalWrite(pompa, HIGH);          //pompa spenta
    delay(tempo);
    lcd.setCursor(9, 3);
    lcd.print("       ");
    Serial.println("Pompa osmosi OFF");
  }
  else if (digitalRead(galle1) == LOW && digitalRead(galle2) == LOW) {  //livello acqua sump basso e livello osmosi OK
    digitalWrite(pompa, LOW); //pompa accesa
    digitalWrite(led, HIGH);
    delay(tempo);
    digitalWrite(led, LOW);
    delay(tempo);
    lcd.setCursor(0, 3);
    lcd.print("Pump ON          ");
    Serial.println("Pompa osmosi ON");
  }
  else if (digitalRead(galle1) != digitalRead(galle2)) { //se i due sensori non hanno lo stesso valore
    digitalWrite(pompa, HIGH);                         //spengo la pompa
    lcd.setCursor(0,3);
    lcd.print("Verifica Gallegg.");
    Serial.println("Verificare galleggianti");
    digitalWrite(buzzer, HIGH);      //attivo la suoneria
    delay(100);
    digitalWrite(buzzer, LOW);
    delay(2000);
  }
  Serial.print("Galleggiante1=");
  Serial.println(digitalRead(galle1));
  Serial.print("Galleggiante2=");
  Serial.println(digitalRead(galle2));
  Serial.print("Galleggiante3=");
  Serial.println(digitalRead(galle3));
  Serial.println("");
}

Io utilizzerei un riscaldatore con termostato incorporato comunemente specifico x acquari dispensando Arduino della sua attivazione , usando Arduino solo per controllo temperatura che con un secondo buzzer segnalerei un'eventuale anomalia ( tipo riscaldatore non funziona) , e per il livello acqua e ventola .
Per l'alimentazione usa gli output di Arduino per innescare transistor di potenza che con un'altra fonte di alimentazione alimenti relè e ventola .

1 Like

Ottima discussione, seguo.

fedeMO:
... Per la temperatura vorrei comandare il riscaldatore(220v 250W) tramite relay https://it.aliexpress.com/item/5V-30A-Two-way-isolation-relay-module-High-low-level-trigger-5V-30A-1-Channel-Relay/32717908978.html?spm=2114.13010608.0.0.pevPtQ ...

Ti consiglio caldamente di seguire le indicazioni di "Inferro2004" e di proseguire il tuo thred nel rispetto del punto 15. del REGOLAMENTO, o ... sarò obbligato a chiudere la discussione :confused:

Guglielmo

Esatto Guglielmo ,
Ragazzi non scherziamo con l'elettricità in quanto letale .
L'elettronica è una grande passione ma va seguita con criterio nel rispetto della sicurezza , finché si parla di corrente continua a basso amperaggio va bene per tutti ( al massimo ci rimettiamo qualche € e tutto il tempo perso ) , ma se teniamo conto che molte cose sono già presenti in commercio (a norma di legge) non vale la pena rischiare .

FedeMo stasera ti faccio uno schizzo della parte analogica ma ti escludo la resistenza .
Faccio presente che sono un autodidatta che da anni fa pratica seguendo e realizzando circuiti presi su internet , quindi se c'è qualcuno che voglia giudicare ed approvare il mio schema ben venga.
Saluti a tutti.

Inferro2004:
Esatto Guglielmo ,
Ragazzi non scherziamo con l'elettricità in quanto letale .

+1
... ed in questo caso ancora di più visto che abbiamo il mix di elettricità ed acqua !!!

Guglielmo

1 Like

Scusate la qualità del disegno ma spero che renda l'idea .

All'uscita output di Arduino c'è una resistenza che credo 330 hom dovrebbe andare bene , collegata alla base del npn ( in base al relè utilizzato , un comune bc547 va bene per relè che non assorbono oltre 500mA ) innesca il transistor che eccita il relè , vedi un diodo 1n4007 collegato ai poli della bobina che serve ad evitare che la bobina restituisce corrente a causa della sua induttanza .
In questo modo utilizzi poca corrente da Arduino in quanto per eccitare il relè usi un'altra fonte ( non obbligatoria se proteggi il circuito ) , in seguito la ventola o la pompa li colleghi ai perni del relè che vengono collegati alla rete .
Un circuito così semplice necessità di una piastra saldando ed isolando bene le saldature in particolare se ai contatti del relè ( pompa o ventola ) usi corrente a 220 v , quindi ATTENZIONE a cosa fai , prima x te stesso e poi per i cari pesciolini , elettricità + acqua = corto circuito = elettrolisi , quindi a monte di tutto il circuito un bel fusibile ci sta tutto .

Inferro2004:
... saldando ed isolando bene le saldature in particolare se ai contatti del relè ( pompa o ventola ) usi corrente a 220 v , quindi ATTENZIONE a cosa fai , prima x te stesso e poi per i cari pesciolini ...

NO, non ci siamo capiti ...
... qui NON si parla di 220V, quindi ... ho tutte quelle cose funzionano a bassissima tensione (es. 12V o 24V) e dimensioniamo tutto per queste tensioni discutendo solo di oggetti in "bassissima tensione" o ... il thread viene chiuso.

Guglielmo

1 Like

Scusa Guglielmo hai ragione , mi è sfuggito .
Fede per le ventole può usare tranquillamente ventole da PC che lavorano a 12 V , per la pompa può rinunciare.
Anch'io ho un acquario e la pompa non si spegne in un acquario , è di vitale importanza .
Fede che vuoi fare ?

1 Like

Inferro2004:
... per la pompa può rinunciare.

Un tempo avevo anche io un acquario (... marino mediterraneo) e ricordo che, cercando, le pompe a bassissima tensione si trovano :wink:

Esempio, vedo che su eBay le hanno :slight_smile:

Guglielmo

1 Like

Si si trova di tutto , non per frenare le fantasie ma ne vale la pena ?! Se vuoi far da te per risparmiare e poi spendi un botto :slight_smile: , tanto vale usare i metodi convenzionali , garantiti e a norma cioè senza modifiche dell'acquario acquistato.
Se non c'è uso intelligente che senso ha ?
Giusto x dire , fede vuole monitorare l'evaporazione ma in acquariofilia è risaputo che l'acqua va rinnovata per abbassare i valori di NO2 e NO3 letali per i pesci non acqua perpetua .
Complicarsi la vita con la resistenza non ne vale la pena .....Ma basterebbe una candeletta auto diesel che ti costa il triplo di un comune riscaldatore per acquari ahahah x non parlare dell'alimentazione .

Un bel progetto Alba tramonto da più soddisfazione , con questo chiudo ,adesso aspetto opinioni di fede che è l'unico che non si esprime , ciao a tutti

Inferro2004:
... Se vuoi far da te per risparmiare e poi spendi un botto :slight_smile: , tanto vale usare i metodi convenzionali ...

... mai voluto fare nulla con questo scopo, ma sempre e solo per ottenere quello che IO voglio e non quello che il prodotto commerciale offre, anche perché, tra il mio tempo e il materiale, se dovessi farlo solo per risparmiare ... sarei sempre in perdita ! :smiley: :smiley: :smiley:

Guglielmo

chiedo scusa se non ho risposto prima, ma tra lavoro e impegni vari non ho molto tempo disponibile.
Accetto il consiglio del riscaldatore e lo toglierò dal progetto, mi ero fatto prendere dall'idea di controllare tutto con arduino...per il resto vi posso garantire che userò tutto a 5v, sia pompa di rabbocco che ventola..questi li ho già e hanno l'attacco usb.
appena ho qualche minuto cercherò di capire lo schemma di inferro2004, non perchè non sia chiaro ma per me ogni componente e nome è nuovo...
Volevo chiedervi come posso alimentare il tutto, la pompa consuma al max 6w a 5v, la ventola non lo so ma l'anno scorso la facevo andare con il caricabatterie del cell. Avevo pensato di prendererì un alimentatore a 5v e alimentare sia gli output che arduino da quello, è fattibile?

dimenticavo di ringraziarvi per l'attenzione che mi state dedicando.

Sicuramente è fattibile, ma ... dato il costo esiguo degli alimentatori, ti consiglio caldamente di tenere separate l'alimentazione del solo Arduino da quella di tutto il resto (relè inclusi).

Prendi moduli relè che hanno accoppiatori ottici (esempio come QUESTO) così da avere la massima separazione ed il minor rischio di ritorno di disturbi ... che sono poi i problemi principali che si incontrano.

Guglielmo

Inferro2004:
Scusate la qualità del disegno ma spero che renda l'idea .

All'uscita output di Arduino c'è una resistenza che credo 330 hom dovrebbe andare bene , collegata alla base del npn ( in base al relè utilizzato , un comune bc547 va bene per relè che non assorbono oltre 500mA ) innesca il transistor che eccita il relè , vedi un diodo 1n4007 collegato ai poli della bobina che serve ad evitare che la bobina restituisce corrente a causa della sua induttanza .
In questo modo utilizzi poca corrente da Arduino in quanto per eccitare il relè usi un'altra fonte ( non obbligatoria se proteggi il circuito ) , in seguito la ventola o la pompa li colleghi ai perni del relè che vengono collegati alla rete .
Un circuito così semplice necessità di una piastra saldando ed isolando bene le saldature in particolare se ai contatti del relè ( pompa o ventola ) usi corrente a 220 v , quindi ATTENZIONE a cosa fai , prima x te stesso e poi per i cari pesciolini , elettricità + acqua = corto circuito = elettrolisi , quindi a monte di tutto il circuito un bel fusibile ci sta tutto .

spero mi sopportiate ma anche se elementari per me questi disegni tecnici non sono di facile lettura, ho provato a disegnarlo con frtizing, mi puoi dire se corretto?

gpb01:
Sicuramente è fattibile, ma ... dato il costo esiguo degli alimentatori, ti consiglio caldamente di tenere separate l'alimentazione del solo Arduino da quella di tutto il resto (relè inclusi).

Prendi moduli relè che hanno accoppiatori ottici (esempio come QUESTO) così da avere la massima separazione ed il minor rischio di ritorno di disturbi ... che sono poi i problemi principali che si incontrano.

Guglielmo

volevo se possibile utilizzare unico alimentatore perchè devo mettere il tutto in un vano picccolino dove ci sono già un pò di alimentatori per l'acquario...accetto molto il consiglio ma se possibile opterei per l'ipotesi originaria..magari mettendo nel circuito qualche componente necessario per evitare noie.
ho già preso un modulo contente due relè a 5v, avevo riportato il link all'inizio del post, va bene questo? come mai ho il problema del buzzer che scalda?

un altra cosa di cui volevo parlarvi, sto pensando di aggiungere un esp8266 per creare un file log dei valori letti e consultarli su internet, da quel poco che ho letto devo alimentare a 3,3v...posso usare l'alimentazione di arduino ?

Salve. A tutti circa un anno fa mi sono imbattuto nella progettazione di una centralina per acquario che faceva per le mie. Esigenze, praticamente controllavo temperatura dell acqua ed attivavo il riscaldatore tramite dei relè però dai relè che avevo montato sull' arduino gestivo altri relè a 12v di potenza. Poi controllavo se la temperatura min e max da me settata fosse nella norma altrimenti sul display avevo una segnalazione con un led ad alta luminosità e la scritta temperatura alta o bassa lampeggiante.poi sempre ad orario accendevo le luci e comandavo a tempo ed a orario il vulcano che.piaceva molto ai miei figli ma per l' acquario non è molto indicato.

No non va bene , perché :
In questo modo hai sempre tutto collegato alla stessa alimentazione senza alcuna protezione per Arduino da effetti di risonanza dovuto alle bobine dei relè oltre ai cali di tensione all'accensione del relè ;
Il diodo lo hai messo al contrario , in quel modo non passa la corrente , oltre al fatto che il circuito del relè è errato , nel relè hai 5 piedini di cui due sono i capi della bobina e 3 i contatti di NA e NC e comune .
Se guardi bene lo schema capirai .
Ti posso consigliare di fare un giro sul sito " Schemi e circuiti elettronici di Vittorio Crapella "dove trovare tanti circuiti da cui potrai capire come configurare relè ed alimentazione .

Io sceglierei sempre due alimentatori che sono abbastanza piccoli tipo l'alimentatore di Arduino grande quanto un comune carica batteria Cell.

Ho provato a cercare ma non sono riuscito a trovare nulla che sia uguale al mio relè..Il mio era funzionare lo devo collegare al gnd-vcc-in.
Per il buzzer mi sapete dire qualcosa?

Si a vederlo non devi fare nessun circuito in quanto è già protetto e pronto per collegarlo all'uscita output di Arduino .
Per il buzzer non so dire molto , se scalda dovrebbe significare che rimane sotto tensione quando dovrebbe stare spento .