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?


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

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,12414 seconds with 14 queries