Go Down

Topic: Arduino & acquario (Read 10282 times) previous topic - next topic

Andrea96

Quote
domani sono in fiera e prendo un arduino


Intendi la fiera a Malpensa?
Vale la pena ?

Ciao Grazie

Andrea

@miky

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

alfa75

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???

@miky

#18
Sep 13, 2010, 12:06 am Last Edit: Sep 13, 2010, 12:08 am by michele.massaro Reason: 1
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
Code: [Select]
/*========================================================================== 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);

@miky

Code: [Select]
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()...

vinca

Ho appena preso in mano il mio primo Arduino!!!! l'ho collegato e si sta installando...speriamo che Svita trovi i driver necessari!!! ;D

Probabilmente sono io ad essere rincoglionito...ma come si caricano i programmi in macchina?...poi... vedo 14 pin digitali e 6 analogici, credo si parli sempre di uscite..ma noi abbiamo bisogno anche di ingressi, sia digitali che analogici!!!
Comunque adesso attendo l'arrivo del display 20X4...poi mi metto dietro a fare l'interfaccia seriale-I2C, sono arrivati anche gli IC!!!!!! ;D

alfa75

http://acquadolce.altervista.org/LCD_keypad.pdf

ecco il modulo di controllo costituito dall'LCD e il Keypad 3X4
tutto I2C
con 2 pcf8574

lcd è un 16x2 ma ha la stessa piedinatura del 20x4 per cui e solo una questione di ingombro

che ne pensate???

@miky

Vinca i pin possono essere impostati sia come ingressi che come uscite quindi nessun problema.

Alfa molto bello direi e buono se fa quello che ti serve ..... ops non ne capisco na cippa però ..... hahaha :P :P, quindi valuto l'aspetto grafico.

alfa75

scusa ma tu tastiera ed lcd come li hai collegati? Permette di collegare i due in una scatola a se stante con un classico cavo telefonico 4poli e relativo plug. Metto qui la sonda di temp. che misura la temperatura ambiente? Se vi interessano pubblico i file.

Calamaro

Avrei 2 domande che non riguardano il vostro progetto :D
1) come si chiamano e quanto costano quelle pompe che vendono per fare le bollicine negli acquari. Se le dovessi cercare tipo su ebay qual'e` la keyword?
2) si trovano dei cavi riscaldanti per acquari che arrivano fino a 80-90 gradi? come si chiamano?

@miky

Calamaro,
quello delle bollicini è l'areatore qui puoi trovare modelli e costi (indicativamente sono quelli più bassi che puoi trovare ... http://www.aquariumline.com/catalog/areatori-accessori-c-45.html ) li trovi a 1 2 o 4 vie, con diverse potenze .... c'è anche un modello elettronico anche in questo caso più spendi migliore è la meccanica e il materiale delle membrane .... alcuni modelli li trovi anche come ricambi)
I cavetti riscladatori non penso arrivino a 80/90 gradi mica devi fare bollire l'acqua ... http://www.aquariumline.com/catalog/dennerle-1647-cavetto-riscaldante-boden-fluter-24v100watt-p-3002.html .... io ne ho uno da 75w non hanno regolatore e non ho mai misurato la temperatura ma 80/90 gradi dubito altrimenti anche i rettili li piastri.

Calamaro

A me queste cose servivano per metterle in una vaschetta di pvc in cui terrei il percloruro ferrico per fare le basette elettroniche. 80-90 gradi sarebbe buono... meglio se mi portano il tutto a ebollizione incipiente, mi sa che ne dovro` modificare uno. pero` 168euri son tantini :D
Grazie mille :D

Federico Vanzati

una resistenza tipo quella dei forni/fornetti oppure delle lavatrici potrebbe andare?
F

Calamaro

#28
Sep 15, 2010, 11:21 am Last Edit: Sep 15, 2010, 11:23 am by Calamaro Reason: 1
si il problema e` che quelle sono di materiale ferroso che il percloruro corrode. andrebbero rivestite di qualcosa tipo  un termorestringente resistente ai 100 e passa gradi. Comunque dovro` fare delle prove, magari mettere una retroazione con un LM35 e quando l'acido supera tot gradi un relee spenge la serpentina...
questo e` lo schizzo del progetto!

Calamaro

le quote son sbagliate. Lo spazio utile interno deve essere 20x10x30 cm
per un totale di 6000cm^3 la capienza dovrebbe essere 6 litri :D tanta roba ...

Go Up