Таймер для управления двигателем с помощью концевого выключателя

Я не силен в arduino, но у меня есть проект, который управляет двигателем с помощью концевого выключателя.

Правило таково:

  1. При выключении двигатель ВКЛЮЧАЕТСЯ

  2. При включении выключите двигатель на 1 час (я не хочу использовать задержку, потому что не могу выполнять многозадачность, поэтому будет остановлена другая программа, которая должна работать в то же время)

  3. Через 1 час двигатель ВКЛЮЧЕН (хотя состояние переключателя все еще включено)

Какой тип таймера я должен использовать? А как же код? Спасибо. Извините, если у меня нет никаких кодов.

, 👍-1

Обсуждение

Вы можете сделать задержку на 1 час с помощью millis() (хотя это не 100% точно). Если время сейчас, за вычетом времени, когда был нажат выключатель, составляет более одного часа, то включите двигатель., @Majenko


1 ответ


0

Для этого нет необходимости делать такие сложные вещи, как использование дополнительных таймеров. Вы можете использовать неблокирующий код с функцией millis (), как в примере BlinkWithoutDelay в среде IDE Arduino (вы действительно должны попробовать и понять, как это работает). Функция millis() возвращает количество миллисекунд с момента включения Arduino, и она переполнится примерно через 50 дней (и с кодом из упомянутого примера это тоже не будет проблемой).

В основном вы сохраняете метку времени последнего события и проверяете, не пора ли что-то сделать. В вашем случае я бы добавил логическое значение, указывающее, что двигатель должен быть выключен и что состояние переключателя больше не имеет значения. Затем (я предполагаю, что вы хотите снова отключить двигатель, переключившись в положение "ВЫКЛ." и снова " ВКЛ.") вам придется сбросить эту переменную, когда переключатель снова перейдет в состояние " ВЫКЛ.". Что-то вроде этого:

boolean state=true; // on by default
unsigned long timestamp=0;

void loop(){
  if(switch_on() && state){
    state=false;
    // switch off the motor here
    timestamp = millis();
  }
  if(switch_off()){
    state=true;
  }
  if(!state && millis()-timestamp > INTERVAL){
    //switch on the motor here
  }
}

Убедитесь, что у вас есть хороший код для проверки состояния переключателя, так как большинству механических кнопок требуется код отмены. В приведенном выше коде я заменил это простыми функциями, чтобы проиллюстрировать функциональность синхронизации.

,

вам нужно только отключить выключатель, когда двигатель запустится, @jsotola