Передача ссылки на объект NeoPixel в пользовательскую библиотеку

Я новичок в программировании Arduino и раньше не программировал на C++. Я пытаюсь создать пользовательскую библиотеку для циклического воспроизведения радуги на моей светодиодной ленте NeoPixel. Я хочу передать ссылку, указатель или что-то еще в библиотечный класс, чтобы максимально упростить код в файле проекта.

Вот код моего текущего проекта:

#include <YaNeoPixelCycle.h>
#include <Adafruit_NeoPixel.h>

#define CONTROL_PIN 3
#define LED_COUNT 8
Adafruit_NeoPixel neoPixel(LED_COUNT, CONTROL_PIN, NEO_RGBW + NEO_KHZ800);
YaNeoPixelCycle cycle = YaNeoPixelCycle(neoPixel,255,100,200);

void setup() {
}

void loop() {
  cycle.tryStep();
}

А вот библиотека, которую я пытался создать:

/*
Библиотека циклов Artificery NeoPixel от Youkai.
Супер базовый цикл светодиодов RGB.
*/

#ifndef YaNeoPixelCycle_h
#define YaNeoPixelCycle_h

#include "Arduino.h"
#include <Adafruit_NeoPixel.h>

class YaNeoPixelCycle{
    public:
        YaNeoPixelCycle(Adafruit_NeoPixel& neoPixel, int saturation, int brightness, int hueStep);
        void tryStep();
    private:
        Adafruit_NeoPixel& _neoPixel;
        unsigned int _ledHue = 0;
        int _saturation;
        int _brightness;
        int _hueStep;
};

#endif
/*
Библиотека таймеров Youkai Artificery.
Некоторые основные неблокирующие функции таймера.
*/

#include "Arduino.h"
#include "YaNeoPixelCycle.h"


YaNeoPixelCycle::YaNeoPixelCycle(Adafruit_NeoPixel& neoPixel, int saturation, int brightness, int hueStep){
    _neoPixel = neoPixel;
    _saturation = saturation;
    _brightness = brightness;
    _hueStep = hueStep;
    _neoPixel.begin();
    _neoPixel.show();
}

void YaNeoPixelCycle::tryStep(){
    _ledHue += _hueStep;
    _neoPixel.fill(_neoPixel.ColorHSV(_ledHue, _saturation, _brightness));
    _neoPixel.show();
}

Первым шагом будет заставить все это работать. Загрузка этого в мой Sparkfun ProMicro блокирует его, и мне приходится сбрасывать его, чтобы снова загрузить код.

После этого было бы здорово, если бы можно было объявить NeoPixel в файле проекта, но фактически не инициализировать его до файла библиотеки. Я хотел бы передать CONTROL_PIN и LED_COUNT в качестве переменных в библиотеку с помощью YaNeoPixelCycle(..., int controlPin, int ledCount), чтобы мне не приходилось настраивать кучу повторяющихся переменных в моем основной файл, если я запускаю более одной ленты NeoPixel.

Это моя собственная пользовательская библиотека, поэтому я не слишком беспокоюсь о том, что она будет непонятна. Если это возможно/проще, я бы просто полностью переместил весь код NeoPixel в библиотеку и вообще никогда не создавал его в основном файле. Достаточно просто передать управляющий контакт и светодиод в качестве параметров и «знать», что они относятся к NeoPixel.

, 👍0

Обсуждение

Если вы хотите инициализировать его в библиотеке, зачем вам экземпляр NeoPixel, внешний по отношению к библиотеке? Вы можете просто поместить его полное объявление в библиотеку. в настоящее время я не вижу вашей проблемы, @chrisl

Изначально я не думал объявлять это в библиотеке. Но если это сработает, то тоже хорошо., @William

Да, это работает. Вы можете просто иметь это только там, @chrisl


1 ответ


Лучший ответ:

2

Вы вызываете _neoPixel.begin() и _neoPixel.show() в конструкторе вашего класса. Этот конструктор запускается до инициализации Arduino. Вот почему используются функции begin(). Добавьте в свой класс функцию begin() и вызовите cycle.begin() в setup().

void YaNeoPixelCycle::begin() {
  _neoPixel.begin();
  _neoPixel.show();
}

Конечно, удалите _neoPixel.begin() и _neoPixel.show() из конструктора.

,

Это помогло. Мне также нужно было явно использовать «список инициализаторов членов» вместо выполнения назначения в конструкторе. Я предполагаю, что мой объект NeoPixel не устанавливался должным образом, как я делал это выше., @William

Спасибо за это! У меня также были мои участники, установленные в ctor, что не сработало. Я сходил с ума, пытаясь понять, почему это не сработало. Переключился на список инициализаторов участников, и теперь он работает нормально., @Kevin Aung