#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()
{
}