Fristående WiFi Radio Control Panel (Arduino Powered) (4 / 10 steg)
Steg 4: Gör och koden Rotary Encoder Input delsystem
Börjar på vad jag tänkt var toppen, kollade jag alla stift för kontinuitet. Eftersom det var tänkt för att vara en enkel kodare, tänkt jag (korrekt) att det inte skulle finnas två osammanhängande uppsättningar av anslutna pins för en given encoder position. Därför gjorde jag en karta som den följande, notera 0 för stift som inte har anslutit och 1 för stift som var anslutna.
Befattning: Anslutning för pins 12345)
0 - 00000
1 - 01100
2 - 10100
3 - 11100
4 - 00101
5 - 01101
6 - 10101
7 - 11101
8 - 00110
9 - 01110
Att veta att en PIN-kod måste vara gemensamma, letade jag efter den enda stift som var ansluten för alla men den "0" ståndpunkten, som råkade vara stift 3, i mitten. Jag försökte sedan att urskilja vissa mönster till andra anslutna nummer, och som ni kan se, det blev uppenbart att vänster två stiften var de två minst signifikanta bitarna, och just två stiften var de två mest signifikanta bitarna (i båda paren, de större bitarna var till vänster). Med andra ord, med stift 3 som vanligt ville jag bestämma heltalsvärdet bestående av stiften 4512.
För att läsa detta värde i, jag var tvungen att tråd dessa pins till digitala ingångar för Arduino, och sedan läsa värdena och flytta dem till en byte. Eftersom kontakterna inte alltid ändrar omedelbart till förväntade värden när du ändrar valet av kodaren, La jag några debounce kod. Följande kommer att rapportera statligt av kodaren efter att det har varit oförändrad för DEBOUNCE_TIME millisekunder (i detta fall, 10). Observera följande ledningarna, från schematiskt:
Encoder stift 2 -> ENC_BIT_0
Encoder stift 1 -> ENC_BIT_1
Encoder stift 5 -> ENC_BIT_2
Encoder stift 4 -> ENC_BIT_3
---börja---
fyra bitar som används av rotary encoder
analoga stiften kan faktiskt användas som digital IO,
bara hänvisa till tal A0-A5 så deras digitala motsvarigheter: 14-19
#define ENC_BIT_0 14
#define ENC_BIT_1 15
#define ENC_BIT_2 16
#define ENC_BIT_3 17
varaktigheten av debounce fördröjning i millisekunder
dvs, måste tid som indata-värde förbli konsekvent
innan det räknas som en ny "ingång"
#define DEBOUNCE_TIME 10
uint8_t debounceEncoder() {
statiska uint32_t timer = 0;
statisk uint8_t debounced = false;
statisk uint8_t currentValue = 0;
uint8_t bit0 =! digitalRead(ENC_BIT_0);
uint8_t bit1 =! digitalRead(ENC_BIT_1);
uint8_t bit2 =! digitalRead(ENC_BIT_2);
uint8_t bit3 =! digitalRead(ENC_BIT_3);
uint8_t newValue = 0;
newValue = (bit3 << 3) | (bit2 << 2) | (bit1 << 1) | bit0;
om (newValue! = currentValue & & debounced) {
timer = millis() + DEBOUNCE_TIME;
debounced = false;
}
om (millis() > timer & &! debounced) {
currentValue = newValue;
debounced = sant;
}
återvända currentValue;
}
// ------end------