Кнопки и Arduino

Тема в разделе "Arduino & Shields", создана пользователем Уыфгдщм, 29 июн 2017.

  1. Уыфгдщм

    Уыфгдщм Нерд

    Привет, ребят. Пытался написать скетч, но не смог. Смысл такой, что если последней была нажата одна кнопка то зажигается 1 светодиод,если последней была нажата другая кнопка то включается 2 светодиод.Кнопки без фиксации.
    Просьба помочь.
     
  2. NikitOS

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

    Вам код написать?
     
  3. NikitOS

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

    Если да то часа часа через 4 в личку скину
     
  4. DetSimen

    DetSimen Guest

    меняю код на деньги.
     
  5. mcureenab

    mcureenab Гуру

    Что значит "последней"? Элемент в очереди остается крайним пока нет следующего элемента.
     
  6. NikitOS

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

    Да.... Вот что значит маленькая пенсия...
     
    Уыфгдщм нравится это.
  7. DetSimen

    DetSimen Guest

    я просто пытаюсь до нее дажыть.
     
    Толик Иванов нравится это.
  8. Уыфгдщм

    Уыфгдщм Нерд

    ))
     
  9. Уыфгдщм

    Уыфгдщм Нерд

    Есть две кнопки 1 и 2. Я нажал 2 кнопку и пока я не нажму 1 кнопку будет выполняться команда которая приписанная к 2 кнопке.Потом когда я нажму 1 кнопку то будет выполняться программа приписанная к кнопке 1 пока не нажму 2 кнопку. И так до бесконенчости
     
  10. Уыфгдщм

    Уыфгдщм Нерд

    Хотелось бы
     
  11. mcureenab

    mcureenab Гуру

    Кнопки на GND замыкают? Пины уже определены?
     
  12. vvr

    vvr Инженерище

    да ещё нужно знать что происходит при начале работы дуни, какая программа работает или обе молчат)))
     
    Уыфгдщм нравится это.
  13. Уыфгдщм

    Уыфгдщм Нерд

    Да
     
  14. Уыфгдщм

    Уыфгдщм Нерд

    Спасибо за подсказку. Сейчас добавлю в код вывод на монитор порта
     
  15. vvr

    vvr Инженерище

    для кнопок ещё желательно защиту от дребезга добавить
     
  16. mcureenab

    mcureenab Гуру

    Зачем? Первое касание - значит нажали. Нажали - вошли в состояние и в нем остаемся, пока другую кнопку не нажали. Удержание кнопки ведь это не нажатие.
     
    arkadyf нравится это.
  17. ANV

    ANV Гуру

    Ардуины, скетчи... Это называется RS триггер:

    [​IMG]
     
    SHTIRLIZnid и ИгорьК нравится это.
  18. Уыфгдщм

    Уыфгдщм Нерд

    Спасибо за схему, но вместо светодиодов в дальнейшем планировалось использовать другие элементы.Дело было в коде
     
  19. qwone

    qwone Гик

    Похоже я так и буду сувать один и тот же код , ну немного переделав, в разные ситуации.
    Код (C++):
    //
    class Cl_Sys;// предварительно объявить о создании класса Sys для послед подключения к нему
    //----------------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_LED;
        //конструктор
        Cl_LED(Cl_Sys *Sys, byte _pin, bool _inv);
        // setup()
        void setup() {
          pinMode(pin, OUTPUT);// подключить светодиод
          led = 0;
          digitalWrite(pin, led ^ inv) ; // погасить светодиод
        }
        // loop()
        void 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) ; // погасить светодиод
        }
    };
    //----------------Cl_Mech_BTN------------------------------------------------------------
    // класс на механич кнопку подкл к кнопке Ардуины.
    class Cl_Mech_BTN {
        byte pin; // номер ноги на кнопке
        void (* Do)();// указатель на обработчик
        bool btn, btn_old;
        bool bounce = 0; // антидребезговый флаг
        uint32_t past = 0 ;
      public:
        //указатель на следующий компонент
        Cl_Mech_BTN *pnt_Mech_BTN;
        //конструктор
        Cl_Mech_BTN(Cl_Sys *Sys, byte _pin, void (* _Do)());
        void setup() {
          pinMode(pin, INPUT_PULLUP);// подключить кнопку 1 с подтяжкой
          btn = digitalRead(pin); // прочитать реальное значение на выводе};
        }
        void 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();
          }
        }
    };
    //----------------Cl_Sys------------------------------------------------------------
    class Cl_Sys {
      public:
        // указатели на блоки однотипных классов в системе
        Cl_LED * Start_LED = NULL;
        Cl_Mech_BTN * Start_Mech_BTN = NULL;
        void setup() {
          for (Cl_LED *i = Start_LED; i != NULL; i = i->pnt_LED) i->setup();
          for (Cl_Mech_BTN *i = Start_Mech_BTN; i != NULL; i = i->pnt_Mech_BTN) i->setup();
        }
        void loop () {
          for (Cl_LED *i = Start_LED; i != NULL; i = i->pnt_LED) i->loop ();
          for (Cl_Mech_BTN *i = Start_Mech_BTN; i != NULL; i = i->pnt_Mech_BTN)  i->loop ();
        }
    };
    //-----------------конструкторы классов вход в систему-------------------------------
    Cl_LED::Cl_LED(Cl_Sys *Sys, byte _pin, bool _inv): pin(_pin), inv(_inv) {
      pnt_LED = Sys->Start_LED;
      Sys->Start_LED = this;
    }
    Cl_Mech_BTN::Cl_Mech_BTN(Cl_Sys *Sys, byte _pin, void (* _Do)()): pin(_pin), Do(_Do) {
      pnt_Mech_BTN = Sys->Start_Mech_BTN;
      Sys->Start_Mech_BTN = this;
    }
    //------------------компоновка-------------------------------------------------------
    Cl_Sys *Sys = new Cl_Sys();
    Cl_LED *LED1 = new Cl_LED(Sys,/*пин*/10,/*инверсия*/0);// создать светодиод LED1
    Cl_LED *LED2 = new Cl_LED(Sys,/*пин*/11,/*инверсия*/0);// создать светодиод LED2
    void Do_BTN1() {
      LED1->ON();
      LED2->OFF();
    }
    void Do_BTN2() {
      LED1->OFF();
      LED2->ON();
    }
    Cl_Mech_BTN *BTN1 = new Cl_Mech_BTN(Sys,/*пин*/2,/*обработчик*/Do_BTN1);// создать кнопку BTN1
    Cl_Mech_BTN *BTN2 = new Cl_Mech_BTN(Sys,/*пин*/3,/*обработчик*/Do_BTN2);// создать кнопку BTN2
    //------------------ main()----------------------------------------------------------
    void setup() {
      Sys->setup();
    }

    void loop() {
      Sys->loop();
    }
     
    SHTIRLIZnid и Уыфгдщм нравится это.
  20. wadass

    wadass Нуб

    Приветствую всех чатлан!
    Народ нужна помощь, обращаюсь как к гуру, потому как перелопатил весь интернет, нечего толкового не нашел.
    Суть такая, есть джойстик от телевизора, хотелось бы прикрутить его к ардуино мега 2560, для управления менюшкой или еще каких удобств.
    Распиновка на платке есть, но какую библиотеку приспособить не знаю, как опрашивать что нажато и прочее.

    плата BN41 -0184QB
    распиновка
    IR
    GND
    3.3 V
    SCL
    SDA
    KEY1
    KEY2
    LED
     

    Вложения: