Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* "RGBBounce" - RGB fading without delay()
- For Arduino C
- @diemastermonkey 2016 (for Internet Toybox)
- */
- // From config: What pins are RGB
- int iRedPin = 9;
- int iGreenPin = 10;
- int iBluePin = 11;
- // Target values - user may change at any time
- // RGB Step routine continuously moving toward them
- int iRedTarget = 128;
- int iBlueTarget = 240;
- int iGreenTarget = 32;
- // Current values - more efficient than reading them
- int iRedNow = 0;
- int iBlueNow = 0;
- int iGreenNow = 0;
- // A counter for RGB updates: This controls rate of color fades
- // Decrement each cycle, then when zero, update RGB and recharge
- int iRGBCounterCharge = 50; // Recharge to this
- int iRGBCounter = iRGBCounterCharge;
- // For user: How often to randomly change (use 0 for never)
- // This is 'sides' on the dice for changes
- int iRGBRandomDice = 4096000; // 2048000 =~ 30s changes @ 16mhz
- void setup() {
- // Set output mode - superfluous?
- pinMode (iRedPin, OUTPUT);
- pinMode (iGreenPin, OUTPUT);
- pinMode (iBluePin, OUTPUT);
- }
- void loop() {
- // Update RGB pins if time to do so, else mb randomize targets
- if (fnRGBStep() == 0) {
- // No RGB event, maybe randomize
- iRedTarget = fnRGBTargetRand (iRedTarget);
- iGreenTarget = fnRGBTargetRand (iGreenTarget);
- iBlueTarget = fnRGBTargetRand (iBlueTarget);
- }
- }
- // Move and set RGB values toward current global "target" values
- // Also handles RGB "update" counter. Returns 1 if it was event time.
- int fnRGBStep () {
- iRGBCounter--; // Decrement counter, ditch if not time yet
- if (iRGBCounter > 0) { return (0); }
- // If still here time for event - recharge counter
- iRGBCounter = iRGBCounterCharge;
- int iRate = 1; // Optional change rate!
- // Red
- iRedNow += iRate * fnToward (iRedNow, iRedTarget);
- analogWrite (iRedPin, iRedNow);
- // Green
- iGreenNow += iRate * fnToward (iGreenNow, iGreenTarget);
- analogWrite (iGreenPin, iGreenNow);
- // Blue
- iBlueNow += iRate * fnToward (iBlueNow, iBlueTarget);
- analogWrite (iBluePin, iBlueNow);
- return (1); // If caller interested, it was RGB event time
- }
- // Return value that should be added to get from argFrom to argTo
- int fnToward (int iArgFrom, int iArgTo) {
- if (iArgFrom < iArgTo) { return (+1); }
- if (iArgFrom > iArgTo) { return (-1); }
- return (0); // If same
- }
- // Return a random destination for the arg RGB value, or the arg value
- // Die is sides set by user in iRGBRandomDice, thus == 1 allows "0 for never"
- int fnRGBTargetRand (int iArgNow) {
- if (random(iRGBRandomDice) == 1) { // 1-in-x chance of changing
- return (random(255));
- }
- return (iArgNow); // Else what you sent me
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement