Всем ку помогите написать скетч светофора на ардуинки с кнопкой

Тема в разделе "Arduino & Shields", создана пользователем Rajja, 5 авг 2021.

  1. Rajja

    Rajja Нуб

    Всем ку помогите написать скетч светофора на Ардуинки с кнопкой при котором когда кнопка нажата то светофор включается и три света идут по очереди , а если отключить кнопку даже не важно на каком свете то светофор отключается и при повторном нажатии светофор заново включается
    Код (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); // зеленый светодиод гаснет
        }
    }
     
     
  2. b707

    b707 Гуру

    для начала надо выкинуть delay() и переписать без них, иначе кнопка не будет работать
     
    SergeiL нравится это.
  3. Airbus

    Airbus Радиохулиган Модератор

    Можно и с delay. В прерываниях выставлять/менять флаг статуса. Если TRUE то просто работает как светофор если FALSE то просто не работает.
     
  4. parovoZZ

    parovoZZ Гуру

    Конечный автомат. Сигнал светофора - состояние автомата. Кнопка светофора - входное воздействие автомата.
     
  5. SergeiL

    SergeiL Оракул Модератор

    Думаю, что ТС светофор нужен не для собственных нужд.
    А коли так, от него ждут выполнения требований "ТЗ", в котором есть кнопка, при нажатии которой нужно отключить светофор.
    И по кнопке светофор выключается в произвольном состоянии.
    Это как раз и есть требование, не позволяющее использовать delay().
    ИМХО.
     
  6. Sergku

    Sergku Нерд

    Так попробуй. Кнопку - 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);
    }
     
    Последнее редактирование: 6 авг 2021
  7. Sergku

    Sergku Нерд

    это вселенское злище. по определению
     
  8. Airbus

    Airbus Радиохулиган Модератор

    Не факт. Это всего лишь хороший инструмент которым нужно уметь пользоваться. Чтобы выполнялся именно нужный блок кода и мк больше ни на что внешнее (в.т.ч) помехи не реагировал. millis не вседа замена delay и тем более наоборот.
    Вот для этого и нужно прерывание. Здесь по INT0. К сожалению использование прерывания в Ардуино ограничены по сравнению с голым МК но и то что есть можно использовать.
     
  9. Sergku

    Sergku Нерд

    Нормально тут подчистили :)