Назначение и управление цифровым выводом из строки

Вот модифицированная версия примера Blink

#define D8  13

String p = "D8";

// функция настройки запускается один раз, когда вы нажимаете кнопку сброса или включаете плату
void setup() {
  // инициализируем цифровой вывод LED_BUILTIN как выход.
  pinMode(D8, OUTPUT);
}

// функция цикла выполняется снова и снова, вечно
void loop() {
  byte pin[2];
  p.getBytes(pin, sizeof(pin)); 

  digitalWrite(D8, HIGH);   // включаем светодиод (HIGH - уровень напряжения)
  delay(1000);                       // подождем секунду
  digitalWrite(D8, LOW);    // выключаем светодиод, понижая напряжение
  delay(1000);                       // подождем секунду
}

D8, определенный выше, представляет собой байт длиной 2. Таким образом, светодиод включается/выключается, если я упоминаю D8 в digitalWrite(D8, HIGH). Точно так же я получаю тот же байт D8 из String p = "D8" и конвертирую его в байт длиной 2, но назначаю pin для digitalWrite(pin, HIGH/LOW ) не работает. Кто-нибудь пробовал что-то подобное раньше? любая помощь будет оценена :)

, 👍1

Обсуждение

digitalWrite(pin, value) ожидает беззнаковое 8-битное целое число для параметра pin.... на самом деле неясно, что вы пытаетесь сделать.... также , не работает не описывает то, что на самом деле происходит.... если у вас возникла ошибка, то почему вы ничего о ней не сказали?, @jsotola


1 ответ


1

Программы на C и C++ компилируются за несколько проходов через различные программы/шаги. Одним из первых является препроцессор C, который обрабатывает #define директиву препроцессора.

По сути, это большая функция поиска/замены. После завершения работы препроцессора везде, где есть D8 за пределами строкового литерала, будет иметься значение 13. Это не переменная или строка — это просто число 13.

Но String p, содержимое которого "D8", не заменяется #define >, поскольку она является частью строки, и препроцессор не изменяет строки таким образом.

Кроме того, p, преобразованный в массив byte длины 2, не имеет значения, подобного 13. Он имеет 0x44 и 0x38 (или, в десятичном формате, 68 (ASCII 'D') и . 56 (ASCII '8')). Несмотря на то, что digitalWrite() и pinMode() не принимают массивы байтов, а только байты, вы передаете байт, который не представляет вывод 13.

Если вы хотите назначить вывод через строку, вам нужно будет использовать программирование для проверки строки и выбора правильного значения байта, и каждое возможное значение должно быть явно перечислено и проверено.

,