/* RGB LED - Langzaam vloeiende regenboog kleurenwisseling Terry van Erp September 2015 */ // Output pins voor PWM #define R_PIN 4 // Rode LED #define G_PIN 5 // Groene LED #define B_PIN 6 // Blauwe LED #define MIN_RGB_VALUE 10 // niet kleiner dan 0. #define MAX_RGB_VALUE 255 // niet groter dan 255. #define TRANSITION_DELAY 70 #define WAIT_DELAY 500 typedef struct { byte x, y, z; } coord; static coord v; const coord vertex[] = { //x y z name {0, 0, 0}, // A or 0 {0, 1, 0}, // B or 1 {0, 1, 1}, // C or 2 {0, 0, 1}, // D or 3 {1, 0, 0}, // E or 4 {1, 1, 0}, // F or 5 {1, 1, 1}, // G or 6 {1, 0, 1} // H or 7 }; const byte path[] = { 0x01, 0x23, 0x76, 0x54, 0x03, 0x21, 0x56, 0x74, 0x13, 0x64, 0x16, 0x02, 0x75, 0x24, 0x35, 0x17, 0x25, 0x70, }; #define MAX_PATH_SIZE (sizeof(path)/sizeof(path[0])) void setup() { pinMode(R_PIN, OUTPUT); pinMode(G_PIN, OUTPUT); pinMode(B_PIN, OUTPUT); } void traverse(int dx, int dy, int dz) { if ((dx == 0) && (dy == 0) && (dz == 0)) return; for (int i = 0; i < MAX_RGB_VALUE-MIN_RGB_VALUE; i++, v.x += dx, v.y += dy, v.z += dz) { // set the colour in the LED analogWrite(R_PIN, v.x); analogWrite(G_PIN, v.y); analogWrite(B_PIN, v.z); delay(TRANSITION_DELAY); } delay(WAIT_DELAY); } void loop() { int v1, v2=0; v.x = (vertex[v2].x ? MAX_RGB_VALUE : MIN_RGB_VALUE); v.y = (vertex[v2].y ? MAX_RGB_VALUE : MIN_RGB_VALUE); v.z = (vertex[v2].z ? MAX_RGB_VALUE : MIN_RGB_VALUE); for (int i = 0; i < 2*MAX_PATH_SIZE; i++) { v1 = v2; if (i&1) v2 = path[i>>1] & 0xf; else v2 = path[i>>1] >> 4; traverse(vertex[v2].x-vertex[v1].x, vertex[v2].y-vertex[v1].y, vertex[v2].z-vertex[v1].z); } }