Всем ку помогите написать скетч светофора на Ардуинки с кнопкой при котором когда кнопка нажата то светофор включается и три света идут по очереди , а если отключить кнопку даже не важно на каком свете то светофор отключается и при повторном нажатии светофор заново включается Код (C++): const int button = 5;// пин подключения 5 const int led_red = 2; // пин подключения 2 const int led_yellow = 3; // пин подключения 3 const int led_green = 4; // пин подключения 4 int buttonState = 0; int buttonnoState = 1; void setup() { // конфигурация выводов на выход pinMode(led_red, OUTPUT); pinMode(led_yellow, OUTPUT); pinMode(led_green, OUTPUT); pinMode(button, INPUT); } void loop() { buttonState = digitalRead(button); if (buttonState == HIGH) { digitalWrite(led_red, LOW); // красный светодиод гаснет digitalWrite(led_yellow, LOW); // желтый светодиод гаснет digitalWrite(led_green, LOW); // зеленый светодиод гаснет } else { digitalWrite(led_red, HIGH); // красный светодиод загорается delay(2000); // задержка 2 секунд digitalWrite(led_red, HIGH); digitalWrite(led_red, LOW); // красный светодиод гаснет digitalWrite(led_yellow, HIGH); // желтый светодиод загорается delay(2000); // задержка 2 секунд digitalWrite(led_yellow, LOW); // желтый светодиод гаснет digitalWrite(led_green, HIGH); // зеленый светодиод загорается delay(2000); // задержка 2 секунд digitalWrite(led_green, LOW); // зеленый светодиод гаснет } if (buttonState == LOW);{ digitalWrite(led_red, LOW); // красный светодиод гаснет digitalWrite(led_yellow, LOW); // желтый светодиод гаснет digitalWrite(led_green, LOW); // зеленый светодиод гаснет } }
Можно и с delay. В прерываниях выставлять/менять флаг статуса. Если TRUE то просто работает как светофор если FALSE то просто не работает.
Конечный автомат. Сигнал светофора - состояние автомата. Кнопка светофора - входное воздействие автомата.
Думаю, что ТС светофор нужен не для собственных нужд. А коли так, от него ждут выполнения требований "ТЗ", в котором есть кнопка, при нажатии которой нужно отключить светофор. И по кнопке светофор выключается в произвольном состоянии. Это как раз и есть требование, не позволяющее использовать delay(). ИМХО.
Так попробуй. Кнопку - 5 пин на землю замыкать. Антидребезг кнопки сам допиши, если требуется Код (C++): const byte redLedPin = 2, yellowLedPin = 3, greenLedPin = 4, buttonPin = 5; byte currentMode = 0; boolean buttonState = false; unsigned long timerSwitch = 0; void setup() { pinMode(redLedPin, OUTPUT); pinMode(yellowLedPin, OUTPUT); pinMode(greenLedPin, OUTPUT); pinMode(buttonPin, INPUT_PULLUP); } void loop() { if(!digitalRead(buttonPin)) buttonState = !buttonState; if(buttonState){ if(millis() - timerSwitch > 1000){ timerSwitch = millis(); switch(currentMode){ case 0: redLedOn(); break; case 1: yellowLedOn(); break; case 2: greenLedOn(); break; } if(++currentMode == 3) currentMode = 0; } }else offAll(); } void redLedOn(){ digitalWrite(yellowLedPin, LOW); digitalWrite(greenLedPin, LOW); digitalWrite(redLedPin, HIGH); } void yellowLedOn(){ digitalWrite(greenLedPin, LOW); digitalWrite(redLedPin, LOW); digitalWrite(yellowLedPin, HIGH); } void greenLedOn(){ digitalWrite(yellowLedPin, LOW); digitalWrite(redLedPin, LOW); digitalWrite(greenLedPin, HIGH); } void offAll(){ digitalWrite(yellowLedPin, LOW); digitalWrite(redLedPin, LOW); digitalWrite(greenLedPin, LOW); }
Не факт. Это всего лишь хороший инструмент которым нужно уметь пользоваться. Чтобы выполнялся именно нужный блок кода и мк больше ни на что внешнее (в.т.ч) помехи не реагировал. millis не вседа замена delay и тем более наоборот. Вот для этого и нужно прерывание. Здесь по INT0. К сожалению использование прерывания в Ардуино ограничены по сравнению с голым МК но и то что есть можно использовать.