Buen día para todos. hace unos días empece a investigar OOP en arduino, y quería hacer el típico hola mundo en una pantalla lcd 16x2; pero me surgió un problema el cual he buscado la solución por todas partes y no lo he podido encontrar. me podrían ayudar a solucionar el problema?
este es mensaje de error:
sketch\arduinoOOP.ino.cpp.o (symbol from plugin): In function `lcd':
(.text+0x0): multiple definition of `lcd'
sketch\Pantalla.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2.exe: error: ld returned 1 exit status
y los archivos son los siguientes:
arduinoOOP.ino
#include "Pantalla.h"
Pantalla ej;
void setup() {
ej.imprimirPantalla();
}
void loop() {
}
pantalla.h
#include <Arduino.h>
#include "LiquidCrystal_I2C.h"
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27,16,2);
class Pantalla {
public:
Pantalla();
void imprimirPantalla();
};
pantalla.cpp
#include <Arduino.h>
#include "Pantalla.h"
Pantalla::Pantalla(){}
void Pantalla::imprimirPantalla(){
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("hola mundo");
}
muchas gracias 
antes que nada, creo que seria útil si nos digieras de donde estas sacando ese ejemplo.
partiendo de eso puedo darte una mejor idea.
almenos para mi no tiene sentido que una librería solo sea para mandar a imprimir Hola mundo.
pero dame alguna otra referencia, tutorial o pagina.
muchas gracias Eduardosanchez por tu respuesta. en efecto, no voy a usar una librería y un lcd para escribir "hola mundo", mi objetivo no es ese; mi objetivo es ver que tal es arduino y sus librerías(hechas por usuarios) para programación orientada a objetos (OOP). ya que si puedo implementarlas dos cosas me ahorraría bastante tiempo en el desarrollo de un proyecto mas grande.
como fuente de información te puedo dar el siguiente link: https://www.prometec.net/clases-y-objetos/ sin embargo, el ejemplo no lo saque de ninguna parte, yo mismo lo hice con los conocimientos que ya tenia en C++ y en arduino; el programa como tal funciona bien si utilizo para imprimir Serial.println(). lo que necesito realmente saber es que si tengo mal la sintaxis de aquel código, o si el problema es la librería, que hay que modificar para que no presente el error o que otra librería usar si sale este error.
Bueno si lo que necesitas es crear una libreria, te puedo comparte parte de la mia, es para un display tft pero quizas te sirva la estructura de el Archivo cabecera y codigo, te comento que mi en realidad no soy muy bueno en POO pero al menos la librería funciona a la perfección.
Archivo .h (solo un fragmento)
#ifndef sinectft_h
#define sinectft_h
#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#include "pins_arduino.h"
#include "WConstants.h"
#endif
#define tftheight 0xcc
#define tftwidth 0xf0
class sinectft{
public:
sinectft();
bool init(int dc, int cs,int rst);
void dispon();
void dispoff();
void writedata(uint8_t c);
private:
void writecomand(uint8_t c);
uint8_t get_decena(uint8_t valor);
uint8_t get_unidad(uint8_t valor);
};
#endif
Archivo .cpp (igual solo algunas partes)
#include "Arduino.h"
#include "sinectft.h"
#include "SPI.h"
#include "SdFat.h"
sinectft::sinectft()
{
}
void sinectft::writedata(uint8_t c){
digitalWrite(_dc,HIGH);// DC_HIGH();
digitalWrite(_cs,LOW);// CS_LOW();
SPI.transfer(c);
digitalWrite(_cs,HIGH);//CS_HIGH();
}
void sinectft::writecomand(uint8_t c){
digitalWrite(_dc,LOW);//DC_LOW();
digitalWrite(_cs,LOW);//CS_LOW();
SPI.transfer(c);
digitalWrite(_cs,HIGH);//CS_HIGH();
}
Las funciones ni siquiera coinciden completamente. pero es para que tengas una idea
Espero te sea de utilidad, mas que nada los primeros ifdef que son los importante, al principio no ponerlos me dio mucha lata(tengo entendido que esos ifdef son utilizar librerías según la versión del arduino). Saludos
mucha gracias por tu ayuda. después de investigar un poco, actualmente los archivos .cpp y .h se utilizan mas que todo para la creación de librerías, ya que para crear una librería no se debe que utilizar librerías que no vengan con el paquete de arduino. entonces mi solución fue usar una característica particular de los archivos .ino la cual es que no importa cuantos ficheros cree siempre van actuar como si fuera un solo archivo, sin embargo no compila si no se usa el ide de arduino, pero lo bueno es que se acerca un poco a la OOP. al fin y al cabo arduino fue un proyecto el cual tiene como finalidad que cualquier persona lo pueda usar así que no puedo quejarme mucho por pequeños detalles como esos.
Así es Esteban, la verdad es muy faci (para empezar a programar) pero creo que después de mi proyecto completo en arduino me pienso mudar a los Cortex, es muy noble arduino pero para programación mas avanzada te restringe un poco.
pero bueno, de principio crei que querías hacer una libreria ya que al menos para mi normalmente las unicas cosas que puedes tratar como objetos son sensores, o demás dispositivos.
hacer un objeto de objetos, almenos en microcontroladores no le veo una implementan rápida, es decir solo que quiera que arduino identifique una pantalla conectada automaticamente, serviria hace un objeto de pantallas.
pero ya es cuestion de cada quien. igual podias declarar el objeto directamente en el Skecth , que creo que fue lo que finalmente hiciste, quizas el problema es que dentro de las librerías crean objetos, que por desgracia trataste de volver a crear uno con el mismo nombre, debería intentar cambiar el nombre.
eso me paso a mi con Width al parecer ya existe esa constante, así que le tube que poner tftwidth.
Saludos y suerte.