dc42:
Some suggestions:
-
Don't use the String class, it causes memory fragmentation. Learn to use character arrays instead. You can use the atoi function for extracting and integer form a character array. Be sure to write your code so that you do not overflow the character array if the input does not conform to expectations.
-
If the Ethernet client library supports it, use F strings when printing string literals to it, like this:
client.print(F("GET http://justtwobros.com/christmas/scripts/get_sequence.php"));
client.println(F(" HTTP/1.1"));
client.println(F("Host: justtwobros.com"));
This will avoid those strings using RAM.
Thanks for your response! I tried both, and I still have the same problem. Here's all of my code:
#include <SPI.h>
#include <Ethernet.h>
#include <SdFat.h>
#include <SdFatUtil.h>
#include <WaveRP.h>
byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x01 };
IPAddress ip(192,168,1,100);
EthernetClient client;
char serverName[] = "justtwobros.com";
int delayOn = 5000;
int delayOff = 900000;
int delaySong = 60000;
boolean readingData = false;
char tempString[14];
char tempoString[4];
#define number_of_74hc595s 1
#define numOfRegisterPins number_of_74hc595s * 8
boolean registers[numOfRegisterPins];
int latchPin = A2;
int clockPin = A5;
int dataPin = A3;
SdFat sd;
SdFile myFile;
WaveRP wave;
#define error(msg) sd.errorHalt_P(PSTR(msg))
int freeRam(void)
{
extern int __bss_end;
extern int *__brkval;
int free_memory;
if((int)__brkval == 0) {
free_memory = ((int)&free_memory) - ((int)&__bss_end);
}
else {
free_memory = ((int)&free_memory) - ((int)__brkval);
}
return free_memory;
}
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
Serial.begin(9600);
if (!sd.begin(9, SPI_HALF_SPEED)) sd.initErrorHalt();
Ethernet.begin(mac, ip);
connectToServer();
}
void clearTemp() {
for (int i=0; i<sizeof(tempString); i++) {
tempString[i] = '\0';
}
}
void loop() {
if (client.connected()) {
if (client.available()) {
char inChar = client.read();
if (!readingData) {
if (inChar == '{') {
readingData = true;
}
} else {
if (inChar == '}') {
Serial.print("5. freeram: ");
Serial.println(freeRam());
// enableAudio();
//String songIDWav = tempString;
//songIDWav += ".WAV";
//char this_char2[songIDWav.length() + 1];
//songIDWav.toCharArray(this_char2, sizeof(this_char2));
//Serial.println(this_char2);
playfile("2.WAV");
} else if (inChar == 'n') {
allOff();
} else if (inChar == 'o') {
allOn();
} else if (inChar == '(') {
// SAVE TEMPO HERE
clearTemp();
} else if (inChar == ')') {
Serial.println(tempString);
clearTemp();
delay(500);
} else if (inChar == ']') {
client.stop();
readingData = false;
clearTemp();
} else if (inChar == '[') { } else {
char str2[2]; str2[0] = inChar; str2[1] = '\0';
strcat (tempString, str2);
}
}
}
}
}
void connectToServer() {
if (client.connect(serverName, 80)) {
client.print(F("GET http://justtwobros.com/christmas/scripts/get_sequence.php"));
client.println(F(" HTTP/1.1"));
client.println(F("Host: justtwobros.com"));
client.println();
}
}
void setRegisterPin(int index, int value){ registers[index] = value; }
void writeRegisters(){
digitalWrite(latchPin, LOW);
for(int i = numOfRegisterPins - 1; i >= 0; i--){
digitalWrite(clockPin, LOW);
int val = registers[i];
digitalWrite(dataPin, val);
digitalWrite(clockPin, HIGH);
}
digitalWrite(latchPin, HIGH);
}
void allOff(){
digitalWrite(latchPin, LOW);
for(int i = numOfRegisterPins - 1; i >= 0; i--){
digitalWrite(clockPin, LOW);
digitalWrite(dataPin, LOW);
digitalWrite(clockPin, HIGH);
}
digitalWrite(latchPin, HIGH);
delay(delayOff);
resetData();
}
void allOn(){
digitalWrite(latchPin, LOW);
for(int i = numOfRegisterPins - 1; i >= 0; i--){
digitalWrite(clockPin, LOW);
digitalWrite(dataPin, HIGH);
digitalWrite(clockPin, HIGH);
}
digitalWrite(latchPin, HIGH);
delay(delayOn);
resetData();
}
void playfile(char *name) {
if (wave.isPlaying()) {// already playing something, so stop it!
wave.stop(); // stop it
}
myFile.close(); // SdFat will not open a file that is already open
if (!myFile.open(name, O_READ)) {
PgmPrint("Couldn't open file ");
Serial.println(name);
return;
}
if (!wave.play(&myFile)) {
PgmPrint("Not a valid WAV ");
Serial.println(name);
return;
}
}
void resetData() {
client.stop();
readingData = false;
clearTemp();
connectToServer();
}