Переключение программ кнопкой
- Войдите на сайт для отправки комментариев
Вс, 11/03/2018 - 01:52
Помогите, пожалуйста
Пишу программу для переключения режимов горения светодиодов кнопкой, но собранное устройство очень странно горит: сначала мигающий жёлтый(по плану), потом я нажимаю кнопку и переключается программа на горение жёлтого, красного и зелёного(тоже по плану), но потом при последющих нажатиях ничего не меняется
int flag=0;
int regim=0;
int button = 5;
int count = 0;
int button_old = 1;
int LedR = 13;
int LedY = 12;
int LedG = 11;
int LedLeftHand = 10;
int LedRightHand = 9;
int RedTime = 2000;
int YelTime = 3000;
int GrnTime = 12000;
int GrnFlashTime = 1000;
int LedLeftHandTime = 12000;
int LedRightHandTime = 12000;
int GrnNumFlash = 3;
void setup()
{
Serial.begin(9600);
pinMode(button, INPUT_PULLUP);
pinMode(LedR, OUTPUT);
pinMode(LedY, OUTPUT);
pinMode(LedG, OUTPUT);
pinMode(LedLeftHand, OUTPUT);
pinMode(LedRightHand, OUTPUT);
}
void loop()
{
if(digitalRead(button) == HIGH && count== 0)
{
regim ++;
count = 1;
}
if(regim > 3)
{
regim = 0;
}
if(digitalRead(button) == LOW && flag == 1)
{
flag = 0;
}
if(regim == 0)
{
digitalWrite(LedY, HIGH);
delay(1000);
digitalWrite(LedY, LOW);
delay(1000);
}
if(regim == 1)
{
digitalWrite(LedR, HIGH);
delay(RedTime);
digitalWrite(LedY, HIGH);
delay(YelTime);
digitalWrite(LedR, LOW);
digitalWrite(LedY, LOW);
digitalWrite(LedG, HIGH);
delay(GrnTime);
for (int i = GrnNumFlash; i > 0; i--)
{
digitalWrite(LedG, LOW);
delay(GrnFlashTime);
digitalWrite(LedG, HIGH);
delay(GrnFlashTime);
}
digitalWrite(LedG, LOW);
digitalWrite(LedY, HIGH);
delay(YelTime);
digitalWrite(LedY, LOW);
}
if(regim == 2)
{
digitalWrite(LedR, HIGH);
delay(RedTime);
digitalWrite(LedY, HIGH);
delay(YelTime);
digitalWrite(LedR, LOW);
digitalWrite(LedY, LOW);
digitalWrite(LedG, HIGH);
digitalWrite(LedRightHand, HIGH);
delay(GrnTime);
delay(LedRightHandTime);
for (int i = GrnNumFlash; i > 0; i--)
{
digitalWrite(LedG, LOW);
delay(GrnFlashTime);
digitalWrite(LedG, HIGH);
delay(GrnFlashTime);
}
digitalWrite(LedG, LOW);
digitalWrite(LedRightHand, LOW);
digitalWrite(LedY, HIGH);
delay(YelTime);
digitalWrite(LedY, LOW);
}
if(regim == 3)
{
digitalWrite(LedR, HIGH);
delay(RedTime);
digitalWrite(LedY, HIGH);
delay(YelTime);
digitalWrite(LedR, LOW);
digitalWrite(LedY, LOW);
digitalWrite(LedG, HIGH);
digitalWrite(LedLeftHand, HIGH);
delay(GrnTime);
delay(LedLeftHandTime);
for (int i = GrnNumFlash; i > 0; i--)
{
digitalWrite(LedG, LOW);
delay(GrnFlashTime);
digitalWrite(LedG, HIGH);
delay(GrnFlashTime);
}
digitalWrite(LedG, LOW);
digitalWrite(LedLeftHand, LOW);
digitalWrite(LedY, HIGH);
delay(YelTime);
digitalWrite(LedY, LOW);
}
}
Совсем не понимаю почему так(
меняйте структуру программы и ваши приемы программирования. так не взлетит. ПС;#7 #59
1.
Кнопка у Вас срабатывает только 1 раз! Как только она сработала один раз, переменная count становится 1 (в строке 39) и обратно нулём она уже не становится никогда. Поэтому условие в строке 36 больше никода не выполнится.
2.
Неясно для чего нужны строки 45-48. Там в условии стоит проверка, что flag рано 1, но переменная flag у Вас никогда не становится 1, значит это условине никогда не выполнится. Возможно, в строках 45 и 47 Вы имели в виду count, а не flag? Подумайте.
Общее замечание. Когда непонятно как работает, ставьте печать в Serial.print всех переменных, какие есть и внимательно на них смотрите. Обычно человек замечает странное значение и немного подумав, понимает в чём ошибка.
Я так понял, наличие нескольких режимов - это была задумка препода проверить знание Вами конструкций языка. В таких случаях используют оператор switch(){} а не цепочки из ша(){}, несмотря на то что компилятор все равно преварит switch() в цепочку if() в большинстве случаев. А ежели ишо, каждый "режим" оформите в однократно вызываемую "функцию", то читаемость вашей поделки вырастет "на порядок", взамен скорости исполнения. Зато ошибки в коде выйдут "на первый план".
Перепишите, и Вам самому станет гораздо понятней.