Färgskiftande Larson Scanner (3 / 6 steg)
Steg 3: kod
Från bildr artikel: http://bildr.org/2012/08/rotary-encoder-arduino/
och från Adafruit's Larson Scanner https://learn.adafruit.com/larson-scanner-shades
Du behöver också Adafruit's NeoPixel biblioteket installerat https://github.com/adafruit/Adafruit_NeoPixel
#include
#define N_LEDS 60
#define stift 6
Adafruit_NeoPixel strip = Adafruit_NeoPixel (N_LEDS, stift, NEO_GRB + NEO_KHZ800);
dessa stift kan inte ändras 2/3 är speciella stift
int encoderPin1 = 2;
int encoderPin2 = 3;
flyktiga int lastEncoded = 0;
flyktiga int encoderValue = 0;
lång lastencoderValue = 0;
int lastMSB = 0;
int lastLSB = 0;
void setup() {
Strip.BEGIN();
int pos = 1, dir = 1; Position, riktning mot "öga"
Serial.BEGIN (9600); för att testa encoder
pinMode (encoderPin1, ingång);
pinMode (encoderPin2, ingång);
digitalWrite (encoderPin1, hög); Aktivera pullup motstånd
digitalWrite (encoderPin2, hög); Aktivera pullup motstånd
anropa updateEncoder() när någon hög/låg ändras sett
å avbryta 0 (pin 2) eller avbryta 1 (pin 3)
attachInterrupt (0, updateEncoder, förändring);
attachInterrupt (1, updateEncoder, förändring);
}
int pos = 1, dir = 1; Position, riktning mot "öga"
void loop() {
int count = 0;
count = (encoderValue / 4);
Serial.println(encoderValue); testning / felsökning encoder
Serial.println(Count); testning / felsökning encoder
int j;
lång colorb = 0;
lång colorg = 0;
lång colorr = 0;
int antal;
colorb = colorb + abs(encoderValue); blå
colorg = colorb + 2*abs(encoderValue); grön
colorr = colorb + 4*abs(encoderValue); röd
Uppslagsregister för färgvärden 13 uppsättningar av 3 färger
int röd [13] = {255,255,255,255,128,0,0,0,0,0,127,255,255};
int red1 [13] = {128,128,204,204,102,0,0,0,0,0,102,204,204};
int red2 [13] = {32,16,153,153,76,0,0,0,0,0,76,153,153};
int gröna [13] = {255,0,0,0,0,0,127,255,255,255,255,255,127}.
int green1 [13] = {128,0,0,0,0,0,102,64,204,128,204,204,102};
int green2 [13] = {32,0,0,0,0,0,76,32,153,16,153,153,76};
int blå [13] = {255,0,127,255,255,255,255,255,0,0,0,0,0};
int blue1 [13] = {128,0,102,204,204,128,204,32,102,0,0,0,0};
int blue2 [13] = {32,0,76,153,153,16,153,32,76,0,0,0,0};
om (colorb > 255) colorg = colorg ++;
om (colorg > 255) colorr = colorr ++;
Draw 5 pixlar centrerad på pos. setPixelColor() kommer att klippa någon
pixlar av ändarna på remsan, vi behöver inte se för det.
strip.setPixelColor(0,(red[count]),(green[count]),(blue[count])); Encoder LED (separat WS2811 chip)
strip.setPixelColor (pos - 2,(red2[count]),(green2[count]),(blue2[count])); red2 green2 blue2 från uppslagstabellen
strip.setPixelColor (pos - 1, (red1[count]),(green1[count]),(blue1[count])); red1 green1 blue1
strip.setPixelColor (pos, (red[count]),(green[count]),(blue[count])); Mittpixeln är ljusast
strip.setPixelColor (pos + 1, (red1[count]),(green1[count]),(blue1[count])); red1 green1 blue1
strip.setPixelColor (pos + 2,(red2[count]),(green2[count]),(blue2[count])); red2 green2 blue2
Strip.show();
Delay(30);
Snarare än att vara luriga och radera bara svansen pixeln,
Det är lättare att radera allt och dra en ny en nästa gång.
för (j =-2; j < = 2, j ++) strip.setPixelColor (pos + j, 0);
Studsa ändarna av strip
POS += dir;
om (pos < 2) {
POS = 3;
dir = - dir;
} else om (pos > = strip.numPixels()) {
POS = strip.numPixels() - 2.
dir = - dir;
}
}
void updateEncoder() {
int MSB = digitalRead(encoderPin1); MSB = mest signifikanta biten
int LSB = digitalRead(encoderPin2); LSB = minst signifikanta biten
int kodade = (MSB << 1) | LSB; konvertera värdet 2 stift till enstaka nummer
int summa = (lastEncoded << 2) | kodade, att lägga till tidigare kodade värde
om (summan == 0b1101 || summan == 0b0100 || summan == 0b0010 || summan == 0b1011) encoderValue ++;
om (summan == 0b1110 || summan == 0b0111 || summan == 0b0001 || summan == 0b1000) encoderValue--;
om (encoderValue > 55) encoderValue = 0; Ändrade 10-26-14
om (encoderValue < 0) encoderValue = 55.
lastEncoded = kodade, lagra detta värde till nästa gång
}