Нужно помочь с написанием маленкого кода

andre13161
Offline
Зарегистрирован: 09.06.2017

Железо

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. Уже неделю бюся над кодом но ничего не получяется.

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Для этого есть раздел "Ищу исполнителя"

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Маленький код. Вот только не заблудитесь в нем.

/*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();
}