Skip to content

Commit 7e6d8d2

Browse files
committed
add
1 parent ee79a8f commit 7e6d8d2

File tree

2 files changed

+131
-0
lines changed

2 files changed

+131
-0
lines changed
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
// мини-класс для работы с энкодером, версия 1.0
2+
3+
class encMinim
4+
{
5+
public:
6+
encMinim(uint8_t clk, uint8_t dt, uint8_t sw, boolean dir, boolean type);
7+
void tick();
8+
boolean isClick();
9+
boolean isTurn();
10+
boolean isRight();
11+
boolean isLeft();
12+
boolean isRightH();
13+
boolean isLeftH();
14+
15+
private:
16+
byte _clk, _dt, _sw;
17+
boolean _type = false;
18+
boolean _state, _lastState, _turnFlag, _swState, _swFlag, _turnState;
19+
byte _encState;
20+
uint32_t _debTimer;
21+
// 0 - ничего, 1 - лево, 2 - право, 3 - правоНажат, 4 - левоНажат
22+
};
23+
24+
encMinim::encMinim(uint8_t clk, uint8_t dt, uint8_t sw, boolean dir, boolean type) {
25+
if (dir) {
26+
_clk = clk;
27+
_dt = dt;
28+
} else {
29+
_clk = dt;
30+
_dt = clk;
31+
}
32+
_sw = sw;
33+
_type = type;
34+
pinMode (_clk, INPUT);
35+
pinMode (_dt, INPUT);
36+
pinMode (_sw, INPUT_PULLUP);
37+
_lastState = bitRead(PIND, _clk);
38+
}
39+
40+
void encMinim::tick() {
41+
_encState = 0;
42+
_state = digitalRead(_clk);
43+
_swState = digitalRead(_sw);
44+
45+
if (_state != _lastState) {
46+
_turnState = true;
47+
_turnFlag = !_turnFlag;
48+
if (_turnFlag || !_type) {
49+
if (digitalRead(_dt) != _lastState) {
50+
if (_swState) _encState = 1;
51+
else _encState = 3;
52+
} else {
53+
if (_swState) _encState = 2;
54+
else _encState = 4;
55+
}
56+
}
57+
_lastState = _state;
58+
}
59+
60+
if (!_swState && !_swFlag && millis() - _debTimer > 80) {
61+
_debTimer = millis();
62+
_swFlag = true;
63+
_turnState = false;
64+
}
65+
if (_swState && _swFlag && millis() - _debTimer > 80) {
66+
_debTimer = millis();
67+
_swFlag = false;
68+
if (!_turnState) _encState = 5;
69+
}
70+
}
71+
boolean encMinim::isTurn() {
72+
if (_encState > 0 && _encState < 5) {
73+
return true;
74+
} else return false;
75+
}
76+
boolean encMinim::isRight() {
77+
if (_encState == 1) {
78+
_encState = 0;
79+
return true;
80+
} else return false;
81+
}
82+
boolean encMinim::isLeft() {
83+
if (_encState == 2) {
84+
_encState = 0;
85+
return true;
86+
} else return false;
87+
}
88+
boolean encMinim::isRightH() {
89+
if (_encState == 3) {
90+
_encState = 0;
91+
return true;
92+
} else return false;
93+
}
94+
boolean encMinim::isLeftH() {
95+
if (_encState == 4) {
96+
_encState = 0;
97+
return true;
98+
} else return false;
99+
}
100+
boolean encMinim::isClick() {
101+
if (_encState == 5) {
102+
_encState = 0;
103+
return true;
104+
} else return false;
105+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/*
2+
Тест мини класса энкодера
3+
*/
4+
5+
// пины энкодера
6+
#define SW 0
7+
#define DT 2
8+
#define CLK 3
9+
10+
#include "encUniversalMinim.h"
11+
// пин clk, пин dt, пин sw, направление (0/1), тип (0/1)
12+
encMinim enc(CLK, DT, SW, 1, 1);
13+
14+
void setup() {
15+
Serial.begin(9600);
16+
}
17+
18+
void loop() {
19+
enc.tick();
20+
if (enc.isTurn()) Serial.println("turn");
21+
if (enc.isLeft()) Serial.println("left");
22+
if (enc.isRight()) Serial.println("right");
23+
if (enc.isLeftH()) Serial.println("leftH");
24+
if (enc.isRightH()) Serial.println("rightH");
25+
if (enc.isClick()) Serial.println("click");
26+
}

0 commit comments

Comments
 (0)