Кнопка обязательно сработает, если ее держать нажатой более 3х секунд )))
Попадая во второй режим, программа все время висит на delay, выскакивая из него на микроскопическое время, чтобы проверить состояние кнопки. Именно в этот момент кнопка д.б. нажата, чтобы переключиться на следующий режим. Попробуйте использовать для кнопки прерывания, либо счетчики для пауз + delay(100), чтобы постоянно проверять состояние кнопки.
Или решить проблему так:
Код:
void setup()
{
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(buzzer1, OUTPUT); //объявляем пин как выход1
pinMode(button, INPUT);
Serial.begin(9600);
}
void loop()
{
if (digitalRead(A0) == HIGH && flag == 0) //если кнопка нажата
// и перемення flag равна 0 , то ...
{
regim++;
flag = 1;
if (regim > 4) //ограничим количество режимов
{
regim = 1; //так как мы используем только одну кнопку,
// то переключать режимы будем циклично
}
}
if (digitalRead(A0) == LOW && flag == 1) //если кнопка НЕ нажата
//и переменная flag равна - 1 ,то ...
{
flag == 0; //обнуляем переменную "knopka"
//}!!!!
if (regim == 1) //первый режим
{
digitalWrite(11, LOW); //выключаем все светодиоды
digitalWrite(12, LOW);
Serial.println ("led 1 2 off");
//здесь может быть любое ваше действие
}
if (regim == 2) //второй режим
{
digitalWrite(12, HIGH); //включае красный светодиод
digitalWrite(11, LOW);
Serial.println ("led1 off");
tone (buzzer1, 261); //включаем на 261 Гц
delay(300); //на 500 миллисекунд
Serial.println ("buz1 on");
noTone(buzzer1); //выключаем динамик на 1 секунду
delay(1000);
Serial.println ("buz1 off");
tone(buzzer1, 493); //включаем на 493 Гц
delay(300); //на 500 миллисекунд
Serial.println ("buz2 on");
noTone(buzzer1);//выключаем динамик на 1 секунду
delay(1000);
Serial.println ("buz2 off");
//здесь может быть любое ваше действие
}
if (regim == 3) //третий режим
{
digitalWrite(11, HIGH); //включае зеленый светодиод
digitalWrite(12, LOW);
Serial.println ("led2 on");
//здесь может быть любое ваше действие
}
if (regim == 4) //четвертый режим
{
digitalWrite(11, HIGH); //включаем светодиоды одновременно
digitalWrite(12, HIGH);
//здесь может быть любое ваше действие
Serial.println ("led 1 2 on");
}
}//!!!!!
}
Вариантов много.
Сама кнопка аппаратно тоже выполнена не правильно. Резистор 10к д.б. подключен между входным портом и + питания (либо использовать pinMode(X,INPUT_PULLUP)). А кнопкой соединять вход с минусом питания. В этом случае исключаются наводки на болтающуюся в воздухе входную ногу. Нажатие кнопки будет определяться LOW уровнем соответственно.