5 переключателей, 5 светодиодов, 5 тонов, в массиве

Идея заключается в том, что при нажатии переключателя воспроизводится соответствующий тон, а также загорается соответствующий светодиод. Я настроил схему, в которой каждый массив соответствует другому, например, первый переключатель будет воспроизводить тон 1 и зажигать светодиод 1. Когда переключатель отпущен, светодиод выключается, и тон больше не воспроизводится.

Однако я должен использовать массив для скетча вместо объявления каждого отдельного переключателя, светодиода и тона. Моя проблема в том, что когда я компилирую код, я получаю сообщение об ошибке «i» не объявлено. Не уверен, где моя ошибка в цикле for в части настройки скетча.

Я попытался следовать примеру с веб-страницы «Изучение Arduino», но это не помогло.

#define NOTE_C   262 //HZ
#define NOTE_D   294 //ГЦ
#define NOTE_E   330 // Гц
#define NOTE_G   392 //ГЦ
#define NOTE_A   440 //ГЦ

const int SPEAKER = 9;   //динамик на пин 10
int LED[5] = {13, 12, 11, 10, 8};   // светодиодные контакты
int ledcount = 5;
int buttonState; 
int buttonState1;
int buttonState2;
int buttonState3;
int buttonState4;

// Массив кнопок
int Buttons[5]= {3, 4, 5, 6, 7};
int ButtonCount = 5;
const int numButtons = sizeof(Buttons) / sizeof (Buttons[0]);

// Массив тональных нот
int Notes[5] = {NOTE_C, NOTE_D, NOTE_E, NOTE_G, NOTE_A};

void setup()
{
  for (int i = 0; i < sizeof (Buttons) / sizeof(Buttons[0]); i++){
  pinMode(Buttons[], INPUT);
}
  for (int i = 0; i < sizeof (LED) / sizeof (LED[0]); i++);{
  pinMode(LED[], OUTPUT);
}
  for (int i = 0; i < numButtons; i++){
  pinMode(Buttons[i], INPUT);
  debouncer[i].attach(Buttons[i]);
  debouncer[i].interval(100);
}
  buttonState = digitalRead(Buttons[0]);
  buttonState1 = digitalRead(Buttons[1]);
  buttonState2 = digitalRead(Buttons[2]);
  buttonState3 = digitalRead(Buttons[3]);
  buttonState4 = digitalRead(Buttons[4]);
}


void loop()
{


  if (buttonState == HIGH)
  { tone(SPEAKER, Notes[0]);
  digitalWrite(LED[0], HIGH);
  }
  else if (buttonState1 == HIGH)
  {tone(SPEAKER, Notes[1]);
  digitalWrite(LED[1], HIGH);
 }
  else if (buttonState2 == HIGH)
  {tone(SPEAKER, Notes[2]);
  digitalWrite(LED[2], HIGH);
 }
  else if (buttonState3 == HIGH)
  {tone(SPEAKER, Notes[3]);
  digitalWrite(LED[3], HIGH);
 }
  else if (buttonState4 == HIGH)
  {tone(SPEAKER, Notes[4]);
   digitalWrite(LED[4], HIGH);
 }

  else
 {
  digitalWrite(LED[5], LOW);
  noTone(SPEAKER);
 }
}

, 👍1

Обсуждение

Я должен использовать массив ..... это школьное задание?, @jsotola

@jsotola, это школьное задание. Вот почему я прошу предложения, а не заполненные коды. Не поможет, если кто-то сделает работу за меня. Учиться можно только через действие. Millis() была отличной вещью для изучения здесь, millis() даже не будет рассматриваться в учебной программе. Однако я не думаю, что в этом коде нам нужна millis(). Теперь я использую библиотеку Bounce2, и она дает интервал устранения дребезга. Я обновлю свой код для внесенных изменений., @Steven

прошу предложений и незавершенных кодов .... не вижу такого, @jsotola

@jsotola Я прошу прощения за то, что не прояснил это в этом посте., @Steven


1 ответ


4

У вас мошеннический ; здесь:

  for (int i = 0; i < sizeof (LED) / sizeof (LED[0]); i++);{
  pinMode(LED[], OUTPUT);                                 ^------ЗДЕСЬ
}

Это завершает for, делая его пустым, а следующий блок имеет совершенно другую область действия.

Еще одна вещь, которую я заметил: вы не помещаете i в свой индекс массива LED[] (должен быть LED[i]) . То же самое верно и для кнопок [].

Однако по другому поводу:

buttonState == digitalRead(Buttons[0]);
buttonState == digitalRead(Buttons[1]);
buttonState == digitalRead(Buttons[2]);
buttonState == digitalRead(Buttons[3]);
buttonState == digitalRead(Buttons[4]);

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

В том же духе:

if (buttonState = Buttons[0])

сохраняет текущее значение Buttons[0] в buttonState и завершается успешно, если Buttons[0] отличается от 0. То же самое касается всех остальных.

Вам нужно разобраться в своих сравнениях (==) и назначениях (=), а также разобраться, что, по вашему мнению, вы делаете со всеми этими состояниями кнопок в вершина цикла.

,

Я не заметил дополнительных точек с запятой, что объясняет, почему это не было объявлено в области видимости. Я также внес изменения, звук воспроизводится, а светодиоды просто не выключаются. Я предполагаю, что мне нужно устранить дребезг переключателей, чтобы заставить их работать., @Steven

Я отключил переключатели, и у меня все еще такая же проблема. Его дебаунс через массив для цикла, через библиотеку bounce2. Я все еще не заставляю светодиод или другие переключатели работать должным образом. Это также не позволит мне опубликовать новый код в комментарии., @Steven

Если вы не исправите все остальные проблемы с вашим кодом, у вас нет надежды, что он заработает., @Majenko

Теперь у меня все работает, спасибо за помощь. В итоге проблема заключалась в двух вещах, на которые вы указали, и в том, как я звонил в массив., @Steven