Ардуино и переключатель

Тема в разделе "Arduino & Shields", создана пользователем Evgeny_KH, 31 май 2017.

  1. Evgeny_KH

    Evgeny_KH Нерд

    Всем привет! помогите разобраться с ардуино и переключателем. Нужно чтобы при включении переключателя ардуина выдавала импульс 1 сек а потом выключала порт, при повторном включении происходило то же самое. По сути одновибратор. Заранее спасибо
     
  2. qwone

    qwone Гик

    Да что там писать.
    Код (C++):
    /*Cl_Led.ino
      светодиод ->13
      кнопка    ->2
    */


    //--------------------class Cl_Led------------------------
    // класс светодиода
    class Cl_Led {
        byte pin; // нога для подключения светодиода
        bool inv; // 0 светодиод горит при 1/ 1 светодиод горит при 0
        bool stat_ON = 0, led = 0;
        uint32_t time = 500, past = 0;
      public:
        // указатель на следующий элемент
        Cl_Led *pnt;
        // конструктор
        Cl_Led(byte _pin, bool _inv): pin(_pin), inv(_inv), pnt(NULL) {}
        // setup()
        void setup() {
          if (this->pnt != NULL) this->pnt->setup();
          pinMode(pin, OUTPUT);// подключить светодиод
          led = 0;
          digitalWrite(pin, led ^ inv) ; // погасить светодиод
        }
        // loop()
        void loop() {
          if (this->pnt != NULL) this->pnt->loop();
          if (stat_ON && millis() - past >= time)OFF();
        }
        // включить светодиод
        void ON() {
          stat_ON = 0;
          led = 1;
          digitalWrite(pin, led ^ inv) ; // зажечь светодиод
        }
        // включить светодиод на время
        void ON( uint32_t _time) {
          time = _time;
          stat_ON = 1;
          past = millis();
          led = 1;
          digitalWrite(pin, led ^ inv) ; // зажечь светодиод
        }
        // выключить светодиод
        void OFF() {
          stat_ON = 0;
          led = 0;
          digitalWrite(pin, led ^ inv) ; // погасить светодиод
        }

    };
    //--------------------class Cl_Btn------------------------
    // класс кнопки с 1 обработчиком кнопки
    class Cl_Btn {
        byte pin; // номер ноги на кнопке
        void (* Do)();// указатель на обработчик
        bool btn, btn_old;
        bool bounce = 0; // антидребезговый флаг
        uint32_t past = 0 ;
      public:
        // указатель на следующую
        Cl_Btn *pnt = NULL;
        // конструктор
        Cl_Btn(byte _pin, void (* _Do)()): pin(_pin), Do(_Do) {};
        // setup()
        void setup() {
          if (this->pnt != NULL) this->pnt->setup();
          pinMode(pin, INPUT_PULLUP);// подключить кнопку 1 с подтяжкой
          btn = digitalRead(pin); // прочитать реальное значение на выводе};
        }
        // loop()
        void loop() {
          if (this->pnt != NULL) this->pnt->loop();
          if (! bounce && btn != digitalRead(pin)) { // если прошел фронт изм на выводн
            bounce = 1;                              // выставить флаг
            past = millis();                         // сделать временую засветку
          }
          else if ( bounce && millis() - past >= 5 ) { // если прошло антидребезговое время
            bounce = 0;                                // то снять флаг
            btn_old = btn ;
            btn = digitalRead(pin) ;                   // прочитать реальное значение на выводе
            if (btn_old && ! btn) Do();
          }
        }
    };
    //-----------------class Cl_sys---------------------------
    class Cl_sys {
        Cl_Led *Start_Led = NULL;
        Cl_Btn *Start_Btn = NULL;
      public:
        Cl_sys() {}
        void Plug(Cl_Led * obj) {
          obj->pnt = Start_Led;
          Start_Led = obj;
        }
        void Plug(Cl_Btn * obj) {
          obj->pnt = Start_Btn;
          Start_Btn = obj;
        }
        void setup() {
          Start_Led->setup();
          Start_Btn->setup();
        }
        void loop() {
          Start_Led->loop();
          Start_Btn->loop();
        }
    } Sys;
    //--------------------------------------------
    Cl_Led Led(/*пин*/13,/*инверсия*/0);// подключить светодиод на ногу 13 / инверсия отключена
    void Do_Btn() {
      const uint32_t time_1s = 1000;
      Led.ON(time_1s);// вкл на 1 секунду
    }
    Cl_Btn Btn(/*пин*/2,/*обработчик*/Do_Btn);// подключить кнопку на ногу 2

    void setup() {
      Sys.Plug(&Led);

      Sys.Plug(&Btn);
      Sys.setup();
    }
    void loop() {
      Sys.loop();
    }
     
    Evgeny_KH и arkadyf нравится это.
  3. Evgeny_KH

    Evgeny_KH Нерд

    Спасибо! Не так все просто как я думал((
     
  4. qwone

    qwone Гик

    Разумеется можно проще. Но зачем. У меня есть готовый отработаный компонент кнопка и компонент светодиод. Вот я и слепил. И да я могу засунуть пяток кнопок и пяток светодиодов и все это будет работать независимо друг от друга. Вот где-то так
    Код (C++):
    /*Cl_Led5.ino
      кнопка    ->2
      светодиод ->9

      кнопка    ->3
      светодиод ->10

      кнопка    ->4
      светодиод ->11

      кнопка    ->5
      светодиод ->12

      кнопка    ->6
      светодиод ->13
    */


    //--------------------class Cl_Led------------------------
    // класс светодиода
    class Cl_Led {
        byte pin; // нога для подключения светодиода
        bool inv; // 0 светодиод горит при 1/ 1 светодиод горит при 0
        bool stat_ON = 0, led = 0;
        uint32_t time = 500, past = 0;
      public:
        // указатель на следующий элемент
        Cl_Led *pnt;
        // конструктор
        Cl_Led(byte _pin, bool _inv): pin(_pin), inv(_inv), pnt(NULL) {}
        // setup()
        void setup() {
          if (this->pnt != NULL) this->pnt->setup();
          pinMode(pin, OUTPUT);// подключить светодиод
          led = 0;
          digitalWrite(pin, led ^ inv) ; // погасить светодиод
        }
        // loop()
        void loop() {
          if (this->pnt != NULL) this->pnt->loop();
          if (stat_ON && millis() - past >= time)OFF();
        }
        // включить светодиод
        void ON() {
          stat_ON = 0;
          led = 1;
          digitalWrite(pin, led ^ inv) ; // зажечь светодиод
        }
        // включить светодиод на время
        void ON( uint32_t _time) {
          time = _time;
          stat_ON = 1;
          past = millis();
          led = 1;
          digitalWrite(pin, led ^ inv) ; // зажечь светодиод
        }
        // выключить светодиод
        void OFF() {
          stat_ON = 0;
          led = 0;
          digitalWrite(pin, led ^ inv) ; // погасить светодиод
        }

    };
    //--------------------class Cl_Btn------------------------
    // класс кнопки с 1 обработчиком кнопки
    class Cl_Btn {
        byte pin; // номер ноги на кнопке
        void (* Do)();// указатель на обработчик
        bool btn, btn_old;
        bool bounce = 0; // антидребезговый флаг
        uint32_t past = 0 ;
      public:
        // указатель на следующую
        Cl_Btn *pnt = NULL;
        // конструктор
        Cl_Btn(byte _pin, void (* _Do)()): pin(_pin), Do(_Do) {};
        // setup()
        void setup() {
          if (this->pnt != NULL) this->pnt->setup();
          pinMode(pin, INPUT_PULLUP);// подключить кнопку 1 с подтяжкой
          btn = digitalRead(pin); // прочитать реальное значение на выводе};
        }
        // loop()
        void loop() {
          if (this->pnt != NULL) this->pnt->loop();
          if (! bounce && btn != digitalRead(pin)) { // если прошел фронт изм на выводн
            bounce = 1;                              // выставить флаг
            past = millis();                         // сделать временую засветку
          }
          else if ( bounce && millis() - past >= 5 ) { // если прошло антидребезговое время
            bounce = 0;                                // то снять флаг
            btn_old = btn ;
            btn = digitalRead(pin) ;                   // прочитать реальное значение на выводе
            if (btn_old && ! btn) Do();
          }
        }
    };
    //-----------------class Cl_sys---------------------------
    class Cl_sys {
        Cl_Led *Start_Led = NULL;
        Cl_Btn *Start_Btn = NULL;
      public:
        Cl_sys() {}
        void Plug(Cl_Led * obj) {
          obj->pnt = Start_Led;
          Start_Led = obj;
        }
        void Plug(Cl_Btn * obj) {
          obj->pnt = Start_Btn;
          Start_Btn = obj;
        }
        void setup() {
          Start_Led->setup();
          Start_Btn->setup();
        }
        void loop() {
          Start_Led->loop();
          Start_Btn->loop();
        }
    } Sys;
    //--------------------------------------------
    Cl_Led Led1(/*пин*/9 ,/*инверсия*/0);// подключить светодиод на ногу 9 / инверсия отключена
    Cl_Led Led2(/*пин*/10,/*инверсия*/0);// подключить светодиод на ногу 10 / инверсия отключена
    Cl_Led Led3(/*пин*/11,/*инверсия*/0);// подключить светодиод на ногу 11 / инверсия отключена
    Cl_Led Led4(/*пин*/12,/*инверсия*/0);// подключить светодиод на ногу 12 / инверсия отключена
    Cl_Led Led5(/*пин*/13,/*инверсия*/0);// подключить светодиод на ногу 13 / инверсия отключена

    const uint32_t time_1s = 1000;
    void Do_Btn1() {
      Led1.ON(time_1s);// вкл на 1 секунду
    }
    void Do_Btn2() {
      Led2.ON(time_1s);// вкл на 1 секунду
    }
    void Do_Btn3() {
      Led3.ON(time_1s);// вкл на 1 секунду
    }
    void Do_Btn4() {
      Led4.ON(time_1s);// вкл на 1 секунду
    }
    void Do_Btn5() {
      Led5.ON(time_1s);// вкл на 1 секунду
    }
    Cl_Btn Btn1(/*пин*/2,/*обработчик*/Do_Btn1);// подключить кнопку на ногу 2
    Cl_Btn Btn2(/*пин*/3,/*обработчик*/Do_Btn2);// подключить кнопку на ногу 3
    Cl_Btn Btn3(/*пин*/4,/*обработчик*/Do_Btn3);// подключить кнопку на ногу 4
    Cl_Btn Btn4(/*пин*/5,/*обработчик*/Do_Btn4);// подключить кнопку на ногу 5
    Cl_Btn Btn5(/*пин*/6,/*обработчик*/Do_Btn5);// подключить кнопку на ногу 6

    void setup() {
      Sys.Plug(&Led1);
      Sys.Plug(&Led2);
      Sys.Plug(&Led3);
      Sys.Plug(&Led4);
      Sys.Plug(&Led5);

      Sys.Plug(&Btn1);
      Sys.Plug(&Btn2);
      Sys.Plug(&Btn3);
      Sys.Plug(&Btn4);
      Sys.Plug(&Btn5);
      Sys.setup();
    }
    void loop() {
      Sys.loop();
    }
     
    Последнее редактирование: 31 май 2017
    Evgeny_KH и arkadyf нравится это.
  5. qwone

    qwone Гик

    А это если кнопка на+5B , внешний резистор подтяжка на землю. Если вам надо поменять состояние на светодиоде, то /*инверсия*/ 1
    Код (C++):
    /*Cl_Led5.ino
      кнопка    ->2 кнопка на +5 резистор на землю
      светодиод ->9

      кнопка    ->3 кнопка на +5 резистор на землю
      светодиод ->10

      кнопка    ->4 кнопка на +5 резистор на землю
      светодиод ->11

      кнопка    ->5 кнопка на +5 резистор на землю
      светодиод ->12

      кнопка    ->6 кнопка на +5 резистор на землю
      светодиод ->13
    */


    //--------------------class Cl_Led------------------------
    // класс светодиода
    class Cl_Led {
        byte pin; // нога для подключения светодиода
        bool inv; // 0 светодиод горит при 1/ 1 светодиод горит при 0
        bool stat_ON = 0, led = 0;
        uint32_t time = 500, past = 0;
      public:
        // указатель на следующий элемент
        Cl_Led *pnt;
        // конструктор
        Cl_Led(byte _pin, bool _inv): pin(_pin), inv(_inv), pnt(NULL) {}
        // setup()
        void setup() {
          if (this->pnt != NULL) this->pnt->setup();
          pinMode(pin, OUTPUT);// подключить светодиод
          led = 0;
          digitalWrite(pin, led ^ inv) ; // погасить светодиод
        }
        // loop()
        void loop() {
          if (this->pnt != NULL) this->pnt->loop();
          if (stat_ON && millis() - past >= time)OFF();
        }
        // включить светодиод
        void ON() {
          stat_ON = 0;
          led = 1;
          digitalWrite(pin, led ^ inv) ; // зажечь светодиод
        }
        // включить светодиод на время
        void ON( uint32_t _time) {
          time = _time;
          stat_ON = 1;
          past = millis();
          led = 1;
          digitalWrite(pin, led ^ inv) ; // зажечь светодиод
        }
        // выключить светодиод
        void OFF() {
          stat_ON = 0;
          led = 0;
          digitalWrite(pin, led ^ inv) ; // погасить светодиод
        }

    };
    //--------------------class Cl_Btn------------------------
    // класс кнопки с 1 обработчиком кнопки
    class Cl_Btn {
        byte pin; // номер ноги на кнопке
        void (* Do)();// указатель на обработчик
        bool btn, btn_old;
        bool bounce = 0; // антидребезговый флаг
        uint32_t past = 0 ;
      public:
        // указатель на следующую
        Cl_Btn *pnt = NULL;
        // конструктор
        Cl_Btn(byte _pin, void (* _Do)()): pin(_pin), Do(_Do) {};
        // setup()
        void setup() {
          if (this->pnt != NULL) this->pnt->setup();
          pinMode(pin, INPUT);// подключить кнопку
          btn = digitalRead(pin); // прочитать реальное значение на выводе};
        }
        // loop()
        void loop() {
          if (this->pnt != NULL) this->pnt->loop();
          if (! bounce && btn != digitalRead(pin)) { // если прошел фронт изм на выводн
            bounce = 1;                              // выставить флаг
            past = millis();                         // сделать временую засветку
          }
          else if ( bounce && millis() - past >= 5 ) { // если прошло антидребезговое время
            bounce = 0;                                // то снять флаг
            btn_old = btn ;
            btn = digitalRead(pin) ;                   // прочитать реальное значение на выводе
            if (!btn_old && btn) Do();
          }
        }
    };
    //-----------------class Cl_sys---------------------------
    class Cl_sys {
        Cl_Led *Start_Led = NULL;
        Cl_Btn *Start_Btn = NULL;
      public:
        Cl_sys() {}
        void Plug(Cl_Led * obj) {
          obj->pnt = Start_Led;
          Start_Led = obj;
        }
        void Plug(Cl_Btn * obj) {
          obj->pnt = Start_Btn;
          Start_Btn = obj;
        }
        void setup() {
          Start_Led->setup();
          Start_Btn->setup();
        }
        void loop() {
          Start_Led->loop();
          Start_Btn->loop();
        }
    } Sys;
    //--------------------------------------------
    Cl_Led Led1(/*пин*/9 ,/*инверсия*/0);// подключить светодиод на ногу 9 / инверсия отключена
    Cl_Led Led2(/*пин*/10,/*инверсия*/0);// подключить светодиод на ногу 10 / инверсия отключена
    Cl_Led Led3(/*пин*/11,/*инверсия*/0);// подключить светодиод на ногу 11 / инверсия отключена
    Cl_Led Led4(/*пин*/12,/*инверсия*/0);// подключить светодиод на ногу 12 / инверсия отключена
    Cl_Led Led5(/*пин*/13,/*инверсия*/0);// подключить светодиод на ногу 13 / инверсия отключена

    const uint32_t time_1s = 1000;
    void Do_Btn1() {
      Led1.ON(time_1s);// вкл на 1 секунду
    }
    void Do_Btn2() {
      Led2.ON(time_1s);// вкл на 1 секунду
    }
    void Do_Btn3() {
      Led3.ON(time_1s);// вкл на 1 секунду
    }
    void Do_Btn4() {
      Led4.ON(time_1s);// вкл на 1 секунду
    }
    void Do_Btn5() {
      Led5.ON(time_1s);// вкл на 1 секунду
    }
    Cl_Btn Btn1(/*пин*/2,/*обработчик*/Do_Btn1);// подключить кнопку на ногу 2
    Cl_Btn Btn2(/*пин*/3,/*обработчик*/Do_Btn2);// подключить кнопку на ногу 3
    Cl_Btn Btn3(/*пин*/4,/*обработчик*/Do_Btn3);// подключить кнопку на ногу 4
    Cl_Btn Btn4(/*пин*/5,/*обработчик*/Do_Btn4);// подключить кнопку на ногу 5
    Cl_Btn Btn5(/*пин*/6,/*обработчик*/Do_Btn5);// подключить кнопку на ногу 6

    void setup() {
      Sys.Plug(&Led1);
      Sys.Plug(&Led2);
      Sys.Plug(&Led3);
      Sys.Plug(&Led4);
      Sys.Plug(&Led5);

      Sys.Plug(&Btn1);
      Sys.Plug(&Btn2);
      Sys.Plug(&Btn3);
      Sys.Plug(&Btn4);
      Sys.Plug(&Btn5);

      Sys.setup();
    }
    void loop() {
      Sys.loop();
    }
     
    Evgeny_KH нравится это.
  6. Evgeny_KH

    Evgeny_KH Нерд

    Шикарно!)))) Спасибо!!