Найти в Дзене

немного ардуино не повредит ..

управляем шлагбаумом.
со светодиодами непонятка, в мою эпоху автоматизации ещё не было, поэтому один моргает на столбе, второй на плате
светодиод будет один, потому как исторически достовернее :)
убрал delay, позорный он..... :)
#include <Servo.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <ServoSmooth.h>
// #define AMOUNT 4 // кол-во серво
// ServoSmooth servos[AMOUNT];
#define LEDPIN1 13
#define LEDPIN2 7

int shl_speed_delay = 40;
int down_pos = 70;
int up_pos = 110;
int pos = 88;
int secs = 0;
Servo myservo1;
// servos[0].attach(9);
// servos[0].setSpeed(180);
volatile bool train_on_flag = true;  // занятие
bool shl_closed = false;

void setup()
{

 myservo1.attach(9);

  // pinMode(2, );
  pinMode(LEDPIN1, OUTPUT);
  pinMode(LEDPIN2, OUTPUT);
  // инициализация Timer1
  cli(); // отключить глобальные прерывания
  TCCR3A = 0;  // установить регистры в 0
  TCCR3B = 0;

   //OCR1A = 15624; // установка регистра совпадения
  OCR3A = 7800;
  TCCR3B |= (1 << WGM12); // включить CTC режим
  TCCR3B |= (1 << CS10); // Установить биты на коэффициент деления 1024
  TCCR3B |= (1 << CS12);

  TIMSK3 |= (1 << OCIE1A); // выключить прерывание по совпадению таймера

  pinMode(2, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(2), train_on, CHANGE);
  sei(); // включить глобальные прерывания
// Serial.begin(9600);

// init
train_on_flag = digitalRead(2);
if (train_on_flag==1) {
  shl_dn();
// myservo1.write(down_pos);
   }
  else
   {

  shl_up();
  //myservo1.write(up_pos);
}

}

void loop()
{

  if (train_on_flag==1) {

   if (shl_closed==0) {

   if (secs==6) {
   shl_dn();
   secs=0;
   }
   }

  }
  else
  {

   if (shl_closed==1) {

   shl_up();
   }

  }
} //loop

ISR(TIMER3_COMPA_vect)
{
 secs++;
if (train_on_flag==1) {

  digitalWrite(LEDPIN1, !digitalRead(LEDPIN1));
  digitalWrite(LEDPIN2, !digitalRead(LEDPIN1));
}
else {
 digitalWrite(LEDPIN2, 0);
 digitalWrite(LEDPIN1, 0);
}

}
void train_on()
{
 //train_on_flag = true;
 train_on_flag = digitalRead(2);
 secs=0;
}

void shl_up() {
//myservo1.write(100);
//servos[0].setTargetDeg(10);
// myservo1.writeMicroseconds(1500);
for (pos = down_pos; pos <= up_pos; pos++) {
//myservo1.writeMicroseconds(150);
  myservo1.write(pos); //744
//  Serial.println(pos);
  delay(shl_speed_delay);
 }
 shl_closed=0;
}

void shl_dn() {
for (pos = up_pos; pos > down_pos; pos--) {
 myservo1.write(pos); //619
 // Serial.println(pos);
  delay(shl_speed_delay);
 }
//servos[0].setTargetDeg(190);
// myservo1.write(75);
 shl_closed=1;
}
немного ардуино не повредит .. управляем шлагбаумом.
00:19
2 минуты