Mi controlador arduino se queda bloqueado

Tema en 'Mi Controlador' iniciado por Joiba, 9 Jul 2013.

  1. Joiba

    Joiba

    Mensajes:
    148
    Registrado:
    5 Feb 2008
    Ubicación:
    España
    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.
     
  2. jmcadsl

    jmcadsl Miembro Honorífico

    Mensajes:
    852
    Registrado:
    17 Ene 2010
    Ubicación:
    España
    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.
     
  3. Joiba

    Joiba

    Mensajes:
    148
    Registrado:
    5 Feb 2008
    Ubicación:
    España
    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.
     
  4. Joiba

    Joiba

    Mensajes:
    148
    Registrado:
    5 Feb 2008
    Ubicación:
    España
    A nadie se le ocurre nada???
     
  5. isoriano

    isoriano

    Mensajes:
    353
    Registrado:
    12 Sep 2011
    Ubicación:
    badalona
    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
     
  6. Joiba

    Joiba

    Mensajes:
    148
    Registrado:
    5 Feb 2008
    Ubicación:
    España
    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.
     
  7. isoriano

    isoriano

    Mensajes:
    353
    Registrado:
    12 Sep 2011
    Ubicación:
    badalona
    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);
    }
     
  8. isoriano

    isoriano

    Mensajes:
    353
    Registrado:
    12 Sep 2011
    Ubicación:
    badalona
    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
     
  9. ferprof

    ferprof

    Mensajes:
    2.733
    Registrado:
    13 Ene 2011
    Ubicación:
    Spain
    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.
     
  10. Joiba

    Joiba

    Mensajes:
    148
    Registrado:
    5 Feb 2008
    Ubicación:
    España
    Gracias a todos
    El Arduino esta conectado con na transformador de 9v, gracias por el aporte.
     
  11. Joiba

    Joiba

    Mensajes:
    148
    Registrado:
    5 Feb 2008
    Ubicación:
    España
    Pues nada que no hay forma de que esto funcione.
    En cuanto al codigo, si meto ese, tendria que cambiar muchas cosas, no?
     
  12. Joiba

    Joiba

    Mensajes:
    148
    Registrado:
    5 Feb 2008
    Ubicación:
    España
    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???
     
  13. isoriano

    isoriano

    Mensajes:
    353
    Registrado:
    12 Sep 2011
    Ubicación:
    badalona
    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
     
  14. Joiba

    Joiba

    Mensajes:
    148
    Registrado:
    5 Feb 2008
    Ubicación:
    España
    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???
     
  15. isoriano

    isoriano

    Mensajes:
    353
    Registrado:
    12 Sep 2011
    Ubicación:
    badalona
    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
     
  16. Joiba

    Joiba

    Mensajes:
    148
    Registrado:
    5 Feb 2008
    Ubicación:
    España
    Tu has probado el codigo que me has puesto aqui???
    Que cosas has debido poner o cambiar para que funcione???
     
  17. Joiba

    Joiba

    Mensajes:
    148
    Registrado:
    5 Feb 2008
    Ubicación:
    España
    Solo le veo una constante para el mando a distancia, es que solo tiene un boton para el menu???
     
  18. djdevil666bcn

    djdevil666bcn

    Mensajes:
    299
    Registrado:
    29 Mar 2013
    Ubicación:
    Sant Andreu de la Barca
    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.
     
  19. isoriano

    isoriano

    Mensajes:
    353
    Registrado:
    12 Sep 2011
    Ubicación:
    badalona
    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
     
  20. isoriano

    isoriano

    Mensajes:
    353
    Registrado:
    12 Sep 2011
    Ubicación:
    badalona
    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; -