Как преобразовать строку в массив?

VictorArx

★★★✩✩✩✩
22 Мар 2021
697
104
Доброго времени суток, коллеги. Подскажите, как преобразовать в массив следующую строчку, и чтобы потом выполнился следующий код.
C++:
if (digitalRead(BUT_PIN1) == LOW && digitalRead(BUT_PIN2) == LOW && digitalRead(BUT_PIN3) == LOW)
 

poty

★★★★★★★
19 Фев 2020
3,651
1,047
@VictorArx, приведенная строка является оператором сравнения. Массив - это место для хранения нескольких элементов. Что нужно преобразовать?
 

VictorArx

★★★✩✩✩✩
22 Мар 2021
697
104
@poty, у меня таких пинов 8 штук. Чтобы не писать длинную строчку, преобразовать в более удобную форму, понимаю что это можно через массив и потом , когда выполнится данное условие, будет выполнен следующий код.
C++:
 if (digitalRead(BUT_PIN1) == LOW )
  if (digitalRead(BUT_PIN2) == LOW)
  if (digitalRead(BUT_PIN3) == LOW )
  if (digitalRead(BUT_PIN4) == LOW)
  if (digitalRead(BUT_PIN5) == LOW)
  if (digitalRead(BUT_PIN6) == LOW)
  if (digitalRead(BUT_PIN7) == LOW)
  if (digitalRead(BUT_PIN8) == LOW)
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,373
1,338
Москва
Если я правильно понял, то хочется упростить это.
Через массив это глупость какая то велосипедно -изобретательная. Если только номера пинов сохранить в массиве. Тогда можно сделать цикл такого типа:
сумма=0
для всех пинов от 1 до 8
сумма =сумма+считать состояние пина (i)
если сумма равна 0, то все пины в low.

Но и так не надо. По хорошему надо считать состояние всех пинов за раз или два -три, если они лежат совсем в разных регистрах. Далее логическим И исключить ненужные биты регистров, сложить регистры и сравнить сумму с 0
 

VictorArx

★★★✩✩✩✩
22 Мар 2021
697
104
Если я правильно понял, что ничего не понял. С регистрами ещё не изучал. Оставлю как есть.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,373
1,338
Москва
Вот такой строкой:
uint8_t allPins = PIND;
Можно считать состояние сразу всех пинов порта D: а это пины 0,1,2,3,4,5,6,7
Пины 0 и 1 принадлежат Serial.
Если сделать PIND >> 2, то они будут исключены из проверки.
Далее
if (allPins ==0){
Тут делаем что то если пины в низком уровне
}
 
  • Лойс +1
Реакции: Serg13

VictorArx

★★★✩✩✩✩
22 Мар 2021
697
104
@Старик Похабыч, благодарствуйте. Немного прочитал про регистры и как считать весь ряд пинов за один раз. Только у меня пины не по порядку в Arduino, приходится за два раза и код сложнее. Один порт я бы осилил, но два это выше моих способностей.
 

Sergo_ST

★★★★★★✩
15 Мар 2020
1,273
939
@VictorArx, Если вручную выставлять биты маски для регистров лень, можно использовать такой макрос:
C++:
#define _BIT(pin) ((uint32_t)0x01 << ((pin > 13) ? (pin + 2) : pin))
#define _PINS(p0,p1,p2,p3,p4,p5,p6,p7) (_BIT(p0) | _BIT(p1) | _BIT(p2) | _BIT(p3) | _BIT(p4) | _BIT(p5) | _BIT(p6) | _BIT(p7))
#define READ_PINS(p0,p1,p2,p3,p4,p5,p6,p7) (boolean)( \
    (PIND & (uint8_t)_PINS(p0,p1,p2,p3,p4,p5,p6,p7)) | \
    (PINB & (uint8_t)(_PINS(p0,p1,p2,p3,p4,p5,p6,p7) >> 8)) | \
    (PINC & (uint8_t)(_PINS(p0,p1,p2,p3,p4,p5,p6,p7) >> 16)))

void setup() {
  //Инициализация пинов
}

void loop() {
  if (!READ_PINS(BUT_PIN1, BUT_PIN2, BUT_PIN3, BUT_PIN4, BUT_PIN5, BUT_PIN6, BUT_PIN7, BUT_PIN8) {
    //Что-то сделать если все пины в низком уровне
  }
}
Номера пинов указывать в диапазоне 0..19, где 0..13 - D0..D13, а 14..19 - A0..A5.
В железе не проверял, но должно работать...
 
Изменено:

VictorArx

★★★✩✩✩✩
22 Мар 2021
697
104
@Sergo_ST, дружище мне не лень, просто это пока для меня сложно. Работу регистров я ещё не изучал. У меня простенькие коды, могу что то подправить так на дилетанском уровне. У меня пины идут не по порядку 2; 3; 5; 7; 9;10;11;12. Мне легче вагон угля разгрузить чем написать код с регистрами и сдвигами. :)
 

Sergo_ST

★★★★★★✩
15 Мар 2020
1,273
939
@VictorArx, Я не с подколкой, просто выражение такое.
В каком порядке пины идут без разницы, этот макрос формирует маски под каждый регистр.
 

VictorArx

★★★✩✩✩✩
22 Мар 2021
697
104
@Sergo_ST, всё нормально. Если скопировать этот макрос , то сразу можно вставлять код, который должен исполнится? У меня код для ЦМУ, который я разработал и мне помогли довести его до логического завершения и я его понимаю. В этом макросе много для меня не понятного, поэтому буду учить про регистры, сдвиги и маски. Хочу понимать, а не тупо скопировать.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,373
1,338
Москва
Выборочно для нужных пинов:
2, 3, 5, 7 - это порт D (0-7)
9, 10, 11, 12 - это порт B (8-13)
Для получения только значений только от них делаем маски:
#define D_MASK=0b10101100
#define B_MASK=0b00001110

Далее такое
uint8_t pin_states = (PIND & D_MASK) + (PINB & B_MASK );
if (!pin_states )
{
....
}

Выглядит проще , чем у Sergo_ST
У Sergo_ST универсальный подход, можно легко вносит изменения.
 
  • Лойс +1
Реакции: VictorArx и Sergo_ST

VictorArx

★★★✩✩✩✩
22 Мар 2021
697
104
Дико извиняюсь, но по моему скромному мнению здесь ошибка #define B_MASK=0b00001110
 

VictorArx

★★★✩✩✩✩
22 Мар 2021
697
104
Исчё один вопрос. Вставляю код в симулятор WOKWI и сразу ругается. Разве в #define B_MASK=0b00001110 должен быть знак =?
 

VictorArx

★★★✩✩✩✩
22 Мар 2021
697
104
Благодарю всех за участие. Всё фунциклирует в симуляторе. Потом перенесу в код ЦМУ. Обязательно почитаю про маску и регистры, заинтересовало. Пока вы помогали я тоже сделал код с массивом. Сейчас покажу на вашу рецензию, тоже заработал.

C++:
byte BUT_PIN[]
{BUT_PIN1,BUT_PIN2,BUT_PIN3,......};
void setap(){
for(int i=0;i<8;i++)
{pinMode(BUT_PIN[i],INPUT);
}
void loop()
{bool allow = true;
 for(int i=0;i<8;i=++){
 if (digitalRead(BUT_PIN[i])==HIGH)
allow = false;
 }
 if(allow)
 {выполняем код}
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,373
1,338
Москва
@VictorArx, То , что сделал свой код это очень правильно! Это опыт.
Теперь можно сделать оценку процессорного времени , затраченного на каждый вариант.
Для твоего варианта надо добавить 1ой строкой цикла loop захват времени в микросекундах (uint32_t tmr1=micros() ( и перед if второй захват. Ну и вывести разницу в монитор порта.
 

VictorArx

★★★✩✩✩✩
22 Мар 2021
697
104
@Старик Похабыч, конечно твой код мне больше понравился и я сразу понял, что к чему и времени затрачено меньше. Мой код сделан с подсказкой ИИ, в котором я исправлял ошибки. До самостоятельного кода я ещё не способен. Что касаемо захвата времени на выполнение участка кода есесено обращение к регистрам на прямую значительно быстрее. Где мне с тобой соревноваться:)
 
Изменено:

poty

★★★★★★★
19 Фев 2020
3,651
1,047
@VictorArx, использование МП - это симбиоз электроники и программирования. Для целей оптимизации можно подключить все входы к одному порту (как раз 8 линий). Это элегантнее, чем в программе мостырить обходные варианты.
 

VictorArx

★★★✩✩✩✩
22 Мар 2021
697
104
@poty, согласен, только сначала припаял к переходной плате с резисторами по входу, поэтому и получилось так, тем более изначально было 10 каналов. Да и немного с помощью друзей опыта чуток приобрёл, далее буду изучать.