I wrote this code to control my christmas tree. It takes up the majority of the memory on my Arduino Uno:
Sketch uses 31822 bytes (98%) of program storage space. Maximum is 32256 bytes.
Global variables use 1882 bytes (91%) of dynamic memory, leaving 166 bytes for local variables. Maximum is 2048 bytes.
Low memory available, stability problems may occur.
Does anyone know how I can reduce the memory usage?
Code:
#include <SPI.h>
#include <SdFat.h>
#include <SdFatUtil.h>
#include <SFEMP3Shield.h>
#define TREEONE 3
#define TREETWO 4
#define TREETHREE 5
#define TREEFOUR 10
SdFat sd;
SFEMP3Shield MP3player;
const uint8_t volume = 10; // MP3 Player volume 0=max, 255=lowest (off)
//10 for basement 50 for testing
const uint16_t monoMode = 1;
int song = 3;
int num = 0;
int count = 0;
//put arrays here
byte arrayTree[] = {17,16,9,8,3,2,5,4,17,16,9,8,3, ...etc };
void setup() {
initSD();
initMP3Player();
pinMode(TREEONE, OUTPUT);
pinMode(TREETWO, OUTPUT);
pinMode(TREETHREE, OUTPUT);
pinMode(TREEFOUR, OUTPUT);
digitalWrite(TREEONE, HIGH);
digitalWrite(TREETWO, HIGH);
digitalWrite(TREETHREE, HIGH);
digitalWrite(TREEFOUR, HIGH);
}
void loop() {
if(!MP3player.isPlaying()){
MP3player.playTrack(song);
MetallicaChristmas();
}
}
void initSD() {
if(!sd.begin(SD_SEL, SPI_HALF_SPEED))
sd.initErrorHalt();
if(!sd.chdir("/"))
sd.errorHalt("sd.chdir");
}
void initMP3Player() {
uint8_t result = MP3player.begin();
MP3player.setVolume(volume, volume);
MP3player.setMonoMode(monoMode);
}
void treeFunc() {
//delay(arrayTimes[i]);
num = arrayTree[count];
//TREEONE
if(num>15){
if((num%2)==0){
digitalWrite(TREEONE,HIGH);
}else{
digitalWrite(TREEONE,LOW);
}
}
//TREETWO
if((num%16)>7){
if((num%2)==0){
digitalWrite(TREETWO,HIGH);
}else{
digitalWrite(TREETWO,LOW);
}
}
//TREETHREE
if((num%8)>3){
if((num%2)==0){
digitalWrite(TREETHREE,HIGH);
}else{
digitalWrite(TREETHREE,LOW);
}
}
//TREEFOUR
if((num%4)>1){
if((num%2)==0){
digitalWrite(TREEFOUR,HIGH);
}else{
digitalWrite(TREEFOUR,LOW);
}
}
count = count + 1;
}
void MetallicaChristmas()
{
//event 1
delay(670);
treeFunc();
delay(248);
treeFunc();
//event 2
delay(116);
treeFunc();
delay(248);
treeFunc();
//event 3
delay(100);
treeFunc();
delay(248);
treeFunc();
//event 4
delay(132);
treeFunc();
delay(248);
treeFunc();
//event 5
delay(125);
treeFunc();
delay(248);
treeFunc();
//event 6
...etc.
arrayTree
. And use PROGMEM on both arrays your code will become smaller and use less dynamic memory. And also make it easier to read/maintain.