NodeMcu V3 Conflicto de librerias

Hola a todos, tengo problemas con unas librerias con el NodeMcu V3 de L0L1n, estuve trabajando en una tarjeta de monitoreo de alarmas con el Firebase, usando las siguientes librerias sin problemas:

#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
#include <ESP8266WiFi.h>          
#include <Firebase_ESP_Client.h>
#include <addons/RTDBHelper.h>

Luego decidi agregarle un teclado por I2C y adicionar una contraseña editable en la EEPROM del mismo modulo, asi que realice un programa independiente aparte que funciono perfectamente con las librerias:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad_I2C.h>
#include <Keypad.h>
#include <EEPROM.h>

Al final realice la union de ambos programas con librerias y me arroja un error de bibliotecas que indica lo siguiente:

Arduino:1.8.18 (Windows 10), Tarjeta:"NodeMCU 1.0 (ESP-12E Module), 80 MHz, Flash, Legacy (new can return nullptr), All SSL ciphers (most compatible), 4MB (FS:2MB OTA:~1019KB), 2, v2 Lower Memory, Disabled, None, Only Sketch, 115200"

ATENCIÓN: la librería LiquidCrystal_I2C-1.1.2 pretende ejecutarse sobre arquitectura(s) avr y puede ser incompatible con tu actual tarjeta la cual corre sobre arquitectura(s) esp8266.

In file included from sketch\CENTRAL_DE_ALARMAS.ino.cpp:1:0:

C:\Users\ALEX\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.4\cores\esp8266/Arduino.h:43:14: error: expected identifier before numeric constant

 #define HIGH 0x1

              ^

C:\Users\ALEX\Documents\Arduino\libraries\Keypad/Keypad.h:63:16: note: in expansion of macro 'HIGH'

 #define CLOSED HIGH

                ^

C:\Users\ALEX\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.4\libraries\ESP8266WiFi\src/include/wl_definitions.h:73:3: note: in expansion of macro 'CLOSED'

   CLOSED      = 0,

   ^

C:\Users\ALEX\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.4\cores\esp8266/Arduino.h:43:14: error: expected '}' before numeric constant

 #define HIGH 0x1

              ^

C:\Users\ALEX\Documents\Arduino\libraries\Keypad/Keypad.h:63:16: note: in expansion of macro 'HIGH'

 #define CLOSED HIGH

                ^

C:\Users\ALEX\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.4\libraries\ESP8266WiFi\src/include/wl_definitions.h:73:3: note: in expansion of macro 'CLOSED'

   CLOSED      = 0,

   ^

C:\Users\ALEX\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.4\cores\esp8266/Arduino.h:43:14: error: expected unqualified-id before numeric constant

 #define HIGH 0x1

              ^

C:\Users\ALEX\Documents\Arduino\libraries\Keypad/Keypad.h:63:16: note: in expansion of macro 'HIGH'

 #define CLOSED HIGH

                ^

C:\Users\ALEX\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.4\libraries\ESP8266WiFi\src/include/wl_definitions.h:73:3: note: in expansion of macro 'CLOSED'

   CLOSED      = 0,

   ^

In file included from C:\Users\ALEX\Desktop\ARDUINO\PROGRAMA FINAL ALARMAS\CENTRAL_DE_ALARMAS\CENTRAL_DE_ALARMAS.ino:7:0:

C:\Users\ALEX\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.4\libraries\ESP8266WiFi\src/ESP8266WiFi.h:29:1: error: expected declaration before '}' token

 }

 ^

Se encontraron varias bibliotecas para "SD.h"

Usado: C:\Users\ALEX\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.4\libraries\SD

 No usado: C:\Program Files (x86)\Arduino\libraries\SD

exit status 1

Error compilando para la tarjeta NodeMCU 1.0 (ESP-12E Module).

Este informe podría contener más información con
"Mostrar salida detallada durante la compilación"
opción habilitada en Archivo -> Preferencias.

La verdad que no entiendo de que va el problema, agradeceria si alguien que ha trabajado con todas esas librerias juntas o si tiene alguna idea me heche una mano con este problema. Gracias de ante mano.

PD. Disculpa es mi primer post.

Moderador:
Por favor, lee las Normas del foro y edita tu código/error usando etiquetas de código.
Ve a edición, luego selecciona todo el código que has publicado, lo cortas y click en </>


Los temas de ESP8266/ESP32 van en microcontroladores, por eso he movido tu hilo.
Los errores también deben ir como código, asi que usa etiquetas para una cosa y la otra.
Ordena todo tu hilo inicial por favor.

Tu error esta indicado en esta línea de error

29:1: error: expected declaration before '}' token

Observa que es solo una linea y sin embargo lo posteo con etiquetas.

1 Like

Probando por descarte, las librerias que me dan conflicto son las del Keypad y Keypad I2C:

#include <Keypad_I2C.h>
#include <Keypad.h>

Ninguna de las 2 pueden convivir con el resto, me salta error, que dilema :frowning:

Deja tu código.
Toma un ejemplo de Keypad_I2C.h y pruébalo a ver si compila bien.

Independientemente si compila y funciona muy bien trabajandolo en el NodeMcu, el problema es cuando trato de unirlo a las librerias:

#include <ESP8266WiFi.h>          
#include <Firebase_ESP_Client.h>
#include <addons/RTDBHelper.h>  

He estado buscando solucion para usar el teclado solo con la libreria <Whire.h> y el PCF8574P, aun no lo termino de entender bien por los videos que encontre, pero por ahora es la unica solucion que he encontrado, agradeceria si alguien tiene algun ejercicio de un Keypad con el PCF8574 hacia NodeMcu o arduino utilizando solo la libreria <Whire.h>.

En youtube encontre un ejercicio en Arduino, en este utilizan 2 PCF8574 para direccionar por I2C un teclado 4x4 y un LCD 16x2, pero lo veo tan desordenado que me pierdo y no termino de entender donde declara las direcciones de cada PCF8574 ni como logra obtener la lectura de cada tecla pulsada. Dejo adjunto el codigo que utilizan en dicho video.

#include <Wire.h>

//se declara el pin2 que es utilizado para recibir la interrupción
const byte interruptPin = 2;
// se declara la bandera para indicar que ha sucedido una interrupcion
volatile byte BANDERA = LOW;

//variable DATO que contiene el valor leido cuando se presiona una tecla ( lo envía el PCF8574 a través del I2C)
byte DATO = 0;
//CABACERA DE FUNCIONES
void inicializarlcd();
void imprimirletra();
void posicionarcursoralinicio();

void setup()
{
Wire.begin(); // join i2c bus
  // se configura el pin 2 como interrupción
  pinMode(interruptPin,INPUT);
  
  // funcion que se configura para la interrupcion que se activa en flanco de subida y se indica que la función teclado se ejecutará cuando suceda la interrupción
  attachInterrupt(digitalPinToInterrupt(interruptPin),teclado,RISING); 
  
//OMITIR SI GUSTAN 
Serial.begin(9600);// se inicializa la comunicación serial

// FUNCIÓN QUE INICIALIZA LA lcd
inicializarlcd();

}

void loop()
{


if(BANDERA==HIGH)
{

Wire.requestFrom(32,1,true);
DATO=Wire.read(); 
//SE PUEDE OMITIR
Serial.print(DATO, HEX);
Serial.println("\n");
 
 // FUNCION QUE DECODIFICA E IMPRIME LA TECLA PRESIONADA
 imprimirletra();
  // FUNCIÓN QUE POSICIONA EL CURSOR
 posicionarcursoralinicio();
  BANDERA=LOW;  
 }
  
delay(500);

}

// funcion que se ejecuta si sucede la interrupcion
void teclado() {
delay(100);
BANDERA=HIGH;
 
}

void inicializarlcd()
{
   //inicializar la pantalla en Arduino
  delay(60);
  Wire.beginTransmission(0x3E); // transmit to device #7C
                              // device address is specified in datasheet
  Wire.write(0x80);             // sends value byte  
  Wire.write(0x3c);             // sends value byte  
  delayMicroseconds(80);
  
  Wire.write(0x80);             // sends value byte  
  Wire.write(0x0f);             // sends value byte  
  delayMicroseconds(80);

  Wire.write(0x80);             // sends value byte  
  Wire.write(0x01);             // sends value byte  
  delay(3);

  Wire.write(0x00);             // sends value byte  
  Wire.write(0x06);             // sends value byte  
  delayMicroseconds(80);

  Wire.endTransmission();     // stop transmitting

  }  
  void imprimirletra()
  {
 byte valor=0;
 delay(60);
 Wire.beginTransmission(0x3E);
 Wire.write(0x40);             // sends value byte  
 if(DATO==0X0E)
 valor=0x30;
 if(DATO==0X04)
 valor=0x31;
 if(DATO==0X06)
 valor=0x32;
 if(DATO==0X05)
 valor=0x33;
 if(DATO==0X08)
 valor=0x34;
 if(DATO==0X0A)
 valor=0x35;
 if(DATO==0X09)
 valor=0x36;
 if(DATO==0X00)
 valor=0x37;
 if(DATO==0X02)
 valor=0x38;
 if(DATO==0X01)
 valor=0x39;
 if(DATO==0X0d)
 valor=0x3d;
 if(DATO==0X0f)
 valor=0x2b;
 if(DATO==0X07)
 valor=0x2d;
 if(DATO==0X0B)
 valor=0x2a;
 if(DATO==0X03)
 valor=0x2f;
 //IMPRIMIR EL CARACTER
  Wire.write(valor);             // sends value byte  
  delayMicroseconds(50);
  
  Wire.endTransmission();     // stop transmitting

    }

    void posicionarcursoralinicio()
    {
      Wire.beginTransmission(0x3E); // transmit to device #7C
                                   // device address is specified in datasheet
  Wire.write(0x00);             // sends value byte  
  Wire.write(0x80);             // sends value byte  
  
  delayMicroseconds(50);
 
  Wire.endTransmission();     // stop transmitting
      }

Código de este video en youtube.

La interrupción del PCF8574 pone en alto la BANDERA cuando algo se ha presionado.
Cuando BANDERAes true entonces
Lees el dato con esta parte y lo imprimes.

    DATO = Wire.read();
    //SE PUEDE OMITIR
    Serial.print(DATO, HEX);
    Serial.println("\n");

Eso es lo relevante.

@cyberpuchi , cuando encuentres un código en la red e incluso lo veas funcionando (como en éste caso), siempre ten presente que puede ocurrir que el autor puede no saber exactamente lo que hace y "le sale" de casualidad.
Te explico algo que veo mal hecho en el código de #6.
El autor del código inicia la comunicación I2C correctamente

Wire.beginTransmission(direccion);

Luego para enviar un dato hace

  Wire.write(dato);               
  delayMicroseconds(usegs);

Y repite la misma secuencia para cada dato a enviar (es habitual al enviar datos por I2C poner un pequeño delay "por seguridad" para no sobreescribir datos que pudieran todavía estar en el buffer I2C).
A continuación termina la comunicación, también correctamente, con

Wire.endTransmission();

Hasta ahí parecería que todo es correcto, pero hay un pequeñísimo detalle...
Como dije antes, es habitual poner un delay al enviar los datos y resulta que la instrucción write() no envía el dato, la instrucción write() solo pone el dato en el buffer de salida I2C, los datos son enviados cuando se ejecuta la instrucción endTransmission(), no antes.
Entonces el delay luego de write() no cumple ninguna función más allá de "frenar" el código innecesariamente, y el delay que sí sería conveniente (aunque no estrictamente necesario) luego de endTransmission() no existe.

Siempre toma "con pinzas" los códigos que encuentres.
Y eso incluye a los que puedas encontrar aquí porque también podemos equivocarnos. :wink:

Saludos

PD: Si te interesa entender un poco más sobre I2C te paso un excelente artículo de Nick Gammon

1 Like

Al final terminare usando un decodificador BDC 74C622 para el Keypad 4x4, luego pasar por un PCD8574 para comunciar por I2C usando 4 de sus pines como entradas, todo esto ya que no pude solucionar lo del conflicto de librerias del Keypad I2C al trabajar con las librerias del ESP8266 y del firebase, bueno por ahora me sirve. Dejo el codigo y diagrama del ejercicio por si a alguien le sirve.

#include "PCF8574.h"                  //libreria para uso del PCF8574, ampliacion de pines I/O I2C
#include "Wire.h"                     //libreria I2C
#include <LiquidCrystal_I2C.h>        //Libreria LCD I2C

LiquidCrystal_I2C lcd(0x27,40,4);     //Creacion de objeto y configuracion de LCD I2C
PCF8574 PCF8574_1(0x21);              //Creacion de objeto y direccion del PCF8574 (segun cofiguracion de pines A0, A1 y A2)

String lectura = "x";                 //Lectura de Keypad

void setup() {

  //Configuracion de pines del PCF8574, todos como entrada en este caso
  PCF8574_1.pinMode(P0, INPUT);
  PCF8574_1.pinMode(P1, INPUT);
  PCF8574_1.pinMode(P2, INPUT);
  PCF8574_1.pinMode(P3, INPUT);
  PCF8574_1.pinMode(P4, INPUT);       //USADA PARA EL TECLADO
  PCF8574_1.pinMode(P5, INPUT);       //USADA PARA EL TECLADO
  PCF8574_1.pinMode(P6, INPUT);       //USADA PARA EL TECLADO
  PCF8574_1.pinMode(P7, INPUT);       //USADA PARA EL TECLADO
  
  PCF8574_1.begin();                  //Inicializar PCF8574_1 (Keypad)
  lcd.init();                         //Inicializar LCD
  lcd.backlight();                    //Encender pantalla LCD
  lcd.clear();                        //Limpiar pantalla LCD
}

void loop() {
  uint8_t A0 = PCF8574_1.digitalRead(P0);       //Guardar lectura del pin P0 en la variable A0
  uint8_t A1 = PCF8574_1.digitalRead(P1);       //Guardar lectura del pin P1 en la variable A1
  uint8_t A2 = PCF8574_1.digitalRead(P2);       //Guardar lectura del pin P2 en la variable A2
  uint8_t A3 = PCF8574_1.digitalRead(P3);       //Guardar lectura del pin P3 en la variable A3
  uint8_t A4 = PCF8574_1.digitalRead(P4);       //Guardar lectura del pin P4 en la variable A4
  uint8_t A5 = PCF8574_1.digitalRead(P5);       //Guardar lectura del pin P5 en la variable A5
  uint8_t A6 = PCF8574_1.digitalRead(P6);       //Guardar lectura del pin P6 en la variable A6
  uint8_t A7 = PCF8574_1.digitalRead(P7);       //Guardar lectura del pin P7 en la variable A7
  delay(50);
  if(A4==LOW && A5==LOW && A6==LOW && A7==LOW) lectura = "1";
  if(A4==HIGH && A5==LOW && A6==LOW && A7==LOW) lectura = "2";
  if(A4==LOW && A5==HIGH && A6==LOW && A7==LOW) lectura = "3";
  if(A4==HIGH && A5==HIGH && A6==LOW && A7==LOW) lectura = "U";
  if(A4==LOW && A5==LOW && A6==HIGH && A7==LOW) lectura = "4";
  if(A4==HIGH && A5==LOW && A6==HIGH && A7==LOW) lectura = "5";
  if(A4==LOW && A5==HIGH && A6==HIGH && A7==LOW) lectura = "6";
  if(A4==HIGH && A5==HIGH && A6==HIGH && A7==LOW) lectura = "D";
  if(A4==LOW && A5==LOW && A6==LOW && A7==HIGH) lectura = "7";
  if(A4==HIGH && A5==LOW && A6==LOW && A7==HIGH) lectura = "8";
  if(A4==LOW && A5==HIGH && A6==LOW && A7==HIGH) lectura = "9";
  if(A4==HIGH && A5==HIGH && A6==LOW && A7==HIGH) lectura = "R";
  if(A4==LOW && A5==LOW && A6==HIGH && A7==HIGH) lectura = "C";
  if(A4==HIGH && A5==LOW && A6==HIGH && A7==HIGH) lectura = "0";
  if(A4==LOW && A5==HIGH && A6==HIGH && A7==HIGH) lectura = "M";
  if(A4==HIGH && A5==HIGH && A6==HIGH && A7==HIGH) lectura = "E";
  lcd.setCursor(0,0);
  lcd.print(lectura);
  delay(200);
}

Conecte los dispositivos de la siguiente manera, falta solo adicionar la interrupcion.

Saludos.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.