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);
}
}
@Steven , 👍1
Обсуждение1 ответ
У вас мошеннический ;
здесь:
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
- Несколько условий оператора if
- Светодиоды: разница между общим анодом и общим катодом
- Остановить мигание светодиодов
- Интеграция 2 кнопок для включения и выключения светодиода.
- Управление цифровой адресной светодиодной лентой RGB 12 В с помощью Arduino
- Код Arduino для управления 4 светодиодами с 4 кнопок
- Нужен ли подтягивающий/понижающий резистор для цепи светодиода кнопки?
- Мигните светодиодом 5 раз с помощью цикла for
Я должен использовать массив
..... это школьное задание?, @jsotola@jsotola, это школьное задание. Вот почему я прошу предложения, а не заполненные коды. Не поможет, если кто-то сделает работу за меня. Учиться можно только через действие. Millis() была отличной вещью для изучения здесь, millis() даже не будет рассматриваться в учебной программе. Однако я не думаю, что в этом коде нам нужна millis(). Теперь я использую библиотеку Bounce2, и она дает интервал устранения дребезга. Я обновлю свой код для внесенных изменений., @Steven
прошу предложений и незавершенных кодов
.... не вижу такого, @jsotola@jsotola Я прошу прощения за то, что не прояснил это в этом посте., @Steven