Class 将类与Arduino一起使用

Class 将类与Arduino一起使用,class,object,arduino,Class,Object,Arduino,我试图在Arduino中使用类对象,但我一直遇到问题。我只想声明一个类并创建该类的对象。举个什么例子?你能提供一个不起作用的例子吗?但是,正如您可能知道的,它是基于C/C++的 是否允许您在Wiring IDE中创建类,我不确定(我的第一个Arduino现在正在邮件中)。我知道,如果你写了C++类,编译它,然后使用它在你的ARDUIO上加载,它就会起作用。 < P>我在后面创建了这个简单的一个。我面临的主要挑战是创建一个良好的构建环境——一个无需使用GUI即可编译和链接/部署所有内容的makef

我试图在Arduino中使用类对象,但我一直遇到问题。我只想声明一个类并创建该类的对象。举个什么例子?

你能提供一个不起作用的例子吗?但是,正如您可能知道的,它是基于C/C++的


是否允许您在Wiring IDE中创建类,我不确定(我的第一个Arduino现在正在邮件中)。我知道,如果你写了C++类,编译它,然后使用它在你的ARDUIO上加载,它就会起作用。

< P>我在后面创建了这个简单的一个。我面临的主要挑战是创建一个良好的构建环境——一个无需使用GUI即可编译和链接/部署所有内容的makefile。对于代码,以下是标题:

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();
};
这是主要的来源

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();
    }
}
这里的格式更漂亮:

要使用,我只需在.pde文件中执行以下操作:

#include "AM_Led.h"

#define TIME_LED    12   // The port for the LED

AMLed test(TIME_LED);
有。库基本上是一个类,所以它应该向您展示它是如何完成的

在Arduino上,您可以使用类,但有一些限制:

  • 没有新关键字和删除关键字
  • 没有例外
  • 没有libstdc++,因此没有标准函数、模板或类
您还需要为类创建新文件,不能只在主草图中声明它们。在重新编译库时,还需要关闭Arduino IDE。这就是为什么我使用Eclipse作为我的ARDUINO IDE。

我的所有都基于C++类,它在ARDUINO以太网屏蔽层上实现了一个Web服务器。我在一个.h文件中定义了整个类,任何Arduino代码都可以包含这个类。请随意查看代码,看看我是如何做到的。。。我最终只是以内联方式定义它,因为没有真正的理由用Arduino IDE单独编译对象。

在上,Arduino草图定义了两个结构(加上两个方法),然后在安装循环和主循环中调用它们。即使对于像我这样几乎不识字的程序员来说,解释起来也很简单。

指出:

默认情况下,Arduino IDE和 库不使用运算符 新建和删除运算符。是的 支持malloc()和free()。所以 解决方案是实施新的和 为自己删除运算符,以便使用 这些功能

代码:

#include <stdlib.h> // for malloc and free
void* operator new(size_t size) { return malloc(size); } 
void operator delete(void* ptr) { free(ptr); }
问候,,
tamberg

在Arduino 1.0上,这可以很好地编译:

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);
}

注意,我没有虚拟析构函数——构建动态对象似乎没问题,但删除可能会导致碎片化,所以我不认为除了动态配置您的环境之外做更多的事情是一个好主意
int y?不,类型B的对象只具有x和y属性。作为另一个函数的参数,您如何通过
测试
?这种类的函数签名是什么样的?您没有使用
new AMLed(时间指示灯)
,那么
AMLed测试(时间指示灯)
看起来怎么样?我这样问是因为我有两个对象,都是
AMLed
,我想在函数中引用它们。@SamuelClay
AMLed test(TIME_LED)
line调用构造函数。不需要
new
,因为对象已经创建。在Arduino 1.0.6上,new/delete很好
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);
}