Нужно помочь с написанием маленкого кода
- Войдите на сайт для отправки комментариев
Железо
Arduino ProMini
Блок на реле
Кнопка без фиксации
Схема подключения
Pin2 - reley1
Pin3 - reley2
Pin9 - button
Как должно работать:
Положения кнопки Или зажата или нет (тут понятно) но при включении всей системи кнопка находится в состоянии LOW, потом при нажатии кнопки и удерживании (в состоянии HIGH может находится от 1сек. до 12 чясов (60*60*12=43200сек.) ну сколько времени зажата кнопка мне считать ненужно, только проверять что она зажата как минимум на 1 секунду. При достижении времени зажатия в 1 секунду включить reley1 на 2 сек. и потом отключить. Дальше ждать когда разомкнётся контак и будет разомкнут 3сек. тогда отключть reley1 и включить reley2 на 2сек. Дальше жнать опять нажатия кнопки...
Я понимаю может для когото всё просто, я только учуся)). Всегда получяетс одно - реле просто клацают так как задал все интервали через delay. Уже неделю бюся над кодом но ничего не получяется.
Для этого есть раздел "Ищу исполнителя"
Маленький код. Вот только не заблудитесь в нем.
/*to_andre13161.ino реле 1-->2 реле 2-->3 кнопка -->9 */ 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; // конструктора Cl_Led(Cl_Sys *Sys, byte _pin, bool _inv); void setup() { pinMode(pin, OUTPUT);// подключить светодиод led = 0; digitalWrite(pin, led ^ inv) ; // погасить светодиод } // setup() 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_Btn----------------- class Cl_Btn { byte pin; // номер ноги на кнопке void (* Do1)(), (* Do2)(); // указатель на обработчики нажатия и отжатия uint32_t time_dw , time_up; bool stat_dw = 0, stat_up = 0; bool btn, btn_old; bool bounce = 0; // антидребезговый флаг uint32_t past = 0, past1 = 0 ; public: // указатель на следующий элемент Cl_Btn *pnt = NULL; // конструктора Cl_Btn() {} Cl_Btn(Cl_Sys *Sys, byte _pin, uint32_t _time_dw, void (* _Do1)(), uint32_t _time_up, void (* _Do2)()); void setup() { pinMode(pin, INPUT_PULLUP);// подключить кнопку 1 с подтяжкой btn = digitalRead(pin); // прочитать реальное значение на выводе}; } // setup() 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) { stat_dw = 1; stat_up = 0; past1 = millis(); } if (!btn_old && btn) { stat_dw = 0; stat_up = 1; past1 = millis(); } } if (stat_dw && millis() - past1 >= time_dw) { stat_dw = 0; Do1(); } if (stat_up && millis() - past1 >= time_up) { stat_up = 0; Do2(); } } }; //-----Cl_Sys----------------- class Cl_Sys { public: Cl_Led *Startl_Led = NULL; Cl_Btn *Start_Btn = NULL; Cl_Sys() {} // setup() void setup() { for (Cl_Led *i = Startl_Led; i != NULL; i = i->pnt) i->setup(); for (Cl_Btn *i = Start_Btn; i != NULL; i = i->pnt) i->setup(); } void loop() { for (Cl_Btn *i = Start_Btn; i != NULL; i = i->pnt) i->loop(); for (Cl_Led *i = Startl_Led; i != NULL; i = i->pnt) i->loop(); } } Sys; //---------описание классов------------ Cl_Led::Cl_Led(Cl_Sys *Sys, byte _pin, bool _inv): pin(_pin), inv(_inv) { pnt = Sys->Startl_Led; Sys->Startl_Led = this; } Cl_Btn::Cl_Btn(Cl_Sys *Sys, byte _pin, uint32_t _time_dw, void (* _Do1)(), uint32_t _time_up, void (* _Do2)()): pin(_pin), time_dw( _time_dw), Do1(_Do1), time_up( _time_up), Do2(_Do2) { pnt = Sys->Start_Btn; Sys->Start_Btn = this; } //----------Компоновка--------------------- Cl_Led *Led1 = new Cl_Led(&Sys,/*пин*/2,/*инверсия*/1); // создать Led_1 Cl_Led *Led2 = new Cl_Led(&Sys,/*пин*/3,/*инверсия*/1); // создать Led_2 const uint32_t time_1s = 1000; //время 1 сек const uint32_t time_2s = 2000; //время 2 сек const uint32_t time_3s = 3000; //время 3 сек void Do1_Btn1() { Led2->OFF(); Led1->ON(time_2s); } void Do2_Btn1() { Led1->OFF(); Led2->ON(time_2s); } Cl_Btn *Btn_1 = new Cl_Btn(&Sys,/*пин*/9,/*задержка при нажатии*/time_1s,/*обработчик нажатия*/Do1_Btn1,/*задержка при отжатии*/time_3s,/*обработчик отжатия*/Do2_Btn1); // создать кнопку Btn_1 //-----------Main()----------------------- void setup() { Sys.setup(); } void loop() { Sys.loop(); }