//Fire animation for 7 LEDS int l6 = 11; //switch these around to change which bulb flickers int l5 = 10; int l4 = 9; int l3 = 6; int l2 = 5; int l1 = 3; int dly = 5; // change this to make the fire slower & smoother (increase delay) or faster & jerkier (decrease delay) // Brighness ranges int ur1; int lr1; int ur2; int lr2; int ur3; int lr3; //exact brightness levels int lvl1; int lvl2; int lvl3; int prev1; int prev2; int prev3; //get random range for each bulb void findRange(){ ur1 = random(125, 255); //upper range lr1 = random(0, 125); //lower range ur2 = random(125, 255); lr2 = random(0, 125); ur3 = random(125, 255); lr3 = random(0, 125); }; //get random level withing random range for each bulb void findLevels(){ lvl1 = random(lr1, ur1); lvl2 = random(lr2, ur2); lvl3 = random(lr3, ur3); }; //display option one: jump directly to new levels (very jerky, more like a wind-blown candle) void findLevels1(){ lvl1 = random(0, 255); lvl2 = random(0, 255); lvl3 = random(0, 255); analogWrite(l1, lvl1); analogWrite(l2, lvl2); analogWrite(l3, lvl3); analogWrite(l4, lvl1); analogWrite(l5, lvl2); analogWrite(l6, lvl3); delay(50); }; //display option two: fade nicely into new levels (slower "movement", more like indoor fire) void displayLevels(){ //if new level is higher than the previous, fade the previous up while(lvl1 >= prev1){ //use while loops to force it to fade all the way instead of picking a new level prev1 = prev1+5; analogWrite(l1, prev1); delay(dly); }; while(lvl2 >= prev2){ prev2 = prev2+5; analogWrite(l2, prev2); delay(dly); }; while(lvl3 >= prev3){ prev3 = prev3+5; analogWrite(l3, prev3); delay(dly); }; //if new level is lower than the previous, fade the previous down while(lvl1 <= prev1){ prev1 = prev1 - 5; analogWrite(l1, prev1); delay(dly); }; while(lvl2 <= prev2){ prev2 = prev2 - 5; analogWrite(l2, prev2); delay(dly); }; while(lvl3 <= prev3){ prev3 = prev3 - 5; analogWrite(l3, prev3); delay(dly); }; }; void setup (){ pinMode(12, OUTPUT); pinMode(l1, OUTPUT); pinMode(l2, OUTPUT); pinMode(l3, OUTPUT); pinMode(3, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); }; void loop (){ analogWrite(l4, 255); analogWrite(l5, 255); analogWrite(l6, 255); digitalWrite(12, HIGH); findRange(); findLevels(); //findLevels1(); //uncomment this and comment out findLevels(); and displayLevels(); to get jerky effect displayLevels(); }