Ich habe mir eine LED-Matrix von Adafruit besorgt um 16x16 Bilder darzustellen. Dazu habe ich mir ein C#-Programm geschrieben das 16x16 Bilder nimmt und jeden einzelnen Pixel in eine Textdatei schreibt. Immer drei Zeilen ergeben einen Pixel. Die Dateien lese ich von einer SD Karte ein. Jetzt ist es allerdings so dass es immer nach einer bestimmten Zeit passiert dass das ganze Programm irgendwie weiterläuft jedoch die LEDs nicht mehr aktualisiert werden. Meine Vermutung ist dass es irgendwie mit dem Puffer zusammenhängen müsste in den die Datei zeilenweise eingelesen wird. Jedoch habe ich auch nach einiger Zeit nichts hilfreiches gefunden. Oder ich bin zu verwöhnt vom automatischen RAM-Management von anderen Sprachen. Um das ganze besser zu verstehen unten stehend der gesamte Code den ich benutze.
Was mich darauf bringt dass es irgendwie mit dem RAM zusammenhängen muss ist einfach die Tatsache dass es schneller crasht wenn ich mehr RAM verbrauche.
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#include <SD.h>
#define PIN 3
#define NUMPIXELS 256
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int delayval = 50;
int intensity = 10;
File dir;
File file;
String fileBuffer;
void setup()
{
// put your setup code here, to run once:
pixels.begin();
Serial.begin(9600);
Serial.println("Init SD-Card");
if (!SD.begin(53))
{
Serial.println("Init failed");
return;
}
Serial.println("Init success");
dir = SD.open("/");
}
void loop()
{
showPicture();
//delay(500);
}
void showPicture()
{
Serial.println("show");
int countLED=0;
int countColor=0;
int r=0;
int g=0;
int b=0;
getNextFile();
while (file.available())
{
if (countLED == NUMPIXELS)
{
Serial.println("break");
break;
}
fileBuffer = file.readStringUntil('\n');
switch (countColor)
{
case 0:
r = fileBuffer.toInt();
countColor = 1;
break;
case 1:
g = fileBuffer.toInt();
countColor = 2;
break;
case 2:
b = fileBuffer.toInt();
fillLed(countLED, r, g, b);
countColor = 0;
countLED++;
break;
}
}
pixels.show();
}
void getNextFile()
{
file = dir.openNextFile();
if (!file)
{
dir = SD.open("/");
file = dir.openNextFile();
}
if(file.isDirectory())
{
file = dir.openNextFile();
}
Serial.println(file.name());
}
void fillLed(int p, int r, int g, int b)
{
r = map(r, 0, 255, 0, intensity);
g = map(g, 0, 255, 0, intensity);
b = map(b, 0, 255, 0, intensity);
pixels.setPixelColor(p, pixels.Color(r, g, b));
}
Der Debug Output sieht zum Zeitpunkt des Crashs folgendermaßen aus:
038.TXT
show
039.TXT
show
040.TXT
show
show