Mi controlador arduino se queda bloqueado

5 Feb 2008
148
España
Provincia
Sevilla
Buenas a todos, espero podais ayudarme e intentare explicarme lo mejor posible:
La cuestion es que mi controlador formado por un arduino mega 2560, un reloj ds, una LCD de 20x4 y un modulo de 2 reles, se queda bloqueado de vez en cuando, la cosa es que si trabaja sin la pantalla led conectada parace que va mejor, o yo no me he dado cuenta de que pase lo mismo, pero si conecto la pantalla led, lo mismo se queda bloqueado en el dimeo de encendido, que de apagado, que solo con el led de luna, que sin tener nada encendido, ya me tiene loco. Con bloqueado me refiero a que la pantalla LCD, se queda congelada y si la pantalla led esta encendida, pues esta se apaga y si pasa con la pantalla led apagada, pues directamente ni enciende.
Yo lo tengo montado en una caja de PVC, no se si es problema de hardware o software, pero como dije antes, parece que sin la pantalla led conectada no lo hace.
Espero me podais ayudar.
Un saludo y gracias a todos.
 

jmcadsl

Miembro Honorífico
17 Ene 2010
1.030
España
Provincia
Madrid
Hola Joiba, para poder ayudarte necesitamos que seas un poco más preciso...
Lo más importante es determinar (sin ninguna duda) si con la pantalla LCD desenchufada el controlador no se bloquea....
Si fuera así, el siguiente paso que yo te aconsejaría es conectar otro LCD (y así descartar un problema de hardware del LCD)

Un saludo.
 
5 Feb 2008
148
España
Provincia
Sevilla
Gracias por tu respuesta, te refieres a la pantalla LCD del arduino, esa es la que tengo que desconectar, o la pantalla led del acuario???
Porque las pruebas que hice fueron con la pantalla led del acuario desconectada y parecia que no me fallaba.
 
12 Sep 2011
355
badalona
Provincia
barcelona
joiba has probado con el otro codigo el que no actibaba los reles pones un programador temporalmente y prueva ese codigo haber si se cuenga tambien
 
5 Feb 2008
148
España
Provincia
Sevilla
Ayer probe por desconectarle la pantalla LCD y a durado hasta hace 5 minutos, por lo que descartado, ahora he desconectado la sonda de temperatura, haber que tal.
Isoriano, tu tienes todos los codigos identificados por cada modificacion???
Si es asi pasamelos.
Yo sigo diciendo que es del codigo.
 
12 Sep 2011
355
badalona
Provincia
barcelona
mira joiba este es el codigo que te digo le falta el poder controlar los reles y funciones del mando pero puedes probar te hara el dimeo asi que las luces se apagaran pero las fuentes no
//Pinout//
/*
PWM2 - Dimeo 1 Azules
PWM3 - Dimeo 2 Blancos
PWM4 - Dimeo 3 Varios
PWM5 - Sensores de Temperatura
PWM6 - Receptor IRDA
PWM7
PWM8
PWM9
PWM10
PWM11
PWM12
PWM13
D22 - rele1 fuente de lampara leds
D23 - rele2 Bombra de reposicion
D24 - rele3 Bomba de subida
D25 - rele4
D26 - rele5
D27 - rele6
D28 - rele7
D29 - rele8
D30 - triac ventiladores lampara
D31 - triac ventilador sump
D32 - triac ventiladores urna ppal
D33 - triac/rele luz sump
D34 - triac Luz Luna?? o dimeo..
D35
D36
D37
D38
D39
D40
D41
D42
D43
D44
D45
D46
D47
D48
D49
D50
D51
D52
D53
A0 - Boya nivel relleno 1
A1 - Boya nivel relleno 2
A2 - Boya nivel ppal
A3
A4
A5
A6
A7
A8
A9
A10
A11
A12
A13
A14
A15
*/


#include <WProgram.h> // necesaria quita error de copilacion
#include <EEPROM.h> // read/write eeprom
#include <avr/wdt.h> //perro
#include <Wire.h> // comunicacion I2C
#include <IRremote.h> // #include <NECIRrcv.h> // Mando a Distacia
#include <OneWire.h> // temeperatura
#include <DallasTemperature.h> //temperatura DS1820
#include <LiquidCrystal_I2C.h> // Pantalla LCD
// direcciones de memoria del I2C
#define Reloj_I2C 0x68
LiquidCrystal_I2C lcd(0x27,20,4);


//// Pin (I/O) /////
#define ONE_WIRE_BUS 5//pin de temperatura 5
int RECV_PIN = 6; // pin del mando a distancia
int Rele1Luces =22;
int Rele2=23;
int Rele3=24;
int DimeoA = 2;
int DimeoB = 3;
int DimeoV = 4;
OneWire oneWire(ONE_WIRE_BUS);//temperatura
DallasTemperature sensores(&oneWire);// temperatura

////+++++++++++++++++++++++++++++++++///

//////////////// variables//////////////

int ValorFaderMaxA = 200;
int ValorFaderMaxB = 200;
int ValorFaderMaxV = 200;

int ValorFaderA = 0;
int ValorFaderB = 0;
int ValorFaderV = 0;

int ValorHora = 0; // valor de la hora para poder comparar

int horaON = 11; //hora a la que empiezan a encender
int minutoON = 30;
int horaOFF = 23; //hora a la que se apagan
int minutoOFF = 0;

int TiempoDimeoA=25; //el valor bueno es 25 puesto 1 para pruebas
int TiempoDimeoV=25; //el valor bueno es 25 puesto 1 para pruebas
int TiempoDimeoB=25; //el valor bueno es 25 puesto 1 para pruebas

int TiempoDimeando = (ValorFaderMaxA*TiempoDimeoA)/60;

int ONLucesA = (horaON*60)+minutoON;
int OFFLucesA = ((horaOFF*60)+minutoOFF)-TiempoDimeando;
int ONLucesV = ONLucesA+20;
int OFFLucesV =OFFLucesA-20;
int ONLucesB = ONLucesV+20;
int OFFLucesB =OFFLucesV-20;

int ContadorA=0;
int ContadorV=0;
int ContadorB=0;

int ContadorDiaA=0;
int ContadorDiaV=0;
int ContadorDiaB=0;

int ContadorNocheA=0;
int ContadorNocheV=0;
int ContadorNocheB=0;


int TempAcu;//variable donde guardaremos la temperatura del acuario
int TempCaja;//variable donde guardaremos la temperatura de la caja
int TempLeds;//variable donde guardaremos la temperatura de los leds


byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; //del reloj

////// constantes Mado distancia
#define mando_1 16748655


///////////////////Funciones /////////////////////////////

//////// leer la hora /////////////
void Leer_Reloj(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
// Resetea el registro puntero
Wire.beginTransmission(Reloj_I2C);
Wire.send(0);
Wire.endTransmission();
Wire.requestFrom(Reloj_I2C, 7);
// Alguno de estos necesitan enmascarar porque ciertos bits son bits de control
*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());
}


// 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) );}

//// LEDS AZULES////

void LucesA() {//Como son los primeros y ultimos solo estos controlan el rele
ContadorA=0;// se reinicia contador si no cumple ninguna de las condiciones
//On azules//
if (ValorHora >= ONLucesA && ValorHora <= OFFLucesA && ValorFaderA < ValorFaderMaxA)
{
if (ValorFaderA == 0)
{ digitalWrite(Rele1Luces,LOW); //sera low o high segun se conecten los reles
}
analogWrite (DimeoA,ValorFaderA);
ValorFaderA=ValorFaderA+1;
ContadorA=ContadorDiaA;
}
//OFF azules//
if (ValorHora >= OFFLucesA && ValorFaderA != 0 )
{
ValorFaderA=ValorFaderA-1;
analogWrite (DimeoA,ValorFaderA);
if (ValorFaderA == 0) {
digitalWrite(Rele1Luces,HIGH);
}
ContadorA=ContadorNocheA;
}
}

////LEDS VARIOS////

void LucesV() {
ContadorV=0;
//On varios//
if (ValorHora >= ONLucesV && ValorHora <= OFFLucesV && ValorFaderV < ValorFaderMaxV)
{
analogWrite (DimeoV,ValorFaderV);
ValorFaderV=ValorFaderV+1;
ContadorV=ContadorDiaV;
}
//OFF varios//
if (ValorHora >= OFFLucesV && ValorFaderV != 0 )
{
ValorFaderV=ValorFaderV-1;
analogWrite (DimeoV,ValorFaderV);
ContadorV=ContadorNocheV;
}
}

//////LEDS BLANCOS/////

void LucesB() {
ContadorB=0;
//On blancos//
if (ValorHora >= ONLucesB && ValorHora <= OFFLucesB && ValorFaderB < ValorFaderMaxB)
{
analogWrite (DimeoB,ValorFaderB);
ValorFaderB=ValorFaderB+1;
ContadorB=ContadorDiaB;
}
//OFF blancos/
if (ValorHora >= OFFLucesB && ValorFaderB != 0 )
{
ValorFaderB=ValorFaderB-1;
analogWrite (DimeoB,ValorFaderB);
ContadorB=ContadorNocheB;
}
}

void setup()
{
lcd.init();
lcd.backlight();
}


void loop()
{
Leer_Reloj(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
ValorHora = (hour*60)+minute;
///// codiciones de los canales /////
if (ContadorA ==TiempoDimeoA)
{
LucesA(); // funcion de dimeo azules
}
if (ContadorV ==TiempoDimeoV)
{
LucesV(); // funcion de dimeo canal 2
}
if (ContadorB ==TiempoDimeoB)
{
LucesB(); // funcion de dimeo canal 3
}

/////// incremento contador de canales ////////
ContadorA=ContadorA+1;
ContadorV=ContadorV+1;
ContadorB=ContadorB+1;

lcd.setCursor(0, 0);

if (dayOfMonth < 10) lcd.print("0");
lcd.print(dayOfMonth, DEC);
lcd.print("/");
if (month < 10) lcd.print("0");
lcd.print(month, DEC);
lcd.print("/");
if (year < 10) lcd.print("0");
lcd.print(year, DEC);
lcd.setCursor(12, 0);
if (hour < 10) lcd.print("0");
lcd.print(hour, DEC);
lcd.print(":");
if (minute < 10) lcd.print("0");
lcd.print(minute, DEC);
lcd.print(":");
if (second < 10) lcd.print("0");
lcd.print(second, DEC);
lcd.setCursor(0,1);
lcd.print("Azules:");
lcd.print(ValorFaderA, DEC);
lcd.setCursor(0, 2);
lcd.print("Blancos:");
lcd.print(ValorFaderB, DEC);
lcd.setCursor(0, 3);
lcd.print("Varios:");
lcd.print(ValorFaderV, DEC);


/////TEMPERATURA/////

// Lee el valor de temperatura de todos los sensores conectados al bus
sensores.requestTemperatures();

// Crea una variable llamada ”T1” asignándole el valor de temperatura obtenido con sensores.getTemp(0),el valor 0 indica que es el primer sensor que encuentre en el bus//
float T1(sensores.getTempCByIndex(0));

lcd.setCursor(12,1);
lcd.print("T1:");
lcd.print(T1);

float T2(sensores.getTempCByIndex(1));

lcd.setCursor(12,2);
lcd.print("T2:");
lcd.print(T2);

float T3(sensores.getTempCByIndex(2));

lcd.setCursor(12,3);
lcd.print("T3:");
lcd.print(T3);

delay(800);
}
 
12 Sep 2011
355
badalona
Provincia
barcelona
es el del compañero pero como el foro lo cerraron pues no e podido hablar con el espero no se enfade si lo ve publicado
 
13 Ene 2011
2.730
Spain
Provincia
Madrid
A veces estos fallos se deben a que el arduino alimentado desde el ordenador no tiene capacidad suficiente para todo lo que le conectas.
Prueba a alimentar al arduino con un transformador de corriente continua.
 
5 Feb 2008
148
España
Provincia
Sevilla
Gracias a todos
El Arduino esta conectado con na transformador de 9v, gracias por el aporte.
 
5 Feb 2008
148
España
Provincia
Sevilla
Pues nada que no hay forma de que esto funcione.
En cuanto al codigo, si meto ese, tendria que cambiar muchas cosas, no?
 
5 Feb 2008
148
España
Provincia
Sevilla
Isoriano, recuerdas eso que conan hizo en el codigo de reiniciar el perro o algo asi???
A que se refiere con eso y como puedo eliminarlo???
 
12 Sep 2011
355
badalona
Provincia
barcelona
hola solo te digo que lo pongas y prueves unos dias haber si se cuelga o no no te apagara las fuentes pero si las luces ya que te bajara el dimeo a 0
en cuanto al perro lo que conan decia que el codigo lleva lo del perro para que reiniciara y por ese motivo no deveria colgarse
y lo de el otro cidigo que te e mandado lo unico que varia es que usa botonera en vez de mando ir y sensores ultra sonido pero programas el horario en el codigo y lo dejas trabajar
 
5 Feb 2008
148
España
Provincia
Sevilla
Pero no tengo que cambiar nada del codigo para poder ponerlo y que funcione???
Y cual es el codigo, el que me has puesto aqui o el que me has mandado por email???
 
12 Sep 2011
355
badalona
Provincia
barcelona
el que e puesto aqui tiene lo mismo que el de conal pero sin tanto follon funcionar funciona pero no activa los reles y el que te e mandado es de un compañero del foro usa la misma pantalla que nosotros
 
5 Feb 2008
148
España
Provincia
Sevilla
Tu has probado el codigo que me has puesto aqui???
Que cosas has debido poner o cambiar para que funcione???
 
5 Feb 2008
148
España
Provincia
Sevilla
Solo le veo una constante para el mando a distancia, es que solo tiene un boton para el menu???
 
29 Mar 2013
299
Sant Andreu de la Barca
Provincia
barcelona
Haz un programa basico que te vaya encenciendo 1,2,3 leds secuencialmente, por tiempo, aleatorio... y pruebalo así, si se cuelga es el arduino. De todas formas, si no quieres probar con lo basico, prueba de meterle una fuene con mas voltios tal vez de 12 como max. También vigila la temperatura que te alcanza la placa donde la tienes colocada.
 
12 Sep 2011
355
badalona
Provincia
barcelona
joiba es lo basico olvidate de mando solo pon en el codigo la hora y fecha y a que hora quieres que se ponga en marcha y haber si se cuelga nada mas
yo mañana empiezo ya con la parte electrica de mi acuario ( control de arduino ) y podre mirar haber que ocurre en el codigo
 
12 Sep 2011
355
badalona
Provincia
barcelona
en esta parte pon la hora depuesta en marcha y apagado y lo programas
int ValorFaderMaxA = 200;
int ValorFaderMaxB = 200;
int ValorFaderMaxV = 200;

int ValorFaderA = 0;
int ValorFaderB = 0;
int ValorFaderV = 0;

int ValorHora = 0; // valor de la hora para poder comparar

int horaON = 11; //hora a la que empiezan a encender
int minutoON = 30;
int horaOFF = 23; //hora a la que se apagan
int minutoOFF = 0; -
 
Arriba