El codigo funciona en una breadboard, pero conectada a la pantalla no.

  • Iniciador del tema Iniciador del tema JLucas
  • Fecha de inicio Fecha de inicio
Registrado
27 Abr 2012
Mensajes
44
Ubicación
España
Provincia
Badajoz
Buenos días,
Tengo una pantalla que llevo utilizando hace un par de años, y quiero automatizarla con arduino, el código que tengo es el que ya muchos conocéis y está en el foro de Dani, funciona perfectamente con pruebas realizadas en una breadboard.
Pero cuando la he conectado a la pantalla, montada con los tip141 no funciona.
Se encienden las luces pero como si estuvieran al 50% y en ese tramo horario lo mismo tienen que estar apagadas.
O deben estar al 98% y siguen al 50%.

¿Alguien puede decirme porqué puede ser?
 
Pues la verdad es que es dificil ayudarte asi sin más.
Pero una cosa esta clara....si la tenias funcionando en la Breadboard y ha dejado de funcionar la pasarla a la pantalla es que algo no has conectado bien....revisa una a una las conexiones, algo se te ha escapado.
Un saludo
 
Cuando digo que la tengo trabajando en la breadboard, se alimentaba por arduino con 3 led de pruebas uno para cada canal, relé, sondas y todo perfecto.
Es ahora cuando al conectarlo a la pantalla principal con los tips, cuando existe el problema.
la conexion de los tips es básicamente sencilla para tenerlo mal conectado, lo he revisado una y otra vez.
En total son 11 tips, uno para cada línea, al no funcionar todos juntos, he probado con uno sólo y hace básicamente lo mismo.
Los pin en el arduino los tengo conectados al pwm, que es como viene funcionando, no creo que deba ser nada de códigos, ya que funciona y carga bien.
Alguna sugerencia...
gracias
 
Potencias de los leds? Potencia de la fuente dr alimentacion? Da mas detalles. 11 tip a mi personalmente me parecen una barbaridad pero tambien depende del acuario que tengas claro.... tienes algo mal en el circuito de potencia y no en el de control. Un saludo.

Enviado desde mi GT-I9505 usando Tapatalk 2
 
La pantalla esta funcionando con 11 series de 7 led de 3 voltios de 3 watios y la fuente es de 24 vol 15 amp.
Estos son los tip y como los tengo conectados [TodoMarino.com] El codigo funciona en una breadboard, pero conectada a la pantalla no. el negro al gnd de arduino y negativo de la fuente.
gris del positivo de la fuente a la salida de la serie de Led y el verde al pwm de arduino
 
Hola no se si te has expresado mal o yo no lo he entendido bien.
Pero dices que el cable gris va desde el positivo de la fuente de alimentacion a la serie de leds???
si es asi esta mal...

Revisa este esquema a ver si lo tienes igual...
[TodoMarino.com] El codigo funciona en una breadboard, pero conectada a la pantalla no.

Un saludo
 
¿Tienes puesta una lámina de mica entre el tip y el disipador?.

Igual el problema es que tienes que aislar cada tip del disipador, o disipadores independientes para cada tip-

Saludos
 
jmcadsl la conexión esta bien es como lo tengo conectado.

Lanchone este es el disipador [TodoMarino.com] El codigo funciona en una breadboard, pero conectada a la pantalla no.
 
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;
}
 
Bnas tardes,
nadie puede ayudarme, es posible que la placa arduino esté mal, es por el código...

Creo que lo dejaré para después de fiestas, demás tengo la cabeza saturada
felices fiestas a todos
 
Buenos días,
El problema debe estar en el código, donde no lo sé, es extraño porque he probado con un código sencillo con la misma conexión a la pantalla y funciona perfectamente.
Por favor mirar si hubiera algo que no consigo detectar.
Mil gracias y felices fiestas a todos...
 
Buenos días,
El problema debe estar en el código, donde no lo sé, es extraño porque he probado con un código sencillo con la misma conexión a la pantalla y funciona perfectamente.
Por favor mirar si hubiera algo que no consigo detectar.
Mil gracias y felices fiestas a todos...

creo que esta aqui
Código:
analogWrite(7, 255-LucesAzules ); 
analogWrite(8, 255-LucesMixtas ); 
analogWrite(9, 255-LucesBlancas);
y es asi
Código:
analogWrite(7, LucesAzules ); 
analogWrite(8, LucesMixtas ); 
analogWrite(9, LucesBlancas);
 
Tal y como te comenta medina el analogWrite puede ser el problema que tienes.

tu lo defines:
analogWrite(7, 255-LucesAzules );
analogWrite(8, 255-LucesMixtas );
analogWrite(9, 255-LucesBlancas);

supongo porque quieres mandar el valor de dimeo a la salida.

pero le estas realizando una operación matemática y las operaciones matemáticas se deben realizar fuera de la función analogWrite.

Lazules=255-LucesAzules;
Lmixtas=255-LucesMixtas;
Lblancas=255-LucesBlancas;

analogWrite(7,Lazules);
analogWrite(8,Lmixtas);
analogWrite(9,Lblancas);

creo que tendrias que probar así.

saludos
 
Atrás
Arriba