Заработало норм на Винде. Единственно что если крутить быстро - толку мало =) лучше крутить спокойно но долго =)
Завтра притащу планшет и буду его ковырять =)
скетч:
Код:
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;
int vol_up = 0;
int vol_down = 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 + 1)){ // проверяем каждые 5мс (200 Гц)
encoder_A = digitalRead(pin_A); // считываем состояние выхода А энкодера
encoder_B = digitalRead(pin_B); // считываем состояние выхода Б энкодера
if((!encoder_A) && (encoder_A_prev)){ // если состояние изменилось с положительного к нулю
if(encoder_B) {
// выход В в полож. сост., значит вращение по часовой стрелке
vol_up = 100;
}
else {
// выход В в 0 сост., значит вращение против часовой стрелки
vol_down = 100;
}
}
//if ((!encoder_A)&&(!encoder_B)){digitalWrite(9, LOW); digitalWrite(10, LOW);}
encoder_A_prev = encoder_A; // сохраняем значение А для следующего цикла
loopTime = currentTime;
if (vol_up > 0) {digitalWrite(9,HIGH); vol_up--;} else {digitalWrite(9,LOW);}
if (vol_down > 0) {digitalWrite(10,HIGH); vol_down--;} else {digitalWrite(10,LOW);}
}
if (digitalRead(button)==HIGH){
if (digitalRead(relay)==HIGH){digitalWrite(relay,LOW);delay(500);}else{digitalWrite(relay,HIGH);delay(500);}
}
}