скетч работы энкодера взят
отсюда и немного изменён =) Добавлено включение реле с пина номер 3.
Код:
unsigned long currentTime;
unsigned long loopTime;
const int pin_A = 0; // pin 0
const int pin_B = 1; // pin 1
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;
const int button = 3; //пин кнопки вкл/выкл
const int relay = 13; //пин управления реле
void setup() {
// declare pin 9 to be an output:
pinMode(9, OUTPUT); // устанавливаем pin 9 как выход +
pinMode(10, OUTPUT); // устанавливаем pin 10 как выход -
pinMode(pin_A, INPUT);
pinMode(pin_B, INPUT);
currentTime = millis();
loopTime = currentTime;
pinMode(relay, OUTPUT);
pinMode(button, INPUT);
}
void loop() {
currentTime = millis();
if(currentTime >= (loopTime + 5)){ // проверяем каждые 5мс (200 Гц)
encoder_A = digitalRead(pin_A); // считываем состояние выхода А энкодера
encoder_B = digitalRead(pin_B); // считываем состояние выхода Б энкодера
if((!encoder_A) && (encoder_A_prev)){ // если состояние изменилось с положительного к нулю
if(encoder_B) {
// выход В в полож. сост., значит вращение по часовой стрелке
digitalWrite(9, HIGH);
delay(300);
digitalWrite(9, LOW);
}
else {
// выход В в 0 сост., значит вращение против часовой стрелки
digitalWrite(10, HIGH);
delay(300);
digitalWrite(10, LOW);
}
}
encoder_A_prev = encoder_A; // сохраняем значение А для следующего цикла
loopTime = currentTime;
}
if (digitalRead(button)==HIGH){
if (digitalRead(relay)==HIGH){digitalWrite(relay,LOW);delay(500);}else{digitalWrite(relay,HIGH);delay(500);}
}
}