Использование двоичных значений для адресации нескольких контактов Arduino/MCP23017

Два вопроса:

  1. Есть ли способ адресации нескольких выводов с использованием двоичных значений с помощью функции digitalWrite? Кажется, в документации указано, что вы можете использовать только 1 контакт на digitalWrite.

  2. Я перебираю этот массив 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 в вашем массиве.

Другие вопросы по тегам