Использование двоичных значений для адресации нескольких контактов Arduino/MCP23017
Два вопроса:
Есть ли способ адресации нескольких выводов с использованием двоичных значений с помощью функции digitalWrite? Кажется, в документации указано, что вы можете использовать только 1 контакт на digitalWrite.
Я перебираю этот массив
int array4[] = {14, 10, 4, -1};
и я не хочу включать светодиод, представленный массивом 4[3], по какой-то причине -1 фактически активирует вывод. Есть ли "нулевое" значение, которое я могу использовать в этом отношении?
Я портирую некоторый код Python для запуска на Arduino и столкнулся с проблемой при использовании нескольких микросхем MCP23017 для включения / выключения светодиодов. Мне удалось включить комбинации светодиодов, используя массивы двоичных значений в Python.
С помощью программы Python я могу адресовать любую комбинацию выводов на данном чипе MCP, используя двоичную строку, например: 0b10011011. Например, скажем, что загорается светодиод 2, 4 и 6. Ну, на Arduino это же двоичное значение загорается только один светодиод.
Я понимаю, что могу активировать несколько контактов, как:
int array1[] = {11, 6, 5, 0};
int array2[] = {12, 8, 2, 7};
int array3[] = {13, 9, 3, 1};
int array4[] = {14, 10, 4, -1};
mcp5.digitalWrite(array1[i],1);
mcp5.digitalWrite(array2[i],1);
mcp5.digitalWrite(array3[i],1);
mcp5.digitalWrite(array4[i],1);
Но я хотел бы использовать свой существующий код для двоичных последовательностей и не переписывать все. Спасибо!
1 ответ
Ниже предполагается, что вы используете библиотеку Adafruit MCP23017
Вы можете написать только один пин за раз digitalWrite
, Вот источник:
void Adafruit_MCP23017::digitalWrite(uint8_t pin, uint8_t d) {
uint8_t gpio;
uint8_t bit=bitForPin(pin);
// read the current GPIO output latches
uint8_t regAddr=regForPin(pin,MCP23017_OLATA,MCP23017_OLATB);
gpio = readRegister(regAddr);
// set the pin and direction
bitWrite(gpio,bit,d);
// write the new GPIO
regAddr=regForPin(pin,MCP23017_GPIOA,MCP23017_GPIOB);
writeRegister(regAddr,gpio);
}
Вы можете видеть, что нет проверки ошибок или границ.
Вы можете использовать эту функцию в качестве основы, чтобы написать свой собственный digitalWriteMany
функция (или другое подходящее имя). Эта функция также может проверять значения NULL в вашем массиве.