Как правильно настроить сопоставления пинов библиотеки?
Я работаю с некоторыми библиотеками, которые предоставляют API для взаимодействия с определенными аппаратными чипами (что делает эти драйверы?). Однако на разных пользовательских платах или экранах микросхема будет привязана к разным выводам, что означает, что библиотеку необходимо модифицировать для каждого конкретного случая. Необходимость изменения библиотеки плохо работает с Arduino IDE Library Manager.
Существуют ли предпочтительные / рекомендуемые шаблоны для предоставления этой конфигурации, чтобы саму библиотеку не нужно было изменять каждый раз?
Вот пример, в котором задокументировано, какую деталь необходимо изменить, чтобы она соответствовала расположению контактов на вашей плате.
@vossad01, 👍10
Обсуждение4 ответа
Лучший ответ:
Метод, который я использую, заключается в предоставлении выводов в качестве параметров конструктору. Эти пины хранятся в переменных для последующего использования в функции .begin()
и в других местах.
Большую часть времени я использую списки инициализации, чтобы все было просто. Например:
class Something {
uint8_t _cs;
uint8_t _dc;
Something(uint8_t cs, uint8_t dc) : _cs(cs), _dc(dc) {}
void begin();
};
void Something::begin() {
pinMode(_cs, OUTPUT);
pinMode(_dc, OUTPUT);
}
Something mySomething(10, 8);
в зависимости от вашего подхода.
1) если вы просто предоставляете двоичные файлы + заголовочные файлы, вам нужно будет создать переменные pins.
2) если вы предоставляете исходный код и ожидаете, что пользователь перекомпилирует исходный код, используйте макросы.
Я бы использовал любую из следующих двух возможностей:
Используйте переменные (класса) и устанавливайте их в конструкторе.
Преимущества:
- Всегда инициализируется
- Простота в использовании (одновременная настройка конструктора и PIN)
Используйте отдельный метод (например, Init).
Преимущества:
- Может быть динамически изменен
Замечания
Для настройки контактов используются в основном статические схемы, поэтому первый подход, вероятно, лучше.
Что касается настроек, то в основном второй способ лучше.
Если задействовано много контактов (маловероятно), используйте структуру или отдельный класс настроек контактов.
Макросы
Чего бы я не советовал, так это макросов. Когда пользователям необходимо самим изменить исходный код и устанавливаются новые версии, им приходится либо объединять, либо заново вносить изменения. Преимущества - это немного меньше (машинного) кода, возможно, немного быстрее и немного меньше использования памяти, но все три аспекта минимальны.
В случае, если вы хотите избежать конструктора C ++, который довольно часто является излишним в Arduino, вы можете использовать #define
(объектно-подобные макросы).
Вот так:
#define PIN_ONE 1
#define PIN_TWO 2
Препроцессор легко заменит PIN_ONE
на число 1, а PIN_TWO
на 2, предполагая, что эти определения находятся в файле library header .h
. Это, скорее всего, потребует наименьшего количества ресурсов по сравнению с другими возможными решениями.
Альтернатива 1
Если у вас есть возможность использовать современный C ++, вы можете использовать constexpr
для определения переменных. По сравнению с макросами вы получите проверку типов, и она должна быть столь же эффективной.
Проблема в том, что они должны находиться в таком месте, где к ним могут попасть как файл .ino, так и источник библиотеки. Обычно это означает отдельный заголовочный файл со всем, что требуется., @Ignacio Vazquez-Abrams
Вы уверены? Почти уверен, что я могу использовать переключатели #define в .ino, и они используются в библиотеках, но я могу ошибаться., @Avamander
Это может сработать, если код библиотеки находится строго в заголовке, но не в том случае, если он находится совсем в другом блоке компиляции., @Ignacio Vazquez-Abrams
Да, это имеет смысл, не знал точных ограничений, добавил это заявление об отказе от ответственности., @Avamander
- Запуск 7-контактного OLED-дисплея с 4 контактами (I2C)
- Выбор PIN для подключения радиочастотного приемника
- Попытка разрешить недопустимое преобразование из «байта» {он же «беззнаковый символ»} в
- Попытка прочитать разные уровни газа с помощью датчика газа MQ2
- Какие контакты использовать для получения данных от нескольких периферийных устройств?
- Можно ли создать сигнал повышения hemi-цикла с помощью одного штифта, а другой сигнал hemi-цикла-с помощью другого штифта?
- NodeMCU - Vin контакт как выход 5V?
- Использовать все контакты как цифровые входы/выходы
Многие из обычных библиотек Arduino уже делают это - начните с ознакомления с этим методом, даже с точки зрения пользователя., @Chris Stratton