Final-ish Code for Workshop

We have the final(ish) code ready for the prototypes that people will be able to make from our kits.

// Accessible Pixel version 1
// APvl.ino
// designed by AccessiblePixel.com
 
//Include Libraries
  #include <Adafruit_NeoPixel.h>
  #include <Keypad.h>
  #ifdef __AVR__
    #include <avr/power.h>
  #endif
 
// Initialise Variables
 
  #define PIN 9 // PIN for LED Strip
 
  volatile int frame=0;
  volatile int backcolorframe=0;
  volatile int r = 0;
  volatile int g = 0;
  volatile int b = 0;
  volatile int brightred = 0;
  volatile int brightgreen = 0;
  volatile int brightblue = 0;
  volatile int brightcolor = 0;
  volatile int up = 0;
  volatile int rainbowi = 0;
  volatile int rainboww = 0;
  volatile int circleanimation = 0;
   
// Initialise Pixels
 
  Adafruit_NeoPixel strip = Adafruit_NeoPixel(16, PIN, NEO_GRB + NEO_KHZ800);
   
// Setup Keypad
 
  const byte ROWS = 4; // Four rows
  const byte COLS = 3; // Three columns
  // Define the Keymap
  char keys[ROWS][COLS] = {
    {'1','2','3'},
    {'4','5','6'},
    {'7','8','9'},
    {'*','0','#'}
  };
   
  // Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
  byte rowPins[ROWS] = { 8, 7, 6, 5 };
  // Connect keypad COL0, COL1 and COL2 to these Arduino pins.
  byte colPins[COLS] = { 4, 3, 2 }; 
 
  // Create the Keypad
  Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
 
// Main Setup Loop (Run Once At Start Up)
void setup() {

  // Initialize Pixels
    strip.begin();    
    strip.setBrightness(135);
    strip.setPixelColor(0,50,50,50);
          strip.setPixelColor(1,0,0,0);
          strip.setPixelColor(2,50,50,50);
          strip.setPixelColor(3,0,0,0);
          strip.setPixelColor(4,50,50,50);
          strip.setPixelColor(5,0,0,0);
          strip.setPixelColor(6,50,50,50);
          strip.setPixelColor(7,0,0,0);
          strip.setPixelColor(8,50,50,50);
          strip.setPixelColor(9,0,0,0);
          strip.setPixelColor(10,50,50,50);
          strip.setPixelColor(11,0,0,0);
          strip.setPixelColor(12,50,50,50);
          strip.setPixelColor(13,0,0,0);
          strip.setPixelColor(14,50,50,50);
          strip.setPixelColor(15,0,0,0);
    strip.show(); 
    

     
// Setup Interrupt at 32hz
  // Stop Interrupts
    cli();
 
 // Clear Timer Register
    TCCR1A = 0;// Set entire TCCR1A register to 0
    TCCR1B = 0;// Same for TCCR1B
    TCNT1  = 0;// Initialize counter value to 0
 // set compare match register for 32hz increments
    OCR1A = 488;// = (16*10^6) / (32*1024) - 1 (must be <65536)
 // turn on CTC mode
    TCCR1B |= (1 << WGM12);
 // Set CS10 and CS12 bits for 1024 prescaler
    TCCR1B |= (1 << CS12) | (1 << CS10);  
 // enable timer compare interrupt
    TIMSK1 |= (1 << OCIE1A);
 // Allow Interrupts
    sei();
 
}//end setup loop


 
// Function Declarations


  //Initialize Reset Function
  
    void(* resetFunc) (void) = 0; //declare reset function @ address 0 
uint32_t wheelz(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }
}
 
// Run Animation Frames
  ISR(TIMER1_COMPA_vect){
  if(frame==1){ 
    strip.setPixelColor(0,135,0,0);
    strip.show(); 
    frame++;
    }
  else if(frame==2) {  
    strip.setPixelColor(1,135,0,0);
    strip.show(); 
    frame++;
    }
  else if(frame==3) {  
    strip.setPixelColor(2,135,0,0);
    strip.show(); 
    frame++;
    }
  else if(frame==4) {  
    strip.setPixelColor(3,135,0,0);
    strip.show(); 
    frame++;
    }
      else if(frame==5) {  
    strip.setPixelColor(4,135,0,0);
    strip.show(); 
    frame++;
    }
      else if(frame==6) {  
    strip.setPixelColor(5,135,0,0);
    delay(50);
    strip.show(); 
    frame++;
    }
      else if(frame==7) {  
    strip.setPixelColor(6,135,0,0);
    strip.show(); 
    frame++;
    }
      else if(frame==8) {  
    strip.setPixelColor(7,135,0,0);
    strip.show(); 
    frame++;
    }
      else if(frame==9) {  
    strip.setPixelColor(8,135,0,0);
    strip.show(); 
    frame++;
    }
      else if(frame==10) {  
    strip.setPixelColor(9,135,0,0);
    strip.show(); 
    frame++;
    }
      else if(frame==11) {  
    strip.setPixelColor(10,135,0,0);
    strip.show(); 
    frame++;
    }
      else if(frame==12) {  
    strip.setPixelColor(11,135,0,0);
    strip.show(); 
    frame++;
    }
      else if(frame==13) {  
    strip.setPixelColor(12,135,0,0);
    strip.show(); 
    frame++;
    }
      else if(frame==14) {  
    strip.setPixelColor(13,135,0,0);
    strip.show(); 
    frame++;
    }
          else if(frame==15) {  
    strip.setPixelColor(14,135,0,0);
    strip.show(); 
    frame++;
    }
          else if(frame==16) {  
    strip.setPixelColor(15,135,0,0);
    strip.show(); 
    frame = 38;
    
    }

    // RESET ANIMATION
      else if(frame==17){ 
    strip.setPixelColor(15,0,0,0);
    strip.show(); 
    frame++;
    }
  else if(frame==18) {  
    strip.setPixelColor(14,0,0,0);
    strip.show(); 
    frame++;
    }
  else if(frame==19) {  
    strip.setPixelColor(13,0,0,0);
    strip.show(); 
    frame++;
    }
  else if(frame==20) {  
    strip.setPixelColor(12,0,0,0);
    strip.show(); 
    frame++;
    }
      else if(frame==21) {  
    strip.setPixelColor(11,0,0,0);
    strip.show(); 
    frame++;
    }
      else if(frame==22) {  
    strip.setPixelColor(10,0,0,0);
    strip.show(); 
    frame++;
    }
      else if(frame==23) {  
    strip.setPixelColor(9,0,0,0);
    strip.show(); 
    frame++;
    }
      else if(frame==24) {  
    strip.setPixelColor(8,0,0,0);
    delay(50);
    strip.show(); 
    frame++;
    }
      else if(frame==25) {  
    strip.setPixelColor(7,0,0,0);
    strip.show(); 
    frame++;
    }
      else if(frame==26) {  
    strip.setPixelColor(6,0,0,0);
    strip.show(); 
    frame++;
    }
      else if(frame==27) {  
    strip.setPixelColor(5,0,0,0);
    strip.show(); 
    frame++;
    }
      else if(frame==28) {  
    strip.setPixelColor(4,0,0,0);
    strip.show(); 
    frame++;
    }
      else if(frame==29) {  
    strip.setPixelColor(3,0,0,0);
    strip.show(); 
    frame++;
    }
      else if(frame==30) {  
    strip.setPixelColor(2,0,0,0);
    strip.show(); 
    frame++;
    }
      else if(frame==31) {  
    strip.setPixelColor(1,0,0,0);
    strip.show(); 
    frame++;
    }
          else if(frame==32) {  
    strip.setPixelColor(0,0,0,0);
    strip.show(); 
    } else if(frame==33) {
      strip.setPixelColor(random(0,15),random(0,135),random(0,135),random(0,135));
      strip.setPixelColor(random(0,15),0,0,0,0);
      strip.show();
    }
          else if(frame==34){strip.setPixelColor(0,0,0,0);
          strip.setPixelColor(1,0,0,0);
          strip.setPixelColor(2,0,0,0);
          strip.setPixelColor(3,0,0,0);
          strip.setPixelColor(4,0,0,0);
          strip.setPixelColor(5,0,0,0);
          strip.setPixelColor(6,0,0,0);
          strip.setPixelColor(7,0,0,0);
          strip.setPixelColor(8,0,0,0);
          strip.setPixelColor(9,0,0,0);
          strip.setPixelColor(10,0,0,0);
          strip.setPixelColor(11,0,0,0);
          strip.setPixelColor(12,0,0,0);
          strip.setPixelColor(13,0,0,0);
          strip.setPixelColor(14,0,0,0);
          strip.setPixelColor(15,0,0,0);
          strip.show();
  }
          else if(frame==35){
          strip.setPixelColor(0,brightred,brightgreen,brightblue);
          strip.setPixelColor(1,brightred,brightgreen,brightblue);
          strip.setPixelColor(2,brightred,brightgreen,brightblue);
          strip.setPixelColor(3,brightred,brightgreen,brightblue);
          strip.setPixelColor(4,brightred,brightgreen,brightblue);
          strip.setPixelColor(5,brightred,brightgreen,brightblue);
          strip.setPixelColor(6,brightred,brightgreen,brightblue);
          strip.setPixelColor(7,brightred,brightgreen,brightblue);
          strip.setPixelColor(8,brightred,brightgreen,brightblue);
          strip.setPixelColor(9,brightred,brightgreen,brightblue);
          strip.setPixelColor(10,brightred,brightgreen,brightblue);
          strip.setPixelColor(11,brightred,brightgreen,brightblue);
          strip.setPixelColor(12,brightred,brightgreen,brightblue);
          strip.setPixelColor(13,brightred,brightgreen,brightblue);
          strip.setPixelColor(14,brightred,brightgreen,brightblue);
          strip.setPixelColor(15,brightred,brightgreen,brightblue);
          strip.show();
            if (brightcolor==0) {
                        if (up == 0) {
                          if (brightred < 135) {
                           brightred++; 
                          }
                          else if (brightred == 135) {
                            brightred=135; 
                            up = 1;
                          } 
                        }
                        else if(up == 1) {
                          if(brightred > 0) {
                            brightred--;
                          } 
                          else if (brightred == 0) {
                            up = 0;brightcolor++;
                          } 
                        }
              
            } 
            else if (brightcolor==1) {
                        if (up == 0) {
                          if (brightgreen < 135) {
                           brightgreen++; 
                          }
                          else if (brightgreen == 135) {
                            brightgreen=135; 
                            up = 1;
                          } 
                        }
                        else if(up == 1) {
                          if(brightgreen > 0) {
                            brightgreen--;
                          } 
                          else if (brightgreen == 0) {
                            up = 0;brightcolor++;
                          } 
                        }
              
            } 
            else if (brightcolor==2) {
                        if (up == 0) {
                          if (brightblue < 135) {
                           brightblue++; 
                          }
                          else if (brightblue == 135) {
                            brightblue=135; 
                            up = 1;
                          } 
                        }
                        else if(up == 1) {
                          if(brightblue > 0) {
                            brightblue--;
                          } 
                          else if (brightblue == 0) {
                            up = 0;brightcolor=0;
                          } 
                        }
              
            }            
          }
                     else if(frame==36){
                      strip.setPixelColor(rainbowi, wheelz((rainbowi+rainboww) & 255));
                      strip.show();
                      if (rainbowi < 15 )
                      { rainbowi++; } else if (rainbowi == 15) { rainbowi = 0; }
                      if (rainboww < 255 )
                      {rainboww++; } if (rainboww == 255) {rainboww =0; }
                       
                      }
                     else if(frame==37){frame=0;}
if(frame==38){ 
    strip.setPixelColor(0,0,0,135);
    strip.show(); 
    frame++;
    }
  else if(frame==39) {  
    strip.setPixelColor(1,0,0,135);
    strip.show(); 
    frame++;
    }
  else if(frame==40) {  
    strip.setPixelColor(2,0,0,135);
    strip.show(); 
    frame++;
    }
  else if(frame==41) {  
    strip.setPixelColor(3,0,0,135);
    strip.show(); 
    frame++;
    }
      else if(frame==42) {  
    strip.setPixelColor(4,0,0,135);
    strip.show(); 
    frame++;
    }
      else if(frame==43) {  
    strip.setPixelColor(5,0,0,135);
    strip.show(); 
    frame++;
    }
      else if(frame==44) {  
    strip.setPixelColor(6,0,0,135);
    strip.show(); 
    frame++;
    }
      else if(frame==45) {  
    strip.setPixelColor(7,0,0,135);
    strip.show(); 
    frame++;
    }
      else if(frame==46) {  
    strip.setPixelColor(8,0,0,135);
    strip.show(); 
    frame++;
    }
      else if(frame==47) {  
    strip.setPixelColor(9,0,0,135);
    strip.show(); 
    frame++;
    }
      else if(frame==48) {  
    strip.setPixelColor(10,0,0,135);
    strip.show(); 
    frame++;
    }
      else if(frame==49) {  
    strip.setPixelColor(11,0,0,135);
    strip.show(); 
    frame++;
    }
      else if(frame==50) {  
    strip.setPixelColor(12,0,0,135);
    strip.show(); 
    frame++;
    }
      else if(frame==51) {  
    strip.setPixelColor(13,0,0,135);
    strip.show(); 
    frame++;
    }
          else if(frame==52) {  
    strip.setPixelColor(14,0,0,135);
    strip.show(); 
    frame++;
    }
          else if(frame==53) {  
    strip.setPixelColor(15,0,0,135);
    strip.show(); 
    frame++;
    
    }
    if(frame==54){ 
    strip.setPixelColor(0,0,135,0);
    strip.show(); 
    frame++;
    }
  else if(frame==55) {  
    strip.setPixelColor(1,0,135,0);
    strip.show(); 
    frame++;
    }
  else if(frame==56) {  
    strip.setPixelColor(2,0,135,0);
    strip.show(); 
    frame++;
    }
  else if(frame==57) {  
    strip.setPixelColor(3,0,135,0);
    strip.show(); 
    frame++;
    }
      else if(frame==58) {  
    strip.setPixelColor(4,0,135,0);
    strip.show(); 
    frame++;
    }
      else if(frame==59) {  
    strip.setPixelColor(5,0,135,0);
    delay(50);
    strip.show(); 
    frame++;
    }
      else if(frame==60) {  
    strip.setPixelColor(6,0,135,0);
    strip.show(); 
    frame++;
    }
      else if(frame==61) {  
    strip.setPixelColor(7,0,135,0);
    strip.show(); 
    frame++;
    }
      else if(frame==62) {  
    strip.setPixelColor(8,0,135,0);
    strip.show(); 
    frame++;
    }
      else if(frame==63) {  
    strip.setPixelColor(9,0,135,0);
    strip.show(); 
    frame++;
    }
      else if(frame==64) {  
    strip.setPixelColor(10,0,135,0);
    strip.show(); 
    frame++;
    }
      else if(frame==65) {  
    strip.setPixelColor(11,0,135,0);
    strip.show(); 
    frame++;
    }
      else if(frame==66) {  
    strip.setPixelColor(12,0,135,0);
    strip.show(); 
    frame++;
    }
      else if(frame==67) {  
    strip.setPixelColor(13,0,135,0);
    strip.show(); 
    frame++;
    }
          else if(frame==68) {  
    strip.setPixelColor(14,0,135,0);
    strip.show(); 
    frame++;
    }
          else if(frame==69) {  
    strip.setPixelColor(15,0,135,0);
    strip.show(); 
    frame = 1;
    
    } else if(frame==70) {  
            strip.setPixelColor(0,50,50,50);
          strip.setPixelColor(1,0,0,0);
          strip.setPixelColor(2,50,50,50);
          strip.setPixelColor(3,0,0,0);
          strip.setPixelColor(4,50,50,50);
          strip.setPixelColor(5,0,0,0);
          strip.setPixelColor(6,50,50,50);
          strip.setPixelColor(7,0,0,0);
          strip.setPixelColor(8,50,50,50);
          strip.setPixelColor(9,0,0,0);
          strip.setPixelColor(10,50,50,50);
          strip.setPixelColor(11,0,0,0);
          strip.setPixelColor(12,50,50,50);
          strip.setPixelColor(13,0,0,0);
          strip.setPixelColor(14,50,50,50);
          strip.setPixelColor(15,0,0,0);
          strip.show();
}
else if(frame==71) {  
            strip.setPixelColor(0,135,0,0);
          strip.setPixelColor(1,135,0,0);
          strip.setPixelColor(2,135,0,0);
          strip.setPixelColor(3,135,0,0);
          strip.setPixelColor(4,135,0,0);
          strip.setPixelColor(5,135,0,0);
          strip.setPixelColor(6,135,0,0);
          strip.setPixelColor(7,135,0,0);
          strip.setPixelColor(8,135,0,0);
          strip.setPixelColor(9,135,0,0);
          strip.setPixelColor(10,135,0,0);
          strip.setPixelColor(11,135,0,0);
          strip.setPixelColor(12,135,0,0);
          strip.setPixelColor(13,135,0,0);
          strip.setPixelColor(14,135,0,0);
          strip.setPixelColor(15,135,0,0);
          strip.show();
}
else if(frame==72) {  
            strip.setPixelColor(0,0,135,0);
          strip.setPixelColor(1,0,135,0);
          strip.setPixelColor(2,0,135,0);
          strip.setPixelColor(3,0,135,0);
          strip.setPixelColor(4,0,135,0);
          strip.setPixelColor(5,0,135,0);
          strip.setPixelColor(6,0,135,0);
          strip.setPixelColor(7,0,135,0);
          strip.setPixelColor(8,0,135,0);
          strip.setPixelColor(9,0,135,0);
          strip.setPixelColor(10,0,135,0);
          strip.setPixelColor(11,0,135,0);
          strip.setPixelColor(12,0,135,0);
          strip.setPixelColor(13,0,135,0);
          strip.setPixelColor(14,0,135,0);
          strip.setPixelColor(15,0,135,0);
          strip.show();
}
else if(frame==73) {  
            strip.setPixelColor(0,0,0,135);
          strip.setPixelColor(1,0,0,135);
          strip.setPixelColor(2,0,0,135);
          strip.setPixelColor(3,0,0,135);
          strip.setPixelColor(4,0,0,135);
          strip.setPixelColor(5,0,0,135);
          strip.setPixelColor(6,0,0,135);
          strip.setPixelColor(7,0,0,135);
          strip.setPixelColor(8,0,0,135);
          strip.setPixelColor(9,0,0,135);
          strip.setPixelColor(10,0,0,135);
          strip.setPixelColor(11,0,0,135);
          strip.setPixelColor(12,0,0,135);
          strip.setPixelColor(13,0,0,135);
          strip.setPixelColor(14,0,0,135);
          strip.setPixelColor(15,0,0,135);
          strip.show();
}
else if(frame==74) {  
            strip.setPixelColor(0,0,68,68);
          strip.setPixelColor(1,0,68,68);
          strip.setPixelColor(2,0,68,68);
          strip.setPixelColor(3,0,68,68);
          strip.setPixelColor(4,0,68,68);
          strip.setPixelColor(5,0,68,68);
          strip.setPixelColor(6,0,68,68);
          strip.setPixelColor(7,0,68,68);
          strip.setPixelColor(8,0,68,68);
          strip.setPixelColor(9,0,68,68);
          strip.setPixelColor(10,0,68,68);
          strip.setPixelColor(11,0,68,68);
          strip.setPixelColor(12,0,68,68);
          strip.setPixelColor(13,0,68,68);
          strip.setPixelColor(14,0,68,68);
          strip.setPixelColor(15,0,68,68);
          strip.show();
}
else if(frame==75) {  
            strip.setPixelColor(0,68,0,68);
          strip.setPixelColor(1,68,0,68);
          strip.setPixelColor(2,68,0,68);
          strip.setPixelColor(3,68,0,68);
          strip.setPixelColor(4,68,0,68);
          strip.setPixelColor(5,68,0,68);
          strip.setPixelColor(6,68,0,68);
          strip.setPixelColor(7,68,0,68);
          strip.setPixelColor(8,68,0,68);
          strip.setPixelColor(9,68,0,68);
          strip.setPixelColor(10,68,0,68);
          strip.setPixelColor(11,68,0,68);
          strip.setPixelColor(12,68,0,68);
          strip.setPixelColor(13,68,0,68);
          strip.setPixelColor(14,68,0,68);
          strip.setPixelColor(15,68,0,68);
          strip.show();
}
else if(frame==76) {  
            strip.setPixelColor(0,68,68,0);
          strip.setPixelColor(1,68,68,0);
          strip.setPixelColor(2,68,68,0);
          strip.setPixelColor(3,68,68,0);
          strip.setPixelColor(4,68,68,0);
          strip.setPixelColor(5,68,68,0);
          strip.setPixelColor(6,68,68,0);
          strip.setPixelColor(7,68,68,0);
          strip.setPixelColor(8,68,68,0);
          strip.setPixelColor(9,68,68,0);
          strip.setPixelColor(10,68,68,0);
          strip.setPixelColor(11,68,68,0);
          strip.setPixelColor(12,68,68,0);
          strip.setPixelColor(13,68,68,0);
          strip.setPixelColor(14,68,68,0);
          strip.setPixelColor(15,68,68,0);
          strip.show();
}
else if(frame==77) {  
            strip.setPixelColor(0,50,50,50);
          strip.setPixelColor(1,50,50,50);
          strip.setPixelColor(2,50,50,50);
          strip.setPixelColor(3,50,50,50);
          strip.setPixelColor(4,50,50,50);
          strip.setPixelColor(5,50,50,50);
          strip.setPixelColor(6,50,50,50);
          strip.setPixelColor(7,50,50,50);
          strip.setPixelColor(8,50,50,50);
          strip.setPixelColor(9,50,50,50);
          strip.setPixelColor(10,50,50,50);
          strip.setPixelColor(11,50,50,50);
          strip.setPixelColor(12,50,50,50);
          strip.setPixelColor(13,50,50,50);
          strip.setPixelColor(14,50,50,50);
          strip.setPixelColor(15,50,50,50);
          strip.show();
}
  }
void loop(){

char key = kpd.getKey();
  if(key)  // Check for a valid key.
  {
    switch (key)
    {
      case '1':
      frame = 1;
        break;
        case '#':
        frame = 33;
        break;
                      case '2':
        frame = 35;
        up = 0;
        break;
                              case '3':
        frame = 36;
        break;
                                      case '4':
        frame = 71;
        break;
                                              case '5':
        frame = 72;
        break;
                                                      case '6':
        frame = 73;
        break;
                                                              case '7':
        frame = 74;
        break;
                                                                      case '8':
        frame = 75;
        break;
                                                                              case '9':
        frame = 76;
        break;
                                                                                      case '*':
        frame = 77;
        break;
              case '0':
              resetFunc();
        break;
       default:
        break;
    }
  }
}

First Animation

Here is the first piece of code for the start-up and shutdown animations for the rear light. I have tried to add code to control which pixels in the string will illuminate, but it’s kinda hacky. The lights turn on one way, and off in the other direction. Perhaps someone could guide me on how to “improve” this implementation.

This code assumes that the string of lights is connected to PIN 9.

#include <Adafruit_NeoPixel.h>
      #define PIN 9
Adafruit_NeoPixel strip = Adafruit_NeoPixel(16, PIN, NEO_GRB + NEO_KHZ800);
    
    void setup() {
      strip.begin();
      strip.show(); // Initialize all pixels to 'off'
    }

void loop() {
  // put your main code here, to run repeatedly:
lightStart(135,0,0,0,16); // Red Value, Green Value, Blue Value, Start From Pixel, End At Pixel
delay(5000);
lightStop(0,0,0,0,16); // Red Value, Green Value, Blue Value, Start From Pixel, End At Pixel
delay(5000);
  }
  
void lightStart(uint32_t r, uint8_t g,uint8_t b,uint8_t s, uint8_t m ) {
  for(uint16_t i=s; i<m; i++) {
    strip.setPixelColor(i,r,g,b);
    strip.show();
    delay(50);
  }
}
void lightStop(uint32_t r, uint8_t g,uint8_t b,uint8_t s, uint8_t m ) {
  for(uint16_t i=m; i>s; i--) {
    
    strip.setPixelColor(i,r,g,b);
    strip.show();
    delay(50);
  }
  strip.setPixelColor(s,r,g,b); // Hack to work with value 0
  strip.show();
  delay(50);
}

Again, this is built on the Adafruit NeoPixel Library, which is required to make this sketch work.