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

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

?

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

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

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

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

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

    0 голосов
    0,0%
  1. Адам

    Адам Нерд

    #define LED_FLASH 6 // мигалка
    #define MOTOR_OPEN 8 // выход на драйвер управления мотором
    #define MOTOR_CLOSE 7 // выход на драйвер управления мотором
    #define BUTTON 11 // кнопка или сигнал с пульта
    #define SWITCH_OPENED 12 // концевик полностью открытых ворот
    #define SWITCH_CLOSED 10 // концевик полностью закрытых ворот
    #define BLINK_TIME 250 // скорость моргания мигалки
    #define DEBOUNCE 150 // задержка для антидребезга кнопки
    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()
    {
    if (digitalRead(BUTTON)) // если нажата кнопка
    {
    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;
    }
    }
    }

    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, LOW);
    digitalWrite(MOTOR_CLOSE, LOW);
    break;

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

    case CLOSE:
    digitalWrite(MOTOR_OPEN, LOW);
    digitalWrite(MOTOR_CLOSE, HIGH);
    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);
    }
    }

    тупит он сильно

    о каком отношении идёт речь?
     
    Последнее редактирование модератором: 3 ноя 2019
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    о таком, что вас как минимум дважды попросили оформлять код правильно, чтобы его можно было прочесть и помочь.
    Вы проигнорировали.
    Это не главная, но одна из причин отсутствия желающих разобраться в вашем коде.
     
  3. Адам

    Адам Нерд

    [
    у меня есть самодельный актуатор для открытия подъёмной створки и ардуино а в программировании я новичок, даже можно сказать чайник , извини если что не так.

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

    ок. все супер работает , оказывается я дурак концевиков на массу не спаял через резистор 10 К ом, вот он и тупил как я )))) спасибо тебе большое выручил меня, ты гений !!!!!!!!!!!!!!

    хорошо что есть такие хорошие люди еще на земле!!!!!!!!!!!!!!

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

    помогите

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

    #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()
    {
    if (digitalRead(BUTTON)) // если нажата кнопка
    {
    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;
    }
    }
    }

    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);
    }
    }
     

    Вложения:

    • _22222.ino
      Размер файла:
      3 КБ
      Просмотров:
      507
    • _22222.ino
      Размер файла:
      3 КБ
      Просмотров:
      358
    Последнее редактирование модератором: 3 ноя 2019
  4. NikitOS

    NikitOS Король шутов Администратор

  5. Un_ka

    Un_ka Гуру

    Почитай про прерывания , поможет.
    УН_КА добрый Ун_ка поможет.
     
    Адам нравится это.
  6. NikitOS

    NikitOS Король шутов Администратор

    УН_КА плохой, не даёт воспитывать людей.
    Из-за него нубы так и будут писать сообщения, которые невозможно прочитать

    UPD: и как ему перерывания помогут?
     
    Адам и Daniil нравится это.
  7. Адам

    Адам Нерд

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

    Защёл с долбанного планшета это окошки здесь не показывают

    Вернее редактор
     
    Последнее редактирование модератором: 3 ноя 2019
  8. NikitOS

    NikitOS Король шутов Администратор

    Да поможем мы, только правильно сообщение отредактируйте.
    Код не читаемый... А такое и читать не хочется
     
  9. Адам

    Адам Нерд

    Доброе утро мой друг ,вы имеете виду код это скейч не правильно закинут ?

    Код (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()
    {
    if (digitalRead(BUTTON)) // если нажата кнопка
    {
    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;
    }
    }
    }

    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);
    }
    }
    вот мой скейч , концевики работают на примыкание , то есть концевики подают сигнал и воротина останавливается а мне нужно чтоб воротина остановилась при отсутствии сигнала ,то есть пока идет сигнал с концевика мотор работает , концевик прерывается останавливается воротина , как то так помогите чайнику добрые люди

    скейч мой рабочий , концевики хотелось бы что работали наоборот

    УН_КА добрый УН_КА не хочет помочь бедному чайнику)))))
     
    Последнее редактирование модератором: 3 ноя 2019
  10. b707

    b707 Гуру

    поменяй два знака в функции checkSwitches()
    Код (C++):
    void checkSwitches()
    {
    if ((! digitalRead(SWITCH_OPENED)) && state == OPEN) // отмена команды Открыть при полностью открытой двери
    {
    lastDir = state;
    state = STOP;
    }
    else if ((!digitalRead(SWITCH_CLOSED)) && state == CLOSE) // отмена команды Закрыть при полностью закрытой двери
    {
    lastDir = state;
    state = STOP;
    }
    }
     
    Адам нравится это.
  11. Адам

    Адам Нерд

    Какие знаки поменять и какие туда поставить не поможешь?
     
  12. b707

    b707 Гуру

    я уже все что надо поменял. просто вставь эту функцию в свой код вместо checkSwitches()
     
  13. qwone

    qwone Гик

    enum {STOP, OPEN, CLOSE}; // возможные состояния системы
    Вот только состояний системы ПЯТЬ. - стоим/ открываем двери/ открыты двери/ закрываем двери/ закрыты двери.
     
  14. Адам

    Адам Нерд

    У меня скейч работает 1) нажал кнопку открываются ворота 2 ) нажал стоп ворота 3) нажал закрываются ворота 4 ) стоп,,, далее по кругу , а во время закрытия и открытия ворот мотор работает пока концевики не подадут сигнал на стоп , то есть двигатель работает пока нет сигнала концевиках а мне надо что б мотор работал пока есть сигнал на концевиках, а при отсутствии сигнала с концевиков стоп мотор тоесть Воронина закрыта или открыта
     
  15. b707

    b707 Гуру

    Адам - вы мой код-то проверили? Он вас не устраивает?
     
  16. Адам

    Адам Нерд

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

    состояние только три а открытые и закрытые ворота это и есть стоп , как то так, но этом мне уже помогли добрые люди ))
     
    Последнее редактирование модератором: 3 ноя 2019
  17. b707

    b707 Гуру

    завтра гляну, сегодня поздно уже
     
  18. Адам

    Адам Нерд

    Буду ждать мой друг!!!
     
  19. Un_ka

    Un_ka Гуру

    Посмотрел код . Если концевики надёжные и не подведут то можно менять приведущее направление лишь после замыкания их .

    Почему у тебя антидребезг в функции мотора?

    Тогда нужно delay менять на конструкцию с миллис и if.
    А насчёт кнопки , то можно не опрашивать её до замыкания или размыва законцовок.
     
    Последнее редактирование модератором: 3 ноя 2019
  20. Адам

    Адам Нерд

    Концевики щас работают нормально ,вот нажимаешь на пульт на открытие или закрытие Воротины , то перебрасывается сигнал то на закрытие то на открытие воротины если не отпустишь кнопку пульта нужное время

    не знаю как изменить я чайник
     
    Последнее редактирование модератором: 3 ноя 2019