counter + send BMP file to led strip got tricky

I have just learnt how to change a program with a button. In this case I change the color of the first pixel of a led strip (red - green - blue)

#include <FastLED.h>
#define NUM_LEDS 1
#define DATA_PIN 6

CRGB leds[NUM_LEDS];

int buttonPin = 10;
int counter = 1;

void setup() {
  FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
  pinMode(buttonPin, INPUT);
}

void loop() {
  int buttonstate = digitalRead(buttonPin);

  if (buttonstate == HIGH) {
    counter ++;
    if (counter == 4) {
      counter = 1;
    }
  }

  //Change mode
  if (counter == 1) {
    red();
    delay (500);
  }
  else if (counter == 2) {
    blue();
    delay (500);
  }
  else if (counter == 3) {
    green();
    delay (500);
  }
}


void red() {
  leds[0] = CRGB::Red;
  FastLED.show();
  delay(30);
}

void blue() {
  leds[0] = CRGB::Blue;
  FastLED.show();
  delay(30);
}

void green() {
  leds[0] = CRGB::Green;
  FastLED.show();
  delay(30);
}

For some time now, I use a program that reads a bmp file in rows and send this information to a led strip. It is a nice an intuitive way of controlling a led strip. (Attached "bmp_to_led")

Now, I was trying to change the file I am sending to the led strip ("bmp_to_led") with the method I just learned (code example 1), and I cannot make it run properly. this is my attempt:

#include <Adafruit_NeoPixel.h>
#include <SD.h>
#include <SPI.h>

#define SDssPin 4
int NPPin = 6;
int g = 0;
int b = 0;
int r = 0;

#define STRIP_LENGTH 1
int frameDelay = 10;
int menuItem = 1;
int initDelay = 0;
int repeat = 0;
int repeatDelay = 0;
int updateMode = 0;
int repeatTimes = 1;
int brightness = 99;

byte x;

int buttonPin = 10;
int counter = 1;

Adafruit_NeoPixel strip = Adafruit_NeoPixel(STRIP_LENGTH, NPPin, NEO_GRB + NEO_KHZ800);

File root;
File dataFile;
String m_CurrentFilename = "";
int m_FileIndex = 0;
int m_NumberOfFiles = 0;
long buffer[STRIP_LENGTH];


void setup() {
  setupLEDs();
  setupSDcard();
  pinMode(buttonPin, INPUT);
}


void loop() {
  int buttonstate = digitalRead(buttonPin);

  if (buttonstate == HIGH) {
    counter ++;
    if (counter == 4) {
      counter = 1;
    }
  }

  if (counter == 1) {
    SendFile("set01.bmp");
  }
  else if (counter == 2) {
    SendFile("set02.bmp");
  }
  else if (counter == 3) {
    SendFile("set03.bmp");
  }
}



void setupLEDs() {
  strip.begin();
  strip.show();
}


void setupSDcard() {
  pinMode(SDssPin, OUTPUT);
  while (!SD.begin(SDssPin)) {
  }
}


void SendFile(String Filename) {
  char temp[14];
  Filename.toCharArray(temp, 14);

  dataFile = SD.open(temp);

  if (dataFile) {
    ReadTheFile();
    dataFile.close();
  }
  else {
    delay(1000);
    setupSDcard();
    return;
  }
}


void latchanddelay(int dur) {
  strip.show();
  delay(dur);
}


void ClearStrip(int duration) {
  int x;
  for (x = 0; x < STRIP_LENGTH; x++) {
    strip.setPixelColor(x, 0);
  }
  strip.show();
}


uint32_t readLong() {
  uint32_t retValue;
  byte incomingbyte;

  incomingbyte = readByte();
  retValue = (uint32_t)((byte)incomingbyte);

  incomingbyte = readByte();
  retValue += (uint32_t)((byte)incomingbyte) << 8;

  incomingbyte = readByte();
  retValue += (uint32_t)((byte)incomingbyte) << 16;

  incomingbyte = readByte();
  retValue += (uint32_t)((byte)incomingbyte) << 24;

  return retValue;
}



uint16_t readInt() {
  byte incomingbyte;
  uint16_t retValue;

  incomingbyte = readByte();
  retValue += (uint16_t)((byte)incomingbyte);

  incomingbyte = readByte();
  retValue += (uint16_t)((byte)incomingbyte) << 8;

  return retValue;
}


int readByte() {
  int retbyte = -1;
  while (retbyte < 0) retbyte = dataFile.read();
  return retbyte;
}


void getRGBwithGamma() {
  g = gamma(readByte()) / (101 - brightness);
  b = gamma(readByte()) / (101 - brightness);
  r = gamma(readByte()) / (101 - brightness);
}


void ReadTheFile() {
#define MYBMP_BF_TYPE           0x4D42
#define MYBMP_BF_OFF_BITS       54
#define MYBMP_BI_SIZE           40
#define MYBMP_BI_RGB            0L
#define MYBMP_BI_RLE8           1L
#define MYBMP_BI_RLE4           2L
#define MYBMP_BI_BITFIELDS      3L

  uint16_t bmpType = readInt();
  uint32_t bmpSize = readLong();
  uint16_t bmpReserved1 = readInt();
  uint16_t bmpReserved2 = readInt();
  uint32_t bmpOffBits = readLong();
  bmpOffBits = 54;

  /* Check file header */
  if (bmpType != MYBMP_BF_TYPE || bmpOffBits != MYBMP_BF_OFF_BITS) {
    delay(1000);
    return;
  }

  /* Read info header */
  uint32_t imgSize = readLong();
  uint32_t imgWidth = readLong();
  uint32_t imgHeight = readLong();
  uint16_t imgPlanes = readInt();
  uint16_t imgBitCount = readInt();
  uint32_t imgCompression = readLong();
  uint32_t imgSizeImage = readLong();
  uint32_t imgXPelsPerMeter = readLong();
  uint32_t imgYPelsPerMeter = readLong();
  uint32_t imgClrUsed = readLong();
  uint32_t imgClrImportant = readLong();

  /* Check info header */
  if ( imgSize != MYBMP_BI_SIZE || imgWidth <= 0 ||
       imgHeight <= 0 || imgPlanes != 1 ||
       imgBitCount != 24 || imgCompression != MYBMP_BI_RGB ||
       imgSizeImage == 0 )
  {
    delay(1000);
    return;
  }

  int displayWidth = imgWidth;
  if (imgWidth > STRIP_LENGTH) {
    displayWidth = STRIP_LENGTH;
  }


  /* compute the line length */
  uint32_t lineLength = imgWidth * 3;
  if ((lineLength % 4) != 0)
    lineLength = (lineLength / 4 + 1) * 4;


  // Note:
  // The x,r,b,g sequence below might need to be changed if your strip is displaying
  // incorrect colors.  Some strips use an x,r,b,g sequence and some use x,r,g,b
  // Change the order if needed to make the colors correct.

  for (int y = imgHeight; y > 0; y--) {
    int bufpos = 0;
    for (int x = 0; x < displayWidth; x++) {
      uint32_t offset = (MYBMP_BF_OFF_BITS + (((y - 1) * lineLength) + (x * 3))) ;
      dataFile.seek(offset);

      getRGBwithGamma();

      strip.setPixelColor(x, r, b, g);

    }
    latchanddelay(frameDelay);
  }
}


PROGMEM const char gammaTable[]  = {
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,
  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,
  2,  2,  2,  2,  2,  3,  3,  3,  3,  3,  3,  3,  3,  4,  4,  4,
  4,  4,  4,  4,  5,  5,  5,  5,  5,  6,  6,  6,  6,  6,  7,  7,
  7,  7,  7,  8,  8,  8,  8,  9,  9,  9,  9, 10, 10, 10, 10, 11,
  11, 11, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16,
  16, 17, 17, 17, 18, 18, 18, 19, 19, 20, 20, 21, 21, 21, 22, 22,
  23, 23, 24, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30,
  30, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 37, 37, 38, 38, 39,
  40, 40, 41, 41, 42, 43, 43, 44, 45, 45, 46, 47, 47, 48, 49, 50,
  50, 51, 52, 52, 53, 54, 55, 55, 56, 57, 58, 58, 59, 60, 61, 62,
  62, 63, 64, 65, 66, 67, 67, 68, 69, 70, 71, 72, 73, 74, 74, 75,
  76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
  92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 105, 106, 107, 108,
  109, 110, 111, 113, 114, 115, 116, 117, 118, 120, 121, 122, 123, 125, 126, 127
};


inline byte gamma(byte x) {
  return pgm_read_byte(&gammaTable[x]);
}

With this last piece of code I get nothing. The led strip doesnt turn on at all.

If in the Setup I change

void setup() {
  setupLEDs();
  setupSDcard();
  pinMode(buttonPin, INPUT);
}

for

void setup() {
  pinMode(buttonPin, INPUT);
  setupLEDs();
  setupSDcard();
}

it reads set01.bmp, afterwards set02.bmp and then set03.bmp and starts over again.

This means that the program is able to read the files correctly, but something with the order in which I am doing stuff doesnt allow me to have the control with the button.

Somebody sees the mistake?

thanks!

Maybe try a different pin for the button? Making pin 10 an input steps on SPI and SD.

SD
begin()
Description

Initializes the SD library and card. This begins use of the SPI bus (digital pins 11, 12, and 13 on most Arduino boards; 50, 51, and 52 on the Mega) and the chip select pin, which defaults to the hardware SS pin (pin 10 on most Arduino boards, 53 on the Mega). Note that even if you use a different chip select pin, the hardware SS pin must be kept as an output or the SD library functions will not work.

WOW!

very well spotted!!!

thank you so much groundfungus!!!