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