Need help with sketch. BMP to Led strip

Hi!

I have a sketch that I use since a long time to use color data saved in a bmp file to display on a led strip. This code works well and it does not require any attention.

I would like now to add a potentiometer in order to adjust the brightness of the led strip and to be able to choose between three different bmp files with three different momentary buttons or switchs.

the challenge for me (I am not at all a programmer) is that the sketch currently triggers a bmp files and cannot do anything in the meantime until the bmp file is finished. I suppose there is a way that the sketch is both displaying the bmp file in the led strip at the same time as it detects input from the potentiometer and switches in order to react to them.

As I said, the sketch as it is below works, the sd card reader works, and I know how to connect the potentiometer. I will need help with the three two poles switches and the rest of the code.

#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 56
int frameDelay = 1;                      
int menuItem = 1;                        
int initDelay = 0;                        
int repeat = 0;                           
int repeatDelay = 0;                      
int updateMode = 0;                       
int repeatTimes = 1;                      
int brightness = 99;                      

byte x;

Adafruit_NeoPixel strip = Adafruit_NeoPixel(STRIP_LENGTH, NPPin, NEO_RGB + 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();
}


void loop() {
  SendFile("red.bmp");
}
  

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

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

void SendFile(String Filename) {
  char temp[20];
  Filename.toCharArray(temp, 20);
     
  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]);
}

If you want to do many things at once, there is a tutorial here about that. The pot is dead simple, and for switched use, a bounce or button library, there are many in the library manager to the left of the main editing panel.

1 Like

Thanks for your feedback!

I am pretty sure I could learn to do all of this, I simply have right now no time and need to sort this out for a job, that is why I am searching for somebody that does it for / with me.

56 LEDs will only fit an 8x7 BMP... I see... it is just a line of LEDs.

Since you can't write programs, use a premade application. Find the sequencer on this page.

This is not how it works.

The BMP is 56 pixels wide, with one pixel per LED. It can be as high as you want, and it reads one row after another, displaying each consecutively with a given delay.

Easy enough to code from file to LED. Use the premade sequencer above.

If you need it for a job, then you have to do it otherwise you are unqualified for the job.

1 Like

my job is to make it happen, and that is what I am going to do.

At least it's a simple problem to solve, so you should be able to hire a fairly junior person to get it done in a couple weeks.

Post #4... look for the sequencer for your operating system... in zip form.

Once you "get your job" then address learning how to define and add a potentiometer to your running code.

nice. Will check it when I have time. Thank you very much

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.