Boa noite bom estou com um código de automação com controle de 7 relés e 4 Ar-Condicionado porem o código ficou com quase 40.000 bytes e meu Arduino Mega 2560 não compila por causa do tamanho inclusive eu precisava escrever mais algumas coisas no código mas não sei o que fazer para diminuir o tamanho dele já fiz o esquema de usar #define e até usei o client.print(F()); para reduzir mas não foi o suficiente alguém pode me ajudar com isso?

OBS: Separei alguns códigos em abas tambem.

Segue o Código:

Codigo_Automacao_Residencial_Completo.rar

Erro:

Exibições: 3303

Responder esta

Respostas a este tópico

olá Paulo.

      Implementei seu Sistema, ajustando para que use bem menos memória, e com uma técnica que permitirá vc colocar Págimas HTML mais elaboradas, com relativa tranquilidade.

      Também alterei a lógica, a fim de que fique flexível para ajustes futuros que vc venha a fazer.

      Mas antes de postar aqui, vc poderia esclarecer uma dúvida?

      É justamente sobre o controle do Ar.  Vi que quando o controle é feito pela Página HTML, vc simplesmente envia os comandos IR para ligar ou desligar o Ar.

      Mas quando passa o tempo de 5 minutos sem receber comandos, vc envia o comando pra desligar, espera 8 segundos, e então envia o comando pra ligar o Ar (e vc fez isso no setup também). Na figura a seguir, pode-se ver isso:

(clique na figura para "zoom")

      Então a pergunta é essa:  porque o intervalo de 8 segundos entre os dois comandos? é realmente necessário? e se for, quando isso tem que ser feito?

      Fico no aguardo, para poder finalizar o Sistema.

      Abrçs,

      Elcids

olá Paulo.

      Ajustei seu código, e consegui uma redução significativa no uso da memória.

      As técnicas que utilizei, são as mesmas que já tinha usado no caso do Varley (claro, no seu caso, como está usando o Arduino UNO, vc já tem bem menos memória).

      Se vc continuar a usar a mesma técnica que usei, a memória RAM quase não aumentará mais, o que é muito importante. Ou seja, mesmo que você acrescente mais Tabelas de código RAW para outros comandos do AR Condicionado (por exemplo: aumentar ou diminuir a temperatura, etc), ou então acrescentar outras Páginas HTML (mesmo que sejam mais sofisticadas), a memória RAM disponível continuará quase a mesma.

      Veja como era o resultado da compilação no código original que vc postou:

(clique na figura para "zoom")

      Agora veja como ficou o resultado após os ajustes que fiz no seu código:

(clique na figura para "zoom")

      Então vc só precisará continuar a usar a mesma técnica, e a memória RAM vai continuar nestes mesmos níveis. Tenha em mente que, pra que este seu código funcione confiavelmente (sem travar nem ter comportamentos estranhos), pelo menos uns 600 bytes de RAM devem estar sobrando quando vc compilar o código. Veja que o código que ajustei, estão "sobrando" 1474 bytes de RAM. Logo se vc mantiver a técnica, será tranquilo manter seu código funcionando de forma confiável (como eu disse, mesmo com mais comandos RAW, ou com mais Páginas HTML).

      Esta quantidade de 600 bytes livres necessários para execução confiável, eu calculei com base nas alocações dinâmicas (uso de memória) que são feitas quando seu código é executado (cada programa terá uma necessidade diferente).

            No entanto Paulo, tenho que ser sincero com vc em relação ao restante do seu código. Ele está com uma lógica muito ruim. É preciso mudar essa lógica, se vc quer que seu código tenha uma vida útil maior. Além disso, do jeito que está, fica praticamente inviável fazer qualquer coisa mais elaborada nele. Se vc manter com essa lógica atual (eu chamaria de "lógica travada"), qualquer coisa a mais que vc faça no código, vai ser difícil que vc consiga que funcione direito (e se conseguir, provavelmente vão aparecer diversos efeitos colaterais meio malucos).

      Então minha sugestão é alterar essa lógica. Eu ainda não fiz isso, pois ainda não está muito claro como vc quer que o programa funcione.

      Me explique melhor como seu programa deve funcionar, e então eu implementarei uma lógica simples e confiável, de forma que vc possa entender e assim fazer suas próprias alterações.

      Caso vc não deseje isso, então eu postarei apenas o código ajustado, com a redução do uso de memória. Mas eu aconselharia que vc me permitisse mudar a lógica, pois seria o melhor a fazer (e de mais bom senso também).

      Abrçs,

     Elcids

Elcids, 

Obrigado pela ajuda e me desculpe pela demora em responder.... precisei passar uma semana tratando de outros assuntos. 

Realmente estou tentando aprender como fazer as coisas e podem existir falhas em meu código. Vou te descrever a aplicação:

Este dispositivo vai garantir que o ar condicionado se mantenha ligado na sala do servidor. Existe um gerador que entra em ação caso haja um queda na energia, mas sempre que a queda ocorre, o ar condicionado "percebe" a queda na energia e fica em "stand-by".

Acredito que o arduino tb seria reiniciado nesta situação... por isso coloquei no setup para desligar e em seguida ligar o ar condicionado. O tempo de 8 segundos foi o que julguei necessário para dar tempo do ar condicionado desligar e voltar a ligar.

Outro recurso que estou usando é que, caso a temperatura suba acima de um certo valor, o arduino envia comandos de desligar e em seguida ligar o ar (se a sala ficar quente, é sinal de que o ar condicionado não está funcionando)... feito isso, preciso dar um certo tempo para que a sala esfrie, senão o arduino ficará desligando e ligando o ar condicionado o tempo todo... 

Mais uma vez, desculpe a demora... Você tem toda minha gratidão pela disponibilidade em ajudar.

Olá Paulo.

      Eu imaginei que era algo parecido com o que vc descreveu, mas tinha que confirmar com vc.

      Praticamente concluí o ajuste do seu Sistema.

      Sobre o controle do Ar, no seu código, já tem o controle pra ligar o Ar após algum tempo sem comando e se a temperatura está acima de um valor limite máximo. Mas não tem nada relacionado a uma temperatura limite mínima.

      Então pensei em acrescentar uma "histerese", semelhante ao que ocorre com uma geladeira, ou seja, se a temperatura atinge o limite máximo, o Arduino liga o Ar, e se ela atinge um valor mínimo, o Arduino desliga o Ar. Logo o Arduino controla o Sistema de forma a manter a temperatura ambiente dentro de uma faixa (por exemplo: entre 23 e 28 graus). Claro, talvez o Ar já tenha essa função, mas posso também colocar uma forma de se desligar essa característica, caso ela não seja desejada. Que acha?

      Tenho mais uma questão. Sobre a parte que controla pela Página HTML, ali pode-se desligar ou ligar o Ar, que é a forma principal de controle que o usuário tem. Neste caso, quando se vai ligar, vc não acha que precisaria também de ter o intervalo de 8 segundos? Ou seja, quando o usuário clica em ligar, não seria melhor enviar pelo Controle IR o comando desligar, esperar 8 segundos, então enviar o comando ligar?  Isto não seria uma forma mais confiável, uma vez que vc disse que o Ar pode ir pra standby ?

      Fico no aguardo,

      Abrçs,

      Elcids

Elcids, 

Como te falei no privado, neste primeiro momento eu não precisaria me preocupar com temperatura mínima. Preciso apenas garantir que o ar fique sempre ligado.

Sobre o comando "html" de ligar, vc esta certo: Seria mais confiável se fosse enviado um comando de desligar e apos uns segundo o comando de ligar...

Grato

Ah, sobre a segunda questão, talvez possa ser feito de outra forma mais confiável:

      Quando se clicar em ligar, poderia-se enviar pelo Controle IR, o comando "ligar" mais de uma vez (em intervalos que vc escolhe, tipo 1 segundo, 2 segundos, etc). Neste caso, vc define no código, quantas vezes o comando "ligar" seria enviado (1, 2, 3, etc). Claro, antes de se enviar o primeiro "ligar", envia-se o "desligar", espera-se 8 segundos, e então envia-se o "ligar" a quantidade de vezes definida no código. Que acha?

      Abrçs,

      Elcids

Sim, muito bom. Vc consegue entender muito rápido o meu objetivo e consegue propor melhorias que eu nem havia pensado....  podemos enviar mais de uma vez para aumentar a chance de funcionar corretamente... O controle de temperatura que incluí foi justamente pq não temos como saber se o ar esta funcionando.... ninguém fica nesta sala... então se a sala esquentar é pq o ar não está funcionando.

Fico aguardando. Grato

Grato.

olá Paulo.

 

      Estou publicando a implementação do seu Sistema para o Controle do Ar-Condicionado.

      O Sistema foi testado em um Arduino UNO (que tem as limitações de memória RAM que estavam causando sua dor de cabeça).

      Procurei deixar o Sistema o mais flexível possível, de forma que vc pode facilmente alterar os parâmetros conforme deseje (falarei sobre isso mais adiante).

      O resultado final do uso de memória, pode ser visto na figura a seguir:

 (clique na figura para "zoom")

       Como pode ver, o uso de RAM está em 581 bytes (28% do total). Note que "sobram" 1467 bytes e isso é muito importante, pois o Sistema precisa de pelo menos uns 800 bytes livres (anteriormente eu tinha dito 600, mas redimensionei e recalculei, chegando a esse novo valor). Então ele executará sem falhas de estabilidade (as quais poderiam fazer o Arduino reiniciar ou funcionar de forma "estranha").

 

      Note também, que a memória de código está usando 18476 bytes, ou seja 57% do total do Arduino UNO. Assim está sobrando mais de 13k bytes de memória de código. Com isso, vc poderá acrescentar outras características mais sofisticadas à sua página HTML, ou mesmo acrescentar mais páginas (muitas mesmo). Ou então acrescentar outras funcionalidades (se fizer isso, NÃO use o "delay" do Arduino, pois este é um Sistema de "tempo real", e o "delay" usado em qualquer lugar irá corromper as temporizações!!!).

 

      Sobre esta questão das páginas HTML, há uma funcionalidade marcante neste Sistema: criei um Mecanismo que permite facilmente a utilização e o gerenciamento de diversas páginas HTML (inclusive "encadeadas", tipo página "pai", página "filho", etc). Este Mecanismo (vamos chamá-lo de "Gerenciador de Páginas"), já está sendo usado neste Sistema, embora ali atualmente só exista uma página (a da Interface de Controle do Ar). Inclusive testei o Mecanismo também no ESP8266 e no ESP32.

      O Mecanismo é extremamente simples de usar, mas bastante "sofisticado". No código (além dos arquivos de "include"), há descrições que auxiliam a entender o Mecanismo e seu uso. Se vc vier a tentar usar este Mecanismo para gerenciar mais páginas HTML, e não entender como isso deve ser feito, pergunte e eu postarei um exemplo.

  

      Sobre o funcionamento do código, ele está exatamente como vc descreveu antes, inclusive com aquelas funcionalidades relacionadas ao controle de ligar o Ar-Condicionado. Por exemplo: quando se deve ligar o Ar, o Sistema sempre envia o comando "desligar" pelo Controle IR, aguarda um tempo (neste caso os 8 segundos que vc estabeleceu), então envia o comando "ligar". No entanto, os comandos enviados pelo Controle IR, são repetidos "n" vezes, e atualmente "n" = 3 no código. Assim quando o Ar tiver que ser ligado, a sequência que o Sistema fará será essa:  envia 3 vezes o controle IR "desligar", espera 8 segundos, então envia 3 vezes o controle IR "ligar". Claro, entre os 3 envios consecutivos, há também um intervalo de tempo, que atualmente está em 2 segundos. Você pode facilmente alterar qualquer desses parâmetros, pois eles estão definidos no início do código, todos identificados (não tenha preguiça de ler!!!).

 

      Ainda sobre o funcionamento, existe um controle da Temperatura Mínima, exatamente como aquele da Temperatura Máxima que vc já tinha implementado. Mas este controle pode ser facilmente desabilitado. Para isso basta alterar o #define do valor "habilita_TEMP_min", que está definido no início do código. Se vc colocar "1", habilitará o controle. Se colocar "0", desabilitará. Claro, se vc desabilitar este controle, automaticamente não terá mais efeito o valor "TEMP_min" que especifica qual é a Temperatura Mínima.

 

      Logo no início do código, existem várias observações importantes. Leia estas, pois são muito relevantes. Por exemplo, sobre como devem terminar as Tabelas com códigos "RAW".

  

      Existem inúmeras características novas implementadas no código, mas não dá pra falar de todas aqui, pois isto alongaria demais a coisa.

      Mas há uma delas que é bem interessante ao menos mencionar:  para aquele controle "doido" do Ar (que descrevi acima), implementei uma Máquina de Estados, pois esta é a forma mais simples e confiável de fazer. Não vai dar pra falar sobre os detalhes aqui, mas vc pode ver como a Máquina funciona através do Diagrama de Estados, que está na figura a seguir:

(clique na figura para "zoom")

 

      Além de ser confiável e simples de implementar, A Máquina de Estados tem outra característica muito relevante: é possível facilmente e rapidamente alterar seu funcionamento, caso se deseje isso. Uma curiosidade: primeiro fazemos o Diagrama de Estados, e depois que ele está "ok", basta segui-lo pra poder implementar a Máquina de Estados.

  

      No código, deixei a possibilidade de se habilitar um "Debug" do Sistema. Você pode habilitá-lo se quiser, alterando o valor do "SYS_DEBUG_ON". Ele é o primeiro #define logo no início do código. Colocando "1" habilita o Debug. Colocando "0", desabilita. O importante é saber que usei para o Debug, a Serial padrão do Arduino, e quando a Serial é usada (Debug habilitado) então ela já consome cerca de 200 bytes da memória RAM. Então no seu caso Paulo, acredito que vc não vá querer habilitar o Debug. Mas Debug usamos para desenvolvimento e testes, então não precisa estar habilitado no uso final.

      O #define do Debug é usado também nos arquivos de "include", por isso no código este #define tem que estar antes dos "includes".

  

      Também testei a página HTML atual. A que eu deixei é simples, e vc pode ver a "carinha" dela na figura a seguir:

(clique na figura para "zoom")

 

       Claro, como o código está totalmente organizado e fácil de mexer, você poderá alterar a página HTML facilmente. Mas siga a técnica que usei, pois isso é absolutamente necessário para não consumir a memória RAM. É fácil seguir a ideia, basta olhar com atenção. Senão vai voltar sua dor de cabeça por causa da falta de memória.

  

      Segue o código:  AR_Cond_Varjal_02.zip

 

      Nota: a pasta que tem o Diagrama de Estados, não é usada na compilação. Ela está ali apenas para documentação.

  

      Caso tenha alguma dúvida ou comentário, não deixe de postar aqui.

 

      Abrçs,

      Elcids

 

Elcids, Agradeço muito por toda a ajuda. Sei que vc teve que gastar algumas horas de seu tempo para me ajudar com este código. Testarei e tentarei entender tudo que vc fez no fim de semana. Espero poder te retribuir um dia. Abraço.

ok Paulo.

      A forma de vc retribuir, é ler com atenção as orientações que coloquei no post anterior. Claro, provavelmente vão ter coisas que poderão ser tecnicamente mais inacessíveis. Mas procure seguir rigorosamente minhas orientações.

     Se tiver alguma dúvida, não vá pela sorte. Pergunte aqui.

     Abrçs

     Elcids

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço