Pessoal, alguém sabe como resolver a mensagem abaixo?
O sketch usa 21.298 bytes (66%) de espaço de armazenamento para programas. O máximo são 32.256 bytes.
Variáveis globais usam 1.568 bytes (76%) de memória dinâmica, deixando 480 bytes para variáveis locais. O máximo são 2.048 bytes.
Pouca memória disponível, problemas de estabilidade podem ocorrer.
Segue meu programa:
/*
SISTEMA DE ALARME E SIMULADOR DE PRESENÇA RESISTENCIAL
COM MONITORAMENTO REMOTO VIA ANDROID APP E ALERTA VIA E-MAIL
Creditos: jose miguel fernandes / http://labdegaragem.com/Feito por: Mário Rodrigues Sobral / mr.sobral@hotmail.com
*/#include <SPI.h>
#include <Ethernet.h>
#include <Wire.h>
#include <DS1307.h>#include <EthernetClient.h>
#define time 1000//RTC
char dateTime[20];
int HoraAtiva[6];
int RTCValues[7];//Reles/Portas pro Simulador de presença
int piralarme = 5;
int quarto = 6;
int banheiro = 7;
int piscina = 8;
int sirene = 9;//Nomeia Variaveis
int estadoalarme = 1;
int estadosimulador = 1;
int estadoquarto = 0;
int estadobanheiro = 0;
int estadopiscina = 0;
int estadosirene = 0;int sensor = 0; //variavel para gravar o nivel de sinal do sensor
int SSalarme = 60; //variavel para guardar o segundo atual que o sensor detectou movimento. Nenhum movimento = 60.
int MMpiscina = 60; //variavel para guardar o minuto atual para ligar a bomba.boolean incoming = 0;
//Configura Ethernet Shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,100);
EthernetServer server(2015); //PORTA DO SERVIDOR WEB. P/ ABRIR, DIGITAR NO NAVEGADOR O IP DO ARDUINO SEGUIDO DA PORTA: http://192.168.1.19:2015
byte mailserver[] = { 200, 147, 99, 132 }; // Colocar o ip do servidor SMTP. Testado com smtp do Hotmail, Gmail e BOL. Apenas BOL funcionou.
EthernetClient clientmail;void setup()
{
//Inicializamos o monitoramento serial e configuramos saídas
Serial.begin(9600);
Serial.println("Configurando portas do Arduino...");
pinMode(piralarme,INPUT);
pinMode(quarto,OUTPUT);
pinMode(banheiro,OUTPUT);
pinMode(piscina,OUTPUT);
pinMode(sirene,OUTPUT);
Serial.println("Pronto!");
Serial.println("Inicia o RTC...");
DS1307.begin();
Serial.println("Pronto!");
delay(120000); //aguarda 2 minutos para os sensores estabilizarem
// Inicializamos o Ethernet Shield
Ethernet.begin(mac, ip);
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
}//ALERTA DE E-MAIL
void envia()
{
delay(time);
Serial.println("conectando...");
if (clientmail.connect(mailserver, 587)) // Porta de conexao do servidor do email.
{
Serial.println("conectado!");
Serial.println("enviando email...");
Serial.println();
clientmail.println("EHLO localhost");
recebe();
delay(time);
clientmail.println("AUTH LOGIN");
recebe();
delay(time);
clientmail.println("YXXXXXXJy"); // Email de login em base de 64: http://base64-encoder-online.waraxe.us/
recebe();
delay(time);
clientmail.println("TXXXXXio="); // Senha do email em base de 64: http://base64-encoder-online.waraxe.us/
recebe();
delay(time);
clientmail.println("mail from: <arduinosobral@bol.com.br>"); //Email remetente
recebe();
delay(time);
clientmail.println("rcpt to: <mr.sobral@hotmail.com>"); // Email destinatário
recebe();
delay(time);
clientmail.println("data");
recebe();
delay(time);
clientmail.println("Subject: SOS HOME SOBRAL - Alarme disparado!"); // Assunto
recebe();
delay(time);
clientmail.println("Seu sistema de alarme foi ativado em: "); // Corpo
clientmail.println(dateTime);
recebe();
delay(time);
clientmail.println("."); // Indica fim do email.
recebe();
delay(time);
clientmail.println();
recebe();
delay(time);
Serial.println("email enviado!");
delay(time);
if (clientmail.connected()) // Desconecta pra deixar pronto para novo envio.
{
Serial.println();
Serial.println("desconectando...");
clientmail.stop();
Serial.println();
Serial.println();
}
}
else
{
Serial.println("connection failed");
}
Serial.println("Ready. Press 'e' to connect.");
}
//MONITORA ALERTA DE E-MAIL
void recebe()
{
while (clientmail.available())
{
char c = clientmail.read();
Serial.print(c);
}
}//ALARME - Os sensores ficam sempre HIGH. Quando detectam movimento, cortam o sinal (LOW)
void alarme()
{
sensor = digitalRead(piralarme);
if (sensor == LOW)
{
// delay(60000);
envia();
digitalWrite(sirene, HIGH);
estadosirene = 1;
SSalarme = RTCValues[6];
--SSalarme; //subtrai 1 do segundo recebido do rtc, pra garantir que nao vai ligar e logo em seguida desligar, devido à velocidade do loop
}
if (SSalarme == RTCValues[6])
{
digitalWrite(sirene, LOW);
estadosirene = 0;
SSalarme = 60; //coloca um valor que nunca existirá no ssalarme pra nao ficar desligando a sirene em vão no proximo loop.
}
if (SSalarme == -1) //garantir que nunca vai ficar com segundo -1, oque deixaria a sirene ligada enternamente
{
SSalarme = 59;
}
}//PISCINA 1H
void piscina1h()
{
digitalWrite(piscina, HIGH);
estadopiscina = 11; //mudamos pra 11, pq se ficar 2 sempre vai ficar puxando o void de leitura do minuto atual
MMpiscina = RTCValues[5];
--MMpiscina; //subtrai 1 do segundo recebido do rtc, pra garantir que nao vai ligar e logo em seguida desligar, devido à velocidade do loop
if (MMpiscina == -1) //garantir que nunca vai ficar com segundo -1, oque deixaria a sirene ligada enternamente
{
MMpiscina = 59;
}
}
//VOID USADO PELO SIMULADOR DE PRESENÇA
//Compara a hora do simulador com a hora atual e executa a açao
void MudaDispositivo(byte dispositivo, byte estado, byte hora, byte minuto, byte segundo, int* HoraAtiva)
{
if (RTCValues[4] == hora && RTCValues[5] == minuto && RTCValues[6] == segundo)
digitalWrite(dispositivo, estado);
}//VOID DO SIMULADOR DE PRESENÇA
void simulador()
{
//Simula presença de noite
MudaDispositivo(banheiro, HIGH, 18, 40, 10, HoraAtiva);
MudaDispositivo(banheiro, LOW, 18, 43, 10, HoraAtiva);
MudaDispositivo(quarto, HIGH, 18, 43, 20, HoraAtiva);
MudaDispositivo(quarto, LOW, 18, 47, 10, HoraAtiva);
MudaDispositivo(quarto, HIGH, 19, 50, 10, HoraAtiva);
MudaDispositivo(quarto, LOW, 19, 52, 45, HoraAtiva);
MudaDispositivo(quarto, HIGH, 20, 10, 10, HoraAtiva);
MudaDispositivo(quarto, LOW, 20, 10, 40, HoraAtiva);
MudaDispositivo(banheiro, HIGH, 20, 10, 50, HoraAtiva);
MudaDispositivo(banheiro, LOW, 20, 11, 20, HoraAtiva);
MudaDispositivo(quarto, HIGH, 20, 20, 50, HoraAtiva);
MudaDispositivo(quarto, LOW, 20, 21, 20, HoraAtiva);
MudaDispositivo(banheiro, HIGH, 20, 45, 40, HoraAtiva);
MudaDispositivo(banheiro, LOW, 20, 46, 10, HoraAtiva);
MudaDispositivo(quarto, HIGH, 21, 10, 10, HoraAtiva);
MudaDispositivo(banheiro, HIGH, 21, 10, 30, HoraAtiva);
MudaDispositivo(banheiro, LOW, 21, 15, 10, HoraAtiva);
MudaDispositivo(quarto, LOW, 21, 16, 10, HoraAtiva);
MudaDispositivo(quarto, HIGH, 22, 10, 10, HoraAtiva);
MudaDispositivo(quarto, LOW, 22, 10, 50, HoraAtiva);
//Simula colocar pijama e escovar os dentes
MudaDispositivo(quarto, HIGH, 22, 40, 10, HoraAtiva);
MudaDispositivo(banheiro, HIGH, 22, 41, 10, HoraAtiva);
MudaDispositivo(banheiro, LOW, 22, 43, 10, HoraAtiva);
MudaDispositivo(quarto, LOW, 22, 43, 30, HoraAtiva);
MudaDispositivo(quarto, HIGH, 23, 40, 10, HoraAtiva);
MudaDispositivo(banheiro, HIGH, 23, 40, 30, HoraAtiva);
MudaDispositivo(banheiro, LOW, 23, 41, 20, HoraAtiva);
MudaDispositivo(quarto, LOW, 23, 41, 40, HoraAtiva);
//Simula presença de madrugada
MudaDispositivo(quarto, HIGH, 2, 10, 10, HoraAtiva);
MudaDispositivo(banheiro, HIGH, 2, 10, 30, HoraAtiva);
MudaDispositivo(banheiro, LOW, 2, 11, 20, HoraAtiva);
MudaDispositivo(quarto, LOW, 2, 11, 40, HoraAtiva);
MudaDispositivo(quarto, HIGH, 4, 10, 10, HoraAtiva);
MudaDispositivo(banheiro, HIGH, 4, 10, 30, HoraAtiva);
MudaDispositivo(banheiro, LOW, 4, 11, 20, HoraAtiva);
MudaDispositivo(quarto, LOW, 4, 11, 40, HoraAtiva);
MudaDispositivo(quarto, HIGH, 6, 10, 10, HoraAtiva);
MudaDispositivo(banheiro, HIGH, 6, 10, 30, HoraAtiva);
MudaDispositivo(banheiro, LOW, 6, 11, 20, HoraAtiva);
MudaDispositivo(quarto, LOW, 6, 11, 40, HoraAtiva);
}//VOID LOOP INFINITO PADRÃO
void loop()
{
DS1307.getDate(RTCValues); //BUSCA A HORA ATUAL NO RTC
//Coloca o void alarme e simulador em açao
if(estadoalarme == 1)
{
alarme();
}
if(estadosimulador == 1)
{
simulador();
}
if(estadopiscina == 2)
{
piscina1h();
}
// INICIA SERVIDOR WEB
EthernetClient clientweb = server.available();
if (clientweb)
{
// an http request ends with a blank line
boolean currentLineIsBlank = true;
String str;
// Executa enquanto usuario estiver conectado no site
while (clientweb.connected())
{
if (clientweb.available())
{
char c = clientweb.read();
str.concat(c);
if(str.endsWith("/ATIVAALARME")) estadoalarme =1;
else if(str.endsWith("/DESATIVAALARME")) estadoalarme =0;
if(str.endsWith("/ATIVASIMULADOR")) estadosimulador =1;
else if(str.endsWith("/DESATIVASIMULADOR")) estadosimulador =0;
if(str.endsWith("/LIGAQUARTO")) estadoquarto =1;
else if(str.endsWith("/DESLIGAQUARTO")) estadoquarto =0;
if(str.endsWith("/LIGABANHEIRO")) estadobanheiro =1;
else if(str.endsWith("/DESLIGABANHEIRO")) estadobanheiro =0;
if(str.endsWith("/LIGAPISCINA")) estadopiscina =1;
else if(str.endsWith("/DESLIGAPISCINA")) estadopiscina =0;
if(str.endsWith("/LIGAPISCINA1H")) estadopiscina =2;
if(str.endsWith("/LIGASIRENE")) estadosirene =1;
else if(str.endsWith("/DESLIGASIRENE")) estadosirene =0;
//Executa somente quando recebe uma solicitação HTTP (abre/atualiza pagina)
if (c == '\n' && currentLineIsBlank)
{
clientweb.println("HTTP/1.1 200 OK");
clientweb.println("Content-Type: text/html");
clientweb.println();if(estadoalarme == 1)
{
clientweb.println("Alarme ON" );
}
else if (estadoalarme == 0)
{
clientweb.println("AlarmeOFF" );
if(estadosirene == 0) //evita que desligue a sirene quando queremos liga-la enquanto o alarme está desligado
{
digitalWrite(sirene, LOW);
}
}
if(estadosimulador == 1)
{
clientweb.println("Simulador ON" );
}
else if (estadosimulador == 0)
{
clientweb.println("SimuladorOFF" );
}
if(estadoquarto == 1)
{
clientweb.println("Quarto ON");
digitalWrite(quarto, HIGH);
}
else if (estadoquarto == 0)
{
clientweb.println("QuartoOFF" );
digitalWrite(quarto, LOW);
}
if(estadobanheiro == 1)
{
clientweb.println("Banheiro ON" );
digitalWrite(banheiro, HIGH);
}
else if (estadobanheiro == 0)
{
clientweb.println("BanheiroOFF" );
digitalWrite(banheiro, LOW);
}
if(estadopiscina == 1)
{
clientweb.println("Piscina ON" );
digitalWrite(piscina, HIGH);
}
else if (estadopiscina == 0)
{
clientweb.println("PiscinaOFF" );
digitalWrite(piscina, LOW);
}
else if (estadopiscina == 11) //mudamos de 2 pra 11 porque se continuasse 2, ela ficaria sempre pegando o minuto atual
{
clientweb.println("Piscina1ON" );
if (MMpiscina == RTCValues[5])
{
digitalWrite(piscina, LOW);
estadopiscina = 0;
MMpiscina = 60; //coloca um valor que nunca existirá no ssalarme pra nao ficar desligando a sirene em vão no proximo loop.
}
}
if(estadosirene == 1)
{
clientweb.println("Sirene ON" );
digitalWrite(sirene, HIGH);
}
else if (estadosirene == 0)
{
clientweb.println("SireneOFF" );
digitalWrite(sirene, LOW);
}
//Imprime hora atual no site
clientweb.println("/ HORA ATUAL");
clientweb.println(RTCValues[4]);
clientweb.println(":");
clientweb.println(RTCValues[5]);
clientweb.println(":");
clientweb.println(RTCValues[6]);
break;
}
if (c == '\n')
{
currentLineIsBlank = true;
}
else if (c != '\r')
{
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
clientweb.stop();
}
/*
Comando utilizado apenas pra ficar enviando via USB a hora atual
para que possam monitorar no "serial monitor" do simulador Arduino
e ver se esta tudo funcionando de acordo
*/
DS1307.getDate(RTCValues);
sprintf(dateTime, "%02d-%02d-20%02d - %02d:%02d:%02d",
RTCValues[2], RTCValues[1], RTCValues[0],
RTCValues[4], RTCValues[5], RTCValues[6]);
Serial.print(dateTime);
Serial.print(" - day of week: ");
Serial.println(RTCValues[3]);
delay(900);
}
Tags:
Perai, não entendi seu problema? seu projeto esta realmente apresentando algum problema? já apresentou alguma oscilação? já travou ou teve alguma falha?
Ou você é como essa galera maluca que vive assistindo rede globo e porque aparece uma mensagem dizendo: "pode ser que você tenha problemas... " você já julga que esta tendo problemas ?
Mas de qualquer forma, dá uma olhada nesse tutorial que escrevi:
http://labdegaragem.com/forum/topics/tutorial-programando-de-forma-...
A preocupação do Mário tem sentido, pois o programa está deixando pouca memória livre. O ideal é que sobre 10% para uso da memória heap e stack, caso contrário poderá haver problemas de instabilidade, como a própria IDE avisou.
No entanto, parece que esse limite não foi atingido.
Algumas soluções:
- Seria o caso de otimizar o sketch, conforme as dicas do Gustavo Murta;
- Procure criar funções e usar variáveis privadas;
- Realize stress tests com a aplicação para ver se o Arduino trava;
- Considerar usar o Arduino Mega, que possui mais RAM.
Obrigado senhores. Tentarei otimizar o programa.
Questionei por que se trata do sistema de alarme. As vezes dispara sozinho e nao sei dizer se pode ser esse erro que esteja gerando o disparo.
Estranho é que a versao antiga do IDE nao apresentava este erro. Sem contar que o IDE demora bastante pra finalizar a verificação.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por