AcquaPortal Forum Acquario Dolce e Acquario Marino

AcquaPortal Forum Acquario Dolce e Acquario Marino (http://www.acquariofilia.biz/forum.php)
-   Fai da te marino (http://www.acquariofilia.biz/forumdisplay.php?f=60)
-   -   arduino ed automazione acquario (http://www.acquariofilia.biz/showthread.php?t=424662)

-GUIDO- 05-09-2013 09:05

arduino ed automazione acquario
 
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...

-GUIDO- 05-09-2013 09:33

aggiungo 2 foto:

http://s10.postimg.cc/mtbyoovp1/20130905_091632.jpg

http://s10.postimg.cc/9doxz8n79/20130905_091801.jpg

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!
#12:-))

Niko79 05-09-2013 13:43

Complimenti Guido #70, 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":

codice:

/////////MioAcquaController////////////////////////

#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal.h>
#include <OneWire.h>                 
#include <DallasTemperature.h>
#include "Plafo.h"

Plafo plafo;

......

Quindi configuri gli orari di accensione sul metodo setup(), ad esempio con:
codice:

void setup()
{

 //Channel,startHour,startMinute,endHour,endMinute,fadeLen,maxPWM,pin
  plafo.setChannel(blue,18,0,4,0,30,180,7);//Dalle 18.00 alle 4.00, alba/tramonto 30 minuti, pwm massimo 180, pin 7 
  plafo.setChannel(white,18,15,3,45,75,180,5);//Dalle 18.15 alle 3.45, alba/tramonto 75 minuti
  plafo.setChannel(uv,19,30,2,30,0,HIGH,22);//Dalle 19.30 alle 2.30, accensione immediata, pin 22 (digitale)
  plafo.setChannel(moon,4,10,7,0,0,HIGH,23);//Dalle 4.10 alle 7.00

  // inizio la libreria
sensors.begin();
// settaggio a 10 bit della risoluzione dei sensori
sensors.setResolution(sondaAcqua, 10);
sensors.setResolution(sensorePlafo, 10);

....

Per poi aggiornare costantemente lo stato della plafoniera, sul ciclo loop passando il time del RTC:
codice:

void loop()
{

DateTime now = RTC.now();
plafo.perform(now.hour(),now.minute(),now.second());

  delay(1000);
sensors.requestTemperatures();
lcd.setCursor(0,2);
lcd.print("TEMP.Acqua: ");
printTemperature(sondaAcqua);

.....

In bocca al lupo

-GUIDO- 05-09-2013 17:11

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!

Niko79 05-09-2013 18:02

Quote:

Originariamente inviata da -GUIDO- (Messaggio 1062123606)
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.

-GUIDO- 05-09-2013 23:48

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?

Niko79 06-09-2013 11:23

Quote:

Originariamente inviata da -GUIDO- (Messaggio 1062124065)
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.

-GUIDO- 06-09-2013 23:25

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.

kikkino87 14-09-2013 00:27

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

Inviato dal mio GT-I9300 con Tapatalk 2

-GUIDO- 15-09-2013 21:35

ciao
io sono ancora in fase sperimentale comunque dacci qualche info...
hai gia qualcosa o parti da zero?

kikkino87 16-09-2013 19:08

Quote:

Originariamente inviata da -GUIDO- (Messaggio 1062137678)
ciao
io sono ancora in fase sperimentale comunque dacci qualche info...
hai gia qualcosa o parti da zero?

Non parto da zero o quasi ho gia la plafo operativa un po buttata la in pratica ho 20 led 3 watt alimentati alimentati da 5 driver da 10 watt cad volevo cambiare tutto e mettere o un driver unico o riuscire ad alimentare e dimmerare tramite arduino che ho gia ... volevo capire quali limentatori prendere come collegare ad arduino e ricreare alba tramonto

Inviato dal mio GT-I9300 con Tapatalk 2

-GUIDO- 17-09-2013 20:22

che arduino hai? ci hai gia fatto qualcosa? che drivers?

kikkino87 17-09-2013 21:50

Arduino uno ho dei driver semplici 220v uscita 12 volt

Inviato dal mio GT-I9300 con Tapatalk 2

-GUIDO- 19-09-2013 13:43

quindi ac/dc ...non il gruppo metal:-) dai se fanno il pwm?
Che esperienza hai di arduino e programmazione? io sono partito da zero ed ora sono appena un gradino dopo...però qualcosa ho fatto.

otaner 19-09-2013 18:04

Quote:

Originariamente inviata da -GUIDO- (Messaggio 1062125017)
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 #12, tengo il controller nel mobile con la sump.

Quì si può vedere qualcosa della mia realizazione http://www.acquariofilia.biz/showthr...=307339&page=2 e quì http://www.acquariofilia.biz/showthr...=274067&page=4

Ciao

Renato

-GUIDO- 20-09-2013 23:20

complimenti! bella e semplice!!!
io per ora ho problemi di sfarfallio dei led, ho paura che derivi da come alimento arduino perchè
senza pwm e arduino tutto è ok...

otaner 21-09-2013 00:18

Lo "sfarfallio" lo fa maggiormente a valori pwm bassi e tende a scomparire salendo sino a 255?

Ciao

-GUIDO- 21-09-2013 21:25

si è così otaner

otaner 22-09-2013 00:03

Prendi quello che ti dico con le pinze:-))
Le uscite pwm hanno frequenze diverse a seconda del pin (500/1000Hz); alcuni driver possono presentare difficoltà se pilotati ad alta frequenza.
Ti direi di provare a cambiare pin o in alternativa operare sui timer interrupt di arduino (che sono ben oltre le mie capacità).
Vedi se questo articolo ti può aiutare http://neuroelec.com/2011/03/high-pw...d-good-or-bad/

Ciao
Renato

-GUIDO- 22-09-2013 08:51

qualcosa riguardo ai pin pwm ho letto, so che esiste differenza ma il problema secondo me è
proprio legato all'alimentazione ed ai milliampere totali che uso per l'intero sistema suppongo!

otaner 22-09-2013 11:11

Io non credo, se fosse così dovrebbe sfarfallare anche anche con il pwm a 255.

Quanti canali pwm usi? prova, via Sketch, ad utilizzare una linea alla volta così da verificare se il il problema c'è sempre ed in ugual misura.

Come alimenti l'arduino?

Ciao

Renato

Può postare un video per vedere quanto sfarfallano.

-GUIDO- 23-09-2013 09:20

uso 4 canali pwm ed uno non pwm per 3 led lunari
ho provato anche come dici tu ma niente, l' impressione è che ci siano dei falsi contatti o qualcosa che comunque disturba l'hardware, appena posso revisiono il tutto.


Tutti gli orari sono GMT +2. Attualmente sono le 00:54.

Powered by vBulletin versione 3.8.9
Copyright ©: 2000 - 2024, Jelsoft Enterprises Ltd.
Traduzione italiana Team: AcquaPortal
User Alert System provided by Advanced User Tagging v3.2.5 Patch Level 2 (Lite) - vBulletin Mods & Addons Copyright © 2024 DragonByte Technologies Ltd.
Copyright Zero Pixel Srl

Page generated in 0,09616 seconds with 14 queries