Hola gente, mi primera consulta, acabo de registrarme y espero poder colaborar a futuro y tambén que a alguien le sirva este ejemplo que si lo hacemos funcionar esta muy bueno como para entender el polimorfismo en Arduino.
Les comento que estoy trabajando con un Arduino Uno. Hasta donde puedo ver el ejemplo debería funcionar bien, pero luego de ejecutarse una vez y hacer el loop, falla en el segundo caso (cuando debería prender por segunda vez el led ROJO).
Para funcionar el ejemplo solo se requiere un LED rojo con una resistencia de 1k entre el pin 7 y GROUND
a continuación pongo todas las librerias y la principal para que lo prueben.
PolimorfismoExample.ino
/*
* PolimorfismoExample.ino
*
* Created: 10/5/2014 12:51:00 PM
* Author: Commander
*/
#include "Arduino.h"
#include "Mascota.h"
#include "Perro.h"
#include "Gato.h"
Mascota *p; // Perro es led Rojo 7
Mascota *g; // Gato es led Verde 13
Perro perro("Ramiro"); // Crea un perro
Gato gato("Lancelot"); // Crea un gato
void setup()
{
p = &perro;
g = &gato;
//perro.hablar(); // Hace que el "perro hable" Prende y apaga el Led 7 Rojo
//gato.hablar(); // Hace que el "gato hable" Prende y apaga el Led 13 Verde
}
void loop()
{
p->hablar(); // Hace que el "perro hable" Prende y apaga el Led 7 Rojo
delay(2000); // Hace un delay para que se note la diferencia de uno de otro
Serial.println(freeRam()); // Dice cuanta Ram queda
g->hablar(); // Hace que el "gato hable" Prende y apaga el Led 13 Verde
}
int freeRam ()
{
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
Mascota.h
/*
* Mascota.h
*
* Created: 05/10/2014 12:53:15 p.m.
* Author: Commander
*/
#ifndef __MASCOTA_H__
#define __MASCOTA_H__
#include "Arduino.h"
class Mascota
{
public:
Mascota(String nombre, int patas);
virtual String hablar();
private:
virtual String palabra();
String nombre;
int patas;
};
#endif //__MASCOTA_H__
Mascota.cpp
/*
* Mascota.cpp
*
* Created: 05/10/2014 12:53:14 p.m.
* Author: Commander
*/
#include "Arduino.h"
#include "Mascota.h"
// Constructor de la clase Mascota que es la superClase
Mascota::Mascota(String nombre, int patas):nombre(nombre),patas(patas)
{
}
// Define el método palabra para la clase de mascota
String Mascota::palabra()
{
return "BUUU";
}
// Define el método hablar para la clase mascota
String Mascota::hablar()
{
return nombre+" dice: "+this->palabra();
}
Perro.h
/*
* Perro.h
*
* Created: 05/10/2014 12:54:12 p.m.
* Author: Commander
*/
#ifndef __PERRO_H__
#define __PERRO_H__
#include "Arduino.h"
#include "Mascota.h"
class Perro : public Mascota
{
public:
Perro(String nombre);
String hablar();
String palabra();
};
#endif //__PERRO_H__
Perro.cpp
/*
* Perro.cpp
*
* Created: 05/10/2014 12:54:11 p.m.
* Author: Commander
*/
#include "Arduino.h"
#include "Perro.h"
// Crea el contructor de la clase y a su vez llama al constructor de la superClase
Perro::Perro(String nombre):Mascota(nombre, 4)
{
Serial.begin(115200);
// Pone el pin 7 para esta clase
pinMode(7,OUTPUT);
digitalWrite(7,LOW);
}
// Crea el método hablar, que es público y es requerido por la superclase
String Perro::hablar()
{
// Prende y apaga el LED Rojo para dar un aviso de que esta ejecutando bajo polimorfismo
digitalWrite(7,HIGH);
delay(2000);
digitalWrite(7,LOW);
// Envía la palabra asociada a la clase
Serial.println(palabra());
}
// Crea el método palabra, que es privado, requerido por la superClase y define que es un GUAU para esta clase
String Perro::palabra()
{
return "GUAU";
}
Gato.h
/*
* Gato.h
*
* Created: 05/10/2014 12:55:29 p.m.
* Author: Commander
*/
#ifndef __GATO_H__
#define __GATO_H__
#include "Arduino.h"
#include "Mascota.h"
class Gato : public Mascota
{
public:
Gato(String nombre);
String hablar();
String palabra();
};
#endif //__GATO_H__
Gato.cpp
/*
* Gato.cpp
*
* Created: 05/10/2014 12:55:29 p.m.
* Author: Commander
*/
#include "Arduino.h"
#include "Gato.h"
// Crea el contructor de la clase y a su vez llama al constructor de la superClase
Gato::Gato(String nombre):Mascota(nombre, 4)
{
Serial.begin(115200);
// Pone el pin 13 para esta clase
pinMode(13,OUTPUT);
digitalWrite(13,LOW);
}
// Crea el método hablar, que es público y es requerido por la superclase
String Gato::hablar()
{
// Prende y apaga el LED Verde para dar un aviso de que esta ejecutando bajo polimorfismo
digitalWrite(13,HIGH);
delay(2000);
digitalWrite(13,LOW);
// Envía la palabra asociada a la clase
Serial.println(palabra());
}
// Crea el método palabra, que es privado, requerido por la superClase y define que es un MIAU para esta clase
String Gato::palabra()
{
return "MIAU";
}