class - mega - librerias arduino
Usando clases con el Arduino (7)
Intento usar objetos de clase con Arduino, pero sigo teniendo problemas. Todo lo que quiero hacer es declarar una clase y crear un objeto de esa clase. ¿Qué sería un ejemplo?
¿Puedes dar un ejemplo de lo que no funcionó? Como probablemente sepa, el lenguaje de cableado se basa en C / C ++, sin embargo, no se admite todo C ++ .
Ya sea que se te permita crear clases en el IDE de cableado, no estoy seguro (mi primer Arduino está en el correo ahora mismo). Sé que si escribieras una clase de C ++, la compilaras usando AVR-GCC , y luego la AVRDUDE en tu Arduino usando AVRDUDE , funcionaría.
Creé este sencillo hace un tiempo. El principal desafío que tuve fue crear un buen entorno de compilación, un archivo MAKE que compilaría y vincularía / desplegaría todo sin tener que usar la GUI. Para el código, aquí está el encabezado:
class AMLed
{
private:
uint8_t _ledPin;
long _turnOffTime;
public:
AMLed(uint8_t pin);
void setOn();
void setOff();
// Turn the led on for a given amount of time (relies
// on a call to check() in the main loop()).
void setOnForTime(int millis);
void check();
};
Y aquí está la fuente principal
AMLed::AMLed(uint8_t ledPin) : _ledPin(ledPin), _turnOffTime(0)
{
pinMode(_ledPin, OUTPUT);
}
void AMLed::setOn()
{
digitalWrite(_ledPin, HIGH);
}
void AMLed::setOff()
{
digitalWrite(_ledPin, LOW);
}
void AMLed::setOnForTime(int p_millis)
{
_turnOffTime = millis() + p_millis;
setOn();
}
void AMLed::check()
{
if (_turnOffTime != 0 && (millis() > _turnOffTime))
{
_turnOffTime = 0;
setOff();
}
}
Está mejor formateado aquí: http://amkimian.blogspot.com/2009/07/trivial-led-class.html
Para usar, simplemente hago algo como esto en el archivo .pde:
#include "AM_Led.h"
#define TIME_LED 12 // The port for the LED
AMLed test(TIME_LED);
En esta página , el boceto de Arduino define un par de Structs (más un par de métodos) que luego se llaman en el bucle de configuración y el bucle principal. Lo suficientemente simple como para interpretar, incluso para un programador poco culto como yo.
En Arduino 1.0, compila muy bien:
class A
{
public:
int x;
virtual void f() { x=1; }
};
class B : public A
{
public:
int y;
virtual void f() { x=2; }
};
A *a;
B *b;
const int TEST_PIN = 10;
void setup()
{
a=new A();
b=new B();
pinMode(TEST_PIN,OUTPUT);
}
void loop()
{
a->f();
b->f();
digitalWrite(TEST_PIN,(a->x == b->x) ? HIGH : LOW);
}
Hay un excelente tutorial sobre cómo crear una biblioteca para la plataforma Arduino . Una biblioteca es básicamente una clase, por lo que debe mostrar cómo se hace todo.
En Arduino puedes usar clases, pero hay algunas restricciones:
- No hay palabras clave nuevas y eliminadas
- Sin excepciones
- No libstdc ++, por lo tanto no hay funciones estándar, plantillas o clases
También necesita crear nuevos archivos para sus clases, no puede simplemente declararlos en su boceto principal. También deberá cerrar el IDE de Arduino al volver a compilar una biblioteca. Es por eso que uso Eclipse como mi Arduino IDE.
Mi biblioteca de Webduino está basada en una clase de C ++ que implementa un servidor web en la parte superior del escudo de Arduino Ethernet. Definí toda la clase en un archivo .h que cualquier código Arduino puede #incluir. Siéntase libre de mirar el código para ver cómo lo hago ... Terminé definiéndolo todo en línea porque no hay una razón real para compilar objetos por separado con el Arduino IDE.
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1230935955 afirma:
De forma predeterminada, Arduino IDE y las bibliotecas no usan el operador new y el operador delete. Admite malloc () y free (). Entonces, la solución es implementar operadores nuevos y eliminarlos para usar estas funciones.
Código:
#include <stdlib.h> // for malloc and free void* operator new(size_t size) { return malloc(size); } void operator delete(void* ptr) { free(ptr); }
Esto permite crear objetos, por ejemplo
C* c; // declare variable
c = new C(); // create instance of class C
c->M(); // call method M
delete(c); // free memory
Saludos, Tamberg