Как записать последовательность кнопок и сохранить ее в массиве

У меня есть 3 кнопки, и я хочу записать последовательность их нажатия в массив размером 10, т. е. я хочу записать 10 значений, например {1,1,2,2,3,3,1 ,1,1,3}. Я хочу мигать массивом из 3 светодиодов по той же схеме, по которой были нажаты кнопки. У меня есть две дополнительные кнопки для перевода Arduino в режимы записи и воспроизведения соответственно. Если кто-нибудь может предложить, как я могу хранить значения в массиве, я буду очень благодарен. Я также столкнулся с проблемой, потому что очень сложно управлять одновременным подпрыгиванием кнопок.

, 👍2

Обсуждение

можно ли показать вашу схему подключения?, @Michel Bouchard


2 ответа


Лучший ответ:

3

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

int states[10];

И текущий индекс:

int index_state = 0;

И инициализируйте массив (в настройках):

for (int n = 0; n < 10; n++)
{
    states[n] = 0; // Не нажато
}

Когда следует сохранять новое нажатие кнопки:

states[index_state] = state;

И добавьте единицу в состояние индекса, если достигнуто 10, начните сначала (это означает, что последние 10 сохранены).

index_state = (index_state + 1) % 10;

И чтобы проверить состояния, которые вы просто перебираете из index_state.

Надеюсь, это поможет вам начать работу.

Обратите внимание, что это называется кольцевым буфером.

,

большое спасибо. Это помогло мне сохранить последовательность кнопок. Если вы можете предложить мне, как я могу мигать светодиодами в той же последовательности, что и в массиве, с задержкой 500 миллисекунд. Я публикую свой код в разделе ответов, пожалуйста, посмотрите., @Sudhanshu Shivam

Задержка в 500 мс может быть сложной. Это означает, что для каждой кнопки, которую вы нажимаете, вы также должны сохранять время. Таким образом, вы можете проверить, прошло ли 500 мс с момента нажатия и мигания соответствующего светодиода. Возможно, это поможет сначала создать программу для одной кнопки и одного светодиода (с задержкой 500 мс), а затем добавить больше кнопок/светодиодов. В большинстве случаев лучше постепенно расширять программу, чем идти прямо к конечной цели., @Michel Keijzers


1

это мой код, который хранит последовательность кнопок, но было бы здорово, если бы кто-нибудь помог мне мигать последовательностью светодиодов и переводить микроконтроллер в режим воспроизведения или записи, когда это необходимо. Также этот код сталкивается с некоторыми проблемами, так как иногда он не может принимать входные данные или принимает два входных данных одновременно:

int arr[10];
boolean previous = LOW;
unsigned long time1 = 0;
int debounce = 200;
unsigned long time2 = 0;
int index_state = 0;
void setup()
{
 for(int i = 3;i<6 ;i++)
  pinMode(i,INPUT);
 for(int n=0;n<10;n++) arr[n] = 0;//инициализация
 Serial.begin(9600);
}

void loop(){
 boolean mode = digitalRead(3) || digitalRead(4) || digitalRead(5);
 while(mode == LOW) mode = digitalRead(3) || digitalRead(4) || digitalRead(5);//ждем здесь, пока одна из кнопок не перейдет в высокий уровень;
 //Serial.println("значение");
 if( mode == HIGH && previous == LOW && millis() - time1 > debounce){
 // узнать, какой из них выше, и сохранить это значение в массиве;
 if(digitalRead(3)) arr[index_state] = 3;
 else if(digitalRead(4)) arr[index_state] = 4;
 else if(digitalRead(5)) arr[index_state] = 5;
 else ;
 //выводим значение и индекс;
 Serial.print(arr[index_state]);
 Serial.print(" Stored in index: ");
 Serial.println(index_state);
 index_state = (index_state + 1) % 10;
 //обновляем значение time1 для устранения дребезга кнопок
 time1 =  millis();
}


  //обновляем значение предыдущего состояния кнопки
  previous = digitalRead(3) || digitalRead(4) || digitalRead(5);


  }
,