автоматика ворот

Тема в разделе "Arduino & Shields", создана пользователем Адам, 11 мар 2017.

?

Как правильно?

Голосование закрыто 11 ноя 2018.
  1. Скетч?

    100,0%
  2. Скейч?

    0 голосов
    0,0%
  3. Скретч?

    0 голосов
    0,0%
  4. Скрейтч?

    0 голосов
    0,0%
  1. parovoZZ

    parovoZZ Гуру

    купи радиокнопку, а защелку на реле любой электрик сделает. Не понимаю, зачем в такой простой задаче МК?
     
  2. Адам

    Адам Нерд

    Электрике я сам могу по шаманить ,программировании полный отстой ,у меня готовый проект на ардуино с выше указанный скетчем вот чуть изменения нужны с кнопкой пульта ,а на счёт на радиопульте с релюшками то он постоянно замкнутым бывает да на ардуино проще ,программу чуть изменить да и все

    То есть у меня воротина на ардуино работает давно ,вот кнопкой с пульта проблемы чуть чуть
     
    Последнее редактирование модератором: 3 ноя 2019
  3. parovoZZ

    parovoZZ Гуру

    Сдал недавно СКУД одному заку. Он попросил радиопульт. Купили радиопульт за там семьсот рублей что ле. У меня и в мыслях не было вкрячивать туда МК. Пара минут на монтаж - дверь открывается с пульта из любого места в офисе.
     
  4. Адам

    Адам Нерд

    Фигня это все на простом пульте с релюшками без ардуино, испытано уже давно
     
  5. b707

    b707 Гуру

    вот, держи, замени на это свою функцию readButton()
    отпишись потом заработало или нет
    Код (C++):
    void readButton()
    { static bool butt_flag =0;
      static long past = 0;
    if ((millis() - past) < 20 ) return;
    if (digitalRead(BUTTON)) // если нажата кнопка
    {
    if (butt_flag) return;
    butt_flag = true;
    past = millis();
    if (state == STOP && lastDir == CLOSE) // даем команду на открытите
    {
    // lastDir = state;
    state = OPEN;
    }
    else if (state == STOP && lastDir == OPEN) // даем команду на закрытите
    {
    // lastDir = state;
    state = CLOSE;
    }
    else if (state == OPEN || state == CLOSE) // даем команду на остановку
    {
    lastDir = state;
    state = STOP;
    }
    }
    else {
    if (!butt_flag) return;
    butt_flag = false;
    past = millis();
    }
    }
     
  6. Адам

    Адам Нерд

    прекрасно работает , как я и хотел , как же вас отблагодарить то друг??? Вы мне очень помогли!!! 9635889334 Адам Грозный , это мой номер
     
  7. b707

    b707 Гуру

    рад. что работает. Ничего не надо, там три строчки всего-то... пользуйтесь :)
     
  8. DetSimen

    DetSimen Guest

    абизательно пришли Филину пузырь, а то работать будет недолго. :)
     
    Spartalexx и Airbus нравится это.
  9. Адам

    Адам Нерд

    Для вас всего лишь три строчки а для меня тёмный лес ))))

    Нет проблем
     
    Последнее редактирование модератором: 3 ноя 2019
  10. Адам

    Адам Нерд

    Код (C++):
    #define LED_FLASH 6 // мигалка
    #define MOTOR_OPEN 8 // выход на драйвер управления мотором
    #define MOTOR_CLOSE 7 // выход на драйвер управления мотором
    #define BUTTON 4 // кнопка или сигнал с пульта
    #define SWITCH_OPENED 12 // концевик полностью открытых ворот
    #define SWITCH_CLOSED 10 // концевик полностью закрытых ворот
    #define BLINK_TIME 450 // скорость моргания мигалки
    #define DEBOUNCE 350 // задержка для антидребезга кнопки
    enum {STOP, OPEN, CLOSE}; // возможные состояния системы
    byte state; // текущее состояние системы
    byte lastDir; // предыдущее направление открытия ворот

    void checkSwitches(void);
    void ledsManager(void);
    void motor(void);
    void readButton(void);

    void setup()
    {
    pinMode(LED_FLASH, OUTPUT);
    pinMode(MOTOR_OPEN, OUTPUT);
    pinMode(MOTOR_CLOSE, OUTPUT);
    pinMode(BUTTON, INPUT);
    pinMode(SWITCH_OPENED, INPUT);
    pinMode(SWITCH_CLOSED, INPUT);
    state = STOP; // исходное состояние после включения питания
    lastDir = CLOSE;
    }

    void loop()
    {
    readButton(); // проверка кнопок
    checkSwitches(); // проверка концевиков, при коллизиях подавляет команду от кнопки
    ledsManager(); // световая индикация
    motor(); // управление двигателем
    }

    void readButton()
    { static bool butt_flag =0;
      static long past = 0;
    if ((millis() - past) < 20 ) return;
    if (digitalRead(BUTTON)) // если нажата кнопка
    {
    if (butt_flag) return;
    butt_flag = true;
    past = millis();
    if (state == STOP && lastDir == CLOSE) // даем команду на открытите
    {
    // lastDir = state;
    state = OPEN;
    }
    else if (state == STOP && lastDir == OPEN) // даем команду на закрытите
    {
    // lastDir = state;
    state = CLOSE;
    }
    else if (state == OPEN || state == CLOSE) // даем команду на остановку
    {
    lastDir = state;
    state = STOP;
    }
    }
    else {
    if (!butt_flag) return;
    butt_flag = false;
    past = millis();
    }
    }

    void checkSwitches()
    {
    if ((! digitalRead(SWITCH_OPENED)) && state == OPEN) // отмена команды Открыть при полностью открытой двери
    {
    lastDir = state;
    state = STOP;
    }
    else if ((!digitalRead(SWITCH_CLOSED)) && state == CLOSE) // отмена команды Закрыть при полностью закрытой двери
    {
    lastDir = state;
    state = STOP;
    }
    }

    void motor()
    {
    switch (state)
    {
    case STOP:
    digitalWrite(MOTOR_OPEN,HIGH );
    digitalWrite(MOTOR_CLOSE, HIGH);
    break;

    case OPEN:
    digitalWrite(MOTOR_OPEN, LOW);
    digitalWrite(MOTOR_CLOSE,HIGH );
    break;

    case CLOSE:
    digitalWrite(MOTOR_OPEN, HIGH);
    digitalWrite(MOTOR_CLOSE, LOW);
    break;
    }
    delay(DEBOUNCE); // простейший антидребезг кнопки
    }

    void ledsManager()
    {
    boolean ledState;
    static unsigned long timestamp = millis();
    if (state == STOP)
    {
    digitalWrite(LED_FLASH, LOW);
    }
    else
    {
    if (millis() - timestamp > BLINK_TIME)
    {
    ledState = LOW;
    timestamp = millis();
    }
    else ledState = HIGH;
    digitalWrite(LED_FLASH, ledState);
    }
    }
    добрый вечер дорогие мои , подскажите пожалуйста на вышеуказанном скече ,хочу добавить 5 выход на силовой трансформатор , как мне сделать при включении OPEN LOW и CLOSE LOW на пятом выходе тоже был LOW а при выключении OPEN HIGH и CLOSE HIGH и на пятом выходе был HIGH (релюшки работают на на нижнем сигнале)
     
    Последнее редактирование модератором: 3 ноя 2019
  11. Airbus

    Airbus Радиохулиган Модератор

    В начале продефинировать/обозвать как нить пин5 В сетапе pinМode назначить его как вывод тобишь OUTPUT.Дальше ничего не понял-нужен перевод на русский но вкратце дописывакте digitalWrite(5, LOW/HIGH) туда куда Вам надо.
     
  12. b707

    b707 Гуру

    неправильно. В данном случае СНАЧАЛА digitalWrite(5, HIGH), а потом уже pinMode(5,OUTPUT) - такова специфика выходов с активным LOW
     
  13. parovoZZ

    parovoZZ Гуру

    т.к. сразу после ресета все регистры сброшены, то просто переводишь пин на выход и все. Получаешь выход и низкий уровень на нем.
     
  14. Адам

    Адам Нерд

    так кто поможет мне изменением вышеуказанным мною скечем,хотел при срабатывании воротины на 5 выходе появился нижний сигнал , в прагромирование я почти полный ноль,короче суть вчем , силовой трансформатор питаюший мотор воротины работет всегда ,но я хотел из пятого пина сделать выход на релюшку чтоб трансформатор (релюшка)срабатывался только тогда когда дается комада на открытие или закрытие (open и clos ), во время стоп ворота на 5 пине чтоб был высокий сигнал , а при открытиии и закрытии на 5 пине был низкий сигнал ,подчеркиваю релюшки срабатываются на нижнем сигнале а на высоком отключаются ,как то так

    охринеть ,сколько коментов и все по напрасно
     
    Последнее редактирование модератором: 3 ноя 2019
  15. b707

    b707 Гуру

    Адам. Вы довольно невнятно пишете, что вам надо - вот наверно поэтому никто и не берется...
     
  16. qwone

    qwone Гик

    Да как браться. Если все же код надо причесывать, а потом туда добавлять что-то еще.
    ПС: Код отправляется в топку не тогда, когда он перестает работать, а когда нужна посторонняя помощь добавлять туда что-то еще.
     
    Последнее редактирование: 21 фев 2019
  17. Адам

    Адам Нерд

    добрый день мои дорогие, Вы мне очень во многом помогли для поправки скейча и безумно благодарен Вам , не могли бы помочь как в скейче установить таймер,то есть в случае не срабатывания концевиков при открытии и закрытии вотор хотелось бы для зашиты электро мотора установить таймер времени на 1 минуту,,,например воротина закрылась а концевик не сработал а двигател гудит во избежания аварии сделать зашиту с таймером 1 минуту , воротина закрывается примерно 50 секунд

    вот мой скейч

    Код (C++):
    #define LED_FLASH 6 // мигалка
    #define MOTOR_OPEN 8 // выход на драйвер управления мотором
    #define MOTOR_CLOSE 7 // выход на драйвер управления мотором
    #define BUTTON 4 // кнопка или сигнал с пульта
    #define SWITCH_OPENED 12 // концевик полностью открытых ворот
    #define TRANS 5 // трансформатор
    #define SWITCH_CLOSED 10 // концевик полностью закрытых ворот
    #define BLINK_TIME 450 // скорость моргания мигалки
    #define DEBOUNCE 350 // задержка для антидребезга кнопки
    enum {STOP, OPEN, CLOSE}; // возможные состояния системы
    byte state; // текущее состояние системы
    byte lastDir; // предыдущее направление открытия ворот

    void checkSwitches(void);
    void ledsManager(void);
    void motor(void);
    void readButton(void);

    void setup()
    {
    pinMode (TRANS, OUTPUT);
    pinMode(LED_FLASH, OUTPUT);
    pinMode(MOTOR_OPEN, OUTPUT);
    pinMode(MOTOR_CLOSE, OUTPUT);
    pinMode(BUTTON, INPUT);
    pinMode(SWITCH_OPENED, INPUT);
    pinMode(SWITCH_CLOSED, INPUT);
    state = STOP; // исходное состояние после включения питания
    lastDir = CLOSE;
    }

    void loop()
    {
    readButton(); // проверка кнопок
    checkSwitches(); // проверка концевиков, при коллизиях подавляет команду от кнопки
    ledsManager(); // световая индикация
    motor(); // управление двигателем
    }

    void readButton()
    { static bool butt_flag =0;
      static long past = 0;
    if ((millis() - past) < 20 ) return;
    if (digitalRead(BUTTON)) // если нажата кнопка
    {
    if (butt_flag) return;
    butt_flag = true;
    past = millis();
    if (state == STOP && lastDir == CLOSE) // даем команду на открытите
    {
    // lastDir = state;
    state = OPEN;
    }
    else if (state == STOP && lastDir == OPEN) // даем команду на закрытите
    {
    // lastDir = state;
    state = CLOSE;
    }
    else if (state == OPEN || state == CLOSE) // даем команду на остановку
    {
    lastDir = state;
    state = STOP;
    }
    }
    else {
    if (!butt_flag) return;
    butt_flag = false;
    past = millis();
    }
    }

    void checkSwitches()
    {
    if ((! digitalRead(SWITCH_OPENED)) && state == OPEN) // отмена команды Открыть при полностью открытой двери
    {
    lastDir = state;
    state = STOP;
    }
    else if ((!digitalRead(SWITCH_CLOSED)) && state == CLOSE) // отмена команды Закрыть при полностью закрытой двери
    {
    lastDir = state;
    state = STOP;
    }
    }

    void motor()
    {
    switch (state)
    {
    case STOP:
    digitalWrite(TRANS,HIGH );
    digitalWrite(MOTOR_OPEN,HIGH );
    digitalWrite(MOTOR_CLOSE, HIGH);
    break;

    case OPEN:
    digitalWrite(TRANS,LOW );
    digitalWrite(MOTOR_OPEN, LOW);
    digitalWrite(MOTOR_CLOSE,HIGH );
    break;

    case CLOSE:
    digitalWrite(TRANS,LOW );
    digitalWrite(MOTOR_OPEN, HIGH);
    digitalWrite(MOTOR_CLOSE, LOW);
    break;
    }
    delay(DEBOUNCE); // простейший антидребезг кнопки
    }

    void ledsManager()
    {
    boolean ledState;
    static unsigned long timestamp = millis();
    if (state == STOP)
    {
    digitalWrite(LED_FLASH, HIGH);
    }
    else
    {
    if (millis() - timestamp > BLINK_TIME)
    {
    ledState = LOW;
    timestamp = millis();
    }
    else ledState = HIGH;
    digitalWrite(LED_FLASH, ledState);
    }
    }
     

    Вложения:

    Последнее редактирование модератором: 3 ноя 2019
  18. asam

    asam Гик

    Ну можно вот так попробовать. Если код не менять особо. Хотя, по-хорошему, я бы все переделал.

    Код (C++):

    #define LED_FLASH 6 // мигалка
    #define MOTOR_OPEN 8 // выход на драйвер управления мотором
    #define MOTOR_CLOSE 7 // выход на драйвер управления мотором
    #define BUTTON 4 // кнопка или сигнал с пульта
    #define SWITCH_OPENED 12 // концевик полностью открытых ворот
    #define TRANS 5 // трансформатор
    #define SWITCH_CLOSED 10 // концевик полностью закрытых ворот
    #define BLINK_TIME 450 // скорость моргания мигалки
    #define DEBOUNCE 350 // задержка для антидребезга кнопки
    #define MOTOR_TIMEOUT (60*1000)  // Время допустимой работы мотора в миллисекундах
    enum {STOP, OPEN, CLOSE}; // возможные состояния системы
    byte state; // текущее состояние системы
    byte lastDir; // предыдущее направление открытия ворот
    unsigned long startTime = 0; //время начала  движения


    void checkSwitches(void);
    void ledsManager(void);
    void motor(void);
    void readButton(void);

    void setup()
    {
      pinMode (TRANS, OUTPUT);
      pinMode(LED_FLASH, OUTPUT);
      pinMode(MOTOR_OPEN, OUTPUT);
      pinMode(MOTOR_CLOSE, OUTPUT);
      pinMode(BUTTON, INPUT);
      pinMode(SWITCH_OPENED, INPUT);
      pinMode(SWITCH_CLOSED, INPUT);
      state = STOP; // исходное состояние после включения питания
      lastDir = CLOSE;
    }

    void loop()
    {
      readButton(); // проверка кнопок
      checkSwitches(); // проверка концевиков, при коллизиях подавляет команду от кнопки
      ledsManager(); // световая индикация
      motor(); // управление двигателем
      checkTimeout();
    }

    void checkTimeout()
    {
      if ((state == OPEN || state == CLOSE) && ( (millis() - startTime) > MOTOR_TIMEOUT))
      {
        state = STOP;
        lastDir = state; // я бы добавил состояние "заклинило"
      }

    }
    void readButton()
    { static bool butt_flag = 0;
      static long past = 0;
      if ((millis() - past) < 20 ) return;
      if (digitalRead(BUTTON)) // если нажата кнопка
      {
        if (butt_flag) return;
        butt_flag = true;
        past = millis();
        if (state == STOP && lastDir == CLOSE) // даем команду на открытите
        {
          // lastDir = state;
          state = OPEN;
          startTime = millis();
        }
        else if (state == STOP && lastDir == OPEN) // даем команду на закрытите
        {
          // lastDir = state;
          state = CLOSE;
          startTime = millis();
        }
        else if (state == OPEN || state == CLOSE) // даем команду на остановку
        {
          lastDir = state;
          state = STOP;
          startTime = 0;
        }
      }
      else {
        if (!butt_flag) return;
        butt_flag = false;
        past = millis();
      }
    }

    void checkSwitches()
    {
      if ((! digitalRead(SWITCH_OPENED)) && state == OPEN) // отмена команды Открыть при полностью открытой двери
      {
        lastDir = state;
        state = STOP;
      }
      else if ((!digitalRead(SWITCH_CLOSED)) && state == CLOSE) // отмена команды Закрыть при полностью закрытой двери
      {
        lastDir = state;
        state = STOP;
      }
    }

    void motor()
    {
      switch (state)
      {
        case STOP:
          digitalWrite(TRANS, HIGH );
          digitalWrite(MOTOR_OPEN, HIGH );
          digitalWrite(MOTOR_CLOSE, HIGH);
          break;

        case OPEN:
          digitalWrite(TRANS, LOW );
          digitalWrite(MOTOR_OPEN, LOW);
          digitalWrite(MOTOR_CLOSE, HIGH );
          break;

        case CLOSE:
          digitalWrite(TRANS, LOW );
          digitalWrite(MOTOR_OPEN, HIGH);
          digitalWrite(MOTOR_CLOSE, LOW);
          break;
      }
      delay(DEBOUNCE); // простейший антидребезг кнопки
    }

    void ledsManager()
    {
      boolean ledState;
      static unsigned long timestamp = millis();
      if (state == STOP)
      {
        digitalWrite(LED_FLASH, HIGH);
      }
      else
      {
        if (millis() - timestamp > BLINK_TIME)
        {
          ledState = LOW;
          timestamp = millis();
        }
        else ledState = HIGH;
        digitalWrite(LED_FLASH, ledState);
      }
    }

     
     
  19. Адам

    Адам Нерд

    [он у меня так работаал без отказа уже год ну вот один прекрасный день концевик не сработал и трансформатор сгорел вместе с мотором

    вот мне и нужно задать время для зашиты если вдруг опять не сработает концевик, механической части я имею понятия а вот среде програмирование полный чайник

    на счет "заклинило" не совсем понял, может подскажете в механической языке как оно будет работать ,был бы вам благлдарен очень !
     
    Последнее редактирование модератором: 5 ноя 2019
  20. parovoZZ

    parovoZZ Гуру

    где-где?
    Язык - мужского рода. Почему у прилагательного женское склонение?

    @BAR__MEN , банька готова или нет еще?