Всем привет! помогите разобраться с ардуино и переключателем. Нужно чтобы при включении переключателя ардуина выдавала импульс 1 сек а потом выключала порт, при повторном включении происходило то же самое. По сути одновибратор. Заранее спасибо
Да что там писать. Спойлер: код Код (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(); }
Разумеется можно проще. Но зачем. У меня есть готовый отработаный компонент кнопка и компонент светодиод. Вот я и слепил. И да я могу засунуть пяток кнопок и пяток светодиодов и все это будет работать независимо друг от друга. Вот где-то так Спойлер: код Код (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(); }
А это если кнопка на+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(); }