Используя классы с Ардуино

Я нахожусь также на лодке Django. Вот несколько причин почему:

32
задан Peter Mortensen 2 August 2011 в 16:49
поделиться

6 ответов

Я создал эту простую таблицу некоторое время назад. Основная задача, которая стояла передо мной, заключалась в создании хорошей среды сборки - 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/trivial-led-class. html

Для использования я просто делаю что-то вроде этого в файле .pde:

#include "AM_Led.h"

#define TIME_LED    12   // The port for the LED

AMLed test(TIME_LED);
4
ответ дан 27 November 2019 в 21:02
поделиться

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

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

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

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

13
ответ дан 27 November 2019 в 21:02
поделиться

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

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

язык Wiring основан на C / C ++, однако не весь C ++ поддерживается .

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

язык Wiring основан на C / C ++, однако не весь C ++ поддерживается .

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

1
ответ дан 27 November 2019 в 21:02
поделиться

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

1
ответ дан 27 November 2019 в 21:02
поделиться

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

0
ответ дан 27 November 2019 в 21:02
поделиться

Я бы не предложил какие-либо рамки тому, кто знает только основы. Вместо этого я бы предложил сначала получить прочный контроль над OOP и наиболее распространенными узорами дизайна, потому что это то, что вы найдете в этих рамках. Также не больно знать свой путь вокруг различных доступных PHP губы и расширения.

-121--3246102-

Тип boolean обычно следует за наименьшей единицей адресуемой памяти целевого компьютера (т.е. обычно за 8bits-байтом).

Доступ к памяти всегда состоит из «порций» (несколько слов, это для эффективности на аппаратном уровне , транзакций шины): логический бит не может быть адресован «один» в большинстве систем ЦП. Конечно, как только данные содержатся в регистре , часто существуют специализированные команды для независимого манипулирования битами.

По этой причине довольно часто используются методы «упаковки битов» для повышения эффективности использования «булевых» базовых типов данных. Хорошим примером является метод, такой как enum (в C) с мощностью 2 кодирования. Такой же трюк встречается в большинстве языков.

Обновлено : Благодаря отличной дискуссии было доведено до моего сведения, что sizeof (char) = 1 по определению в C++. Следовательно, адресация «логического» типа данных довольно привязана к наименьшей единице адресуемой памяти (усиливает мою точку зрения).

-121--3475987-

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1230935955 указывает:

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

Код:

 # включить < stdlib.h >//для malloc и бесплатно
пустота* новый оператор (size_t размер) {возвращает malloc (размер);}
оператор void удаляет (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

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

6
ответ дан 27 November 2019 в 21:02
поделиться