Bnas, nadie sabe porque puede ser?
He probado alimentar el arduino también desde alimentación usb y con alimentador de 7,5 por descartar y tampoco.
No se me ocurre nada
Este es el código, carga y funciona en la breadboar.
#include <LiquidCrystal.h> //pantalla
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //Pantalla
#include <OneWire.h>//temperatura
#include <DallasTemperature.h>//temperatura
#define ONE_WIRE_BUS 41//temperatura, pin de entrada
OneWire oneWire(ONE_WIRE_BUS);//temperatura
DallasTemperature sensors(&oneWire);
#include <Ultrasonic.h> //Sensor Distancia
Ultrasonic ultrasonic(31,33); //Pines Sensor
byte PIN_SENSOR = A1; //Sensor Temperatura Acuario
float centi()
{// Funcion para leer el dato analogico y convertirlo a digital:
int dato;
float c;
dato=analogRead(A0); //Sensor Temperatura Pantalla
c = (500.0 * dato)/1023;
//Esta fórmula sale de la relación del sensor con los grados. Ésta es fácilmente rastreable por la web pero vamos a intentar explicarla un poco: El sensor de temperatura LM35 responde a variaciones de 10 mV por cada grado centígrado. Si el sensor detecta 1 grado centígrado a la salida del sensor obtendríamos 10 mV. Ejemplo: 26,4ºC = 264 mV = 0.264 V.
//Tenemos que el convertidor de analógico a digital es de 10 bits de resolución, los valores variarán entre 0 y 1023, entonces Vout= (5V*Dato)/1023 siendo ( 0 < Dato < 1023 ) y para ajustar la escala a grados centígrados: Vout = ((5V*Dato)*100)/1023
return (c);
}
float kelvin(float cent)
{
float k;
k=cent+273.15;
return(k);
}
float fahren(float cent)
{
float f;
f=cent*1.8+32;
return (f);
}
float rankin(float cent)
{
float r;
r=(cent + 273.15)*1.8;
return (r);
}
//Hasta aquí hemos declarado las funciones de conversión del dato analógico de entrada del sensor en grados celsius en sus respectivas equivalencias.
#include <Wire.h> //reloj
#define DS1307_I2C_ADDRESS 0x68// reloj
// Convierte números normales decimales a BCD (binario decimal codificado)
byte decToBcd(byte val){
return ( (val/10*16) + (val%10) );
}
// Convierte BCD (binario decimal codificado) a números normales decimales
byte bcdToDec(byte val){
return ( (val/16*10) + (val%16) );
}
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
int alarma;
// Pines de los relés
int PinLuces = 30;
int PinLuzSump = 34;
int PinBombas = 38;
int PinCalentador = 42;
int PinVentilador = 46;
// Pines de Estado
int EstadoBombas=0;
int EstadoCalent=0;
int EstadoVentil=0;
int Retraso=5000;
/******************************************************************************\
|************************** SETUP *************************|
\******************************************************************************/
void setup() {
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
Wire.begin();
pinMode(7, OUTPUT); //Azules PWM
pinMode(8, OUTPUT);//Mixtas PWM
pinMode(9, OUTPUT);//Blancas PWM
// set up the LCD's number of columns and rows:
lcd.begin(20,4);
// Print a message to the LCD.
lcd.print(" ## ## ## ## ## ## ");
lcd.print(" ## MARINE REEF ## ");
lcd.print(" ## MARINE REEF ## ");
lcd.print(" ## ## ## ## ## ## ");
sensors.begin();//Temperatura
// si desea poner en hora, active esta parte y luego vuelva a quitarla
second = 0;
minute = 20;
hour = 13;
dayOfWeek = 7;
dayOfMonth = 1;
month = 4;
year = 12;
setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
pinMode(PinLuces, OUTPUT); //Luces
pinMode(PinLuzSump, OUTPUT); //Luz del Sump
pinMode(PinBombas, OUTPUT); //Bombas
pinMode(PinCalentador, OUTPUT); //Calentador
pinMode(PinVentilador, OUTPUT); //Ventiladores
delay(1000);
lcd.clear();
}
/********************* # #### #### #### **************************\
|********************** # # # # # # # ***************************|
|********************** # # # # # #### ***************************|
\********************* ### #### #### # **************************/
void loop() {
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); //Obtenemos la hora
lcd.clear();
if (minute < 2) Retraso=1000;
else if (hour < 5) Retraso=10000;
else Retraso=2500;
Bombas();
Luces(minute, hour);
Bombas();
Temperatura(minute, hour);
Bombas();
Niveles(minute, hour);
}
/******************************************************************************\
|************************** FUNCIONES PRINCIPALES *************************|
\******************************************************************************/
void Luces(int minutos, int horas) {
int LucesAzules;
int InicioAmanecerAzul=800;//13:30
int FinAmanecerAzul=924; //15:40
int InicioAnochecerAzul=1375;//22:90
int FinAnochecerAzul=1440;//24:00
int FinLuzLuna=120;//2:00
int MaxAzul=250;
int PorcentAzules;
int LucesMixtas;
int InicioAmanecerMixtas=930;//15:50
int FinAmanecerMixtas=1014;//16:90
int InicioAnochecerMixtas=1326;//22:10
int FinAnochecerMixtas=1408;//23:46
int MaxMixtas=250;
int PorcentMixtas;
int LucesBlancas;
int InicioAmanecerBlancas=1080;//18:00
int FinAmanecerBlancas=1143;//19:05
int InicioAnochecerBlancas=1318;//21:96
int FinAnochecerBlancas=1380;//23:00
int MaxBlancas=250;
int PorcentBlancas;
int Tiempo;
Tiempo=horas*60+minutos;
//Tiempo=Tiempo+60; //Horario de Verano
//################################# AZULES ###################################
//Luna
if (Tiempo <= FinLuzLuna) LucesAzules=map(Tiempo,0,FinLuzLuna, FinLuzLuna,0);
//Noche
if (Tiempo < InicioAmanecerAzul && Tiempo > FinLuzLuna) LucesAzules=0;
//Amanecer
if (Tiempo >= InicioAmanecerAzul && Tiempo <= FinAmanecerAzul) LucesAzules=map(Tiempo, InicioAmanecerAzul, FinAmanecerAzul, 0, MaxAzul);
//Dia
if ((Tiempo > FinAmanecerAzul) && (Tiempo < InicioAnochecerAzul)) LucesAzules=MaxAzul;
//Anochecer
if (Tiempo >= InicioAnochecerAzul && Tiempo <= FinAnochecerAzul) LucesAzules=map(Tiempo, InicioAnochecerAzul, FinAnochecerAzul, MaxAzul, FinLuzLuna );
//Control
if( LucesAzules <0) LucesAzules=0;
if( LucesAzules >MaxAzul) LucesAzules=MaxAzul;
//################################# MIXTAS ###################################
//Noche
if (Tiempo < InicioAmanecerMixtas) LucesMixtas=0;
//Amanecer
if (Tiempo >= InicioAmanecerMixtas && Tiempo <= FinAmanecerMixtas) LucesMixtas=map(Tiempo, InicioAmanecerMixtas, FinAmanecerMixtas, 0, MaxMixtas);
//Dia
if (Tiempo > FinAmanecerMixtas && Tiempo < InicioAnochecerMixtas) LucesMixtas=MaxMixtas;
//Anochecer
if (Tiempo >= InicioAnochecerMixtas && Tiempo <= FinAnochecerMixtas) LucesMixtas=map(Tiempo, InicioAnochecerMixtas, FinAnochecerMixtas, MaxMixtas, 0 );
//Control
if( LucesMixtas <0) LucesMixtas=0;
if( LucesMixtas >MaxMixtas) LucesMixtas=MaxMixtas;
//################################# BLANCAS ###################################
//Noche
if (Tiempo < InicioAmanecerBlancas) LucesBlancas=0;
//Amanecer
if (Tiempo >= InicioAmanecerBlancas && Tiempo <= FinAmanecerBlancas) LucesBlancas=map(Tiempo, InicioAmanecerBlancas, FinAmanecerBlancas, 0, MaxBlancas);
//Dia
if (Tiempo > FinAmanecerBlancas && Tiempo < InicioAnochecerBlancas) LucesBlancas=MaxBlancas;
//Anochecer
if (Tiempo >= InicioAnochecerBlancas && Tiempo <= FinAnochecerBlancas) LucesBlancas=map(Tiempo, InicioAnochecerBlancas, FinAnochecerBlancas, MaxBlancas, 0 );
//Control
if( LucesBlancas <0) LucesBlancas=0;
if( LucesBlancas >MaxBlancas) LucesBlancas=MaxBlancas;
//################################# RELES ###################################
if (LucesAzules+LucesMixtas+LucesBlancas >= 1)
{
digitalWrite(PinLuces, LOW);
digitalWrite(PinLuzSump, HIGH);
}
else
{
digitalWrite(PinLuces, HIGH);
digitalWrite(PinLuzSump, LOW);
}
analogWrite(7, 255-LucesAzules );
analogWrite(8, 255-LucesMixtas );
analogWrite(9, 255-LucesBlancas);
PorcentAzules =Porcent(LucesAzules ,255)*2;
PorcentMixtas =Porcent(LucesMixtas ,255)*2;
PorcentBlancas=Porcent(LucesBlancas,255)*2;
//PorcentAzules =(LucesAzules/MaxAzul)*100 ;
//PorcentMixtas =(LucesMixtas/MaxMixtas)*100 ;
//PorcentBlancas=(LucesBlancas/MaxBlancas)*100;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" ILUMINACION ");
if (hour < 10) lcd.print("0");
lcd.print(hour, DEC);
lcd.print(":");
if (minute < 10) lcd.print("0");
lcd.print(minute, DEC);
lcd.setCursor(0, 1);
lcd.print(" Azules: ");
if (PorcentAzules < 10) lcd.print(" ");
lcd.print(PorcentAzules);
lcd.print("% ");
lcd.setCursor(0, 2);
lcd.print(" Mixtas: ");
if (PorcentMixtas < 10) lcd.print(" ");
lcd.print(PorcentMixtas);
lcd.print("% SUMP");
lcd.setCursor(0, 3);
lcd.print(" Blancas: ");
if (PorcentBlancas < 10) lcd.print(" ");
lcd.print(PorcentBlancas);
lcd.print("% ");
if (LucesAzules+LucesMixtas+LucesBlancas > 1)
lcd.print("OFF");
else
lcd.print("ON ");
delay(Retraso);
}
void Niveles(int minutos, int horas)
{
lcd.clear();
int CmAgua;
float Litros;
lcd.setCursor(0, 0);
lcd.print(" NIVEL AGUA ");
if (hour < 10) lcd.print("0");
lcd.print(hour, DEC);
lcd.print(":");
if (minute < 10) lcd.print("0");
lcd.print(minute, DEC);
lcd.setCursor(0, 1);
lcd.print(" Quedan: ");
//Sump 440*336, 1,478L por cm
CmAgua=63-ultrasonic.Ranging(CM);
Litros=CmAgua*1.5;
lcd.print(Litros);
lcd.print("L ");
lcd.setCursor(0, 2);
lcd.print(" ");
lcd.print((Litros/60)*100);
lcd.print("% ");
lcd.setCursor(0, 3);
lcd.print("MIN ");
if (Litros > 5) lcd.print((char)255);
if (Litros > 10) lcd.print((char)255);
if (Litros > 15) lcd.print((char)255);
if (Litros > 20) lcd.print((char)255);
if (Litros > 25) lcd.print((char)255);
if (Litros > 30) lcd.print((char)255);
if (Litros > 35) lcd.print((char)255);
if (Litros > 40) lcd.print((char)255);
if (Litros > 45) lcd.print((char)255);
if (Litros > 50) lcd.print((char)255);
if (Litros > 55) lcd.print((char)255);
if (Litros > 60) lcd.print((char)255);
lcd.setCursor(17, 3);
lcd.print("MAX");
delay(Retraso);
}
void Temperatura(int minutos, int horas)
{
float Pantalla = centi ();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" TEMPERATURA ");
if (hour < 10) lcd.print("0");
lcd.print(hour, DEC);
lcd.print(":");
if (minute < 10) lcd.print("0");
lcd.print(minute, DEC);
lcd.setCursor(0, 1);
lcd.print(" Pantalla: ");
lcd.print(Pantalla);
lcd.print((char)223);
float C = (5.0 * analogRead(PIN_SENSOR) * 100.0) / 1024;
float F = C * 1.8;
lcd.setCursor(0, 2);
lcd.print(" Acuario: ");
lcd.print(C);
lcd.print((char)223);
//if (Pantalla < 30) EstadoCalent=1;
//if (Pantalla > 32) EstadoCalent=0;
if (Pantalla < 19) EstadoVentil=0;
if (Pantalla > 21) EstadoVentil=1;
lcd.setCursor(0, 3);
if(EstadoCalent==1 ){
digitalWrite(PinCalentador, LOW);
lcd.print(" HOT ON ");
}
else
{
digitalWrite(PinCalentador, HIGH);
lcd.print(" HOT OFF ");
}
if(EstadoVentil==1 )
{
digitalWrite(PinVentilador, LOW);
lcd.print(" COLD ON ");
}
else
{
digitalWrite(PinVentilador, HIGH);
lcd.print(" COLD OFF");
}
delay(Retraso);
}
void Bombas()
{
if (EstadoBombas == 0)
{
digitalWrite(PinBombas, HIGH);
EstadoBombas =1;
}
else{
EstadoBombas = 0;
digitalWrite(PinBombas, LOW);
}
}
/******************************************************************************\
|************************** FUNCIONES AUXILIARES *************************|
\******************************************************************************/
////////////////////////////////////////////////// MODIFICA LA HORA /////////////////////////
void setDateDs1307(byte second, // 0-59
byte minute, // 0-59
byte hour, // 1-23
byte dayOfWeek, // 1-7
byte dayOfMonth, // 1-28/29/30/31
byte month, // 1-12
byte year) // 0-99
{
int i=0;
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(i);
Wire.write(decToBcd(second)); // 0 a bit 7 inicia el reloj
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour)); // Si usted quiere 12 hora am/pm usted tiene que poner el
// bit 6 (tambien tiene que cambiar readDateDs1307)
Wire.write(decToBcd(dayOfWeek));
Wire.write(decToBcd(dayOfMonth));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.endTransmission();
}
///////////////////////////////////////////// LEE LA HORA /////////////////////
void getDateDs1307(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
// Resetea el registro puntero
int i=0;
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(i);
Wire.endTransmission();
Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
// Alguno de estos necesitan enmascarar porque ciertos bits son bits de control
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f); // Need to change this if 12 hour am/pm
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}
///////////////////////// PORCENTAJE ////////////////////////////////
int Porcent(int Valor, int Maximo)
{
int result;
result=Valor*50;
result=result/Maximo;
return result;
}