This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
problema al compilar con la libreria LiquidCrystal_I2C
#1
Hola, el motivo de esta pregunta es porque estoy realizando un proyecto con el arduino uno y un LCD de16x2; el problema es que yo lo estaba realizando en un ordenador con xp instalado que por motivos profesionales he tenido que dejar, el problema surge cuando al reanudar de nuevo es otros equipos tanto con xp como con W7 instalado me da un fallo al compilar, con exactamente todo igual, las mismas librerías el mismo programa de arduino etc..
El fallo que me da es el siguiente: Incubadora_final_pruebasV4_horas:7:error: `POSITIVE´was not declared in this scope
Y como lo tengo en el programas es como sigue:
#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3,POSITIVE);
// Addr, En, Rw, Rs, d4, d5, d6, d7, backlighpin, polarity
Si hay alguien que me pueda hecar un cable por que ya le pasara o porque sepa cual es el problema se lo agradeceria.
Saludos
  Responder
#2
hola

hay dos librerias lcd con el mismo nombre, la original y la de fmalpartida que es bastante mejor, mira no sea que antes hayas usado la malpartida y ahora tengas instalada la original.
creo que el primer include te sobra si vas a usar i2c
  Responder
#3
Prueba con:

LiquidCrystal_I2C lcd(0x20,16,2);

Si tienes problema como te dicen usa otra libreria.

Estas construyendo una incubadora? Crias pajaros?

EDITO: Te dejo unas librerias aqui:

http://www.mediafire.com/download/28j1cj...2C+LCD.zip

Me las paso un compi del foro y me van perfectas
  Responder
#4
Hay un hilo por aquí con bastante chicha sobre el tema.
  Responder
#5
Precisamente yo estuve ayer toda la mañana probando veintemil marlin´s para un glcd y no había manera cambié la configuración hasta que lo dí por imposible, tambien había cargado el marlin con el de sobremesa(vista) y ahora con el portatil(w7) no era capaz.
A la tarde... inspiración divina... boton derecho(icono de arduino)... ejecutar como administrador... cambia el fallo, ahora es otro... es un avance Cry

Solución (la que me funcionó) boton derecho... propiedades... ejecutar en modo compatibilidad windows xp sp2... y voilá... compilando cargando carga completa.
Prueba con eso, a ver si hay suerte... yo la tuve. Mola
Cuando un hombre planta un árbol bajo cuya sombra sabe que no se sentará ha comenzado a comprender el sentido de la vida... o lo que es lo mismo... comparte!!!
  Responder
#6
Hola gracias por responder, la librería es la misma en ambos ordenadores y si tienes toda la razón el primer include me sobraría pero aun estaba depurando el programa pero gracias por la observación.
  Responder
#7
Hola gracias por vuestra respuestas, en primer lugar y por orden de respuesta, juanjodcv la librería es la misma en ambos ordenadores y si tienes toda la razón el primer include me sobraría pero aun estaba depurando el programa pero gracias por la observación.
En cuanto a Trigger he probado a descargar las librerías del enlace que me proporcionas y sigue dando el mismo error, mañana voy probar en el portatill con W7 y ya te dire como me va, pero gracias. Si estoy intentando hacer una incubadora no es para mi es un regalo que quiero hacer a un familiar.
Jukillo gracias por respondes te pediría que me dieras el enlace del hilo porque yo estuve investigando y no logre encontrar nada, gracias.
DiegoLale he probado la solución que a ti te fue bien y me encuentro con que en ejecutar en modo compatibilidad solo me da la opción de elegir entre:
-Windows 95
-Windows 98/Windows Me
-Windows NT 4.0 (Service Pack 5)
-Windows 2000
No me dan as, y eso que tengo windows XP SP3, te digo lo mismo que a Trigger mañana probare en el portátil con W7 y a ver que pasa gracias.
  Responder
#8
Te dejo la cabecera de un programa que uso para temporizar, uso un lcd, por si te sirve

Código:
//Insoladora V1.0

//Librerias
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Bounce.h>

//Caracteres
byte uparrow[8] = {        //Flecha hacia arriba
    B00100,
    B01110,
    B10101,
    B00100,
    B00100,
    B00100,
    B00100,
    B00100
};
byte downarrow[8] = {    //Flecha hacia abajo
    B00100,
    B00100,
    B00100,
    B00100,
    B00100,
    B10101,
    B01110,
    B00100
};

//LCD
LiquidCrystal_I2C lcd(0x20,16,2);  // set the LCD address to 0x20 for a 16 chars and 2 line display

//Botones
Bounce UP = Bounce(2,100);        //Pin 2 para boton UP
Bounce DOWN = Bounce(3,100);        //Pin 3 para boton DOWN
Bounce START = Bounce(4,100);        //Pin 4 para boton START
Bounce STOP = Bounce(5,100);        //Pin 5 para boton STOP

//Salidas
#define RELE 6
#define BUZ 8

//Variables
long segundos = 0;    //Variable para los segundos
long minutos = 0;    //Variable para los minutos
long segundosactual = 0; //Variable para temporizacion
long segundostotal = 0; //Segundos a temporizar
long segundosviejo = 0; //Tope de segundos para el FOR
long contador = 0;
long multiplo = 1;

void setup() {
  // put your setup code here, to run once:
  //PINES
  pinMode(RELE, OUTPUT);
  pinMode(BUZ, OUTPUT);
  //Iniciamos el LCD
  lcd.init();
  lcd.backlight();                     //Iniciamos la retroiluminacion
  lcd.setCursor(0,0);                //Situamos el cursor al inicio
  lcd.print("Insoladora V1.0");        //Imprimimos mensaje inicial
  lcd.setCursor(5,1);                //        
  lcd.print("L1llo5");                //
  delay(2000);                        //Esperamos 2 segundos con el mensaje
  lcd.clear();                        //Limpiamos la pantalla
  Responder
#9
Hola DiegoLale he probado con las dos opciones que me dices también en w7 y el resultado sigue siendo el mismo, seguimos sin poder compilar. :x :x
  Responder
#10
Hola Trigger he probado tu forma de declarar el lcd pero el problema es que aunque si que me deja compilarlo debe haber un problema de comunicación en el lcd xk no presenta información por pantalla.
  Responder
#11
pedro escribió:Hola Trigger he probado tu forma de declarar el lcd pero el problema es que aunque si que me deja compilarlo debe haber un problema de comunicación en el lcd xk no presenta información por pantalla.

Ensñanos una foto de la placa I2C del lcd, has puesto las resistencias PULLUP?

Enviado desde mi Nexus 4 mediante Tapatalk
  Responder
#12
Hola Trigger, gracias por los consejos paro ya solucione el problema o mejor dicho uno de ellos, te cuento la solución fue desinstalar mi versión del programa que era la 1.0.5 aunque también probara con la 1.5.4 y descargarme e instalar la 1.0.4 que un compañero de trabajo me recomendó y listo sin problema de compilación y de carga de programa, la explicación no me la pidas pero la verdad es que va bien tanto en XP como en W7.
Como te digo solucione uno de los problemas, el otro que me queda es que como saber estoy haciendo una incubadora, pues bien lo que pasa es que cuando pruebo ya todo montado un numero aleatorio de veces se queda pillado y hasta que reseteo no se puede tirar en ese estado de por vida, yo y otro compañero que me esta ayudando creemos que podrían ser una de estas tres cosas:
Que se desborde la memoria del arduino uno, no son muchos datos a almacenar pero ….
Que tenga problemas de consumo corriente, ya que alimento con la propia fuente del arduino a el Lcd, un reloj, y tres reles, ya probrara con una fuente a parte pero tenia problemas porque se realimentaba por las entrada digitales.
O por ultimo que tenga tocada la propia placa del arduino.
En principio descartaría un problema de código, ya que si fuera así fallaría siempre, o eso supongo por si las moscas os pongo el código por si le podéis echar un ojo a ver si veis un fallo que yo no consigo ver.
Gracias.

Código:
#include <Wire.h>
#include <LCD.h>
#include "DHT.h"
#include <RTClib.h>
#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3,POSITIVE);
// Addr, En, Rw, Rs, d4, d5, d6, d7, backlighpin, polarity
RTC_DS1307 RTC; // Crea el objeto RTC
/*---------------------------------------------------Constantes-------------------------------------------------*/
#define DHTTYPE DHT11
#define HUMIDIFICADOR 11
#define CALEFACCION 12

/*-----------------------Atributos--------------------------*/
int bumperA=6;// Declaro que utilizo el Pin 6 para el bumper A.
int bumperB=7;// Declaro que utilizo el Pin 7 para el bumper B.
boolean vbStadoA=false;// Declaro la variable de estado A como false de inicio.
boolean vbStadoB=false;// Declaro la variable de estado B como false de inicio.
int MOTOR=10;//  Simulo el motor
boolean primeraLectura=false;// Si se lee millis() por primera vez
int valorInicial=0;// Valor desde el que se empueza a computar tiempo
int valorActual=0;//  Refresca el valor actual del tiempo transcurrido
boolean primeraVezTocaA=true;
boolean primeraVezTocaB=true;
boolean estaTemporizando=false;
int dht11_data[2]; //Declaro que dht11_data tiene dos elementos
DHT dht;
int minutos=0;//Valor al que se van pasando los dias.
int luzPantalla=3; // Declaro que utilizo el Pin 3 para el interruptor dl backlight
boolean haPasadoUnMinuto=false;
int valorInicialCuenta=0;// Valor desde el que se empueza a computar tiempo
int valorActualCuenta=0;//  Refresca el valor actual del tiempo transcurrido
boolean primeraLecturaCuenta=true;// Si se lee el RTC por primera vez
boolean primeraLecturaReset=true;//Si se activa el interruptor del lcd la primera vez

/*------------------------Métodos----------------------------*/

void presentacion(){    
  if(digitalRead(CALEFACCION)==HIGH){
     lcd.setCursor(0,1);  //posiciona el inicio en el lcd.
     lcd.print("T:on ");
  }      
  else
  {
    lcd.setCursor(0,1);  //posiciona el inicio en el lcd.
    lcd.print("T:off");
  }
  
  if(digitalRead(HUMIDIFICADOR)==HIGH){
     lcd.setCursor(5,1);  //posiciona el inicio en el lcd.
     lcd.print("H:on ");
  }      
  else
  {
    lcd.setCursor(5,1);  //posiciona el inicio en el lcd.
     lcd.print("H:off");
  }
  
  if(digitalRead(MOTOR)==HIGH){
     lcd.setCursor(11,1);  //posiciona el inicio en el lcd.
     lcd.print("M:on ");
  }      
  else
  {
    lcd.setCursor(11,1);  //posiciona el inicio en el lcd.
    lcd.print("M:off");
  }
  lcd.setCursor(0,0);
  lcd.print("Te:");
  lcd.print(dht11_data[1], DEC);  
  lcd.print("C");
  lcd.setCursor(7,0);
  lcd.print("Hu:");
  lcd.print(dht11_data[0], DEC);
  lcd.print("%");
  lcd.setCursor(13,0);  //posiciona el inicio en el lcd.
  lcd.print ("D");
  lcd.print(minutos);
        
}
void pantalla(){
        if (digitalRead(luzPantalla)==HIGH){
            lcd.backlight();
            
             if (primeraLecturaReset==true){
                 lcd.clear();  
                 primeraLecturaReset=false;
                 }
        }
        else{
            lcd.noBacklight();
            primeraLecturaReset=true;
            }
}
/*
* Método para realizar temporizaciones
* con una duración del valor pasado como parámetro
* dado en horas.
*/
  boolean cuentaMinutos(int minutos){    
    /*----condiones de inicalización----*/
    DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC
    if(primeraLecturaCuenta){
        haPasadoUnMinuto=false;  
        valorInicialCuenta=now.minute();                
        primeraLecturaCuenta=false;
    }
    /*----resto de las veces---*/        
    valorActualCuenta=now.minute();
    if((abs(valorActualCuenta-valorInicialCuenta))>=minutos){
        valorInicialCuenta=0;
        valorActualCuenta=0;
        haPasadoUnMinuto=true;        
        primeraLecturaCuenta=true;        
    }
    else{    
        haPasadoUnMinuto=false;              
    }
    return haPasadoUnMinuto;    
}

void lecturaDatos()
{
delay(dht.getMinimumSamplingPeriod());  
  dht11_data[0]= int(dht.getHumidity()); // Forzado de tipo, los métodos devuelven un float y los convierto a int
  dht11_data[1]= int(dht.getTemperature());
   }

/**
* Función para realizar el control de temperatura.
*/
void controlTemperatura(){  
  /**
   * Si la tempreratura es de 38º o menos se activa la resistencia de lo contrario se apaga y al llegar la los 45 se apaga.
   **/  
  if((dht11_data[1])<38){
    digitalWrite(CALEFACCION,HIGH);

  }      
  else{
    digitalWrite(CALEFACCION,LOW);
  }    
}
/**
* Función para realizar el control de humedad.
*/
void controlHumedad(){
  /**
   * Si la humedad es de 65 o menos activa el humificador de lo contrario lo apaga durante los primeros 19 dias,
   *si la humedad es de 85 o menos activa el humificador de lo contrario lo apaga a partir del dia 19
   *y si llega a los 45 dias tambien lo apaga.
   **/  
  if ((minutos <= 6) && ((dht11_data[0])<65))
  {
  
      digitalWrite(HUMIDIFICADOR,HIGH);
  }
        
  else if((minutos > 6) && ((dht11_data[0])<85)){
    digitalWrite(HUMIDIFICADOR,HIGH);
  }    
        
  else {
    digitalWrite(HUMIDIFICADOR,LOW);
  }    
}
/*    Una vez que se toca un bumper que se pasa como parámetro :
        -Detiene el motor.
        
        -Una vez que se detiene la temp, mueve de nuevo el motor
*   BumperA=1
*   BumperB=2
*/
void mueve(int bumper){
  if(minutos<=7){//Si son 21 dias o menos el motor esta activado sino se para."los ultimos dos o tres dias no se voltean los huevos".
    if(bumper==1){
    if(!estaTemporizando){//*     Si no está temporizando!!!
       primeraVezTocaA=false;
       primeraVezTocaB=true;
           digitalWrite(MOTOR,HIGH);// MUEVE!!!!    
    }
    else{
        digitalWrite(MOTOR,LOW); // está temporizando!!
    }
    }
    
    if(bumper==2){
    if(!estaTemporizando){//*     Si no está temporizando!!!
       primeraVezTocaB=false;
       primeraVezTocaA=true;
       digitalWrite(MOTOR,HIGH);// MUEVE!!!!    
    }
    else{
        digitalWrite(MOTOR,LOW); // está temporizando!!
    }
    }
      }
}
/*
* Método para leerDatesBumpers()
*/
void leerDatosBumpers(){//Se genera la funcion para leer los datos de los bumpers.
  /*----Leer datos bumper´s y actualizar variables de estado----*/
  /*___________bumperA___________*/
    if(digitalRead(bumperA)==HIGH){//Si el bumper A es igual a HIGH, hace..
    /*se hace que almacene el estado del bummper hasta que el otro se pulsa, por lo que se pone al contrio */
    vbStadoA=true;//se pasa el vbStado A a true.
    vbStadoB=false;//se pasa el vbStado B a false.
     }
    /*___________bumperB___________*/
    if(digitalRead(bumperB)==HIGH){//Si el bumper B es igual a HIGH, hace..
     /*se hace que almacene el estado del bummper hasta que el otro se pulsa, por lo que se pone al contrio */
    vbStadoB=true;//se pasa el vbStado B a true.
    vbStadoA=false;//se pasa el vbStado A a false.
    }
    }
/*
* Método para realizar temporizaciones para el motor de volteo
* con una duración del valor pasado como parámetro
* dado en segundos
*/
  boolean temporizador(int tiempo){
  DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC
    boolean estaTemporizando=true;
    /*----condiones de inicalización----*/
    if(primeraLectura){                
        valorInicial=now.second();                
        primeraLectura=false;
    }
    /*----resto de las veces---*/        
    valorActual=now.second();
    if((abs(valorActual-valorInicial))>=tiempo){
        valorInicial=0;
        valorActual=0;
        estaTemporizando=false;        
        primeraLectura=true;
    }
        else{
               estaTemporizando=true;
            }
    return estaTemporizando;    
      }
/*
* método para realizar el volteado de los huevos
*/
void moverHuevos(){
  if(vbStadoA){    
    if(primeraVezTocaA){      
      estaTemporizando=temporizador(8);// Temporizador para el volteo en segundos; 8 segundos
      }
      if(!vbStadoB){
        mueve(1);
      }
  }
  else if(vbStadoB){      
      if(primeraVezTocaB){
        estaTemporizando=temporizador(8);//Temporizador para el volteo en segundos; 8 segundos
      }
      if(!vbStadoA){
            mueve(2);
      }
  }
  else {
    digitalWrite(MOTOR,HIGH);// MUEVE!!!!
  }
    
}
/*--------------------Constructores---------------------*/
void setup() { //* Le especificamos que tiene conectado el Arduino
  Serial.begin(9600);
  Wire.begin(); // Establece la velocidad de datos del bus I2C
  lcd.begin(16,2);//* Tengo un display de ... este tipo
  lcd.backlight();  
  dht.setup(2); // data pin 2 (Digital)
  RTC.begin(); // Establece la velocidad de datos del RTC
      //Si quitamos el comentario de la linea siguiente, se ajusta la hora y la fecha con la del ordenador
      //RTC.adjust(DateTime(__DATE__, __TIME__));
  
  /*-------------------------------------------Entradas-----------------------------------------*/
  pinMode(bumperA,INPUT);
  pinMode(bumperB,INPUT);
  pinMode(luzPantalla, INPUT);
   /*-------------------------------------------Salidas-----------------------------------------*/
  pinMode (CALEFACCION, OUTPUT);
  pinMode(MOTOR,OUTPUT);
  pinMode (HUMIDIFICADOR, OUTPUT);
  }
/*---------------------Main-----------------------------*/
void loop(){
    if(minutos<10){                              
        lecturaDatos();// Ejecuta la función para realizar la lectura de datos del sensor de temperatura y humedad,y realiza la funcion para presentarlos en pantalla.
        leerDatosBumpers();// Ejecuta la función para controlar los bumper de final de carrera del volteador.
                controlTemperatura();// Ejecuta la función para controlar la temperatura
        controlHumedad();// Ejecuta la función para controlar la humedad
                presentacion();// Ejecuta la función que presenta en pantalla si las resistencias estan activadas y si el motor esta activado.        
                moverHuevos();      // Ejecuta la función para realizar el movimiento del voleador en funcion del temporizador (4 horas = 14.400.000)
         if (cuentaMinutos(1)){//Ejecuta la función para realizar la cuenta de dias con el rtc.
          minutos++;    
        }
        pantalla();// ejecuta la funcion que controla el encendido y apagado de la luz de fondo del LCD y hace un reset cada vez que se activa el interruptor.
            }
      else{
           digitalWrite(HUMIDIFICADOR,LOW);
           digitalWrite(CALEFACCION,LOW);
           digitalWrite(MOTOR,LOW);
           lcd.backlight();
           delay(2000);
           lcd.setCursor(0,0);
           lcd.clear();
           lcd.print("INCUBACION");
           lcd.setCursor(0,1);
           lcd.print("FINALIZADA");
           lcd.noBacklight();
           delay(1000);
           }    
           }
  Responder
#13
Como veis los comentarios no coinciden pero es que para probar lo tengo como minutos y segundos en vez de horas y días.
  Responder
#14
En que parte de ejecucion de queda pillado?

Tendria que leer el codigo entero para ver si vemos algo que este raro....
  Responder
#15
El codigo entero es el que puse antes, no se donde se queda porque no lo hace de forma fija, unas veces es al poco tiempo, otras mas tarde y otras lo hace bien, y no consigo ver un patron que indique en que o porque motivo lo hace, intentare ir haciendo varias cosas, como ir quitando partes del codigo a ver si es de la memoria, o sustituyendo los reles por diodos para bajar el consumo, no se por buscar cosas, si se os ocurre algo ya me direis, gracias.
  Responder
#16
pedro escribió:El codigo entero es el que puse antes, no se donde se queda porque no lo hace de forma fija, unas veces es al poco tiempo, otras mas tarde y otras lo hace bien, y no consigo ver un patron que indique en que o porque motivo lo hace, intentare ir haciendo varias cosas, como ir quitando partes del codigo a ver si es de la memoria, o sustituyendo los reles por diodos para bajar el consumo, no se por buscar cosas, si se os ocurre algo ya me direis, gracias.

Los reles los tienes con transistores no? Vamos no controlas el rele directamente con la salida del arduino no?
  Responder
#17
si los tengo con los transistores y aislados por aptoacopladores, xk primero los tenia sin estos y se los añadi para aislar por si podia ser de ahi el fallo.
  Responder


Posibles temas similares…
Tema Autor Respuestas Vistas Último mensaje
  error al compilar el código homer32 4 1,984 23-09-2019, 01:29 PM
Último mensaje: homer32
  CONSULTA error al compilar amb2000 4 2,092 05-07-2019, 01:46 PM
Último mensaje: Iván
  errores al compilar el sketch homer32 3 2,220 02-04-2018, 04:38 AM
Último mensaje: homer32
  problemas con libreria servo homer32 9 5,462 17-03-2017, 12:45 PM
Último mensaje: homer32
  control servo sin libreria "servo.h" homer32 11 10,694 08-12-2016, 01:25 PM
Último mensaje: homer32