martes, 27 de julio de 2010

Clases con Arduino 2: Sobrecarga

Me rondaba una duda, por la mente: En caso de tener varios leds, (U objetos) ¿Qué es mejor usar, sobrecarga de métodos o una superclase y subclases para cada led?

Así que voy a probar los 2 métodos: En esta solo voy a poner la sobrecarga, y a explicar un poco por encima el funcionamiento del código.

Y sin mas rodeos, pasteo el código y explico:


int led1 =13;
int led2 =8;

class leds
{
public:
void onled (int);
void onled (int, int);
void offled (int);
void offled (int, int);
} Led;

void leds::onled(int pin)
{
digitalWrite (pin, HIGH);
}

void leds::onled(int pin1, int pin2)
{
digitalWrite(pin1, HIGH);
digitalWrite(pin2, HIGH);
}

void leds::offled(int pin)
{
digitalWrite (pin, LOW);
}

void leds::offled(int pin1, int pin2)
{
digitalWrite(pin1, LOW);
digitalWrite(pin2, LOW);
}

void setup()
{
pinMode (led1, OUTPUT);
pinMode (led2, OUTPUT);
}

void loop()
{
Led.onled(led1);
Led.offled(led2);

delay (50);

Led.onled(led2);
Led.offled(led1);

delay (50);
}



Como vemos, no trabajamos con los leds como atributos directamente, si no que los declaramos fuera de la clase como variables normales.

Y en las declaraciones de los métodos para la clase, vemos la sobrecarga (Observamos 2 métodos que hacen lo mismo, pero a uno le pasamos 1 parámetro entero, y al otro 2).

Una vez declarados y definidos todos, los podemos usar según lo que nos convenga: En caso de, por ejemplo, querer encender led1 y led2 a la vez, podemos usar Led.onled(led1, led2); con lo que encenderemos los 2 leds a la vez (Y usar offled(int, int) para apagarlos).

En el ejemplo sin embargo, usamos solo los métodos onled y offled con 1 parámetro, por lo que solo encendemos o apagamos 1 led a la vez.

3 comentarios:

  1. No entiendo el chiste de las clases en ésto que muestras... ¿se puede usar memoria dinámica?... tal vez no che... sin conocer Arduino no y sólo un poco más C++:
    class Led
    {
    private:
    int _led;
    public:
    Led(int);
    int led() const;
    void onled();
    void offled();
    };

    Led::Led(int l) :_led(l)
    {
    }
    int Led::led() const
    {
    return this->_led;
    }
    // y sigue.....

    Led leds[] = {Led(13), Led(14)};

    void setup()
    {
    pinMode (leds[0].led(), OUTPUT);
    pinMode (leds[1].led(), OUTPUT);
    }

    // continúa.

    ahí tiene un poco más de sentido el uso de C++, aunque no se si funciona. El hecho de seguir con variables globales y utilizar una clase únicamente para escribir métodos, no tiene ninguna ventaja. Es más, yo podría agregar un led más sin agregar otra variable int con un número.

    ResponderEliminar
  2. Pero Arduino no se programa en C++.

    He empezado hace poco con POO bajo Arduino y todavía estoy indagando, (Hay poco material en castellano que explique el uso de clases) pero no me dejaba declarar los pines como atributo. Espero solucionar esto con herencia.

    ResponderEliminar
  3. No tengo Arduino para probar, pero por lo que estuve viendo, si se pueden declarar atributos dentro de una clase (si no pudieses, dudo que la herencia te ayude mucho).

    C++ es para encapsular una funcionalidad, si a una clase le tengo que estar pasando una y otra vez los parámetros que necesita que trabaje, carece de sentido usar C++, mejor usar C.

    Igual, desconozco así que no soy el indicado pa' opina'. Estaría bueno que coloques referencias para saber de dónde sacas las cosas y poder profundizar.

    http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_cplusplus (avr es el compilador no?, acá no dice nada de restringir una clase de que tenga un atributo).
    http://www.arduino.cc/playground/Code/Hierarchy (acá pinta interesante, no caso una pero pinta. Lo gracioso es que si permite que el pin esté declarado como atributo de una clase).

    ResponderEliminar