Отслеживание ивентов на кнопке

Тема в разделе "Arduino & Shields", создана пользователем Roman R, 6 фев 2019.

  1. b707

    b707 Гуру

    Я вам уже ответил, как решаются подобные проблемы - переписыванием программы без делеев. А вы схитрили и приделали прерывание. Нет, в самом прерывании ничего плохого нет - но вы вместо того чтоб научиться ПИСАТЬ ПРОГРАММЫ ПРАВИЛЬНО - применили костыль, которым в данном случае является прерывание.
    А то, что ваша проблема именно в делеея - доказать очень легко. Попробуйте написать с делеями программку мигания тремя светодиодами. У одного поставьте период 333 мс, у второго - 450мс, а у третьего - 1024. Справитесь с делеями - возьму свои слова обратно.
     
    parovoZZ нравится это.
  2. Roman R

    Roman R Нуб

    Еще раз повторяю, я использовал делей потому что она гарантированно тормозит работу программы.Потому что задача была получить ивент с кнопки и обработать его, когда поток занят
     
  3. Roman R

    Roman R Нуб

    Я вообще думал изначально что надо будет какие то потоки менеджить как в С.
     
  4. qwone

    qwone Гик

    1- delay гарантировано тормозит работу. 2 - прерывание гарантировано прерывает работу. Вы что на выборах. Даете обещания которые взаимно противоречат.
     
    parovoZZ нравится это.
  5. Roman R

    Roman R Нуб

     
  6. parovoZZ

    parovoZZ Гуру

    Прерывание гарантированно переводит счётчик программ на вектор данного прерывания. Все остальное абсолютно не гарантированно. Не надо выдумывать глупостей.
     
  7. parovoZZ

    parovoZZ Гуру

    Как где?, и какие потоки? Наверное лучше сперва ознакомится с предметом обсуждения.
     
  8. qwone

    qwone Гик

    Код (C++):
    /**/
    typedef void(*pDo)();
    pDo runBtn = [] {}, runLed = [] {};
    const byte btnPin = 2;
    const byte led1Pin = 9;
    const byte led2Pin = 10;
    const byte led3Pin = 11;
    const byte led4Pin = 12;
    const byte led5Pin = 13;
    enum led_t {s0, s1, s2, s3, s4, s5, s6};
    enum btn_t {s1ON, s1OFF, s2ON, s2OFF};
    void standLed(led_t s) {
      static unsigned long past;
      past = millis();
      switch (s) {
        case s0:
          digitalWrite(led1Pin, LOW);
          digitalWrite(led2Pin, LOW);
          digitalWrite(led3Pin, LOW);
          digitalWrite(led4Pin, LOW);
          digitalWrite(led5Pin, LOW);
          runLed = [] {};
          break;
        case s1:
          digitalWrite(led1Pin, HIGH);
          runLed = [] {
            if (millis() - past >= 800)standLed(s2);
          };
          break;
        case s2:
          digitalWrite(led1Pin, LOW);
          digitalWrite(led2Pin, HIGH);
          runLed = [] {
            if (millis() - past >= 800)standLed(s3);
          };
          break;
        case s3:
          digitalWrite(led2Pin, LOW);
          digitalWrite(led3Pin, HIGH);
          runLed = [] {
            if (millis() - past >= 800)standLed(s4);
          };
          break;
        case s4:
          digitalWrite(led3Pin, LOW);
          digitalWrite(led4Pin, HIGH);
          runLed = [] {
            if (millis() - past >= 800)standLed(s5);
          };
          break;
        case s5:
          digitalWrite(led4Pin, LOW);
          digitalWrite(led5Pin, HIGH);
          runLed = [] {
            if (millis() - past >= 800)standLed(s6);
          };
          break;
        case s6:
          digitalWrite(led5Pin, LOW);
          runLed = [] {
            if (millis() - past >= 800)standLed(s1);
          };
          break;
      }
    }
    void standBtn(btn_t s) {
      static unsigned long past;
      past=millis();
      switch (s) {
        case s1ON:
          digitalWrite(led1Pin, HIGH);
          standLed(s0);
          runBtn = [] {
            if (digitalRead(btnPin) && millis() - past >= 100) standBtn(s1OFF);
          };
          break;
        case s1OFF:
          runBtn = [] {
            if (!digitalRead(btnPin) && millis() - past >= 100) standBtn(s2ON);
          };
          break;
        case s2ON:
          standLed(s1);
          runBtn = [] {
            if (digitalRead(btnPin) && millis() - past >= 100) standBtn(s2OFF);
          };
          break;
        case s2OFF:
          runBtn = [] {
            if (!digitalRead(btnPin) && millis() - past >= 100) standBtn(s1ON);
          };
          break;
      } // switch
    }
    void setup() {
      pinMode(led1Pin, OUTPUT);
      pinMode(led2Pin, OUTPUT);
      pinMode(led3Pin, OUTPUT);
      pinMode(led4Pin, OUTPUT);
      pinMode(led5Pin, OUTPUT);
      standLed(s0);
      pinMode(btnPin, INPUT);
      standBtn(s1ON);
    }
    void loop() {
      runBtn();
      runLed();
    }
    /**/