#include <Servo.h>

class Sweeper
{
 Servo servo; // объект servo
 int pos; // текущее положение сервопривода
 int increment; // определяем увеличение перемещения на каждом интервале
 int updateInterval; // определяем время между обновлениями
 unsigned long lastUpdate; // определяем последнее обновление положения
 
 public: 
 Sweeper(int interval)
 {
  updateInterval = interval;
  increment = 1;
 }
 void Attach(int pin)
 {
  servo.attach(pin);
 }
 void Detach()
 {
  servo.detach();
 }
 void reset() 
 { 
  pos = 0;
  servo.write(pos);
  increment = abs(increment);
 }
 
 void Update(unsigned long currentMillis)
 {
  if((currentMillis - lastUpdate) > updateInterval) //время обновиться
  {
   lastUpdate = millis();
   pos += increment;
   servo.write(pos);
   if ((pos >= 180) || (pos <= 0)) // инициализируем конец вращения
   {
    increment = -increment; // инициализируем обратное направление
   }
  }
 }
};
 
Sweeper sweeper1(25);
 
void setup() 
{ 
 sweeper1.Attach(9);
 
 // Timer0 уже используется millis() - прерываемся примерно посередине и вызываем ниже функцию "Compare A"
 OCR0A = 0xAF;
 TIMSK0 |= _BV(OCIE0A);
 
 pinMode(2, INPUT_PULLUP);
 attachInterrupt(0, Reset, FALLING);
}
 
void Reset()
{
 sweeper1.reset();
}
 
// Прерывание вызывается один раз в миллисекунду, ищет любые новые данные, и если нашло, сохраняет их
SIGNAL(TIMER0_COMPA_vect) 
{
 unsigned long currentMillis = millis();
 sweeper1.Update(currentMillis);
}
 
void loop()
{
}