Boa noite, ainda na batalha, porém agora estou precisando do apoio dos amigos para me ajudarem a resolver esse problema.

Tenho um código que roda perfeito utilizando o arduino Mega com a Ethernet shield W5500.

Porém preciso que o mesmo código rode na Ethernet shield ENC28J60 usando o arduino Nano.

Já tentei algumas bibliotecas, mais sem exito, pois compila mais sobrecarrega a memória do arduino nano, assim não tem espaço para trabalhar o loop na parte referente a String LINE. Segue em anexo o código, agradeço por qualquer apoio.

arduino_mega.ino

Exibições: 1115

Responder esta

Respostas a este tópico

olá novamente Thomaz.

      Esta questão é a mesma do seu tópico anterior, este aqui:  "Ethernet Shield (Ajuda)"

      Eu analisei este seu último código, e então o "ajustei", de forma que ficasse mais coerente. Mas eu  não alterei  a lógica de funcionamento.

      Então eu compilei para o Arduino Nano, e obtive um excelente resultado no uso da Memória RAM, de forma que agora o código é certamente viável para uso com o Ethernet Shield e o Nano.

      Para comparação, veja o resultado da compilação do seu código original para o Nano, conforme mostrado na figura a seguir:

(clique na figura para "zoom")

      Como se pode ver,  1294 bytes (63%) da Memória RAM  estão sendo usados imediatamente.

      Agora veja o resultado da compilação do código que eu "ajustei", conforme mostrado na figura a seguir, também para o Nano:

(clique na figura para "zoom")

      Com esse "ajuste", apenas 621 bytes (30%) da Memória RAM estão sendo usados imediatamente.  Ou seja, uma economia de mais de 50% de Memória RAM  em relação ao código original.

      Mas não estou publicando o código aqui, pelo seguinte motivo:  seu código original é um tanto "nebuloso", e diversas coisas esquisitas estão nele.  Se vc se comprometer em esclarecer estes pontos "nebulosos", então eu publicarei o código ajustado.  Isto pode parecer uma imposição não altruísta,  mas não é isso. É porque alguns dos ajustes que fiz foram nas tais partes nebulosas,  e preciso confirmar que estes ajustes não terão efeitos colaterais indesejados. E essa confirmação só pode ser feita por vc Thomaz.

      Estas "confirmações" seriam feitas na forma de vários questionamentos sobre o código.

      Se vc concordar em fazer essas "confirmações", então eu ficarei seguro em publicar o código "ajustado".  Mas lembre-se:  eu que direi se uma confirmação sua foi satisfatória.

      Aguardo sua posição,

      Abrçs,

      Elcids

Bom dia   Elcids, com certeza estou no aguardo para qualquer explicação para que e onde será usado o referido código.

att, Thomaz

Ok Thomaz.

      Mas  não  é necessário vc dizer algo sobre o que se refere o código, e nem sobre onde ele será usado. Os questionamentos são  sobre o funcionamento "interno" e sobre como está implementado este código.

      Então vamos aos questionamentos. Eu estarei enumerando os mesmos, e assim peço que vc se atenha e se refira a esta numeração pra evitarmos confusões e conclusões incorretas. Segue então:

      1)  nos ajustes que fiz para reduzir o uso da RAM, há alguns que exigem mais conhecimento técnico.  Mas além destes mais técnicos,  há também alguns ajustes que são bastante simples e conhecidos mesmo por quem não é especialista (e na internet amplamente divulgado). Então pergunto:  por que vc mesmo não fez estes ajustes simples?

      2)  sobre o código que vc postou aqui (o de nome "arduino_mega.ino"),  ele está completo, ou falta alguma parte que vc teve que retirar (independente do motivo) ?

      Justificando o motivo da questão "2":  alguns dos ajustes que fiz, poderão ter impacto caso esteja faltando alguma parte do código. E quero evitar publicar aqui um código desalinhado com o funcionamento esperado, e que cause ainda mais problemas.  Mas não  preciso saber qual é a aplicação real. Mas gostaria de ter mais confiança de que o código que ajustei está completo e não terá efeitos colaterais indesejados.

      Depois destas duas questões, irei postar outras, mais específicas sobre o código. A maioria é sobre coisas esquisitas  que "alguém" fez lá, e acabaram ficando sem sentido no código original que vc postou.

      Abrçs,

      Elcids

RESPONDENDO:

1 - Falta de conhecimento para alterar a RAM.

2 - O código esta completo. Das linhas 94 a 104 não irei usar pois de todo o código só preciso saber o nível de (db). Este por sinal fica na posição 13 da string que é recebida do modem tratada para que eu possa saber se a antena parabolica de intenet via satelie esta totalmente apontada, uso em um Motorhome.

Essa informaçao eu consigo ver pelo browser digitando o ip/status do modem (192.168.100.1/index.cgi?page=modemStatusData HTTP/1.1")

Este meu projeto é de uma antena robotizada.

Faltam muitos bytes ?
Eu recorreria a um ESP32 sem sombra de duvida. Sobra recurso... 
Mas uma dica para economizar memória seria essa:
Use:
client.println(F("GET /index.cgi?page=modemStatusData HTTP/1.1"));
Esse F() é isso:
https://www.baldengineer.com/arduino-f-macro.html
Vai te salvar alguns bytes de RAM.

Valeu pela dica Eduardo, aprendendo dia a dia com os amigos. Muito Boa a explicação do site.

olá Thomaz.

      Esta "otimização" com a Macro "F()", é uma das partes "básicas" que mencionei no questionamento "1". Dependendo do caso, esta otimização resolve. Mas não é bem esse o seu caso, uma vez que para seu código original, não será tão grande a economia de RAM  com a Macro "F()".

      Estou publicando num post mais à frente, duas implementações para seu Sistema. Dê uma olhada.

      Abrçs,

      Elcids

olá novamente Thomaz.

      Uma vez que vc afirmou (em resposta ao meu questionamento "2") que seu código original  postado está completo,  resolvi não me preocupar com as coisas esquisitas  que estavam no seu código original. Então eu simplesmente removi algumas daquelas coisas que não tinham efeito no código, e deixei outras casos vc as use em algum momento.

      Fiz duas implementações (ou "versões").

      A primeira versão (de nome "Nano_Ether_02"),  usa a técnica de localização do Parâmetro "db"  exatamente  como no seu código original.  Porém eu não gostei dessa técnica, pois ela usa bem mais Memória Alocada  durante a execução, o que aumenta o risco de um "crash" entre o "Heap" e o "Stack" do Arduino (o que seria catastrófico para o Sistema).

      A segunda versão (de nome "Nano_Ether_03"), eu usei outra técnica para localização do Parâmetro "db", que além de mais eficiente em termos de execução, usa bem menos Memória Alocada (durante a execução) que a técnica original. E assim com esta "nova" técnica, se reduz muito a possibilidade de problemas com o "Heap" do Arduino.  Mas para implementá-la, eu tive que deduzir a formatação da string retornada pelo Server (o que foi uma tarefa até bem simples). Então se eu acertei na dedução da formatação, e não cometi nenhum erro "besta" na implementação,  esta versão deve funcionar bem melhor (com mais eficiência em execução e uso da RAM, embora durante a execução isto não seja percebido por quem observa "do lado de fora").

      Segue a  primeira versão:    "Nano_Ether_02.zip"

      Segue a  segunda versão:    "Nano_Ether_03.zip"

      Assim concluindo pelo que expliquei acima,  é preferível  que vc use a segunda versão, a de nome "Nano_Ether_03".

      Alguns comentários adicionais:

      a)   eu não "gostei" do uso do "Ethernet.begin( mac )" dentro do "loop" do Arduino. Isto porque se esta função estiver alocando alguma memória no "Heap" (o que eu não analisei se ocorre),  isto poderá causar um "crash" no Sistema  após algum tempo.  Mas não me preocupei em investigar isso, pois acredito que vc já tenha deixado o Sistema funcionando por um bom tempo sem ocorrer problemas.

      b)  acredito que vc tenha otimizado as conexões de Hardware (as ligações) entre o Nano  e o Ethernet Shield. Lembre-se:  nem todos os pinos do Ethernet Shield  precisam estar conectados ao Nano (a não ser que vc queira fazer uma "extensão" completa dos pinos do Nano).

      c)  uma sugestão:  depois que estiver funcionando como vc espera,  acrescente um módulo Bluetooh HC-05  ao Sistema (o que é simples de fazer em Hardware e Firmware).  Com isso,  vc pode visualizar os dados a partir de um Smart Phone  usando um APP  de Terminal Bluetooth (uma sugestão é este aqui do Kai Morich que já usei muito em testes:  "Serial Bluetooth Terminal"  ), e assim dispensando que o Nano  esteja conectado a um Computador  via  USB.

      Ah, eu vi que vc é muito "conectado", pois logo que postei aqui, vc já percebeu o email de aviso do LDG e já foi ver o que era.  

      Aguardo seus testes.

      Abrçs,

      Elcids

Boa tarde,

realisei os testes, as duas versões só apresenta no monitor serial:

Desconectado na Rede Local

Para o ENC28j60 eu acho que essa biblioteca Ethernet não funciona.

olá Thomaz.

      A implementação é para o Nano com o Ethernet Shield  convencional.  Veja logo no início do código:

      É possível usar com o ENC28j60, porém é preciso acrescentar a LIB do mesmo, e verificar se as funções são compatíveis. Posso fazer isso, mas seria bom antes testar com o Ethernet Shield  convencional, para ter certeza de que está operando Ok (aqui eu não tenho como testar, pois não tenho o tal Modem).

      Por favor, não deixe de ler todo o texto que coloquei no post anterior.

      Abrçs,

      Elcids

Boa tarde Elcids,

consegui por uma biblioteca UIPEthernt para conectar com o modem usando a shield ENC28J60.

Tive que DEBUGAR o codigo para conseguir fazer se conectar.

porém testando com os arquivos que me enviou, não consegue se conectar.

Nano_Ether_03_thomaz.ino

Ainda não sei o motivo da não conexão.

olá Thomaz.

      Analisei algumas bibliotecas para o ENC28J60, e cheguei a algumas conclusões. Dessas conclusões seguem as mais importantes:

      1)  a "EtherEncLib" do Renato Aloi,  é um tanto limitada. Mas ela tem uma grande otimização do uso de RAM, pois usa a RAM interna do ENC28J60, e isso propicia uma imensa economia da RAM do Arduino. Porém, ao analisar as Classes C++  da Biblioteca,  não encontrei evidência da implementação de um Cliente Ethernet. Talvez seja esse o motivo de não haver na Biblioteca, um exemplo com Cliente Web:  aparentemente não há suporte na própria LIB. Além disso esta LIB implementa Métodos "print" que  não  são derivados da Classe "Print" do Arduino, e usar "print" desta forma é algo que eu não recomendo.  Assim, pelo exposto, é bom evitar essa LIB.

      2)  a "EtherCard" do Paul Stoffregen, achei relativamente completa, mas aparentemente ela é bem "pesada" e não tem otimizações. E também, a forma dela funcionar é meio estranha, e parece que destoa das implementações mais objetivas do Arduino. Então se possível, evitá-la.

      3)  a "UIPEthernet"  tem algumas características interessantes:  ela é totalmente compatível com a LIB  Ethernet padrão do Arduino, e seus Métodos "print" são derivados da Classe "Print" do Arduino. Além disso não é muito "pesada", e parece bastante consolidada e confiável, estando inclusive nas páginas de referência do Arduino  (neste link:  "UIPEthernet no arcuino.cc" ). Assim me parece que esta LIB é a escolha mais adequada.

      Sobre seu último post, onde vc fez o "teste" de conexão ao Modem  usando o ENC28J60 e a LIB "UIPEthernet", foi um grande resultado.  Mas não sei porque vc não conseguiu a conexão com os códigos que eu enviei antes,  pois não analisei isso (mas vai um palpite besta:  vc alterou nome da LIB nos includes ? ).

      De qualquer forma, eu já tinha analisado a LIB "UIPEthernet", e fiz a implementação do seu Sistema usando esta LIB.  Como fiz isso com muito cuidado e com uma lógica completamente nova e confiável (inclusive analisei o uso de RAM durante a execução, e é mínimo),  então acredito que irá funcionar de imediato.  Amanhã irei postar esta implementação aqui.

      Mas antes queria solicitar a vc duas coisas:  um teste  com um código que está postado mais à frente,  e  que vc me envie sua LIB "UIPEthernet" para que eu possa ver qual a versão vc está usando e analisar a mesma.

      Sobre o teste que estou solicitando,  segue como deve ser feito:

      -  com o Arduino Nano e com o módulo ENC28J60, conectado ao seu Modem.  A USB  também deve estar conectada, para ver os resultados na tela do Terminal do Arduino (@9600). É importante que vc não altere nada no código relacionado à lógica de funcionamento. Ao executar, são feitos testes de forma repetitiva (ou seja, cíclica),  e cada teste  demora  pouco mais de  5 segundos.  O código avisa quando o teste iniciou e quando terminou (e em seguida inicia um novo teste).

      Por favor, me envie um print da tela do Terminal do Arduino, com pelo menos um ciclo completo do teste. Se vc puder, seria legal vc também selecionar o texto com o mouse e então copiar (só funciona com as teclas control+c) e colar em um arquivo "txt" que vc pode postar aqui como anexo.

      O código para o teste é esse aqui:   "UIP_Modem_check_01.zip"

      Por favor, não esqueça de me enviar a LIB "UIPEthernet" que vc está usando. Preferencialmente, "zip" a pasta onde está a LIB (pois isto preserva as datas dos arquivos), e post aqui o arquivo zipado como anexo.

      Fico no aguardo.

      Abrçs.

      Elcids

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço