Autor Tema: Se cuelga el lcd I2C con el timer  (Leído 3738 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado korpaztk

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 202
Se cuelga el lcd I2C con el timer
« en: 17 de Febrero de 2015, 11:58:46 »
Hola querida comunidad... hacía mucho que no posteaba...
Por cuestiones de trabajo grupal empece a estudiar un poco arduino (siempre estuve con los pic).
Compre para hacer un proyecto de control de temperaturas de un aire acondicionado de mi casa una placa ARDUINO UNO, al cual le incluí una placa de 4 relay y un lcd de 16x2 y una placa I2C para adaptarle al LCD.

La cuestión es la siguiente:

Antes de adaptarle el I2C al LCD, mi código dentro de todo iba bastante fluido, pero al cargarle la librería del adaptador I2C, el timer me hace colgar el sistema y no se que pasa, ya probe con timer 1 y timer 2 de la placa y sigue tildado...

Código: [Seleccionar]
#include <MsTimer2.h>
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>  // F Malpartida's NewLiquidCrystal library
#include <Thermistor.h>

//PINES DEL LCD//////////////////////////////////////////////////////////////////////
#define I2C_ADDR    0x27
#define BACKLIGHT_PIN  3
#define En_pin  2
#define Rw_pin  1
#define Rs_pin  0
#define D4_pin  4
#define D5_pin  5
#define D6_pin  6
#define D7_pin  7
LiquidCrystal_I2C  lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
////////////////////////////////////////////////////////////////////////////////////

Thermistor temp(0);

//RELAY'S/////////////////////////////////////////////////////////////
#define compresor 12                 //Pin del Compresor
#define velocidadBaja 11
#define velocidadMedia 10
#define velocidadAlta 9
#define valvulaInv 8
//////////////////////////////////////////////////////////////////////

//BOTONES/////////////////////////////////////////////////////////////
#define suboTemp 5                     //Pin Boton Subir Temperatura
#define bajoTemp 4                     //Pin Boton Bajar Temperatura
#define botonVelocidadForz 3
//////////////////////////////////////////////////////////////////////

int temperaturaSET = 24;               //Temperatura Seteada
int banderaArrancarComp = 0;           //Bandera que habilita encender el compresor
int tempAmbiente = 0;             //Variable que almacena la temperatura
int banderaArrancarForz = 0;           //Bandera que habilita encender el forzador
int encTime = 0;                   //Bandera que indica si el timer del forzador esta encendido
int cuenta = 0;                        //Variable que cuenta las cantidades de veces que el timer cuenta
int velocidadForzador = 2;
int ACTIVADOTIMER = 0;
 #define  LED_OFF  0
#define  LED_ON  1
 
void setup()
{

lcd.begin(16,2);                     //Se configura el tipo del lcd a 16x2
  lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
    lcd.setCursor(0,0);                  //Se posiciona el cursor
  lcd.print("IDEC  Temp: ");           //Se escibe en la primer línea
lcd.setBacklight(1);
  pinMode(compresor, OUTPUT);          //Se configura el pin Compresor como salida
  pinMode(velocidadBaja, OUTPUT);           //Se configura el pin Forzador como salida
  pinMode(velocidadMedia, OUTPUT);
  pinMode(velocidadAlta, OUTPUT);
  pinMode(valvulaInv, OUTPUT);
  pinMode(suboTemp, INPUT);            //Se configura el pin de subir temperatura como entrada
  pinMode(bajoTemp, INPUT);            //Se configura el pin de bajar temperatura como entrada
  pinMode(botonVelocidadForz, INPUT);  //Se Configura el pin de Velocidad del forzador como entrada
 
    encTime = 0;
 

MsTimer2::set(5000, flash);
MsTimer2::start();
 
}





//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop()
{

if (encTime == 1)
  {

lcd.setCursor(12, 0);     
  tempAmbiente = temp.getTemp();                         
  lcd.print(tempAmbiente);                       
  lcd.setCursor(0,1);
  lcd.print("Set: ");
  lcd.setCursor(6,1);
  lcd.print(temperaturaSET);

}
 
  if (encTime == 0)
  {

lcd.setCursor(12, 0);     
  tempAmbiente = temp.getTemp();                       
  lcd.print(tempAmbiente);                       
  lcd.setCursor(0,1);
  lcd.print("Set: ");
lcd.setCursor(6,1);
  lcd.print(temperaturaSET);
 
  }

  //C O N S U L T A M O S     S I    L A    T E M P   A M B I E N T E   E S   M A Y O R     A    L A    S E T E A D A/////////////////////////////////////////
  if (tempAmbiente > (temperaturaSET + 1))        //Consultamos si la temperatura ambiente es mayor a dos grados por sobre la temperatura seteada

  {
   
if (encTime == 0) 
    {             //Consulta si el timer del compresor ya fue encendido (en caso de no ser así)

         encTime = 1;
   
    }

  }

 


   
   //S   I     P   R   E   S   I   O   N   A   M   O   S    U   N    B   O   T   O   N///////////////////////////////////////////////////////////////////////////////

  if (digitalRead(suboTemp) == 0)                //Si el boton de subir de temperatura se preciona
  {

    temperaturaSET = temperaturaSET + 1;    //Temperatura seteada la aumentamos un grado
    delay(1000);                            //Delay de 1 seg para evitar repeticiones
   
  }


  if (digitalRead(bajoTemp) == 0)                //Si el boton de bajar de temperatura se preciona
  {

    temperaturaSET = temperaturaSET - 1;    //Temperatura seteada lo disminuimos en grado
    delay(1000);                            //Delay de 1 seg para evitar repeticiones
   
  }

 









}





//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//SUB RUTINAS




//S  I     P   R   E   S   I   O   N   A   M   O   S     C   A   M   B   I   O     D   E     M   A   R   C   H   A///////////////////////////////////////////////////////

void cambiomarcha(void)
{
 

    velocidadForzador = velocidadForzador + 1;
   
    if (velocidadForzador == 3)
        {
          velocidadForzador = 0;
        }
         
   switch(velocidadForzador)
    {
      case 0:
             digitalWrite(velocidadAlta, LOW);
             delay(50);
             digitalWrite(velocidadBaja, HIGH);
             break;
      case 1:
             digitalWrite(velocidadBaja, LOW);
             delay(50);
             digitalWrite(velocidadMedia, HIGH);
             break;   
       case 2:
             digitalWrite(velocidadMedia, LOW);
             delay(50);
             digitalWrite(velocidadAlta, HIGH);
             break;
        }
       
 
       
}
 
 
 




///////////////////////////////////////R    U    T    I    N    A     D   E   L       T   I   M   E   R////////////////////////////////////////////////////////////
void flash(void)                       
{
 
  cuenta = cuenta + 1;                 //Variable que cuenta las veces que entra en la rutina para saber cuanto tiempo estamos esperando
 
  if (cuenta == 4)                     //Si entramos 4 veces en la rutina...
  {
   
  banderaArrancarComp = 1;             //Habilitamos el encendido del compresor
  encTime = 1;                     //Indica que el timer ha entrado en los 4 minutos
  cuenta = 0;
  digitalWrite(compresor, HIGH);        //Ponemos el pin del compresor en estado bajo
  banderaArrancarComp = 0;             //desactivamos la banndera del compresor
  lcd.setCursor(9,1);                  //Posicionamos el cursor
  lcd.print("COM");                    //Imprimimos en pantalla  //cuenta lo igualamos a 0
 
  }
 
  if (cuenta ==2)                      //Si entramos 2 veces en la rutina...
 
  {
   
  lcd.setCursor(0,1);
  cambiomarcha();
  banderaArrancarForz = 1;           //Habilitamos el encendido del forzador
  encTime = 1;                   //Indica que el timer ha entrado en los 2 minutos
  lcd.setCursor(13,1);                 //Posicionamos el cursor
  lcd.print("FOR");   
 
  }

 
}




aquí esta el código... alguna sugerencia??

Saludos.-
Korpaz.
Técnico Electronico.

El Papel Es Mi Mejor Psicologo

Desconectado Ekaitz

  • PIC10
  • *
  • Mensajes: 5
Re: Se cuelga el lcd I2C con el timer
« Respuesta #1 en: 31 de Marzo de 2015, 16:50:13 »
Vamos a ver, no he visto tu código, pero he estado investigando el tema del I2C ya que quiero leer un módulo RTC. Al parecer hay muchos usuarios que reportan problemas, y lo que ocurre es que el I2C en el Arduino carece de resistencias de pull-up en placa, ya que si se quiere utilizar como slave de, por ejemplo, una Raspberri, esta lleva ya las resistencias. Antes de nada comprueba el tema, te facilito unos enlaces que yo mismo he consultado y hablan de ello:
http://quick2wire.com/wp-content/uploads/2012/05/image00.png
https://jalfonsosuarez.wordpress.com/2015/02/19/ds1307-solucion-de-problemas/
http://www.instructables.com/id/Clock-with-termometer-using-Arduino-i2c-16x2-lcd-D/?lang=es&ALLSTEPS