Как осуществить динамическую подстановку в параметр?

Здравствуйте. Пытаюсь упростить повторяющийся код.
Имеется:

const int rele1 = D0;
const int rele2 = D1;
...

digitalWrite(rele1, LOW);

Требуется подставить в digitalWrite вместо “rele1” динамично собранную внутри скетча конструкцию типа “rele”.1 или “rele”+“2”. Это возможно?

Ты не в скаску попал, смирись.

void SetRelayState(const int &Relay, bool AValue){
  digitalWrite(Relay, AValue);
}

вызов:

SetRelayState(rele1, LOW);
SetRelayState(rele2,HIGH);

я так понимаю он индекс пытается прицепить, так может массив?

Да, индекс. Чтобы в цикле суметь по индексу вытаскивать из массивов нужные параметры и запускать требуемые исполнительные механизмы.

Ну, так бы и писали! Слов-то умных развели.

ДА !!!

Какую тему штудировать?

Штудировать Вам надо язык программирования от начала и до конца. Отрывками тут не поможешь.

Вы же даже вопрос задать не можете. Ваш вопрос непонятен, т.к. не видно проблемы. Можно ли там использовать переменные? Можно! Используйте на здоровье, проблема-то в чём?

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

1 лайк

по понедельникам добрый :grinning:, надеюсь мысль и направление понятно

const int rele[] = { 0, 1, 2};

void setup()
{
  for (uint8_t idx = 0; idx < 3; idx++)
  {
    pinMode(rele[idx], OUTPUT);
  }
}

void loop()
{
  for (uint8_t idx = 0; idx < 3; idx++)
  {
    digitalWrite(rele[idx], LOW);
    delay(100);
  }
 delay(5000);

  for (uint8_t idx = 0; idx < 3; idx++)
  {
    digitalWrite(rele[idx], HIGH);
    delay(100);
  }

  delay(5000);

}

А чё так? Особый день? В понедельник мама родила? :slight_smile:

В том-то и проблема, что я не могу подступиться к коду даже для его публикации. И для меня в вопросе ну все понятно. :))

for (int i = 1; i < 12; i++) {
  digitalWrite(<rele+i>, HIGH); // Требуется срабатывание объявленных ранее rele1, rele2...
}

Спасибо! Хотя, да… Быть добрым по понедельникам… :slight_smile:

не, родился я в среду, да просто чет бездельничаю, то протеус запущу, то еще чего :slightly_smiling_face:

1 лайк

И на форум Ардуино
Я без шуток не хожу,
То им скетч в забор просуну,
То Протеус покажу.

4 лайка

Так это конструкции из C++33, рано её ещё применять в ардуине. Она будет изобретена только лет через 7.

Поосторожнее там, а то к пятнице начнётся “похмельё” с горькими причитаниями “Как всё запущено-то!

1 лайк

Ну, если Вы не можете не только решить задачу, но даже сформулировать её, то остаётся только повторить:

Давайте, штудируйте.

Чуть подредактирую выложенный ранее xDriver скетч.

#define rele0 8
#define rele1 6
#define rele2 2
#define numRele 3
const int rele[numRele] = { rele0, rele1, rele2};

void setup()
{
  for (uint8_t idx = 0; idx < numRele; idx++)
  {
    pinMode(rele[idx], OUTPUT);
  }
}

void loop()
{
  for (uint8_t idx = 0; idx < numRele; idx++)
  {
    digitalWrite(rele[idx], LOW);
    delay(100);
  }
 delay(5000);

  for (uint8_t idx = 0; idx < numRele; idx++)
  {
    digitalWrite(rele[idx], HIGH);
    delay(100);
  }

  delay(5000);

}

Спасибо. Будет ли работать конструкция

#define rele0 D8 

?

Будет. Но правильней такая

constexpr uint8_t pinRelay0 = 8;

В заблуждение вводишь.

error: 'D8' was not declared in this scope
   pinMode(D8, OUTPUT);

1 лайк