Setzt man die Verkabelung der vorherigen Kapitel zusammen, erhält man diesen Gesamtaufbau.
Dieses Breakout ist ein sehr schönes Übungsfeld für alle Aspekte der GPIO Pins.
Mit dem Code weiter unten startet das Programm damit, eine Hälfte der LEDs zu erleuchten. Wird der Encoder gedreht, folgt die LED dieser Drehung. Im Hintergrund werden die Farben des Schaftes durchgestimmt um zu zeigen, dass die Interrupt Routinen funktionieren. Drückt man die Taste, werden alle LEDs eingeschaltet bis der Encoder wieder gedreht wird.
Viel Spaß!
#include
#include
int spin = nP[RIGHT][3];
volatile int encoderPin1 = nP[RIGHT][4]; // pin connected to INT-1 by default
volatile int encoderPin2 = nP[RIGHT][5];
volatile int number = 0;
volatile boolean swPressed = false;
// used in loop and both interrupt routines
int oldnumber = number;
int rpin = nP[RIGHT][2];
int gpin = nP[RIGHT][1];
int bpin = nP[RIGHT][0];
int rval;
int gval;
int bval;
int enPin = nP[LEFT][3]; // Shift registers' Output Enable pin
int latchPin = nP[LEFT][4]; // Shift registers' rclk pin
int clkPin = nP[LEFT][5]; // Shift registers' srclk pin
int clrPin = nP[LEFT][6]; // shift registers' srclr pin
int datPin = nP[LEFT][7]; // shift registers' SER pin
void setup(){
Serial.begin(9600);
pinMode(rpin, OUTPUT);
pinMode(gpin, OUTPUT);
pinMode(bpin, OUTPUT);
pinMode(enPin, OUTPUT);
pinMode(latchPin, OUTPUT);
pinMode(clkPin, OUTPUT);
pinMode(clrPin, OUTPUT);
pinMode(datPin, OUTPUT);
digitalWrite(enPin, LOW);
digitalWrite(latchPin, LOW);
digitalWrite(clkPin, LOW);
digitalWrite(clrPin, HIGH);
digitalWrite(datPin, LOW);
pinMode(encoderPin1, INPUT);
digitalWrite(encoderPin1, HIGH);
pinMode(encoderPin2, INPUT);
digitalWrite(encoderPin2, HIGH);
attachInterrupt(1, isr_A, FALLING);
attachInterrupt(3, isr_SW, RISING);
Serial.println("Starting Encoder");
shiftOut16(0x00FF);
}
void loop(){
int val;
for (int i=0; i<256; i++){
Wheel(i);
SoftPWMServoPWMWrite(rpin, rval);
SoftPWMServoPWMWrite(gpin, gval);
SoftPWMServoPWMWrite(bpin, bval);
delay(30);
if (oldnumber != number){
Serial.print(number);
oldnumber = number;
LedSingle((uint16_t)number);
Serial.println();
}
if (swPressed) {
shiftOut16(0xFFFF);
swPressed = false;
}
}
}
void isr_A(){
delay(3); // Debounce time
// Trade off bounce vs missed counts
int LSB = digitalRead(encoderPin1);
int MSB = digitalRead(encoderPin2);
if(LSB == LOW){ // A still LOW ?
if(MSB == HIGH) number++;
if(MSB == LOW) number--;
}
}
void isr_SW(){ // SW went LOW
swPressed = true;
}
void Wheel(byte WheelPos) {
if(WheelPos < 85) {
rval = WheelPos * 3;
gval = 255 - WheelPos * 3;
bval = 0;
}
else if(WheelPos < 170) {
WheelPos -= 85;
rval = 255 - WheelPos * 3;
gval = 0;
bval = WheelPos * 3;
}
else {
WheelPos -= 170;
rval = 0;
gval = WheelPos * 3;
bval = 255 - WheelPos * 3;
}
}
void LedSingle(int pos) {
int lpos;
uint16_t lout;
lpos = pos % 16;
lout = 1 << lpos;
Serial.print(" ");
Serial.print(lpos);
Serial.print(" ");
Serial.print(lout);
shiftOut16(lout);
}
void shiftOut16(uint16_t data)
{
byte datamsb;
byte datalsb;
datamsb = (data&0xFF00)>>8; // mask out the MSB and shift it right 8 bits
datalsb = data & 0xFF; // Mask out the LSB
Serial.print(" ");
Serial.print(datamsb,DEC);
Serial.print(" ");
Serial.print(datalsb,DEC);
digitalWrite(latchPin, LOW); // first send latch low
shiftOut(datPin, clkPin, MSBFIRST, datamsb);
shiftOut(datPin, clkPin, MSBFIRST, datalsb);
digitalWrite(latchPin, HIGH); // send latch high to indicate data is done sending
}
⇒HelvePic32