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);
}

Exibições: 3375

Responder esta

Respostas a este tópico

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.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço