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: 3302

Responder esta

Respostas a este tópico

Bom dia Varley, 

Meu tutorial sobre Controle remoto IR é para Arduino, mas acho que poderá ser útil para você entender como funciona:

http://blog.eletrogate.com/guia-completo-do-controle-remoto-ir-rece...

olá Varley, novamente.

      Aparentemente, vc já resolveu a questão com a ajuda do RV.

      Mas caso queira ver como reduzir o uso de memória RAM do seu código, ajustei o mesmo para que tivesse um uso adequado da RAM.

      Seu código original estava usando 9757 Bytes, o que impedia a execução do mesmo.

      Após o ajuste que apliquei,  passou a usar 1074 Bytes, conforme vc pode ver na figura a seguir, que mostra o resultado da compilação:

(clique na figura para "zoom")

      Também organizei o código, porque, santa bat-caverna, estava um tanto bagunçado.

      Mas há algumas coisas esquisitas no seu código, como o fato de que uma enormidade de sinais estão definidos para o mesmo pino do Arduino, no caso o pino "9". Mas não alterei isso, pois afinal vc é quem deve saber quais o pinos "reais" que está utilizando no seu Sistema.

      Uma coisa importante:  no "setup" vc não está setando o estado inicial dos diversos sinais de controle. Aconselho fazê-lo, principalmente porque há controle de Relés envolvendo potências consideráveis, e assim evitando estados espúrios no "startup" do seu Sistema.

      Segue o código ajustado:    Automacao_01.zip

      Observação:  caso venha a usar o código ajustado, ao alterar ou adicionar Tabelas com códigos "RAW",  veja que obrigatoriamente as Tabelas devem terminar com o valor "-1". Nas Tabelas já existentes no código ajustado, eu já acrescentei o "-1" ao final de cada Tabela. 

      Claro, confira se a lógica do seu programa está ok, pois embora eu tenha ajustado todo o código, eu não alterei a lógica de funcionamento do mesmo. Mas aparentemente ela está ok. Mas eu não testei, uma vez que não tenho o Hardware aqui pra isso.  (e confira se seus códigos RAW estão ok)

      Espero que as técnicas que usei para economia de RAM, sejam uteis pra vc e garagistas que queiram aprender sobre isso.

      Abrçs,

      Elcids

Boa Noite Elcids primeiramente muito Obrigado novamente pelo força agradeço muito eu ainda não tenho um curso de programação nem nada faço e pesquiso tudo na curiosidade é por isso que em muitas coisas tenho dificuldades de entender mas claro coisas que eu nunca vi, então eu sempre dou uma pesquisada sobre tal coisa para entender e poder modificar sem problemas.

Bom você citou sobre o monte de pinos 9 selecionados, o macete que recebi para poder usar mais do que um LED Infravermelho era usar o + do LED IR na porta 9 que é a única que faz o envio de comandos IR e o - do LED IR ligar em alguma outra porta PWM fazendo assim o envio do código pela porta 9 e o acionamento do LED IR em outra porta PWM.

O meu caso vou ter que fazer controle de 4 AR-Condicionado os quatro da mesma marca e se eu fosse usar 4 LED IR na mesma porta 9 obviamente os 4 AR iria receber o comando ao mesmo tempo então foi essa a solução que consegui achar para poder controlar mais de um AR-Condicionado usando uma porta de comando e outra de ativação.

Eu consegui a solução com o RV, e vi que você fez o que eu queria fazer e não sabia como, converter da memoria RAM para a FLASH vi que é uma coisa bem mais complexa do meu entendimento mas em logo cedo vou entender tudo isso no código e poderei usar e modificar sem problemas.

Muito Obrigado a todos pela ajuda admiro muito esse fórum colegas sempre ativos para ajudar os mais leigos como eu sempre atentos novamente Obrigado a todos.

OBS: Sobre o -1 nas tabelas eu esqueci de retirar os negativos do RAW e acabei colocando eles no código,  são sem os negativos mesmos rs.

oi Varley.

      Como vc manifestou interesse na técnica que utilizei para reduzir o uso de memória RAM do seu código, fiz um "upgrade", onde o uso de memória resultou ainda menor.

      Mas o objetivo principal neste upgrade, não foi apenas a redução do uso da memória RAM, uma vez que na primeira versão já havia alcançado uma redução imensa. Nesta nova versão, o foco principal é justamente uma técnica de parametrização na execução dos comandos, que após "parametrizados" são reunidos em uma Tabela de Comandos. Isto simplifica tremendamente a criação de novos comandos, ou mesmo a alteração de parâmetros dos comandos já existentes. A parametrização em si, é extremamente simples, consistindo na enumeração dos parâmetros dos comandos empregados nos diversos "if else if" existentes na função "processa_COMANDO". Para facilitar o processo e a própria construção do programa, uma estrutura chamada "CMD_exec_info" foi criada, a qual reúne todos os parâmetros usados nos comandos "AR" e "Temperatura". A Tabela de Comandos nada mais é do que uma lista com elementos "CMD_exec_info", ou seja, com os comandos existentes no seu Sistema.

      Com isso, todos os "if else if" foram eliminados, simplificando o código. No lugar, um loop "do...while" procura na Tabela de Comandos, o comando atual recebido. Se um comando valido é encontrado, o comando é "extraído" da Tabela e então executado.

      A mesma ideia pode ser estendida para quaisquer outros Sistemas, e quaisquer tipos de comandos. Em específico, observe a técnica de marcação do fim da Tabela de Comandos, o que é necessário para o funcionamento correto do processo. No caso do seu programa, essa marcação foi feita com uma string (a string "fim_da_tabela"), uma vez que era conveniente. Mas qualquer tipo simples da linguagem C pode ser utilizado. Veja que para simplificação, o tipo dessa marcação deve coincidir com o tipo do primeiro elemento da estrutura "CMD_exec_info" (e por esse motivo, neste código utilizei o tipo string).

      Como resultado da técnica empregada, este último código usou apenas 602 bytes de RAM. Mas o próprio uso da Flash foi reduzido em relação ao código anterior (de quase 40k bytes para 36k bytes), e isso é alcançado devido à inclusão dos parâmetros na Tabela e consequente eliminação da enorme quantidade dos "if else if".

      Na figura a seguir vc pode ver o resultado da compilação:

(clique na figura para "zoom").

      Segue esta última versão:   Automacao_02.zip

      Sobre os pontos que vc mencionou, segue estas considerações:

      1) sobre a questão dos diversos "9" nos "defines" dos sinais, após vc ter esclarecido o objetivo, ficou claro o motivo da repetição do "9". É importante que vc procure fornecer informações desse tipo, pois isso facilita que te ajudemos com mais precisão. Eu não tinha percebido o motivo dos "9" (não dei muita atenção pois fiquei concentrado na questão da memória), mas se soubesse antecipadamente, provavelmente eu utilizaria alguma técnica para tornar o código mais versátil em relação a estes "defines" em específico.

      2) sobre os valores negativos nos códigos "IR", por exemplo o valor -480, claro não é o mesmo que 480. Mas basta que os códigos sejam os corretos para cada comando desejado. Em Sistemas Digitais na realidade não existem valores negativos. Eles existem apenas na interpretação humana, sendo "emulados" com a técnica de "complemento de 2". Em outras palavras, qualquer número binário negativo, na realidade corresponde a um número positivo, e quando a máquina faz os cálculos, parece para nós que existem resultados também negativos. Mas é pura representação. Para o exemplo do -480, no Arduino o número real é o 65056, que é o resultado de 65536 - 480, ou ainda 2^16 - 480 (2 elevado a 16, menos 480). Assim quando a máquina faz cálculos com o número 65056, parece para nós humanos que ela está usando o número -480Mas claro, esse já é um assunto para quem estuda estes Sistemas.

     3) independente da questão dos códigos IR negativos que vc usou, observe que os valores "-1" que me referi, são o valor do último código IR que deve estar na lista de cada comando IR. Isto é apenas necessário nas versões que eu ajustei, e portanto Varley não tem necessidade na versão original que vc postou. O importante é vc observar que caso venha a usar a versão que ajustei, é obrigatório que coloque o valor constante "-1" como sendo o último código na lista de cada comando. Sem isso o programa não consegue determinar o total de códigos em cada lista, e portanto não funcionará. Ou seja, a constante "-1" é uma marcação do fim da lista.

      Nota importante: no post anterior esqueci de comentar, que apesar de ter "sobrado" muita memória RAM, o uso dessa "sobra" jamais deve ser indiscriminado, ou "de qualquer jeito". Veja por exemplo a rotina "irsend_RAW_ROM":  durante sua "existência" (que é apenas enquanto ela está sendo executada), ela aloca na memória RAM um vetor de 500 elementos "int", o que permite armazenar até 500 códigos RAW, o que necessita de 1000 bytes de RAM. Este vetor é alocado no "Stack" da CPU (uma região "especial" da RAM). Quando a rotina termina, este espaço é liberado para ser utilizado por outras rotinas e pelo Sistema do Arduino. Mas se estivesse sobrando por exemplo apenas 800 bytes da RAM, não seria possível alocar os 500 elementos quando a rotina iniciasse, e isso provocaria um "crash" no seu Sistema, devido à corrupção de outros dados na memória. Esse "crash" pode ser desde um funcionamento anormal do Sistema (praticamente impossível de prever exatamente o que ocorreria), até um travamento do Sistema e eventual reinício do Arduino (semelhante a um reset da CPU).

      Logo, conheça seu Sistema, e saiba preservar a memória da forma necessária para o seu Sistema funcionar corretamente.

      Espero eu não ter esquecido de mencionar algum ponto significativo. Mas se esqueci e lembrar, irei mencionar aqui. Caso vc tenha alguma dúvida, também não deixe de perguntar.

      Abrçs,

      Elcids

Agora eu entendi como foi que você fez bem interessante eu fiquei até surpreso quando vi pela primeira vez o tanto de bytes na RAM que economizou.

Hoje fui para a loja e fiz o teste com o AR-Condicionado eu captei o código em HEXA porém quando vou alterar a codificação no código da própria biblioteca IRremote ele da esse erro: 'class IRsend' has no member named 'sendUNKNOWN'

Na TV funcionou perfeito a codificação dela foi da "SAMSUNG" agora a do AR deu "UNKNOWN" já tentei pesquisar sobre o erro mas não consegui resolver.

Caso o HEXA não funcionar vou usar o código que você alterou.

oi Varley.

      Claramente, vc usou como base o exemplo "IRsendDemo.ino"  da pasta "examples" da biblioteca "IRremote".

      Mas santo deus, Varley. De onde vc tirou esta função "sendUNKNOW" ???

      Mas aqui vai um palpite:  ou vc pegou em algum exemplo dos milhões espalhados por aí, ou alguém te disse em algum chat para usar essa função.

      Ocorre Varley, que este erro é um "erro em tempo de compilação", e isso não tem nada a ver com ser "Samsung", ou "Sony", ou "Ar-Condicionado".  Aqui fica bem claro que vc está bem cru na plataforma do Arduino, e na verdade em programação.

      Vou te dar uma dica:  mesmo que vc não domine a coisa, não tente fazer as coisas funcionarem na base da força, ou da sorte. Ao invés, gaste alguns pouco minutos (e são poucos mesmo), pra aprender o básico, a filosofia por trás da plataforma. Depois e logo em seguida, aprenda também sobre Lógica de Programação (também fácil e com poucas horas de dedicação). E sempre comece com exemplos simples.

      Neste momento, você está tentando fazer a coisa funcionar na base da força e tentativa, e também na sorte. Corra disso, se vc quer realmente aprender. E olha, não é difícil, e com todos os recursos da internet, só depende de vc.

      Novamente sobre o erro:   simplesmente o Compilador do Arduino não encontrou nas bibliotecas, nenhuma função (ou "método"), com o nome "sendUNKNOW". Como ele não encontrou, não pode continuar a compilação e aí ele pára o processo, e te avisa sobre o que ocorreu.

      E só vc e Deus são os que sabem de onde vc tirou essa função "sendUNKNOW".

      Então mais uma vez:   isto não tem nada a ver com o que vc está controlando (Samsung, LG, Ar-Condicionado, etc). E preste atenção no que escrevemos aqui, senão vc não ajuda a si mesmo.

      Abrçs,

      Elcids

Boa noite Elcids, Bom desculpa essa empolgação toda eu realmente estava querendo que o código funcionasse a força mesmo e vi que não é bem assim então resolvi dar uma pesquisada sim sobre Lógica de Programação e realmente a lógica é tudo na programação.

Bom estou dando uma estudada para poder entender 100% do código que você alterou pra eu conseguir modificar e/ou acrescentar algo a mais sem problemas.

A respeito do Código que lhe mandei com o erro do "sendUNKNOWN" não tirei de lugar algum é por que no "send" logo a sua frente você coloca a codificação por exemplo cada controle aparece uma codificação como mostra a imagem abaixo.

Eu fiz o teste com alguns equipamentos e consegui por exemplo a codificação "SAMSUNG" e coloquei a frente do "send" ficando assim "sendSAMSUNG", dai pra frente compilei e funcionou bem quando fui colocar o "UNKNOWN" ele deu o erro e é por isso que fiquei meio perdido no por que os outros funcionavam e esta codificação "UNKNOWN" não.

Mas Obrigado pela atenção dicas e pela alteração no código aquilo me ajudou muito vou estudar sobre tudo isso que você disse para poder sair do modo digamos Automático.

ok Varley.

      Mas como eu disse antes, e vc agora percebeu, as coisas aqui não costumam funcionar na base da tentativa. Eventualmente poderá dar sorte e funcionar, mas esse não é um caminho seguro. O melhor é saber o que se está fazendo e o que precisa ser feito.

      No seu caso, não adiantou seu "chute" de colocar o "UNKNOW" na frente do "send", porque não existe um função (ou "método") na biblioteca do IR que tenha o nome "sendUNKNOW".  Existe para outros como vc viu (Samsung, NEC, Sony, etc). Mas não existe para o "UNKNOW".

      A lista que vc me mostrou na figura, eu já tinha visto, e se trata de uma função que permite exibir a identificação do Fabricante do código que foi identificado quando vc usa o Arduino para "clonar" os códigos de um Controle Remoto qualquer. Apenas isso. Mas se ele não conseguir identificar quem é o Fabricante, então ele informa que é "UNKNOW",  indicando que não identificou.

      Espero ter esclarecido.

     Abrçs

     Elcids

Bom dia, tentei entender mas está muito complexo para mim... Seria possível me ajudar mais um pouco?

Tenho noções gerais para o projeto e até já funcionando, mas não sobrou espaço na memória para colocar nem os botões html (tive que colocar links em texto).... quero apenas liberar memória para melhorar o html....

Preciso controlar apenas UM ar condicionado... Ligar e Desligar (equivalente ao Olá mundo, kkk)... sem necessidade de conectar tantos pinos, como o caso dele... Um emissor de IR no Arduino UNO, pino 3 (Uso o W5100). 

PS: no link Automacao_02.zip, as Guias de "ROM_types" e "TAB_RAW" estão definidas para a versão 01 e cho que deveria ser 02:


#ifndef _TAB_RAW_01_h_ // garante processamento unico.#define _TAB_RAW_01_h_

e

#ifndef _ROM_types_01_h_ // garante processamento unico.#ifndef _ROM_types_01_h_ // garante processamento unico.#define _ROM_types_01_h_

Vou postar meu código...

Anexos

olá Paulo.

      Irei analisar o código que vc postou, e se for possível, ajustarei o mesmo pra conseguir o que vc precisa.

     Abrçs,

     Elcids

Obrigado. Já fico te devendo só pela boa vontade. Informações que não passei antes, uso um DHT11 no pino 5, lendo apenas a temperatura e conecto à rede com o W5100. Tudo funciona.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço