Назначение и управление цифровым выводом из строки
Вот модифицированная версия примера 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 ) не работает. Кто-нибудь пробовал что-то подобное раньше? любая помощь будет оценена :)
@Anum Sheraz, 👍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.
Если вы хотите назначить вывод через строку, вам нужно будет использовать программирование для проверки строки и выбора правильного значения байта, и каждое возможное значение должно быть явно перечислено и проверено.
- Как преобразовать строку в массив байтов
- Очень простая операция Arduino Uno Serial.readString()
- Несколько условий оператора if
- Светодиоды: разница между общим анодом и общим катодом
- Проблемы с преобразованием byte[] в String
- Преобразование строки в IP-адрес
- Как отправить строку с подчиненного устройства Arduino с помощью SPI?
- Остановить мигание светодиодов
digitalWrite(pin, value)
ожидаетбеззнаковое 8-битное целое число
для параметраpin
.... на самом деле неясно, что вы пытаетесь сделать.... также ,не работает
не описывает то, что на самом деле происходит.... если у вас возникла ошибка, то почему вы ничего о ней не сказали?, @jsotola