// DigisparkNeoPixelStarTwinkle.INO // Digispark Pinout: PB0, PB1, PB2, PB3, PB4, PB5 (Silk screens) // NeoPixel Pinout: (Round side left) Di, +5, GND, Do (Flat side right) #include #include #ifdef __AVR__ #endif #define PIN 0 // Digispark PB0 to Di NeoPixel #define NUMPIXELS 1 // Number of NeoPixels attached to Digispark Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_RGB); Adafruit_NeoPixel strip = Adafruit_NeoPixel(1, PIN, NEO_RGB + NEO_KHZ800); // color variables: mix RGB (0-255) for desired yellow int redPx = 225; int grnHigh = 120; //110-120 for 5v, 135 for 3.3v int bluePx = 13; //10 for 5v, 15 for 3.3v // animation time variables, with recommendations int burnDepth = 13; //10 for 5v, 14 for 3.3v -- how much green dips below grnHigh for normal burn int flutterDepth = 27; //25 for 5v, 30 for 3.3v -- maximum dip for flutter int cycleTime = 111; //120 -- duration of one dip in milliseconds // pay no attention to that man behind the curtain int fDelay; int fRep; int flickerDepth; int burnDelay; int burnLow; int flickDelay; int flickLow; int flutDelay; int flutLow; void setup(){ strip.begin(); // Initializes NeoPixel library pixels.begin(); // Initializes NeoPixel library randomSeed(11); // Random seed (11) pinMode (1,OUTPUT); // +5 pinMode (2,OUTPUT); // GND digitalWrite (1,HIGH); // +5 digitalWrite (2,LOW); // GND flickerDepth = (burnDepth + flutterDepth) / 2.4; burnLow = grnHigh - burnDepth; burnDelay = (cycleTime / 2) / burnDepth; flickLow = grnHigh - flickerDepth; flickDelay = (cycleTime / 2) / flickerDepth; flutLow = grnHigh - flutterDepth; flutDelay = ((cycleTime / 2) / flutterDepth); strip.begin(); strip.show(); } // In loop, call CANDLE STATES, with duration in seconds // 1. on() = solid yellow // 2. burn() = candle is burning normally, flickering slightly // 3. flicker() = candle flickers noticably // 4. flutter() = the candle needs air! void loop() { burn(10); flicker(5); burn(8); flutter(6); burn(3); on(10); burn(10); flicker(10); } // Basic fire funciton - not called in main loop void fire(int grnLow) { for (int grnPx = grnHigh; grnPx > grnLow; grnPx--) { strip.setPixelColor(0, redPx, grnPx, bluePx); strip.show(); delay(fDelay); } for (int grnPx = grnLow; grnPx < grnHigh; grnPx++) { strip.setPixelColor(0, redPx, grnPx, bluePx); strip.show(); delay(fDelay); } } // Fire animation void on(int f) { fRep = f * 1000; int grnPx = grnHigh - 25; // int grnPx = grnHigh - 5 strip.setPixelColor(0, redPx, grnPx, bluePx); strip.show(); delay(fRep); } void burn(int f) { fRep = f * 8; fDelay = burnDelay; for (int var = 0; var < fRep; var++) { fire(burnLow); } } void flicker(int f) { fRep = f * 8; fDelay = burnDelay; fire(burnLow); fDelay = flickDelay; for (int var = 0; var < fRep; var++) { fire(flickLow); } fDelay = burnDelay; fire(burnLow); fire(burnLow); fire(burnLow); } void flutter(int f) { fRep = f * 8; fDelay = burnDelay; fire(burnLow); fDelay = flickDelay; fire(flickLow); fDelay = flutDelay; for (int var = 0; var < fRep; var++) { fire(flutLow); } fDelay = flickDelay; fire(flickLow); fire(flickLow); fDelay = burnDelay; fire(burnLow); fire(burnLow); }