помогите скетчем

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

  1. Адам

    Адам Нерд

    Надо значит чтобы автоматические ворота при нажатии на первую кнопку на пульте начали открываться при еще раз нажатии остановились и еще раз при нажатии начали закрываться, закрываются и открываюстя до тех пока не доедут до концевого выключателя
     
  2. Адам

    Адам Нерд

    плюс два концевика , створка только одна
     
  3. serg_admin

    serg_admin Гик

  4. Адам

    Адам Нерд

    такая не подходит
     
  5. Адам

    Адам Нерд

    #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);
    }
    }
     
  6. serg_admin

    serg_admin Гик

    А вопрос в чем?
     
  7. Адам

    Адам Нерд

    тупит этот
     
  8. serg_admin

    serg_admin Гик

    Что тупит-то.
    Задержка 150 - в принципе немного.

    Двигатель долго останавливается?
     
  9. serg_admin

    serg_admin Гик

    Подключи концевики через AttachInterrupt