Переключение программ кнопкой
- Войдите на сайт для отправки комментариев
Вс, 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() в большинстве случаев. А ежели ишо, каждый "режим" оформите в однократно вызываемую "функцию", то читаемость вашей поделки вырастет "на порядок", взамен скорости исполнения. Зато ошибки в коде выйдут "на первый план".
Перепишите, и Вам самому станет гораздо понятней.