Benvenuti sul Forum di AcquaPortal, la più grande community italiana di acquariofilia!
Sul Forum di AcquaPortal puoi discutere con altri appassionati di acquariofilia, tenere un tuo Blog personale, inserire foto e video, chattare, ed aiutarci a creare un grande database con schede di pesci, invertebrati e prodotti di acquariofilia.
Per entrar a far parte della comunità occorre registrarsi.
Per farlo premi su
Al momento della registrazione ti verrà richiesto di accettare il Regolamento che ti consigliamo di leggere attentamente.
Ti consigliamo inoltre di leggere le FAQ per apprendere le funzionalità principali del forum.
Se invece sei un utente registrato e hai dimenticato i tuoi dati di accesso devi effettuare il Recupero dati.
Fai da te marinoPer parlare delle tecniche di costruzione artigianale, per presentare le vostre realizzazioni, e per avere informazioni su dove reperire materiale ed attrezzatura risparmiando tempo e denaro.
Ciao
Affascinato da cio che puo fare questa piattaforma hardware ho deciso di provare se riesco ad au-
tomatizzare le operazioni di routine del mio acquario.
Qualche risultato gia per me soddisfacente l'ho raggiunto, di seguito posto il codice che ho messo insieme fino ad ora...messo insieme perchè non è tutta farina del mio sacco,infatti online si trovano molti spunti.
Ci tengo a dire che se si pensa di usare arduino solo per risparmiare soldi
per l'acquisto di un controller bell'e pronto si sbaglia, online si trovano prodotti ottimi che ti evitano di dover studiare hardware e sistema operativo(infinite ore!).
il codice mostra sul display data e ora, con due temperature date da 2 sonde, una in vasca ed una all'interno della parte piu calda della plafo a led (autocostruita).
codice:
/////////MioAcquaController////////////////////////
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// inizializza la libreria con i Pin LCD
LiquidCrystal lcd(0);
RTC_DS1307 RTC;
int P1=6;
int P2=7;
int P3=8;
int oraagg;
int minagg;
int annoagg;
int meseagg;
int dayagg;
int menu =0;
// assegno pin 3 per i dati sensori temperatura
#define ONE_WIRE_BUS 3
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
// gli indirizzi deli 2 sensori sono rilevati con un serial scanner
// posso aggiungere sensori aggiungendo gli indirizzi relativi
DeviceAddress sondaAcqua = { 0x28, 0xC4, 0x07, 0xA6, 0x04, 0x00, 0x00, 0x32 };
DeviceAddress sensorePlafo = { 0x28, 0x29, 0x6A, 0x84, 0x04, 0x00, 0x00, 0xDB };
void setup()
{
// inizio la libreria
sensors.begin();
// settaggio a 10 bit della risoluzione dei sensori
sensors.setResolution(sondaAcqua, 10);
sensors.setResolution(sensorePlafo, 10);
// Quante colonne e righe ha il display:
lcd.begin(20, 4);
lcd.setCursor(7,0); /////////////////////////////////////
lcd.print("GUTTY"); ////////SPLASH
lcd.setCursor(2,1); //////// SCREEN BY GUIDO
lcd.print("ACQUACONTROLLER"); /////////////////////////////////////
delay(2000);
lcd.clear();
// Inizializzazione dei pulsanti
pinMode(P1,INPUT);
pinMode(P2,INPUT);
pinMode(P3,INPUT);
//inizializzo la libreria
Serial.begin(9600);
Wire.begin();
RTC.begin();
//RTC.sqw(1);
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
// settiamo la data e l'ora al momento della compilazione
RTC.adjust(DateTime(__DATE__, __TIME__));
}
// di default il display visualizzerà data e ora
int menu=0;
}
void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
lcd.print("Errore");
} else {
lcd.print(tempC);
lcd.print(" C");
}
}
void loop()
{
delay(1000);
sensors.requestTemperatures();
lcd.setCursor(0,2);
lcd.print("TEMP.Acqua: ");
printTemperature(sondaAcqua);
lcd.setCursor(0,3);
lcd.print("TEMP.Plafo: ");
printTemperature(sensorePlafo);
// verifichiamo se viene premuto il pulsante SET e incrementiamo l'indice del menu
if(digitalRead(P1))
{
menu=menu+1;
}
// a quale subroutine dobbiamo andare?
if (menu==0)
{
DisplayDateTime();
delay (100);
}
if (menu==1)
{
DisplaySetHour();
}
if (menu==2)
{
DisplaySetMinute();
}
if (menu==3)
{
DisplaySetYear();
}
if (menu==4)
{
DisplaySetMonth();
}
if (menu==5)
{
DisplaySetDay();
}
if (menu==6)
{
StoreAgg();
delay(200);
menu=0;
}
delay(100);
}
void DisplayDateTime ()
{
// mostriamo la data e l'ora correnti
DateTime now = RTC.now();
lcd.setCursor(12, 0);
lcd.print("");
if (now.hour()<=9)
{
lcd.print("0");
}
lcd.print(now.hour(), DEC);
oraagg=now.hour();
lcd.print(":");
if (now.minute()<=9)
{
lcd.print("0");
}
lcd.print(now.minute(), DEC);
minagg=now.minute();
lcd.print(":");
if (now.second()<=9)
{
lcd.print("0");
}
lcd.print(now.second(), DEC);
lcd.setCursor(0, 0);
lcd.print("");
if (now.day()<=9)
{
lcd.print("0");
}
lcd.print(now.day(), DEC);
dayagg=now.day();
lcd.print("/");
if (now.month()<=9)
{
lcd.print("0");
}
lcd.print(now.month(), DEC);
meseagg=now.month();
lcd.print("/");
lcd.print(now.year(), DEC);
annoagg=now.year();
}
void DisplaySetHour()
{
// Impostazione dell'ora
lcd.clear();
DateTime now = RTC.now();
int ora=now.hour();
if(digitalRead(P2)==HIGH)
{
if(oraagg==23)
{
oraagg=0;
}
else
{
oraagg=oraagg+1;
}
}
if(digitalRead(P3)==HIGH)
{
if(oraagg==0)
{
oraagg=23;
}
else
{
oraagg=oraagg-1;
}
}
lcd.setCursor(0,0);
lcd.print("Imposta Ora:");
lcd.setCursor(0,1);
lcd.print(oraagg,DEC);
delay(50);
}
void DisplaySetMinute()
{
// Impostazione dei minuti
lcd.clear();
if(digitalRead(P2)==HIGH)
{
if (minagg==59)
{
minagg=0;
}
else
{
minagg=minagg+1;
}
}
if(digitalRead(P3)==HIGH)
{
if (minagg==0)
{
minagg=59;
}
else
{
minagg=minagg-1;
}
}
lcd.setCursor(0,0);
lcd.print("Imposta Minuti:");
lcd.setCursor(0,1);
lcd.print(minagg,DEC);
delay(50);
}
void DisplaySetYear()
{
// Impostazione dell'anno
lcd.clear();
if(digitalRead(P2)==HIGH)
{
annoagg=annoagg+1;
}
if(digitalRead(P3)==HIGH)
{
annoagg=annoagg-1;
}
lcd.setCursor(0,0);
lcd.print("Imposta Anno:");
lcd.setCursor(0,1);
lcd.print(annoagg,DEC);
delay(50);
}
void DisplaySetMonth()
{
// Impostazione del mese
lcd.clear();
if(digitalRead(P2)==HIGH)
{
if (meseagg==12)
{
meseagg=1;
}
else
{
meseagg=meseagg+1;
}
}
if(digitalRead(P3)==HIGH)
{
if (meseagg==12)
{
meseagg=12;
}
else
{
meseagg=meseagg-1;
}
}
lcd.setCursor(0,0);
lcd.print("Imposta Mese:");
lcd.setCursor(0,1);
lcd.print(meseagg,DEC);
delay(50);
}
void DisplaySetDay()
{
// Impostazione del giorno
lcd.clear();
if(digitalRead(P2)==HIGH)
{
if (dayagg==31)
{
dayagg=1;
}
else
{
dayagg=dayagg+1;
}
}
if(digitalRead(P3)==HIGH)
{
if (dayagg==1)
{
dayagg=31;
}
else
{
dayagg=dayagg-1;
}
}
lcd.setCursor(0,0);
lcd.print("Imposta Giorno:");
lcd.setCursor(0,1);
lcd.print(dayagg,DEC);
delay(50);
}
void StoreAgg()
{
// Salvataggio delle variabili
lcd.clear();
lcd.setCursor(0,0);
lcd.print("SALVATAGGIO IN");
lcd.setCursor(0,1);
lcd.print("CORSO");
RTC.adjust(DateTime(annoagg,meseagg,dayagg,oraagg,minagg,0));
delay(1000);
lcd.clear();
}
fin qui ce l'ho fatta da solo, gli esperti di programmazione di questa IDE sorrideranno per certe soluzioni prese...
Ora vorrei aggiungere la parte che governa le luci in pwm.
Prima ho editato una routine semplice che prevedeva l'uso di delay ma da perfetto babbeo, quando l'ho inserita nel programma principale mi bloccava tutto....ovviamente
La soluzione piu semplice e migliore di sicuro è quindi quella di fare uso della libreria scritta da Nico, ed a questo punto chiedo aiuto!
eccola la libreria:http://www.acquariofilia.biz/showthread.php?t=418418
Nico è chiaro nella spiegazione ma mi sono incagliato comunque...
per completezza d'informazione il codice oltre che mettere a display data ed ora corrente
offre la possibilità di regolazione tramite pulsanti di set, piu e meno, salvando le impostazioni
....e qui non è farina del mio sacco! mi sarebbe voluto almeno un anno per poter gestire tutto ciò
ma questo è il bello dell'open source e proprio per questa filosofia mi piacerebbe che questo progetto servisse a tutti, magari chiamiamo quello che ne esce AQUAPORTALcontroller!
Complimenti Guido , direi che hai già raggiunto dei buoni risultati.
Ho letto che eri riuscito ad aggiungere i due tabs contenenti la testa e l'implementazione della libreria.
Bene non ti resta che importarla sul tuo codice generale creando anche l'oggetto "plafoniera":
Grazie Nico, appena a casa provo con le tue spiegazioni, sono chiare e non dovrei sbagliare...
Certo che con il tuo display è tutto un altra cosa, io ho un 20x4, devo studiare come gestire il tutto in modo ottimale, magari con un pulsante che cambia screen.
Non vedo l'ora di arrivare a casa!
GRAZIE!
Grazie Nico, appena a casa provo con le tue spiegazioni, sono chiare e non dovrei sbagliare...
Certo che con il tuo display è tutto un altra cosa, io ho un 20x4, devo studiare come gestire il tutto in modo ottimale, magari con un pulsante che cambia screen.
Non vedo l'ora di arrivare a casa!
GRAZIE!
Io per evitare di perdermi tra pulsanti e potenziometri ho acquistato un telecomando.
Il ricevitore necessita di solo un pin !
L'unico inconveniente è che la libreria di gestione (irremote) richiede un bel pò di memoria.
Comunque è semplicissima da utilizzare e trovi tantissimi esempi.
__________________
IO USERO' ACQUA DEL NOSTRO MARE
IO USERO' SABBIA DEL NOSTRO MARE
ciao
Aggiunto tutto come hai detto e GIRAAAAAAAAA!!! ehm...scusa
ho fatto breve prova con due led volanti e tutto è ok, ora imposto un fotoperiodo di prova per gustarmi il tuo fade.
A questo punto uno si chiede se sono impazzito a guardare 2 led accendersi lentamente per mezzora...nooo credetemi!
Domande: Ho visto che hai impostato un pwm massimo a 180 sui due canali white e blue,
avendo io drivers a 700ma posso alzare il pwm senza stressare i led?
eventualmente quanto vicino alla soglia 255?
ciao
Aggiunto tutto come hai detto e GIRAAAAAAAAA!!! ehm...scusa
ho fatto breve prova con due led volanti e tutto è ok, ora imposto un fotoperiodo di prova per gustarmi il tuo fade.
A questo punto uno si chiede se sono impazzito a guardare 2 led accendersi lentamente per mezzora...nooo credetemi!
Domande: Ho visto che hai impostato un pwm massimo a 180 sui due canali white e blue,
avendo io drivers a 700ma posso alzare il pwm senza stressare i led?
eventualmente quanto vicino alla soglia 255?
Dipende dalle caratteristiche e dalla qualità dei led che stai utilizzando.
Se ad esempio sono da 3w e accettano una corrente massima di 700ma, con 180 su 255 sei a circa il 70% della potenza massima che è il valore che molti consigliano di non superare per non ridurre troppo la vita del led.
Se invece stai utilizzando led ad esempio da 10w che accettano una corrente massima di 1000ma, col tuo driver da 700ma puoi andare tranquillamente a 255 perché corrisponderà già al 70% della potenza.
Spero di essermi spiegato bene.
__________________
IO USERO' ACQUA DEL NOSTRO MARE
IO USERO' SABBIA DEL NOSTRO MARE
giusto, non ho detto che sono cree da 3 watt!
Con driver 700ma dovrebbero rendere 2,1 watt anche con pwm al massimo...quindi
presumo che spingendo su il pwm siano comunque protetti...o sbaglio?
Magari ho appena detto una sciocchezza.
Con driver 700ma dovrebbero rendere 2,1 watt anche con pwm al massimo...quindi
presumo che spingendo su il pwm siano comunque protetti...o sbaglio?
Per cronaca vi riporto la mia esperienza sull'affidabilità arduino + led.
Il tutto è in funzione (plafo + controller) dalla primavera del 2011 è non vi è nulla di particolare da segnalare.
Per quanto riguarda i led (cree xpg ) pilotati con driver da 1A con pwm max 210;
su 102 led se ne sono bruciati 4.
Per l'arduino (mega) tutto OK tranne per qualche problema di ossidazione delle saldatura; ma io, furbescamente , tengo il controller nel mobile con la sump.
Ragazzi volevo anche io fare uns cosa del genere mi date delle dritte su come collegare i led a arduino cosa devo usare i codici insomms mi fate uno schemino :D:D:D
Grazie