Arduino & acquario

Salve sono nuovo di questo forum, ma iniziando a leggere ho trovato diversi post che riguardano acquario ed arduino, visto che anche io sarei interessato a realizzare una centralina mi chiedo se può essere utile al posto di chiedere consigli sulle singole questioni reliazzare un gruppo di lavoro per la realizzazione di un controller modulare in modo che poi ognuno possa realizzare i moduli che gli interessano.

Premetto che non sono un buon elettronico per cui chi voglia cimentarsi nella realizzazione può scrivere a questo post per formare il gruppo al momento sto realizzando una bozza di quello che dovrebbe fare il controller ovviamente pareri aperti a tutti
grazie

To un'altro!!! Ma spuntano come i funghi ...
Benvenuto penso che prima o poi ci faranno un post tra quelli importanti ;D ;D ;D.
Io sono più che disponibile, qualche cosa l'ho già realizzata e ho già acquistato ma per fare una cosa comune posso rifare tutto, se vuoi condivido molto volentieri...
Dolce o marino?
Hai già acquistato il materiale?

Michele

per il momento sto all'inizio, per il momento dolce,
quello che hai realizzato che fa?

Ciao! sono nuovo in tutto! :o ho ordinato l'arduino...quando arriva capisco cos'è!!! Io ho un acquario dolce che aspetta di essere elaborato!!! penso che l'arduino sia perfetto per una centralina multigestionale......luci, pompe, maree...e tutto il necessario per il nostro mondo!!!! resto in attesa di buone nuove...... Grazie a tutti voi...che scrivete e modificate codici...io al massimo monto e smonto componenti elettronici...

Vincenzo :wink:

Ciao Vincenzo siamo in 2 allora con la voglia di sviluppare un bel controller, miky è disponibile ed aiutarci, possiamo pensare a come strutturare la cosa
La mia idea era di visualizzare tutto su un LCD 4X20

le prime 2 righe della schermata principale
12/10/2010 ore 12.45.33
Ta=24.9 Te=20.3 Ph=6,99

sono nell'ordine data orario
Ta temperatura acqua, Te temperatura esterna ed il Ph

idee su cosa visualizzare nelle altre 2

poi sto pensando ai vari sotto menù
che serviranno

per le uscite avevo pensato a queste 10
Uscite
1-termoriscaldatore
2-raffreddamento
3-elettrovalvola
4-luci 1
5-luci2
6-luci 3/ generica
7-luci 4/ generica
8-luna
9-filtro
10-mangiatoia

Ottimo allora prima mettete da dove siete sul profilo che magari abitiamo vicino di casa.
La parte base penso sia che per dolce che per marino siano identiche quindi la parte base potrebbe essere comune a tutti.
Io ho per il momento ho da gestire 16 uscite relay che dovrebbero gestire:

1 POMPA MANDATA 1
2 HQI LUCE 1
3 T5 LUCE 1
4 POMPA SK1
5 REA
6 CO2
7 RABBOCCO 1
8 RABBOCCO 2

1 POMPA MANDATA2
2 HQI LUCE 2
3 T5 LUCE 2
4 POMPA SK1
5 RISCALDA 1
6 RISCALDA 2
7 LUNARE
8 MOVIMENTO CAMBIO

Anche io ho un LCD 4x20 e 4 sonde di temperatura .....
magari se comperiamo tutti componenti con le stesse caratterstiche viene fuori uno standard .... oppure possiamo fare più versioni :slight_smile:

per le uscite avevo pensato a pilotarle
attraverso un fotoaccoppiatore e relativo triac
fatto funzionare in I2C del quale ho già lo schema elettrico

Per le temperatura perchè 4 sonde?
cosa usi io pensavo elle Ds18B20

per le uscite penso che rimodulando la disposizione possiamo fare da un lato le uscite comuni e sul secondo gruppo solo le aggiuntive per marino

si la mia idea di fare una cosa grossomodo standard che ognuno poi usa in base alle esigenze

Quattro sonde perchè 3 in vasca in modo da verificare se ci sono scostamenti nel caso una sballi poi la vasca e 230x100x600 e una nella sump giusto per averla ...

per le uscite si potrebbe fre come sul AquaSmart che hai la possibilità di definire tu dove attacchi la cosa, praticametne il programma contiene tutte le funzioni e tu poi gli dici che sull'uscita 4 hai la pompa di mandata ....
il circuito quindi potrebbe essere standard e il programma avere tutto il codice, l'unica cosa per differenziarlo da dolce a marino sarebbe da riconfigurare le uscite ....

non avendo esperienza con circuiti io son partito con schede relay già assemblate e arduino mega .... connessione uno a uno :sunglasses: ...

tu quindi immagino che un po' di elettronica ne mastichi.

ciao

PS: avevi visto il msg privato?

Ciao! ho aggiornato le info...in effetti così è meglio!
Allora...
X alfa75
ottimo il display 4X20, nelle prime 2 righe concordo! nelle seconde si può pensare a visualizzare lo stato delle uscite!
per il pH? hai una sonda? come pensi di leggerlo?
per il resto mi sembra di concordare sul funzionamento.

in effetti si può fare come miky e usare 3 o 4 sonde di temperatura ( su e-bay con 15 euro ne porti a casa 10 di DS18B20),
usare una uscita PWM per fare l'alba tramonto magari con una plafo a led!!!,
bisogna in ogni caso implementare con un rtc, per l'ora.

pensavo di usare sia un encoder rotativo, magari con pulsante per le selezioni, poi una serie di pulsanti o una tastiera per le funzioni aggiuntive.... una cosa simile!
Per ora sono messo così....al lavoro e nel week-end penserò.... un po' a tutto! ::slight_smile:

Io avevo preso in prima battuta un LCD Grafico ma dopo un po' di prove ho utilizzato il 4x20 con comunicazione i2c più facile da gestire.
La mia schermata standard oltre a data e ora sulla prima riga sulla seconda e terza ha le info di temperatura e ph, mentre sulla quarta vorrei utilizzarla per fare scorrere dei messaggi di allarme o di info che non fanno scatare nessuna funzione .... ad esempio la fase della luna .... le info su quando ha fatto l'ultima apertura della sonda rabbocco o se la temperatura è in calo ... insomma info e basta.

Per visualizzare lo stato delel accensioni la mia videata standard cicla tra quelal delle temperature e quella delle accensioni che è di questo tipo:

X X X ON X X X
12345678 12345678
X X X OFF X X X

10 secondi una e 5 l'altra ....

Io ho optato per una pulsantiera a 12 tasti, che è gestita insieme al monitor, questo mi consente di lavorare tra i menu, impostare le ore per la programmazione oltre a poter gestire altre cose, ovvio che per farlo più semplice bastano tre tasti ma ti limiti

PEr le lampade prima cosa ho fatto le accensioni e lo spegnimento poi sicuramente userò PWM per fare il dimmer .... gestione dei led per la luce notturna sicurametne al momento non ho plafo led ma sicurametne ci arriviamo.

Mi picerebbe tantissssssssimo gestire anche le tunze di movimento ma lo tengo per ultimo.

Volevo creare anche una mangiatoia per le vacanze dato che quelle che ci sono in commercio fanno cXXXXe. Pensavo di utilizzare un servo che facesse girare un disco di cilindi contenenti la dose preparata ..... ma oramai di vacnaze se ne parla il prossim oanno quindi tutto in soffitta.

Gestirò poi in automatico il cambio dell'acqua, la vasca e forata per fare uscire un tot di acqua che poi viene cambiata con quella contenuta in una vasca di preparazione, le prime volte lo farò manualemnte.

Poi servono un po' di sensori di livello di max e minimo.
Sump Vasca e vasca di rabbocco per controllare le sonde dell'osmosi ..

Bhe per un po' penso di averne da fare.

Per la disposizone pensavo di mettere lcd e tastiera in posizione facilemtne accessibile mentre fare una scatola per i relè dalla quale escono più scatole gewis con spina dato che non vorrei tagliare gli originali delle spine (poi l'usato te lo svalutano) e portare la presa dove mi serve. Se si unsano dei connettori le prese possono essere spostate e attaccate a piacere oppure si può ambiare l'interno della scatola senza modificare l'esterno.

Allora da dove partiamo ... quanti siamo?

ma tu hai già implementato la parte rtc?
il punto di partenzza credo sia il progetto del controller e dei vari menù, per creare qualcosa di comune
poi iniziare la parte applicativa una volta accordatici sul da farsi

il disply grafico è un pallino che potremo vedere in fase 2 anche io sono stuzzicato ma l'ho accantonato per le difficoltà.
ps hai mp anche

:-? dunque...dunque....
Il progetto di Michele mi sembra già molto valido.... l'unica cosa sarebbe cambiare le schermate... e mettere le info in una schermata sua, così nella quarta riga della 1° videata si possono mettere le uscite attive. almeno...io la vedo così!
Per il display grafico, leggendo in giro non capisco se sia pilotabile via I2C come il 20X4 oppure no!
Il tastierino mi piace, ma vorrei anche l'encoder rotativo ( sono malato alle volte...).
Per il discorso posizionamento esterno dei relè.. se ne può parlare, in effetti si tratta di portare un cavo in una scatola!
Per ora è tutto!

così nella quarta riga della 1° videata si possono mettere le uscite attive. almeno...io la vedo così!

anche io ma idee come farlo???

Per il display grafico, leggendo in giro non capisco se sia pilotabile via I2C come il 20X4 oppure no!

fattibile ma non credo si semplice vorrei partire con una base funzionante lcd 20x4 poi con l'esperienza di questa usare un display a colori grafico molti lo fanno con arduino ci sono pure le shield

Il tastierino mi piace, ma vorrei anche l'encoder rotativo.
Per il discorso posizionamento esterno dei relè.. se ne può parlare, in effetti si tratta di portare un cavo in una scatola

l'encorder rotativo non so di cosa si tratta, per il tastierino ok per i relè io fare il tutto con una scheda di potenza i2c che per 8 uscite ho già pronta collegabile con filo dei telefoni stesso connettore 4 poli ,
In realtà metterei una scatoli solo display e taastiera sto preparando il pbc

ma idee di come abbozzare i menù?

ciao sono scatto di milano anche a me interessa l'idea di pilotare l'acquario marino con arduino e cestinare il mio plc purtroppo non ne capisco molto, domani sono in fiera e prendo un arduino, l'unica cosa è che volevo pilotare le luci led e quindi triggherarle visto che non ho più le luci neon. (praticamente impostare un ora in cui cominciano l'accensione le blu poi a metà blu fare andare anche le bianche su fino ad arrivare tutte e due al max)secondo voi è possiblile ???.
altro problema che ho visto è fare una sonda ph decente e poi gestire l'aggiustamento del ph che sarà opposto per marino e dolce mi date una manina :stuck_out_tongue:
cmq msn andrescatto@libero.it
per l'lcd secondo voi questo è difficile da far funzionare??????? http://cgi.ebay.it/ws/eBayISAPI.dll?ViewItem&item=220594603390&ssPageName=STRK:MEWNX:IT

l'LCD è bello ma non balla, credo che sia per uno step successivo quello al momento accontentiamoci del 4x20 poicheè non reputo sia facile da pilotare, per i neon si può fare cerchiamo di fare una parte base comune poi un parte evoluta per il marino per il momentoti aggiungo a msn
ciao

domani sono in fiera e prendo un arduino

Intendi la fiera a Malpensa?
Vale la pena ?

Ciao Grazie

Andrea

Ciao io ho preso direttametne un lcd 20x4 con un controller i2c lo paghi un po' di piu ma puoi anche fartelo .... io non ci ho manco provato preso e funziona benissimo.
PEr i menu io mi sono sbattuto e sono riuscito a gestire i menu.. vi posto il codice appena arrivo a casa così ci mettiamo le mani in tre ...
sono partito proprio dall'RTC quindi è gestito anche quello .... apriamo in google per gestire il codice?

ciao

Come pezzi base avevo pensato di dividere il controller
in 3 parti
1-core dove e arduino
2-lcd & tastiera
3-scheda di potenza costituite da 2 schede separate pilotate I2C

in modo da fare il modulo 1 solo per dolce chi mette 2 moduli ha tutte le uscite per il marino

per i menù nessuno ha qualche idea su come tentare di impostarli???

Alfa75,

anche se fa schifo nell'ordine e nella sintassi questo è quello che ho buttato giù fino ad ora, se hai suggerimenti e consigli ovviamente son ben accetti

/*========================================================================== Schede Relè   ======================================================================================

Variabile    Accessorio            Variabile       
  Stato                               Pin
R1          Pompa Mandata 1         PMand1
R2          HQI Luce 1              HQI1
R3          HQI Luce 2              HQI2
R4          Sonda Rabbocco          SRab
R5          Sonda Ricambio          SRic
R6          Sonda Sump              SSump
R7          Pompa Mandata Skimmer   PMandS  
R8          Pompa Skimmer           PAirSk

L1          Pompa Risalita 2        PMand2
L2          T5 Gruppo1              T5Gr1
L3          T5 Gruppo2              T5Gr2
L4          Pompa Cambio Acqua      PRic
L5          Riscaldatore Sump       TempS
L6          Pompa REA               PRea
L7          Pompe Corrente          PCorr1
L8          Pompe Corrente          PCorr2

===========================================================================    Definizione Pin     ==============================================================================*/

const int PMand1 = 22;         //fatta
const int HQI1 =  23;          //fatta
const int HQI2 =  24;          //fatta
const int SRab =  25;        
const int SRic =  26;
const int SSump =  27;
const int PMandS =  28;

const int PMand2= 29;         
const int PAirSk = 30;
const int T5gr1 = 31;
const int T5gr2 = 32;  
const int PRic =  33;
const int TempS = 34;
const int PRea =  35;
const int PCorr1 =  36;
const int PCorr2 =  37;   

/*========================================================================== Definizione Stati Relay      =======================================================================*/

int R1 = 0;                    //Pompa mandata 1
int R2 = 0;                    //Illuminazione HQI 1
int R3 = 0;                    //Illuminazione HQI 2
int R4 = 0;
int R5 = 0;
int R6 = 0;
int R7 = 0;
int R8 = 0;

int L1 = 0;                    //Pompa mandata 2
int L2 = 0;                    //Illuminazione T5 1
int L3 = 0;                    //Illuminazione T5 2
int L4 = 0;
int L5 = 0;
int L6 = 0;
int L7 = 0;
int L8 = 0;

int SR1, SR2;                  //Variabili per lo storico
/*========================================================================== Variabili di temporizzazione =======================================================================*/
int keyInput, livello, menu;
long tempo_btn = 0, debounce = 500, tempo_men = 0, ritorno;  //Tempo tra due letture successive di un bottone (500 ms)
// DS1307 funzioni ora
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
int fullYear, phase, fase;
long YY, MM, K1, K2, K3, JD;  
double AG, IP;   
/*===============================================================================================================================================================================*/

// Definizione delle variabili temporali

int mil_time= 0;

int rol_mandata = 1;                      //Intervallo alternanza della pompa di mandata 
int mil_mandata = 0;

/*
ALBA                  TRAMONTO
Accendo T5 1          Spengo HQI 1
Accendo T5 2          Spengo HQI 2
Accendo HQI 1         Spengo T5 1
Accendo HQI 2         Spengo T5 2
*/

//int alba = 30;
//int tramonto = 30;

int T5gr1_on = 32;
int T5gr2_on = 33;
int HQI1_on = 34;                       //Accendione lampada HQI Gruppo 1
int HQI2_on = 35;                      //Accendione lampada HQI Gruppo 2

int HQI1_off = 36;                     //Spegnimento lampada HQI Gruppo 1
int HQI2_off = 37;                      //Spegnimento lampada HQI Gruppo 2
int T5gr1_off = 38;
int T5gr2_off = 39;

/*========================================================================== Variabili di inclusione ============================================================================*/
#define VERSION "1.00"
#include <OneWire.h>
#include <Wire.h>
#include <DallasTemperature.h>
#include <LCDi2cR.h>  
#define DS1307_I2C_ADDRESS 0x68
LCDi2cR lcd = LCDi2cR(4,40,0x63,0);


#define DS1307_I2C_ADDRESS 0x68
#define ONE_WIRE_BUS 3
#define TEMPERATURE_PRECISION 9
/*===============================================================================================================================================================================*/
/*==========================================================================     configurazione temperature   ===================================================================*/
// 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);

// arrays to hold device addresses
DeviceAddress Ther0, Ther1, Ther2;

/*==========================================================================     configurazione rtc  ============================================================================*/
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
  return ( (val/10*16) + (val%10) );
}

// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return ( (val/16*10) + (val%16) );
}

void getDateDs1307(byte *second,
          byte *minute,
          byte *hour,
          byte *dayOfWeek,
          byte *dayOfMonth,
          byte *month,
          byte *year)

{
  // Reset the register pointer
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.send(0);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

  // A few of these need masks because certain bits are control bits
  *second     = bcdToDec(Wire.receive() & 0x7f);
  *minute     = bcdToDec(Wire.receive());
  *hour       = bcdToDec(Wire.receive() & 0x3f);  // Need to change this if 12 hour am/pm
  *dayOfWeek  = bcdToDec(Wire.receive());
  *dayOfMonth = bcdToDec(Wire.receive());
  *month      = bcdToDec(Wire.receive());
  *year       = bcdToDec(Wire.receive());
}

/*===============================================================================================================================================================================*/



void setup()
{
  lcd.clear();
  lcd.init();  
  lcd.setCursor(0,5);
  lcd.print("Open Reef");             // Show Version
  lcd.setCursor(1,8);
  lcd.print (VERSION);
  keyInput=40;
  menu=0;
  delay(5000);
  Serial.begin(9600);
int R1 = 0;
/*==========================================================================     verifica setup sonde============================================================================*/


 // start del monitor sotto la data
   lcd.setCursor(3,0);
   lcd.print("IC Control Library");

  // Start up the library
  sensors.begin();

  // locate devices on the bus
  lcd.setCursor(3,0);
  //lcd.print("Locating devices...");
  lcd.print("Found ");
  lcd.print(sensors.getDeviceCount(), DEC);
  lcd.println(" devices.");
  // report parasite power requirements
  lcd.setCursor(3,0);
  lcd.print("ParasitePower is: "); 
  if (sensors.isParasitePowerMode()) lcd.print("ON");
  else lcd.print("OFF");
  delay(1000);

// assign address manually.  the addresses below will beed to be changed
  // to valid device addresses on your bus.  device address can be retrieved
  // by using either oneWire.search(deviceAddress) or individually via
  // sensors.getAddress(deviceAddress, index)
  //insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };
  //outsideThermometer   = { 0x28, 0x3F, 0x1C, 0x31, 0x2, 0x0, 0x0, 0x2 };

  // search for devices on the bus and assign based on an index.  ideally,
  // you would do this to initially discover addresses on the bus and then 
  // use those addresses and manually assign them (see above) once you know 
  // the devices on your bus (and assuming they don't change).
  // 
  // method 1: by index
  lcd.clear ();
  lcd.print ("Errori rilevamento");
  lcd.setCursor (1,0);
  if (!sensors.getAddress(Ther0, 0)) lcd.print ("Non rilevato Device0");
  lcd.setCursor (2,0);
  if (!sensors.getAddress(Ther1, 1)) lcd.print ("Non rilevato Device1");
  lcd.setCursor (3,0);
  if (!sensors.getAddress(Ther2, 2)) lcd.print ("Non rilevato Device2");

  
  // Definiamo la funzione dei pin

  pinMode(PMand1, OUTPUT);
  pinMode(HQI1, OUTPUT);
  pinMode(HQI2, OUTPUT);
  pinMode(SRab, OUTPUT);  
  pinMode(SRic, OUTPUT);
  pinMode(SSump, OUTPUT);  
  pinMode(PMandS, OUTPUT);
  pinMode(PAirSk, OUTPUT);
  pinMode(PMand2, OUTPUT);
  pinMode(T5gr1, OUTPUT);
  pinMode(T5gr2, OUTPUT);
  pinMode(PRic, OUTPUT);
  pinMode(TempS, OUTPUT);  
  pinMode(PRea, OUTPUT);
  pinMode(PCorr1, OUTPUT);  
  pinMode(PCorr2, OUTPUT);
  //delay (1000);
void loop()
{
   getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
   mil_time = (hour *100) + minute;
   fullYear = (2000 + year);
 
   keyInput=lcd.keypad();
 
 if (menu == 0 && keyInput == 20)
 { 
    menu = 1;
 }
 if (menu == 0 && keyInput ==40)
  { 
    menu = 40;
 }
 switch (menu)
  { 
  case 40:
    //Schermata ciclo sistema
    lcd.clear();
    menu1();
    menu = 0;
    delay(100); 
    break;
    
  case 1:
 
    lcd.clear();
    lcd.setCursor(0,0);        
    lcd.print("MENU PRINCIPALE   ");             
    lcd.setCursor(1,0);        
    lcd.print("1 REGOLAZIONI");
    lcd.setCursor(2,0);
    lcd.print("2 ACCENSIONI ");
    lcd.setCursor(3,0);
    lcd.print("3 TARATURA ");
    
    keyInput=lcd.keypad();
    
    if(keyInput == 1)
    {
    menu = 11;
    tempo_btn = millis();   
    }
    if(keyInput == 2)
    {
    menu = 12;
    tempo_btn = millis();   
    }
    if(keyInput == 3)
    {
    menu = 13;   
    tempo_btn = millis();
    }
    if(keyInput == 30)
    {
    menu = 0;   
    tempo_btn = millis();
    }
    delay(100);
    break;
 case 11:
    //Schermata menu regolazioni
    lcd.clear();
    lcd.setCursor(0,0);        
    lcd.print("MENU REGOLAZIONI   ");
    lcd.setCursor(1,0);        
    lcd.print("1 DATA E ORA ");
    lcd.setCursor(2,0);        
    lcd.print("2 VARIABILI  ");
    lcd.setCursor(3,0);  

    keyInput=lcd.keypad();
    if(keyInput == 1 && millis() - tempo_btn > debounce)
    {
    menu = 21;
    tempo_btn = millis();   
    }
    if(keyInput == 2 && millis() - tempo_btn > debounce)
    {
    menu = 22;
    tempo_btn = millis();    
    }
    if(keyInput == 30 && millis() - tempo_btn > debounce)
    {
    menu = 1;
    tempo_btn = millis();    
    }
    delay(100);
    break;
case 12:
    //Schermata menu principale 
    noMenu();
    if(keyInput == 30 && millis() - tempo_btn > debounce)
    {
    menu = 1;
    tempo_btn = millis();    
    }
    break; 
case 13:
    //Schermata menu principale 
    noMenu(); 
    if(keyInput == 30 && millis() - tempo_btn > debounce)
    {
    menu = 1;
    tempo_btn = millis();    
    }
    break;
case 21:
    //Schermata menu principale 
    noMenu();
    if(keyInput == 30 && millis() - tempo_btn > debounce)
    {
    menu = 11;
   tempo_btn = millis();    
    } 
    
    break;   
case 22:
    //Schermata menu principale 
    noMenu();
    if(keyInput == 30 && millis() - tempo_btn > debounce)
    {
    menu = 11;
    tempo_btn = millis();    
    } 
    break;    
  } //switch... 
  
   GHQI1 ();
   GHQI2 ();
   GT5gr1 ();
   GT5gr2 ();
   Mandata ();
   
} //loop()...