Светофор

Тема в разделе "Arduino & Shields", создана пользователем Arduino77, 13 июл 2019.

  1. Arduino77

    Arduino77 Нуб

    Код светофора с 2 режимами, написал Airbus.
    Код (C++):
    int red = 11;
    int yellow = 8;
    int green = 5;
    int buttonPin = 2; // номер вывода с тумблЁром
    void setup() {
      //initialize pins as outputs
      pinMode(red, OUTPUT);
      pinMode(yellow, OUTPUT);
      pinMode(green, OUTPUT);
      // настроить вывод кнопки на вход
      pinMode(buttonPin, INPUT);
      // прикрепить прерывание
      attachInterrupt(0, blink, LOW);
    }
    void blink() {
      //Мигаем жОлтым пока тумблЁр включен
      digitalWrite(red,LOW);
      digitalWrite(green,LOW);
      digitalWrite(yellow, HIGH);   // turn the LED on (HIGH is the voltage level)
      delay(230000);              // wait for a second
      digitalWrite(yellow, LOW);    // turn the LED off by making the voltage LOW
      delay(230000);              // wait for a second

    }
    void loop() {
      // основная прога Аффтара
      digitalWrite(red,HIGH);
      delay(1000);
      digitalWrite(red,HIGH);
      delay(1000);
      digitalWrite(red,HIGH);
      delay(1000);
      digitalWrite(red,HIGH);
      delay(1000);
      digitalWrite(red,HIGH);
      delay(1000);
      digitalWrite(red,HIGH);
      delay(1000);
      digitalWrite(red,HIGH);
      delay(1000);
      digitalWrite(red,HIGH);
      delay(1000);
      digitalWrite(red,HIGH);
      delay(1000);
      digitalWrite(red,HIGH);
      delay(1000);
      digitalWrite(yellow,HIGH);
      delay(1000);
      digitalWrite(yellow,HIGH);
      delay(1000);
      digitalWrite(yellow,HIGH);
      delay(1000);
      digitalWrite(yellow,HIGH);
      delay(1000);
      digitalWrite(red,LOW);
      digitalWrite(yellow,LOW);
      digitalWrite(green,HIGH);
      delay(1000);
      digitalWrite(red,LOW);
      digitalWrite(yellow,LOW);
      digitalWrite(green,HIGH);
      delay(1000);
      digitalWrite(red,LOW);
      digitalWrite(yellow,LOW);
      digitalWrite(green,HIGH);
      delay(1000);
      digitalWrite(red,LOW);
      digitalWrite(yellow,LOW);
      digitalWrite(green,HIGH);
      delay(1000);
      digitalWrite(red,LOW);
      digitalWrite(yellow,LOW);
      digitalWrite(green,HIGH);
      delay(1000);
      digitalWrite(red,LOW);
      digitalWrite(yellow,LOW);
      digitalWrite(green,HIGH);
      delay(1000);
      digitalWrite(red,LOW);
      digitalWrite(yellow,LOW);
      digitalWrite(green,HIGH);
      delay(1000);
      digitalWrite(red,LOW);
      digitalWrite(yellow,LOW);
      digitalWrite(green,HIGH);
      delay(1000);
      digitalWrite(red,LOW);
      digitalWrite(yellow,LOW);
      digitalWrite(green,HIGH);
      delay(1000);
      digitalWrite(red,LOW);
      digitalWrite(yellow,LOW);
      digitalWrite(green,HIGH);
      delay(1000);
      digitalWrite(green,LOW);
      delay(700);
      digitalWrite(green,HIGH);
      delay(700);
      digitalWrite(green,LOW);
      delay(700);
      digitalWrite(green,HIGH);
      delay(700);
      digitalWrite(green,LOW);
      delay(700);
      digitalWrite(green,HIGH);
      delay(700);
      digitalWrite(green,LOW);
      digitalWrite(yellow,HIGH);
      delay(1000);
      digitalWrite(green,LOW);
      digitalWrite(yellow,HIGH);
      delay(1000);
      digitalWrite(green,LOW);
      digitalWrite(yellow,HIGH);
      delay(1000);
      digitalWrite(green,LOW);
      digitalWrite(yellow,HIGH);
      delay(1000);
      digitalWrite(yellow,LOW);
      }
     
    Последнее редактирование: 21 июл 2019
  2. NikitOS

    NikitOS Король шутов Администратор

    Для начала прочитать закреплённое сообщение и исправить ошибки...
     
    Daniil нравится это.
  3. Daniil

    Daniil Гуру

    Вставьте, пожалуйста, код через тэги. Как это сделать см. в закрепленной теме в любом разделе форума.
    По вопросу:
    Нужно сделать обработку нажатия кнопки, где будет меняться значение флага аварии. В лупе же режимы разделить флагами (см. конечный автомат, switch-case) и в режиме аварии мигать лампочкой.
     
  4. Airbus

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

    Типа так
    [​IMG]
     
    Daniil нравится это.
  5. KindMan

    KindMan Гуру

    Когда поймете этот пример мигания без применения задержки, то сможете и кнопку добавить, и даже целый перекресток сделать из 4 светофоров на одной ардуино. Светофор, это не то, что нужно делать в первый день знакомства с ардуино.
     
  6. Asper Daffy

    Asper Daffy Иксперд

    Этого мало, нужно ещё понять, что в природе не существует переменной delay и менять её нельзя никак. Это, пожалуй, надо сначала понять. Без этого пример не поймётся :(
     
    DetSimen нравится это.
  7. Airbus

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

    А чё тут сложного?Тумблер например на Пин3 Если тумблер включён тоесть пин3 прижат к GND то есть LOW выполняем Вашу программу-или сландартный светофор если тумблер выкл тоесть на нём HIGH выполняем blink блинкаем жОлтым.Как то так.А delay здесь ни при чём.Его можно использовать.
     
  8. b707

    b707 Гуру

    если понадобился, а "писать код не умею" - можно заказать в разделе "Закажу проект"
     
  9. b707

    b707 Гуру

    нынешний код ТС будет переключаться только после полного цикла - так он устроен
     
  10. Belkin

    Belkin Гик

    Опять наскальные рисунки пошли...
     
  11. Airbus

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

    Дык запихать его в отдельную фунуцЫю которая будет выполнятся
    if (тумблер включОн);
    else (blink жОлтым);
     
  12. KindMan

    KindMan Гуру

    Настоящий светофор тоже может так работать, полный цикл закончил и в жёлтый мигающий, так что по схеме @Airbus вполне реализуемо… вот только думаю ТС всё равно не понял как это сделать :)
     
  13. a1000

    a1000 Гуру

    Да, можно и через +5 и GND
     
  14. b707

    b707 Гуру

    можно, если запитывать стабилизированным напряжением 5в
     
  15. parovoZZ

    parovoZZ Гуру

    Да можно и не стабилизированным. Только чтоб не прыгало меньше 4-х и не больше 6.
     
  16. Ariadna-on-Line

    Ariadna-on-Line Гуру

    GND - никак не может быть "выходом". Это точка отсчета всех остальных напряжений. Вот контакты "+5v" и "+3.3v" на гребенке Ардуины - это выходы стабилизаторов на плате. А вообще - подавать "со стороны" напряжение на выход стабилизатора, не подавая напряжение на его вход, возможно далеко не всегда. В зависимости от схемы он может стать цепью КЗ для стороннего источника. Сгорит сам и спалит сторонний источник. Практика показывает, что Ардуиновские стабилизаторы вроде бы это позволяют и не горят. Но при этом будет подаваться напряжение в УСБ порт компа, если он подключен к Ардуине. Так что вы - рискуете компом...
     
    Последнее редактирование: 14 июл 2019
  17. Airbus

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

    Пин Vin на плате.
    А еще можно из прерывания INT0/1 прыгать в blink это еще проще.Только думаю ТС всё равно не понял как это сделать.Держи.Пробуй.
    Код (C++):
    int red = 12;
    int yellow = 11;
    int green = 8;
    int buttonPin = 2; // номер вывода с тумблЁром
    void setup() {
      //initialize pins as outputs
      pinMode(red, OUTPUT);
      pinMode(yellow, OUTPUT);
      pinMode(green, OUTPUT);
      // настроить вывод кнопки на вход
      pinMode(buttonPin, INPUT);
      // прикрепить прерывание
      attachInterrupt(0, blink, LOW);
    }
    void blink() {
      //Мигаем жОлтым пока тумблЁр включен
      digitalWrite(yellow, HIGH);   // turn the LED on (HIGH is the voltage level)
      delay(1000);              // wait for a second
      digitalWrite(yellow, LOW);    // turn the LED off by making the voltage LOW
      delay(1000);              // wait for a second
    }
    void loop() {
      // основная прога Аффтара
      digitalWrite(red,HIGH);
      delay(1000);
      digitalWrite(yellow,HIGH);
      delay(1000);
      digitalWrite(red,LOW);
      digitalWrite(yellow,LOW);
      digitalWrite(green,HIGH);
      delay(1000);
      digitalWrite(green,LOW);
      delay(1000);
      digitalWrite(green,HIGH);
      delay(1000);
      digitalWrite(green,LOW);
      delay(1000);
      digitalWrite(green,HIGH);
      delay(1000);
      digitalWrite(green,LOW);
      digitalWrite(yellow,HIGH);
      delay(1000);
      digitalWrite(yellow,LOW);
      }
     
    Последнее редактирование: 14 июл 2019
    Arduino77 нравится это.
  18. Airbus

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

    Ну всё правильно сделали-под себя.Поздравляю!Ставьте лайки :):):)
    Можно напрямую.Можно и по фен-шую через 3 ком резистор.Да насчет поправки все правильно делал на скорую руку не подумал.Прерывание останавливает программу в любом месте при этом горит все что горело в момент перехода к выполнению прерывания.Гасить лучше сразу и красный и зеленый а желтый включать.
     
    Последнее редактирование: 14 июл 2019
    Arduino77 нравится это.
  19. Airbus

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

    Прерывания-великая Вешь!Только в Ардуино их использование урезано.Потому как Ардуино-учебная парта деЦЦкий конструктор.Про прерывания ЗДЕСЯ.Их всего два.
    1-по ссылке прочитаете что непонятно дорасскажу.
    2-прерывания возникают каждый наз при наступлении условия.Если прерываний несколько и оба сработали одновременно выполниться то которое имеет высший приоритет.там тоже своя иерархия.Но это другая песня.
    3-забудьте о такой глупости как экономия на Ардуино.Хотите реально 10 лет работать от одной батарейки используйте "голый" микроконтроллер.
    4-Да можно почему нет?
     
  20. Asper Daffy

    Asper Daffy Иксперд

    Куда столько? Лопнет же!