Привет, ребят. Пытался написать скетч, но не смог. Смысл такой, что если последней была нажата одна кнопка то зажигается 1 светодиод,если последней была нажата другая кнопка то включается 2 светодиод.Кнопки без фиксации. Просьба помочь.
Есть две кнопки 1 и 2. Я нажал 2 кнопку и пока я не нажму 1 кнопку будет выполняться команда которая приписанная к 2 кнопке.Потом когда я нажму 1 кнопку то будет выполняться программа приписанная к кнопке 1 пока не нажму 2 кнопку. И так до бесконенчости
Зачем? Первое касание - значит нажали. Нажали - вошли в состояние и в нем остаемся, пока другую кнопку не нажали. Удержание кнопки ведь это не нажатие.
Спасибо за схему, но вместо светодиодов в дальнейшем планировалось использовать другие элементы.Дело было в коде
Похоже я так и буду сувать один и тот же код , ну немного переделав, в разные ситуации. Спойлер: Код Код (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(); }
Приветствую всех чатлан! Народ нужна помощь, обращаюсь как к гуру, потому как перелопатил весь интернет, нечего толкового не нашел. Суть такая, есть джойстик от телевизора, хотелось бы прикрутить его к ардуино мега 2560, для управления менюшкой или еще каких удобств. Распиновка на платке есть, но какую библиотеку приспособить не знаю, как опрашивать что нажато и прочее. плата BN41 -0184QB распиновка IR GND 3.3 V SCL SDA KEY1 KEY2 LED