Arduino включить случайный светодиод

У меня есть проект, в котором есть два варианта № 1. Случайным образом включите один светодиод из группы из 6 светодиодов (Релейная плата). № 2 случайным образом включите один светодиод из группы из 2 светодиодов (плата реле) Выбор нужной опции происходит с помощью переключателя.

Я нашел этот код в Интернете, который просто идеально подходит для 6 светодиодов, но я не знаю, как добавить в него выбор опций, как это сделать?

int timeShowRandom = 3000;
int timeShowDecision = 6000;
int timeBlink = 100;
int buttonPin = 2;
int buttonPress = false;
int randomNumber;
int previousNo = 0;
int timePassed = 0;

void setup() {  
  // Set button pin
  pinMode(buttonPin, INPUT);
  // Set output pins  
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(7, OUTPUT);
}

void getRandomNo() {
 int rand = random(7,13);
  if (rand == previousNo) {
   getRandomNo();
  } else {
    randomNumber = rand;
    previousNo = randomNumber;
  }
}

void loop() {
 if (digitalRead(buttonPin) == HIGH && buttonPress == false ) {
     buttonPress = true;
  } if (buttonPress == true && timePassed <= timeShowRandom) {
    getRandomNo(); // Get random pin number
    digitalWrite(randomNumber, LOW);
    delay(timeBlink);
    digitalWrite(randomNumber, HIGH);
    delay(timeBlink);
   timePassed = timePassed + (timeBlink * 2);
  } else if(buttonPress == true) {
    digitalWrite(random(7,13), LOW); // Set random pin on
    delay(timeShowDecision); // For x seconds
    buttonPress = false; // Set button to be enabled again
    timePassed = 0;
  }
  else {
    // Reset all output pins
    digitalWrite(10, HIGH);
    digitalWrite(11, HIGH);
    digitalWrite(12, HIGH);
    digitalWrite(9, HIGH);
    digitalWrite(8, HIGH);
    digitalWrite(7, HIGH);
  }   
}

, 👍1

Обсуждение

Светодиоды? Или реле? Вы, кажется, используете оба термина. Это не одно и то же., @Delta_G


1 ответ


1

Различные предложения:

Создайте 2 различных массива номеров контактов: 1 для первой группы контактов реле и 2-й для второй группы контактов реле:

byte firstRelayPins[] = [7, 8, 9, 10, 11, 12];
byte secondRelayPins[] = [13, 14]; //Замените значения своими контактами реле

Напишите функцию, которая возвращает случайный индекс из одного или другого массива на основе bool:

byte randomPin(bool useSecondArray) {
    int max; 
    int index;
    if useSecondArray {
       return secondRelayPins[random(sizeof(secondRelayPins))]; //Извлекает случайный вывод из массива
    } else {
       return firstRelayPins[random(sizeof(firstRelayPins))]; /Извлекает случайный вывод из массива
    }
}

В зависимости от состояния вашего коммутатора установите значение useSecondArray при вызове этой функции, чтобы определить, какой вывод реле вы включаете.

Используйте возвращенное значение, чтобы установить нужный вывод реле.

В своем коде "отключить все" используйте массивы индексных выводов, а не жестко закодированные индексы.

Вы также должны переработать свой код, чтобы использовать millis (), а не использовать delay(). (Найдите в разделе "Arduino мигает без задержки" руководство о том, как это сделать.)

Обратите внимание, что это приблизительный план того, что нужно сделать. Приведенный выше код, скорее всего, потребуется скорректировать в соответствии с вашими потребностями. Не ожидайте, что сможете скопировать/вставить его в свой проект.

,

Это помогает?, @Duncan C