#include <Servo.h>
//! ЗАДАНИЕ (1) + ЗАДАНИЕ (2).
const uint8_t led1Pin = 13; //!< Пин первого светодиода.
const uint8_t led2Pin = 12; //!< Пин второго светодиода.
const unsigned long intervalLedOn1 = 250; //!< Период включенного первого светодиода, миллисекунды.
const unsigned long intervalLedOff1 = 1000; //!< Период выключенного первого светодиода, миллисекунды.
const unsigned long intervalLedOn2 = 250; //!< Период включенного второго светодиода, миллисекунды.
const unsigned long intervalLedOff2 = 1500; //!< Период выключенного второго светодиода, миллисекунды.
unsigned long previousMillisLed1 = 0; //!< Начало периода для первого светодиода, миллисекунды.
unsigned long previousMillisLed2 = 0; //!< Начало периода для второго светодиода, миллисекунды.
//! ЗАДАНИЕ (3).
const int potPin = A0; //!< Пин потенциометра.
const int led3Pin = 11; //!< Пин третьего светодиода.
const int servoPin = 10; //!< Пин сервомотора.
const unsigned long intervalControl = 50; //!< Период проверки потенциометра, миллисекунды.
unsigned long previousMillisControl = 0; //!< Начало периода для проверки потенциометра, миллисекунды.
//! Сервомотор.
Servo servo;
void setup() {
pinMode(led1Pin, OUTPUT);
pinMode(led2Pin, OUTPUT);
digitalWrite(led1Pin, LOW);
digitalWrite(led2Pin, LOW);
pinMode(led3Pin, OUTPUT);
servo.attach(servoPin);
}
void loop() {
const unsigned long currentMillis = millis();
stopwatchForLeds(currentMillis, led1Pin, intervalLedOn1, intervalLedOff1, previousMillisLed1);
stopwatchForLeds(currentMillis, led2Pin, intervalLedOn2, intervalLedOff2, previousMillisLed2);
stopwatchForPot(currentMillis);
}
//! Таймер для светодиодов (ЗАДАНИЕ (1) + ЗАДАНИЕ (2)).
void stopwatchForLeds(const unsigned long currentMillis, const uint8_t pin, const unsigned long intervalLedOn, const unsigned long intervalLedOff, unsigned long &previousMillisLed) {
const unsigned long intervalLed = digitalRead(pin) ? intervalLedOn : intervalLedOff;
if (currentMillis - previousMillisLed >= intervalLed) {
previousMillisLed = currentMillis;
digitalWrite(pin, !digitalRead(pin));
}
}
//! Таймер для потенциометра (ЗАДАНИЕ (3)).
void stopwatchForPot(const unsigned long currentMillis) {
if (currentMillis - previousMillisControl >= intervalControl) {
previousMillisControl = currentMillis;
const int potValue = analogRead(potPin);
analogWrite(led3Pin, map(potValue, 0, 1023, 0, 255));
servo.write(map(potValue, 0, 1023, 0, 180));
}
}