Probelmas con la Librería Keypad y CodeBlocks

Hola a todos, antes de nada decir que soy nuevo por estos mundos y que es mi primer post, así que no sé si este es el sitio correcto (Espero que sí)

El problema que tengo es que cuando intento añadir la librería Keypad a CodeBloks este no me la linkea adecuadamente (Al eso creo) y me salen un montón de errores. He probado a copiar el .h y la carpeta “utility” en la carpeta del proyecto, también a añadirlas a las librerias de arduino que CodeBlocks trae, también a linkearlo mediante el “Linker Settings”, pero todo me da error y no funciona nada.

He probado con el programa oficial de Arduino y sí que funciona así que es problema de CodeBlocks o de que hago algo mal, he vuelto a bajarme y reinstalar Codebloks oficial para arduino de su página oficial (CodeBlocks Arduino IDE | ArduinoDev.com)

Os adjunto mi código:

#include <Arduino.h>
#include <LiquidCrystal.h>
#include <Keypad.h>
/* ----------------------------------------------------- DISPLAY-----------------------------------------------------
The circuit:

  • LCD RS pin to digital pin 22
  • LCD Enable pin to digital pin 23
  • LCD D4 pin to digital pin 24
  • LCD D5 pin to digital pin 25
  • LCD D6 pin to digital pin 26
  • LCD D7 pin to digital pin 27
  • LCD R/W pin to ground
  • 10K resistor:
  • ends to +5V and ground
  • wiper to LCD VO pin (pin 3)
    /
    LiquidCrystal lcd(22,23,24,25,26,27); // Ponemos los los pines asignados al display
    // ----------------------------------------------------- DISPLAY -----------------------------------------------------
    // ----------------------------------------------------- KEYPAD ------------------------------------------------------
    const byte rows = 4; //Número de filas
    const byte cols = 4; //Número de columnas
    char keys[rows][cols] = {
    {‘1’,‘2’,‘3’, ‘A’},
    {‘4’,‘5’,‘6’, ‘B’},
    {‘7’,‘8’,‘9’, ‘C’},
    {’#’,‘0’,’
    ’, ‘D’}
    };
    byte rowPins[rows] = {32,33,34,35}; //Pines asignados a las filas
    byte colPins[cols] = {28, 29, 30, 31}; //Pines asignados a las columnas
    Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, rows, cols );
    // ----------------------------------------------------- KEYPAD ------------------------------------------------------
    void setup() {
    lcd.begin(20,4); // Indicamos al micro el número de filas y columnas del display
    }

void loop() {
lcd.display();
lcd.print(“Hola mundo”);
delay(500);
lcd.noDisplay();
delay(500);
lcd.clear();
}

Y mis errores:

||=== Build: Arduino Mega 2560/ADK in Programa_Principal (compiler: GNU AVR GCC Compiler) ===|
C:\CodeBlocks\arduino\libraries\Keypad\utility\Key.h|51|error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘attribute’ before ‘Key’|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.h|50|warning: #warning “Using pinMode() INPUT_PULLUP AVR emulation”|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.h|68|error: redefinition of typedef ‘uint’|
C:\CodeBlocks\arduino\libraries\Keypad\utility\Key.h|46|error: previous declaration of ‘uint’ was here|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.h|74|error: expected specifier-qualifier-list before ‘byte’|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.h|84|error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘attribute’ before ‘Keypad’|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|32|error: Keypad.h: No such file or directory|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|35|error: ‘Keypad’ has not been declared|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|35|error: ‘byte’ has not been declared|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|35|error: ‘byte’ has not been declared|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|35|error: ‘byte’ has not been declared|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|35|error: ‘byte’ has not been declared|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|35|error: ISO C++ forbids declaration of ‘Keypad’ with no type|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp||In function ‘int Keypad(char*, int*, int*, int, int)’:expressionless:
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|36|error: ‘rowPins’ was not declared in this scope|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|37|error: ‘columnPins’ was not declared in this scope|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|38|error: ‘sizeKpd’ was not declared in this scope|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|41|error: ‘begin’ was not declared in this scope|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|43|error: ‘setDebounceTime’ was not declared in this scope|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|44|error: ‘setHoldTime’ was not declared in this scope|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|45|error: ‘keypadEventListener’ was not declared in this scope|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|47|error: ‘startTime’ was not declared in this scope|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|48|error: ‘single_key’ was not declared in this scope|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|52|error: ‘Keypad’ is not a class or namespace|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp||In function ‘void begin(char*)’:expressionless:
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|53|error: ‘keymap’ was not declared in this scope|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|57|error: ‘Keypad’ is not a class or namespace|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp||In function ‘char getKey()’:expressionless:
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|58|error: ‘single_key’ was not declared in this scope|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|60|error: ‘getKeys’ was not declared in this scope|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|60|error: ‘key’ was not declared in this scope|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|60|error: ‘PRESSED’ was not declared in this scope|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|65|error: ‘NO_KEY’ was not declared in this scope|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|69|error: ‘Keypad’ is not a class or namespace|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp||In function ‘bool getKeys()’:expressionless:
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|73|error: ‘millis’ was not declared in this scope|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|73|error: ‘startTime’ was not declared in this scope|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|73|error: ‘debounceTime’ was not declared in this scope|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|74|error: ‘scanKeys’ was not declared in this scope|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|75|error: ‘updateList’ was not declared in this scope|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|83|error: ‘Keypad’ is not a class or namespace|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp||In function ‘void scanKeys()’:expressionless:
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|85|error: ‘byte’ was not declared in this scope|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|85|error: expected ;' before 'r'| C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|85|error: 'r' was not declared in this scope| C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|85|error: 'sizeKpd' was not declared in this scope| C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|86|error: 'rowPins' was not declared in this scope| C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|86|error: 'INPUT_PULLUP' was not declared in this scope| C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|86|error: 'pin_mode' was not declared in this scope| C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|90|error: expected ;’ before ‘c’|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|90|error: ‘c’ was not declared in this scope|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|90|error: ‘sizeKpd’ was not declared in this scope|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|91|error: ‘columnPins’ was not declared in this scope|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|91|error: ‘OUTPUT’ was not declared in this scope|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|91|error: ‘pin_mode’ was not declared in this scope|
C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|92|error: ‘LOW’ was not declared in this scope|
||More errors follow but not being shown.|
||Edit the max errors limit in compiler options…|
||=== Build failed: 50 error(s), 1 warning(s) (0 minute(s), 1 second(s)) ===|

Espero que me puedan ayudar, Muchas gracias.

debes revisar que la librería de keypad se encuentre en "Documentos->Arduino->libraries"

la linea

C:\CodeBlocks\arduino\libraries\Keypad\Keypad.cpp|32|error: Keypad.h: No such file or directory|

dice que no encuentra el archivo Keypad.h

Verifica eso y tu problema debería resolverse.

Buenos días, muchas gracias por contestar Gepd, he revisado lo que me has dicho y en esa carpeta también se encuentra la librería aún así me siguen saliendo los mismos errores.

No enciendo cómo me puede dar ese error porque ese archivo está linkeado directamente en "Linker Settings" dentro del proyecto y también dentro de las librerias de CodeBlocks así que debería poder encontrarlo. (También he probado a que sólo esté en un lado pero como no sale pues lo copié en ambos)

¿Alguna sugerencia más? Muchas gracias a todos.

He estado investigando un poco más y he descubierto que el error me lo produce esta linea de código

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, rows, cols );

Si quito la librería del linkeado settings y la comento no me da ningún error pero al ponerla me aparece el siguiente error:

||=== Build: Arduino Mega 2560/ADK in Programa_Principal (compiler: GNU AVR GCC Compiler) ===|
build\Programa_Principal.o||In function global constructors keyed to lcd':| Programa_Principal.ino:(.text._GLOBAL__I_lcd+0x34)||undefined reference to Keypad::Keypad(char*, unsigned char*, unsigned char*, unsigned char, unsigned char)’|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 1 second(s)) ===|

¿Alguien sabe por por qué? si no entiendo mal dice que la referencia a Keypad::Keypad(char*, unsigned char*, unsigned char*, unsigned char, unsigned char) está indefinida.

¿Cómo la defino o cómo lo puedo solucionar?

Muchas gracias de antemano, un saludo.

todavía sigo creyendo que es problema de la librería, ¿puedes dejar el link o subir la librería “keypad” que estás usando?

La librería que estoy usando es la oficial de la página de arduino, dejo el Link http://playground.arduino.cc/code/Keypad

Aunque la tuve que modificar quitando las siguientes lineas de código:

// Arduino versioning.

if defined(ARDUINO) && ARDUINO >= 100

include "Arduino.h"

else

include "WProgram.h"

endif

Ya que me daba error porque no encontraba "WProgram.h"

Puede ser problema de la librería usada en CodeBlocks ya que en el compilador de Arduino no me da errores. ¿Tal vez por el lenguaje de programación?

Muchas gracias de nuevo.

Wprograma.h es por compatibilidad con IDEs muy viejos. No es el caso ahora. Por favor pon como respuesta donde esta exactamente la libreria Keypad. En mi caso esta en

C:\Program Files (x86)\Arduino\libraries\Keypad

Postea tu caso para entender que pasa.

Pero también eliminó

#include "Arduino.h"

ese debería estar incluído no? ¿por qué eliminaste esas lineas, qué error te mostraba?

no hay que elimnar nada. Primero chequear que la librería esta bien, todo comenzó asi y no se si se verificó fehacientemente que estaba bien instalada. Luego considerando eso comienza a borrar cosas.

Hola de nuevo, he restaurado la librería original sin borrar nada y la he añadido a la ruta que me ha dicho surbyte, para asegurarme que el compilador la linkea bien he puesto cambiado el include por este:

include "C:\Program Files (x86)\Arduino\libraries\Keypad\Keypad.h"

Haciendo esto no me aparece el error de "Wprograma.h" pero me sigue dando el mismo error:

||=== Build: Arduino Mega 2560/ADK in Programa_Principal (compiler: GNU AVR GCC Compiler) ===| build\Programa_Principal.o||In function setup':| Programa_Principal.ino:(.text.setup+0x74)||undefined reference toKeypad::Keypad(char*, unsigned char*, unsigned char*, unsigned char, unsigned char)'| ||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 1 second(s)) ===|

Pero si comento la siguiente línea de código me compila sin problema:

//Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, rows, cols );

Por eso digo que creo que la librería está bien, que como ya he dicho con el compilador por defecto de Arduino no me da error.

Muchas gracias a los dos, un saludo.

A ver. NO puedes comentar la linea mas importante de tu programa. Si comentas Keypad te quedas sin teclado.

El error dice que hay una referencia errónea en linea 74:
text.setup+0x74)||undefined reference to `Keypad::Keypad(char*, unsigned char*, unsigned char*, unsigned char, unsigned char)’|

quita esto #include <Arduino.h>

a mi me compila bien

Sketch uses 2.768 bytes (8%) of program storage space. Maximum is 32.256 bytes.
Global variables use 195 bytes (9%) of dynamic memory, leaving 1.853 bytes for local variables. Maximum is 2.048 bytes.

también lo hace con esa línea #include <Arduino.h>

NOTA: Cuando reinstalaste la librería borraste todo posible contenido anterior?

Si, sé que esa línea no a puedo quitar ya que sin ella no podría hacer nada, pero voy probando para tratar de acorralar el problema.

He quitado la línea que comentas y sigo con el mismo error, pero me estoy dando cuenta de que errores que antes me aparecían ahora no salen, como es el caso de las líneas que eliminé antes, o como ahora no poner #include <Arduino.h>, antes si quitaba esta línea me daba error en lcd.display() ya que no me reconocía la función, no sé muy bien a qué se debe esto, pero parece que va mejor.

Te adjunto nuevamente el error por si eres capaz de sacar más información de la que saco yo:

||=== Build: Arduino Mega 2560/ADK in Programa_Principal (compiler: GNU AVR GCC Compiler) ===|
build\Programa_Principal.o||In function setup':| Programa_Principal.ino:(.text.setup+0x74)||undefined reference to Keypad::Keypad(char*, unsigned char*, unsigned char*, unsigned char, unsigned char)’|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 1 second(s)) ===|

Decirte de nuevo por si se te ha pasado que en el compilador oficial de Arduino funciona, el problema es que no estoy acostumbrado a compiladores tan simples y estoy usando la versión de CodeBlocks para Arduino bajada de su web oficial: (CodeBlocks Arduino IDE | ArduinoDev.com)

He probado a desinstalar y volver a instalar el programa pero seguimos igual ¿Tal vez sea incompatible con la sintaxis usada en la función keypad?

Muchas gracias y a ver si encontramos la solución.

Ahhh bueno, error mio. El error ocurre con Codeblocks, entonces se acaba mi ayuda jajaja. Si con Arduino IDE funciona y con Codebocks no, lo lógico es que vayas al foro de Codeblocks y consultes.

Y cual es la idea? transladar código de otras plataformas a Arduino?

Se supone que esa plataforma estaba preparada justamente para arduino pero se ve que no.

Iré al foro de CodeBlocks a ver si ellos saben algo

Muchas gracias por la ayuda Surbyte y Gepd.

Sin ánimo de dejarte abandonado imagina que no domino Codeblocks y poco puedo aportarte en ese aspecto. Lo más lógico es transladar la consulta al foro correspondiente.

Como última opción, para que puedas estar seguro que es codeBlocks, deberías intentar correr el código en el IDE de Arduino, si no te aparece el error, entonces ya no tenemos como ayudarte.

Sí, en el IDE de Arduino funciona sin problemas, al final lo que he hecho es hacerlo allí y listo. Sin duda es problema de CodeBlocks.

Es lógico lo de dices Surbite, basntante habéis hecho ya. Muchas gracias a los dos y si al final encuentro alguna solución ya lo postearé por aquí por si alguien tropieza con el mismo problema que yo.

¿Vosotros no utilizáis ningún compilador externo? ¿Lo hacéis todo en el oficial?

Me diréis pijo o maniático pero estoy acostumbrado a compiladores más sofisticados y este me parece demasiado sencillo. El de PIC de Microchip por ejemplo tiene alguna opción más como debugger que lo uso bastante, los errores de compilación son más claros,...

En fin, será cuestión de acostumbrarse, si conocéis alguno que vaya bien decídmelo que os lo agradecería mucho.

Yo por ahora estoy usando sublimeText con el plugin stino su última versión, en desarrollo, pero totalmente funcional se me hace muy cómodo, como esa versión aún no es oficial, hay que hacer una instalación manual que no es muy difícil de realizar.

Hace tiempo que venía utilizando ese editor por eso me acomoda mucho, además con todos los plugins que le puedes instalar puede ser una herramienta muy potente.

Y como ya me ha pasado, cualquier error, es resuelto rápidamente si se lo informas al creador en github o también si necesitas de alguna nueva función.

Muchas gracias ! Voy a probarlo ahora mismo a ver si funciona.

Saludos
También uso Sublime Text 2, ademas de indicarle la carpeta donde instalaste el IDE de arduino. Tiene el incoveniente que tienes que declarar las funciones al inicio del programa, de resto es mucho mejor trabajar en Sublime Text que en el IDE de arduino.