#include "RotaryEncoder.h" // библиотека для энкодера
#include <Servo.h> // библиотека для сервопривода
RotaryEncoder encoder(3, 2); // пины подключение энкодера (DT, CLK)
Servo servo;
// задаем шаг энкодера, макс./мин. значение поворота
#define STEPS 10
#define POSMIN 0
#define POSMAX 180
#define E_SW 11
#define SW 12
#define VD_E_SW 7
#define VD_SW 8
static int pos = 0; // задаем начальное положение энкодера
int lastPos, newPos;
bool Status_ESW = 0, Status_SW = 0;
void setup() {
pinMode(E_SW, INPUT_PULLUP); pinMode(SW, INPUT_PULLUP);
pinMode(VD_E_SW, OUTPUT); pinMode(VD_SW, OUTPUT);
// выключаем свтодиоды
digitalWrite(VD_E_SW, 1); digitalWrite(VD_SW, 1);
// инициализируем сервопривод
servo.attach(3); // пин для подключения серво
Serial.begin(9600);
Serial.print("Начальная позиция: "); Serial.println(pos);
//encoder.setPosition(10 / STEPS);
encoder.setPosition(0);
}
void loop() {
// проверяем положение ручки энкодера
encoder.tick();
newPos = encoder.getPosition() * STEPS;
if (newPos < POSMIN) {
encoder.setPosition(POSMIN / STEPS);
newPos = POSMIN;
}
else if (newPos > POSMAX) {
encoder.setPosition(POSMAX / STEPS);
newPos = POSMAX;
}
// если положение изменилось - выводим на монитор
if (lastPos != newPos) {
Serial.print("Текущая позиция: "); Serial.println(newPos);
lastPos = newPos;
}
// устанавливаем угол поворота микросерво
servo.write(lastPos);
// проверяем кнопки
if (digitalRead(E_SW) == 0 && Status_ESW == 0) {
Status_ESW = 1;
digitalWrite(VD_E_SW, 0);
Serial.println("Нажата кнопка энкодера");
tone(2,800,500);
delay(500);
}
if (digitalRead(E_SW) == 1 && Status_ESW == 1) {
Status_ESW = 0;
digitalWrite(VD_E_SW, 1);
Serial.println("Отпущена кнопка энкодера");
}
if (digitalRead(SW) == 0 && Status_SW == 0) {
Status_SW = 1;
digitalWrite(VD_SW, 0);
Serial.println("Нажата дополнительная кнопка");
tone(2,800,500);
delay(500);
}
if (digitalRead(SW) == 1 && Status_SW == 1) {
Status_SW = 0;
digitalWrite(VD_SW, 1);
delay(100);
Serial.println("Отпущена дополнительная кнопка");
}
}