Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Estado: Aparece solo en la pantalla la temperatura del agua y la fecha/hora
- Modificado para que quepa el ethernet encima del mega.
- Modificado lineas de codigo con la luz: todas las luces es luz y la luna es noche; Los ventiladores funcionan segun temperatura
- Pendiente: Añadir el codigo necesario para enviar le resto de informacion a la webserver
- Primeras lineas de codigo del controlador de Acuario By Antonio David Torres
- http://miacuarioplantado.comuv.com/
- */
- // include the library code:
- #include <Wire.h> // incluimos libreria wire
- #include <OneWire.h> // incluimos libreria de cables
- #include <DallasTemperature.h> // Incluimos libreria sensores
- #include <EEPROM.h> // Librería para poder escribir en la eprom del arduino
- #include <LiquidCrystal.h> // incluimos libreria LCD
- #include "RelojDS1307.h" // Libreria del Reloj
- #include <Ethernet.h>
- #include <SPI.h>
- // Datos de red
- byte mac[] = { 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5 };
- byte ip[] = { 192, 168, 1, 50 }; // Change this
- IPAddress subnet(255, 255, 255, 0);
- EthernetServer servidor(54322);
- // DEFINIMOS PINES DE SENSORES Y RELES
- #define PIN_P_LUCES 2 // AMARILLO LUCES 1
- #define PIN_P_LUCESN 4 // VERDE LUZ NOCHE (AZUL)
- #define PIN_P_VENTILADOR 3 // AZUL VENTILADOR
- #define PIN_P_TEMPER 5 // SENSORES TEMPERATURA
- #define PIN_D_RELE_CALENTADOR 28 //PIN 28 DIGITAL CONECTADO A RELE 2
- #define PIN_D_RELE_LUCES 34 //PIN 34 DIGITAL CONECTADO A RELE 1
- #define PIN_D_COMIDA 36
- #define MARGEN_TEMPERATURA 0.2
- #define DIMEO_LUZ 255
- #define DIMEO_NOCHE 255
- #define BUFFER 10
- EthernetServer servidorArduino(3200);
- typedef struct Configuracio_struct
- {
- float TermoAcuario; //Temperatura Acuario
- float TermoTapa; //Temperatura Tapa
- int LuzH_ON; //Hora de encendido de la luz
- int LuzM_ON; //Minutos de encendido de la luz
- int LuzH_OFF; //Hora de apagado de la luz
- int LuzM_OFF; //Minutos de apagado de la luz
- int LuzNH_ON; //Hora de encendido de la luz NOCHE
- int LuzNM_ON; //Minutos de encendido de la luz NOCHE
- int LuzNH_OFF; //Hora de apagado de la luz NOCHE
- int LuzNM_OFF; //Minutos de apagado de la luz NOCHE
- int COMIDA_H; //Hora de COMIDA
- int COMIDA_M; //Minutos de COMIDA
- char comando[BUFFER];
- } Stru_Configuracion;
- void(* resetFunc) (void) = 0;
- DeviceAddress AguaTermo, TapaTermo; // Direcciones de los sensores de temperatura
- void Alarma();
- OneWire oneWire( PIN_P_TEMPER );
- DallasTemperature sensors(&oneWire);
- int Dimeo1, DimeoN;
- LiquidCrystal lcd(23, 25, 27, 29, 31, 33, 35);
- RelojDS1307Class Reloj; //Declaración de la variable del Reloj
- Stru_Configuracion CFG; //Variable de la configuración
- boolean hancomido = false;
- void SetRele( int Index, int Pin, boolean Estado )
- {
- int I = 8-Index;
- digitalWrite( Pin, !Estado );
- }
- void setup()
- {
- Serial.begin(9600);
- Ethernet.begin(mac, ip);
- servidorArduino.begin();
- pinMode( PIN_P_LUCES, OUTPUT );
- pinMode( PIN_P_VENTILADOR, OUTPUT );
- pinMode( PIN_P_LUCESN, OUTPUT );
- pinMode( PIN_D_RELE_LUCES, OUTPUT );
- pinMode( PIN_D_RELE_CALENTADOR, OUTPUT );
- pinMode( PIN_D_COMIDA, OUTPUT );
- byte n;
- for(n=28; n < 43; n = n + 2)
- {
- digitalWrite( n, HIGH);
- }
- Wire.begin();
- Dimeo1 = 0; DimeoN = 0;
- CFG.TermoAcuario = 26; // AQUI PODEMOS MODIFICAR LOS VALORES QUE QUERAMOS.
- CFG.TermoTapa = 28.0;
- CFG.LuzH_ON = 11;
- CFG.LuzM_ON = 0;
- CFG.LuzH_OFF = 21;
- CFG.LuzM_OFF = 45;
- CFG.LuzNH_ON = 21;
- CFG.LuzNM_ON = 45;
- CFG.LuzNH_OFF = 23;
- CFG.LuzNM_OFF = 0;
- CFG.COMIDA_H = 15;
- CFG.COMIDA_M = 0;
- lcd.begin(16, 2); // Le decimos a la pantalla las dimensiones que tiene.
- //Reloj.SetDateTime( 28, 10, 12, 19, 20, 00 ); // Quitar comentario para ajustar la hora.
- /// LeerConfig();
- IniciarTemperaturas(); //Iniciamos los sensores de temperatura.
- }
- void loop () // ***********Inicio del bucle del programa*********************
- {
- MirarTemperaturas(); //Miramos la temperaturas
- horario_luces(); // LLAMADA A COMPROBAR HORARIO LUCES
- // SetRele( 1, PIN_D_RELE_LUCES, HIGH ); analogWrite( PIN_P_LUCES, 255 ); // Para dejar luces encendidas fijas
- comedero();
- fechahora();
- ethernet();
- }
- /////////////////////// FIN DEL LOOP //////////////////
- ///////////////////////////////////////////////////////////////
- //
- // INICIAR LOS SENSORES DE TEMPERATURA Y ALARMAS
- //
- ///////////////////////////////////////////////////////////////
- void IniciarTemperaturas()
- {
- //Iniciamos el controlador del controlador/s DS18B20
- sensors.begin();
- //Compruebo que estén todos los sensores.
- //Cuidado, ya que al llamar a “sensors.getAddress()”, lo que hacemos es definir que
- //variable es cada sensor, por ejemplo definimos que el sensor Nº0 es DepoTermo.
- if (sensors.getDeviceCount() < 2); //Serial.println( "Faltan sensores de temperatura");
- if (!sensors.getAddress(AguaTermo, 0)); //Serial.println("Falta el sensores de temperatura del agua");
- if (!sensors.getAddress(TapaTermo, 1)); //Serial.println("Falta el sensores de temperatura de la tapa");
- sensors.setHighAlarmTemp( AguaTermo, 26.75 );
- sensors.setLowAlarmTemp( AguaTermo, 26.25 );
- sensors.setHighAlarmTemp( TapaTermo, 30.00 );
- sensors.setLowAlarmTemp( TapaTermo, 29.50 );
- }
- ///////////////////////////////////////////////////////////////
- //
- // MIRAR LAS TEMPERATURA
- //
- ///////////////////////////////////////////////////////////////
- void MirarTemperaturas()
- {
- float TemperaturaAcuario, TemperaturaTapa;
- //Llamamos a la función requestTemperatures() de nuestro controlador de sensores
- //para que se prepare a nuestra llamada de lectura.
- sensors.requestTemperatures();
- //llamamos a getTempC() pasándole la variable del sensor que queremos leer
- // y esta función nos devolverá la temperatura de el sensor llamado.
- TemperaturaAcuario = sensors.getTempC( AguaTermo ); // ACUARIO
- TemperaturaTapa = sensors.getTempC( TapaTermo ); // TAPA
- // LEE Y ESCRIBE LA TEMPERATURA DEL AGUA
- // E INDICA SI EL CALENTADOR ESTA ON U OFF
- lcd.begin(16, 2);
- lcd.print("Calentador: "); // Escribe calentador en el LCD.
- lcd.print(OFFON(digitalRead(PIN_D_RELE_CALENTADOR)));
- lcd.setCursor(0, 1); // Envia el cursor al comienzo de la segunda linea
- lcd.print("Temp. Agua:"); // Imprime la temperatura.
- lcd.print( TemperaturaAcuario );
- if ((sensors.getTempC(AguaTermo) < (CFG.TermoAcuario-MARGEN_TEMPERATURA)))
- SetRele( 2, PIN_D_RELE_CALENTADOR, HIGH );
- if ((sensors.getTempC(AguaTermo) > (CFG.TermoAcuario+MARGEN_TEMPERATURA)))
- SetRele( 2, PIN_D_RELE_CALENTADOR, LOW );
- // LEE LA TEMPERATURA DE LA TAPA Y ACTIVA O DESACTIVA LOS VENTILADORES
- if (sensors.getTempC(TapaTermo) < (CFG.TermoTapa) ) analogWrite(PIN_P_VENTILADOR, 0 );
- if (sensors.getTempC(TapaTermo) > (CFG.TermoTapa+3) ) analogWrite(PIN_P_VENTILADOR, 50 );
- if (sensors.getTempC(TapaTermo) > (CFG.TermoTapa+4) ) analogWrite(PIN_P_VENTILADOR, 100 );
- if (sensors.getTempC(TapaTermo) > (CFG.TermoTapa+5) ) analogWrite(PIN_P_VENTILADOR, 150 );
- if (sensors.getTempC(TapaTermo) > (CFG.TermoTapa+6) ) analogWrite(PIN_P_VENTILADOR, 200 );
- delay (4000);
- }
- ////////////////// COMPROBACION HORARIO LUCES /////////
- void horario_luces ()
- {
- /////////// LUCES /////////////////////
- // ENCIENDE LUZ Nº1 PRIMERA TIRA DE LEDS EN LA PRIMERA MEDIA HORA DE ENCENDIDO VA AUMENTANDO EL VALOR DIMEO1 HASTA 200///////////////
- if(Reloj.IsLater( CFG.LuzH_ON, CFG.LuzM_ON ) && Reloj.IsPrevious( CFG.LuzH_OFF, CFG.LuzM_OFF ))
- {
- // Alimentar el transformador de la luz si no esta encendido
- if (digitalRead(PIN_D_RELE_LUCES)) SetRele( 1, PIN_D_RELE_LUCES, HIGH );
- if ( Dimeo1 < DIMEO_LUZ )
- {
- Dimeo1 += 2;
- if (Dimeo1 > DIMEO_LUZ) Dimeo1 = DIMEO_LUZ;
- // Si se a re-iniciado el sistema
- if(Reloj.IsLater( CFG.LuzH_ON, CFG.LuzM_ON+30 ) && Reloj.IsPrevious( CFG.LuzH_OFF, CFG.LuzM_OFF )) Dimeo1 = DIMEO_LUZ;
- analogWrite( PIN_P_LUCES, Dimeo1 );
- }
- }
- // APAGA LUZ Nº1 PRIMERA TIRA DE LEDS EN LA PRIMERA MEDIA HORA DE DESDE SU APAGADO VA DISMINUYENDO EL VALOR DIMEO1 HASTA 0
- if(Reloj.IsLater( CFG.LuzH_OFF, CFG.LuzM_OFF ) && (Dimeo1 > 0) )
- {
- Dimeo1 -= 2;
- if (Dimeo1 < 0) Dimeo1 = 0;
- // Si se a re-iniciado el sistema
- if (Reloj.IsLater( CFG.LuzH_OFF, CFG.LuzM_OFF+30 )) Dimeo1 = 0;
- analogWrite( PIN_P_LUCES, Dimeo1 ); // APAGA LA TIRA DE LEDS 1
- }
- // ENCIENDE LUZ NOCHE /////////////////////////////////////////////////////////////////////////////////////////////////
- if(Reloj.IsLater( CFG.LuzNH_ON, CFG.LuzNM_ON ) && Reloj.IsPrevious( CFG.LuzNH_OFF, CFG.LuzNM_OFF ))
- {
- // Alimentar el tramformador de la luz si no esta encendido
- if (digitalRead(PIN_D_RELE_LUCES)) SetRele( 1, PIN_D_RELE_LUCES, HIGH);
- if ( DimeoN < DIMEO_NOCHE )
- {
- DimeoN += 2;
- if (DimeoN > DIMEO_NOCHE) DimeoN = DIMEO_NOCHE;
- // Si se a ri-iniciado el sistema
- if(Reloj.IsLater( CFG.LuzNH_ON, CFG.LuzNM_ON+30 ) && Reloj.IsPrevious( CFG.LuzNH_OFF, CFG.LuzNM_OFF )) DimeoN = DIMEO_NOCHE;
- analogWrite( PIN_P_LUCESN, DimeoN );
- }
- }
- // APAGA LUZ NOCHE
- if( Reloj.IsLater( CFG.LuzNH_OFF, CFG.LuzNM_OFF ) && (DimeoN > 0) )
- {
- DimeoN -= 2;
- if (DimeoN < 0) DimeoN = 0;
- // Si se a ri-iniciado el sistema
- if (Reloj.IsLater( CFG.LuzNH_OFF, CFG.LuzNM_OFF+30 )) DimeoN = 0;
- analogWrite( PIN_P_LUCESN, DimeoN );
- // Apagamos el tranformador de la luz
- if ( DimeoN == 0 ) SetRele( 1, PIN_D_RELE_LUCES, LOW );
- }
- }
- /////////////////////////////////////////////////////////////
- //
- ///IMPRIME LA HORA Y LA FECHA EN LA PANTALLA.
- //
- ///////////////////////////////////////////////////////////
- void fechahora()
- {
- lcd.begin(16, 2);
- lcd.print("Fecha "); // Imprime la palabra fecha
- lcd.write( Reloj.Date()); // Imprime la variable fecha
- lcd.setCursor(0, 1); // Envia el cursor al comienzo de la segunda linea
- lcd.print ("Hora ");
- lcd.write( Reloj.Time()); // Imprime la hora y la variable hora
- delay (2000);
- }
- ///////////////////////////////////////////////////////////////
- //
- // GENERA PITIDOS DE ALARMA
- //
- ///////////////////////////////////////////////////////////////
- void Alarma()
- {
- // Aqui pondriamos la instruccion para que nos avise, mediante twiter o correo o algo...
- }
- ///////////////////////////////////////////////////////////////
- //
- // DEVUELVE ON o OFF
- //
- ///////////////////////////////////////////////////////////////
- char * OFFON( int Valor )
- {
- if (Valor == LOW)
- {return "ON ";}
- else
- {return "OFF";}
- }
- ///////////////////////////////////////////////////////////////
- //
- // GRAVA LA CONFIGURACION EN LA EPROM
- //
- ///////////////////////////////////////////////////////////////
- void SalvarConfig()
- {
- uint8_t Valor[sizeof(CFG)];
- memcpy( &Valor, &CFG, sizeof(CFG));
- for (int i = 0; i <= sizeof(Valor); i++)
- EEPROM.write(i, Valor[i]);
- }
- ///////////////////////////////////////////////////////////////
- //
- // LEE LA CONFIGURACION DE LA EPROM
- //
- ///////////////////////////////////////////////////////////////
- void LeerConfig()
- {
- uint8_t Valor[sizeof(CFG)];
- for (int i = 0; i <= sizeof(CFG); i++)
- Valor[i] = EEPROM.read(i);
- memcpy( &CFG, &Valor, sizeof(CFG));
- }
- /////////////////////////////////////////////////////////////
- //
- // COMEDERO
- //
- //////////////////////////////////////////////////
- void comedero()
- {
- if ((Reloj.GetHour() == (CFG.COMIDA_H)) && (Reloj.GetMinute() == (CFG.COMIDA_M )) && (!hancomido ));
- {
- SetRele( 4, PIN_D_COMIDA, HIGH );
- delay(3000);
- SetRele( 4, PIN_D_COMIDA, LOW );
- hancomido = true;
- }
- if (Reloj.GetHour() != (CFG.COMIDA_H) && (Reloj.GetMinute() != (CFG.COMIDA_M ))) hancomido= false;
- }
- ///////////////////////////////////////////////////////////////
- //
- // Empieza ethernet
- //
- //////////////////////////////////////////////////////////////
- void ethernet()
- {
- int index = 0;
- char comando[BUFFER];
- EthernetClient clienteApp = servidorArduino.available();
- if (clienteApp)
- {
- if (clienteApp.connected()) {
- while (clienteApp.available()) {
- char caracter = clienteApp.read();
- if (caracter != '\n') {
- comando[index] = caracter;
- index++;
- if (index >= BUFFER) index = BUFFER -1;
- continue;
- }
- comando[index] = '\0';
- }
- if (strstr(comando, "holaArdu")) {
- clienteApp.println("done");
- }
- clienteApp.println("Estado del agua: ");
- clienteApp.println( sensors.getTempC( AguaTermo ) );
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement