Hello, I've finished to write and compile my program, but when it start running the arduino runs out of memory and it gives strange characters to serial.
I need some help to optimize my code... to make more SRAM available (Flash memory is good: 31.030 bytes).
#include <SPI.h>
#include <Ethernet.h>
#include <VirtualWire.h>
#include <Wire.h>
#include "SdFatUtil.h"
//VARIÁVEIS PARA O RTC (DS1307)
//SCL <--> Analog Input 5
//SDA <--> Analog Input 4
#define DS1307_I2C_Endereco 0x68 // This is the I2C address
#define I2C_Write Wire.write
#define I2C_Read Wire.read
byte segundo, minuto, hora, diaSemana, dia, mes, ano;
//CONVERSÃO DE BCD PARA DECIMAL
byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}
char* noMes[] = {
"","Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"};
//DECLARAÇÃO DOS PINOS
const byte ledInfo = 2;
const byte ledRececao = 3;
const byte pinoRececao = 8;
const byte BUFSIZ = 128;
//DECLARAÇÃO DAS VARIÁVEIS GLOBAIS
char mensagem[6];
unsigned int dadosAgua = 0;
float dadosBat = 0.0;
float percentagem = 0;
unsigned long litros = 0;
boolean Log = false;
int altAgua = 0;
//CONFIG ETHERNET SHIELD
byte mac[] = {
0x80, 0xA2, 0xDA, 0x00, 0xEA, 0x8C };
byte ip[] = {
10, 50, 196, 80 };
char ficheiroIndex[] = "i.htm";
char ficheiroTanque[] = "t.jpg";
char ficheiroBorder[] = "b.jpg";
char ficheiroFavicon[] = "f.ico";
char ficheiroLog[8];
char* ficheiroLer;
EthernetServer server = EthernetServer(80);
EthernetClient client;
//PROGRAMAÇÃO DO CARTÃO SD
Sd2Card card;
SdVolume volume;
SdFile root;
SdFile file;
//ARMAZENA SEQUÊNCIAS DE ERRO NA MEMÓRIA FLASH PARA ECONOMIZAR RAM
#define error(s) error_P(PSTR(s))
void error_P(const char* str) {
PgmPrint("Erro: ");
SerialPrintln_P(str);
if (card.errorCode()) {
PgmPrint("Erro cart.SD: ");
Serial.print(card.errorCode(), HEX);
Serial.print(',');
Serial.println(card.errorData(), HEX);
}
digitalWrite(ledInfo, HIGH);
while(1);
}
void setup() {
Serial.begin(9600);
delay(100);
pinMode(ledInfo, OUTPUT);
pinMode(ledRececao, OUTPUT);
pinMode(10, OUTPUT);
//INICIA A COMUNICAÇÃO I2C
Wire.begin();
//LIGA E DESLIGA OS 2 LEDS PARA INDICAR QUE ESTÃO OPERACIONAIS
digitalWrite(ledInfo, HIGH);
digitalWrite(ledRececao, HIGH);
digitalWrite(10, HIGH);
delay(1000);
digitalWrite(ledInfo, LOW);
digitalWrite(ledRececao, LOW);
PgmPrint("RAM: ");
Serial.println(FreeRam());
//INICIALIZA O CARTÃO SD EM "FULL SPEED", MÁXIMO DESEMPENHO. (PARA EVITAR ERROS COM LIGAÇÃO À BREADBOARD DEVE ESTAR EM "HALF SPEED")
if (!card.init(SPI_FULL_SPEED, 4)) error("Erro Init cart.SD!");
//INICIALIZA O VOLUME FAT
if (!volume.init(&card)) error("Erro vol cart.SD!");
//LISTA NA SÉRIE OS FICHEIROS QUE ESTÃO NA RAIZ DO CARTÃO SD, COM DATA E TAMANHO
if (!root.openRoot(&volume)) error("Erro root cart.SD!");
//INICIA O SERVIDOR
Ethernet.begin(mac, ip);
server.begin();
delay(100);
//CONFIGURA E INICIA O RECEPTOR
vw_set_rx_pin(pinoRececao);
vw_setup(2000);
vw_rx_start();
//LED PISCA 3 VEZES A INDICAR TODA A CONFIGURAÇÂO CONCLUÍDA COM SUCESSO
for (int i = 0; i<3; i++) {
digitalWrite(ledInfo, HIGH);
delay(250);
digitalWrite(ledInfo, LOW);
delay(250);
}
Serial.println(F("Config concl"));
}
void loop() {
altAgua++;
rececaoRF();
clienteLigado();
delay(500);
}
//RECEPÇÃO DOS DADOS POR RF 433MHz
void rececaoRF() {
byte buf[VW_MAX_MESSAGE_LEN];
byte buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) {
digitalWrite(ledRececao, HIGH);
for (int j = 0; j<buflen; j++) {
mensagem[j] = buf[j];
}
if (mensagem[0] == 'R') {
dadosAgua = atoi(&mensagem[1]);
}
else if (mensagem[0] == 'B') {
dadosBat = atof(&mensagem[1]);
Serial.print(F("Volt Bat: "));
Serial.println(dadosBat);
}
Serial.print(F("Msg Receb: "));
Serial.println(mensagem);
memset(&buf, 0, sizeof(buf));
memset(&mensagem, 0, sizeof(mensagem));
calcAgua();
gravarDados();
digitalWrite(ledRececao, LOW);
}
}
CONTINUES...