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]);
}
