Храните нажатия кнопок в массиве и блестите его светодиодами

Пример: Если пользователь нажимает последовательность кнопок 1-2-2-1, то светодиоды загораются в порядке 1-2-2-1

int userAmount[4];
const int ledPins[] = {4, 5};
const int btnPins[] = {8, 9};
    
int buttonState_1 = 0;
    
void setup() {
  Serial.begin(9600);
    for (int n = 0; n < 4; n++)
     {
    
     }
     pinMode(PIN_BUTTON_1, INPUT_PULLUP);
}
    
void loop() {
  buttonState_1 = digitalRead(PIN_BUTTON_1);  
   if (buttonState_1 == LOW)
      {
        for (int i = 0; i < 4; i++)
        {
    
        }
      }
}

, 👍0

Обсуждение

Эм, а в чем именно твоя проблема? Ты не задал вопроса. Если вы не знаете, как идти дальше, часто бывает полезно сначала изложить логику желаемой программы на бумаге в виде псевдокода. На тот момент ничего с реальным кодом не было. Это может начинаться так: "Проверьте кнопки 1 и 2. Если кто-либо из них нажмет, сохраните нажатие в переменной. Повторяйте, пока кнопки не будут нажаты 4 раза ...". После этого вы можете начать преобразование в реальный код Arduino. Псевдокод может очень помочь, особенно когда вы еще не владеете языком C/C++., @chrisl

запишите переходы кнопок ... это происходит только один раз, когда нажата кнопка, и один раз, когда кнопка отпущена ... если вы записываете только digitalRead(), то вы будете получать одну запись при каждой итерации цикла (), которая может составлять 10000 раз в секунду, @jsotola


2 ответа


0

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

Используйте байтовый массив для хранения последовательности нажатий кнопок (запишите номера контактов).

Как только заданный предел (длина последовательности) будет достигнут, воспроизведите последовательность.

Воспроизведение последовательности может выглядеть примерно так:

const byte ledPin1 = 4;
const byte ledPin2 = 5;
const byte sequenceLength = 4;
byte sequence[sequenceLength] = {4, 5, 5, 4};

void setup(){

  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, LOW);

  for(byte i = 0; i < sequenceLength; i++){
    if(sequence[i] == ledPin1){
      digitalWrite(ledPin1, HIGH);
      digitalWrite(ledPin2, LOW);
    }
    else{
      digitalWrite(ledPin1, LOW);
      digitalWrite(ledPin2, HIGH);
    }
    delay(500);
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, LOW);
    delay(500);
  }

}

void loop(){}

EDIT: Добавление нескольких кнопок с помощью библиотеки Bounce2-тривиальная задача.

// Arduino IDE 1.8.9
// Sketch uses 1696 bytes (5%) of program storage space.
// Global variables use 30 bytes (1%) of dynamic memory,
#include <Bounce2.h>
const byte ledPin1 = 4;
const byte ledPin2 = 5;
const byte buttonPin1 = 8;
const byte buttonPin2 = 9;
const byte sequenceLength = 4;
byte sequence[sequenceLength];
byte counter = 0;

Bounce button1 = Bounce();
Bounce button2 = Bounce();

void setup(){

  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, LOW);

  pinMode(buttonPin1, INPUT_PULLUP);
  pinMode(buttonPin2, INPUT_PULLUP);

  button1.attach(buttonPin1);
  button1.interval(50);
  button2.attach(buttonPin2);
  button2.interval(50);

}

void loop(){

  if(button1.update()){
    if(button1.read() == 0){
      addToSequence(ledPin1);
    }
  }

  if(button2.update()){
    if(button2.read() == 0){
      addToSequence(ledPin2);
    }
  }

  if(counter == sequenceLength){
    for(byte i = 0; i < sequenceLength; i++){
      if(sequence[i] == ledPin1){
        digitalWrite(ledPin1, HIGH);
        digitalWrite(ledPin2, LOW);
      }
      else{
        digitalWrite(ledPin1, LOW);
        digitalWrite(ledPin2, HIGH);
      }
      delay(500);
      digitalWrite(ledPin1, LOW);
      digitalWrite(ledPin2, LOW);
      delay(500);
    }
    counter = 0;
  }
}

void addToSequence(byte pinNumber){
  sequence[counter] = pinNumber;
  counter++;
}

,

0

Код работает очень хорошо @VE7JRO Опция отмены кнопок является практическим вариантом использования. кроме того, сохранение программируемой длины секвенсора повышает ценность кода для повторного использования.

Вот моделирование, которое было сделано для кода.

Код для приведенного выше моделирования взят из другого ответа. он также всегда доступен по ссылке "Моделирование".

,