Förbättrad Arduino Rotary Encoder behandlingen (3 / 4 steg)
Steg 3: Koden
Om du inte är bekant med programmering Arduinos, vänligen komma igång med detta resurs från Arduino själva.
Denna kod är gratis för din användning (som i utan kostnad och ändras så mycket du vill), vänligen attributet dit du ska.
/ *** Avbrott-baserade Rotary Encoder skiss ***
av Simon Merrett, baserat på insikt från Oleg Mazurov, Nick Gammon, rt, Steve Spence
*/
statisk int pinA = 2; Vår första hårdvara avbryta stift är digital stift 2
statisk int pinB = 3; Vår andra hårdvara avbryta stift är digital stift 3
flyktiga byte aFlag = 0; låter veta oss när vi väntar en stigande kanten på pinA att signalera att kodaren har kommit på en spärr
flyktiga byte bFlag = 0; låter oss veta när vi väntar en stigande kanten på pinB att signalera att kodaren har kommit på en spärr (motsatt riktning till när aFlag är inställd)
flyktiga byte encoderPos = 0; Denna variabel lagrar våra nuvarande värde av kodaren position. Ändra till int eller uin16_t i stället för byte om du vill spela in ett större utbud än 0-255
flyktiga byte oldEncPos = 0; innehåller senaste encoder position så vi kan jämföra med den aktuella behandlingen och se om det har ändrats (så vi vet när du ska skriva ut till den seriella bildskärmen)
flyktiga byte läsning = 0; någonstans att lagra direkt värden vi läser från våra avbrott pins innan kontroll för att se om vi har flyttat en hel spärr
void setup() {
pinMode (pinA, INPUT_PULLUP); ställa in pinA som indata, drog hög logik spänningen (5V eller 3.3V för mest fall)
pinMode (pinB, INPUT_PULLUP); ställa in pinB som indata, drog hög logik spänningen (5V eller 3.3V för mest fall)
attachInterrupt(0,PinA,RISING); Ange ett avbrott på PinA, söker en stigande kanten signal och köra den "PinA" avbryta tjänsten rutin (nedan)
attachInterrupt(1,PinB,RISING); Ange ett avbrott på PinB, söker en stigande kanten signal och köra den "PinB" avbryta tjänsten rutin (nedan)
Serial.BEGIN(115200); Starta seriell övervaka länken
}
void PinA() {
CLI(); STOP avbryter händer innan vi läser pin värden
läsning = PIND & 0xC; Läs alla åtta pin värden sedan skala bort alla men pinA och Pinb's värden
om (läser == B00001100 & & aFlag) {//check att vi har båda stiften på spärr (hög) och att vi förväntar oss spärr på detta stift stigande kanten
encoderPos--; stegvis minskning av kodaren läge count
bFlag = 0; återställa flaggor för nästa sväng
aFlag = 0; återställa flaggor för nästa sväng
}
annars om (läser == B00000100) bFlag = 1; signalera att vi väntar pinB att signalera övergången till spärr från fri rotation
SEI(); starta om avbrott
}
void PinB() {
CLI(); STOP avbryter händer innan vi läser pin värden
läsning = PIND & 0xC; Läs alla åtta pin värden sedan skala bort alla men pinA och Pinb's värden
om (läser == B00001100 & & bFlag) {//check att vi har båda stiften på spärr (hög) och att vi förväntar oss spärr på detta stift stigande kanten
encoderPos ++; ökar värdet av kodaren läge count
bFlag = 0; återställa flaggor för nästa sväng
aFlag = 0; återställa flaggor för nästa sväng
}
annars om (läser == B00001000) aFlag = 1; signalera att vi väntar pinA att signalera övergången till spärr från fri rotation
SEI(); starta om avbrott
}
void loop() {
om (oldEncPos! = encoderPos) {
Serial.println(encoderPos);
oldEncPos = encoderPos;
}
}
Det är det!