Передача ссылки на объект 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.
@William, 👍0
Обсуждение1 ответ
Лучший ответ:
Вы вызываете _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
- Как объявить указатель на библиотеку arduino neopixels, чтобы настроить его в функции настройки с помощью динамических переменных?
- Разбор массива объекта в конструкторе библиотеки
- Вызов функций из массива указателей в библиотеке вызывает ошибку «неопределенная ссылка на»
- Как удалить зависимости из библиотеки?
- Как получить исходные файлы для библиотек Arduino?
- Ошибка: "недопустимое использование нестатической функции-члена" при вызове функции из моего собственного класса-метода
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
- Существуют ли библиотеки сглаживания сигналов для Arduino?
Если вы хотите инициализировать его в библиотеке, зачем вам экземпляр NeoPixel, внешний по отношению к библиотеке? Вы можете просто поместить его полное объявление в библиотеку. в настоящее время я не вижу вашей проблемы, @chrisl
Изначально я не думал объявлять это в библиотеке. Но если это сработает, то тоже хорошо., @William
Да, это работает. Вы можете просто иметь это только там, @chrisl