Использование циклов for для блокировки пользователя в Arduino - PullRequest
0 голосов
/ 28 мая 2018

У меня проблемы с моим кодом для проекта цифровой блокировки кода.Мне удалось заставить большую часть этого работать, но есть один раздел, который сбивает меня с толку.Есть набор из 6 переключателей, 2 кнопки, зеленый светодиод и красный светодиод.Переключатели могут быть включены или выключены в любом порядке.После того, как порядок установлен с помощью 1-й кнопки (с помощью контакта 8), он сохраняется как последовательность из 6 переменных.Эта часть отлично работает.

Следующая часть - это та, которая проверяет, равна ли каждая переменная соответствующему переключателю при нажатии 2-й кнопки (контакт 12).Если все они есть, то загорается зеленый светодиод.В противном случае пользователь получает еще 2 попытки.Если пользователь вводит неправильные серии переключателей 3 раза, они блокируются на 10 секунд.Вот где у меня возникают проблемы с использованием цикла for.Я использую систему блочного кодирования Tinkercad и не знаю, как закрыть цикл.Вот весь код на данный момент:

int switch0 = 0;

int switch1 = 0;

int switch2 = 0;

int switch3 = 0;

int switch4 = 0;

int switch5 = 0;

int switchChecker = 0;

int i = 0;

void setup()
{
  pinMode(8, INPUT);
  pinMode(A5, INPUT);
  Serial.begin(9600);

  pinMode(A4, INPUT);
  pinMode(A3, INPUT);
  pinMode(A2, INPUT);
  pinMode(A1, INPUT);
  pinMode(A0, INPUT);
  pinMode(12, INPUT);
  pinMode(2, OUTPUT);
  pinMode(4, OUTPUT);
}

void loop()
{
  // this records the values of all 6 switches on 1st
  // button press
  if (digitalRead(8) == HIGH) {
    switch0 = digitalRead(A5);
    Serial.println(switch0);
    switch1 = digitalRead(A4);
    Serial.println(switch1);
    switch2 = digitalRead(A3);
    Serial.println(switch2);
    switch3 = digitalRead(A2);
    Serial.println(switch3);
    switch4 = digitalRead(A1);
    Serial.println(switch4);
    switch5 = digitalRead(A0);
    Serial.println(switch5);
  }
  // when the 2nd button is pressed, a for loop is
  // started to check if the switches are the same
  // order
  if (digitalRead(12) == HIGH) {
    for (i = 1; i <= 3; i += 1) {
      if (digitalRead(A5) == switch0 && (digitalRead(A4) == switch1 && (digitalRead(A3) == switch2 && (digitalRead(A2) == switch3 && (digitalRead(A1) == switch4 && digitalRead(A0) == switch5))))) {
        i = 3;
      }
    }
  }
  // if the conditions are met, the for loop closes
  // and the green LED turns on
  if (i == 3) {
    digitalWrite(2, HIGH);
    digitalWrite(4, LOW);
  } else {
    delay(10000); // Wait for 10000 millisecond(s)
  }
}

Наконец, если я хочу, чтобы пользователь был заблокирован после 3 неправильных попыток после первоначальной блокировки, и установите эту задержку равнойопределенное количество времени, как бы я это сделал?

1 Ответ

0 голосов
/ 30 мая 2018

Вместо цикла for вы можете создать глобальную переменную, которая будет подсчитывать количество ошибочных попыток.Затем, если оно равно 3, вы вызываете задержку:

char wrongAttemps = 0;

void loop()
{
    // this records the values of all 6 switches on 1st
    // button press
    if (digitalRead(8) == HIGH) {
        switch0 = digitalRead(A5);
        Serial.println(switch0);
        switch1 = digitalRead(A4);
        Serial.println(switch1);
        switch2 = digitalRead(A3);
        Serial.println(switch2);
        switch3 = digitalRead(A2);
        Serial.println(switch3);
        switch4 = digitalRead(A1);
        Serial.println(switch4);
        switch5 = digitalRead(A0);
        Serial.println(switch5);
    }

    // when the 2nd button is pressed,
    // check if the switches are the same order
    if (digitalRead(12) == HIGH) {
        if (digitalRead(A5) == switch0 && digitalRead(A4) == switch1
            && digitalRead(A3) == switch2 && digitalRead(A2) == switch3
            && (digitalRead(A1) == switch4 && digitalRead(A0) == switch5
        ) {
            // right combination
            digitalWrite(2, HIGH);
            digitalWrite(4, LOW);
        } else {
            // wrong combination
            digitalWrite(2, LOW);
            digitalWrite(4, HIGH);

            wrongAttemps++;

            if (wrongAttemps == 3) {
                delay(10000);
                wrongAttemps = 0;   // reset attemps
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...