Использование классов с Arduino

Я пытаюсь использовать объекты класса с Arduino, но постоянно сталкиваюсь с проблемами. Все, что я хочу сделать, это объявить класс и создать объект этого класса. Каким может быть пример?


person user29772    schedule 14.11.2009    source источник


Ответы (7)


На 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);
}
person Warren MacEvoy    schedule 06.10.2012
comment
Заметьте, у меня нет виртуального деструктора -- создание динамических объектов кажется нормальным, но удаление может привести к фрагментации, поэтому я не уверен, что лучше делать что-то большее, чем просто динамически настраивать среду. - person Warren MacEvoy; 07.10.2012
comment
разве строка 11 не должна быть int x;, а не int y;? - person stib; 21.05.2018
comment
Нет, объекты типа B просто имеют свойства x и y. - person Warren MacEvoy; 26.09.2018

Существует отличный учебник по созданию библиотеки для платформы Arduino. Библиотека — это, по сути, класс, поэтому она должна показать вам, как все это делается.

На Arduino вы можете использовать классы, но есть несколько ограничений:

  • Нет новых и удаляемых ключевых слов
  • Без исключений
  • Нет libstdc++, следовательно, нет стандартных функций, шаблонов или классов.

Вам также нужно создать новые файлы для ваших классов, вы не можете просто объявить их в своем основном скетче. Вам также нужно будет закрыть Arduino IDE при перекомпиляции библиотеки. Вот почему я использую Eclipse в качестве IDE для Arduino.

person Johan    schedule 16.11.2009
comment
new/delete отлично работает на Arduino 1.0.6 - person Pointer Null; 14.11.2014

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1230935955 сообщает:

По умолчанию Arduino IDE и библиотеки не используют операторы new и delete. Он поддерживает malloc() и free(). Таким образом, решение состоит в том, чтобы реализовать операторы new и delete для себя, чтобы использовать эти функции.

Код:

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

Это позволяет вам создавать объекты, например.

C* c; // declare variable
c = new C(); // create instance of class C
c->M(); // call method M
delete(c); // free memory

С уважением, Тамберг.

person tamberg    schedule 14.01.2010

Я создал это простое некоторое время назад. Основная проблема, с которой я столкнулся, состояла в том, чтобы создать хорошую среду сборки — make-файл, который бы компилировал и связывал/разворачивал все без использования графического интерфейса. Для кода вот заголовок:

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

Здесь это более красиво оформлено: http://amkimian.blogspot.com/2009/07/тривиально-лед-класс.html

Чтобы использовать, я просто делаю что-то подобное в файле .pde:

#include "AM_Led.h"

#define TIME_LED    12   // The port for the LED

AMLed test(TIME_LED);
person Alan Moore    schedule 16.11.2009
comment
Как бы вы передали test в качестве параметра для другой функции? Как выглядит сигнатура функции для такого класса? Вы не используете new AMLed(TIME_LED), так как же будет выглядеть AMLed test(TIME_LED)? Я спрашиваю, потому что у меня есть два объекта, оба типа AMLed, и я хочу сослаться на них в функции. - person Samuel Clay; 25.06.2014
comment
Строка @SamuelClay AMLed test(TIME_LED) вызывает конструктор. Нет необходимости в new, так как объект уже создан. - person Anton; 04.03.2019

Моя библиотека Webduino полностью основана на классе C++, который реализует веб-сервер поверх Arduino Ethernet Shield. Я определил весь класс в файле .h, который любой код Arduino может #include. Не стесняйтесь смотреть на код, чтобы увидеть, как я это делаю... В итоге я просто определил все это как встроенное, потому что нет реальной причины отдельно компилировать объекты с помощью Arduino IDE.

person Ben Combee    schedule 18.11.2009

Можете ли вы привести пример того, что не сработало? Как вы, вероятно, знаете, язык компоновки основан на C/C++, однако , поддерживаются не все языки C++.

Разрешено ли вам создавать классы в Wiring IDE, я не уверен (мой первый Arduino прямо сейчас на почте). Я знаю, что если вы написали класс C++, скомпилируйте его с помощью AVR-GCC, затем загрузите его на свой Arduino с помощью AVRDUDE, и это сработает.

person John Paulett    schedule 15.11.2009

На этой странице скетч Arduino определяет пара структур (плюс пара методов), которые затем вызываются в цикле настройки и основном цикле. Достаточно просто для понимания даже таким малограмотным программистом, как я.

person ropable    schedule 07.12.2009