ola pessoal, gostaria de ajuda para organizar de uma maneira para o código rodar mais rápido. utilizo a serial0 para ler no monitor, serial1 para enviar aproximadamente 25 variáveis a uma tela nextion e a serial3 para ler dados do gps neo6m. Qd incluo a leitura do gps a exposição dos dados na tela nextion atrasa muito, gostaria de opinião o que fazer para ter uma leitura satisfatória na tela e tb uma boa precisao, pois o km/h e a exposição dos valores dos sensores serão os dados mais  importante  para o projeto.. add um print do monitor sem msm mandar printar nada no serial0 (não sei se é um problema)rec1.ino

Exibições: 1188

Responder esta

Respostas a este tópico

Vc esta usando 9600 nas duas seriais. É obrigatório ? Se conseguir aumente a velocidade. ja ajuda.

Quando vc joga dados na serial existe um buffer. Se ele enche e vc manda mais dados ele espera até serem transmitidos os já na fila pra poder mandar mais.

Certamente boa parte do tempo ele fica só esperando transmitir.

Tente abreviar coisas, reduzir a carga de I/o serial, alem de aumentar o baud rate.

Para o microcontrolador 115.200 vai bem. Para o GPS que não sei se pode/adianta mudar pq dele vc ouve (não fala). 

Alguns gps permitem ajustar os blocos de dados de 0.5 por segundo até 5/segundo.

Vide:

https://learn.sparkfun.com/tutorials/gps-basics/configuring-a-gps-r...

olá Cesar.

      O seu Sistema parece muito legal.

      No entanto há realmente algumas considerações a serem feitas em relação a este seu código "rec1.ino".

      Além destas considerações, eu identifiquei os pontos que estão causando os tais "problemas" que vc mencionou, e vou enumerá-los a seguir, com as respectivas soluções.

      1) a questão da demora/lentidão:  há um problema na funcionalidade da sua função"leGPS ()". Da forma como vc a implementou, a rotina fica em loop por no mínimo 1 segundo (será sempre maior que isto, pois a execução também consome tempo), e durante este período ela fica constantemente obtendo dados do GPS, ou seja, lê estes dados inúmeras vezes consecutivas (na maior velocidade que o Arduino conseguir executar). Obviamente que a grande maioria destes dados não mudará durante este período. Logo, acredito que sua intenção era ler os dados do GPS, a cada segundo, se estes dados estiverem disponíveis.

      Assim, ajustei sua função "leGPS ()" para que tenha este efeito. O ajuste pode ser visto na figura a seguir:

(clique na figura para "zoom")

       Para facilitar a modificação do seu código, "copie e cole" do trecho que preparei, substituindo sua função "leGPS ()" pela alteração que fiz deste arquivo:  "novo leGPS().txt"

      2) a questão dos prints na "Serial 0" do Arduino:  estão ocorrendo porque o "Debug" do Nextion está habilitado. Por default, este "Debug" vem habilitado na biblioteca do Nextion, para que você possa ver o "resultado" das diversas funções sendo executadas. Se vc já se sente seguro com sua interface do Nextion, então vc pode desabilitar este "Debug", o que é aconselhável porque ele consome tempo considerável na execução do código do Arduino (além de memória de código e RAM).

      Para desabilitar o "Debug" do Nextion, proceda da seguinte forma:

            2.1) feche a IDE do Arduino.

            2.2) localize o arquivo "NexConfig.h", que está na pasta onde vc colocou a biblioteca do Nextion. No Windows, a pasta desta biblioteca normalmente fica em C:\Users\myuser\Documents\Arduino\libraries\   sendo "myuser" o seu nome de usuário no Windows. Abra e edite o arquivo "NexConfig.h", usando qualquer editor de texto simples (Wordpad, Notepad, eu uso o Notepad++ que é ótimo).

            2.3) após aberto o "NexConfig.h", comente a linha onde está habilitado o "Debug" do Nextion. Para isto basta colocar um  //  no início da linha, conforme mostro na figura a seguir:

(clique na figura para "zoom")

           2.4) após a alteração, salve o arquivo "NexConfig.h".

            2.5) abra novamente seu código na IDE do Arduino. Acrescente a linha mostrada na figura a seguir, imediatamente antes da linha que contém o  #include "Nextion.h" :

(clique na figura para "zoom")

            Note que esta última linha acrescentada no seu código, também está comentada. Com isso, o "Debug" do Nextion estará desligado. Mas se vc desejar poderá ligá-lo novamente, mas agora diretamente no seu código (não necessitando mais ir até a biblioteca para fazer isso), bastando para isso "descomentar" a linha (ou seja, retirar o  //  no início da linha).

            2.6) recompile e execute seu código no Arduino. Confira no Monitor Serial, que não mais é exibido no mesmo, o texto de "Debug" do Nextion.

     Observe que este procedimento que te passei aqui para ligar/desligar o "Debug" doNextion, está descrito na página do Github do Nextion (do fabricante, a "Itead"). Logo é totalmente confiável.

      Sobre as considerações que mencionei, é quase sempre a mesma coisa aqui no LDG:

      - A sequência de execução do código e funções, está um tanto bagunçada, e poderia ser bastante melhorada.

      - A definição de variáveis e estrutura de dados, pode ser bastante melhorada e otimizada.

      - Há trechos de código que não estão fazendo nada no seu programa (e neste caso, se o Compilador gerar código para estes trechos, vai ficar apenas consumindo tempo de execução, sem uma utilidade real). Há também rotinas (funções) que não estão sendo utilizadas (mas estas o Compilador não acrescenta ao seu código).

      Espero ter ajudado de alguma forma.

      Não deixe de perguntar caso tenha alguma dúvida (mas elabore e elucide bem sua questão, para ajudar no processo).

      Abrçs,

      Elcids

olá mais uma vez, Cesar.

      Se vc fez a implementação que mostrei no post anterior para resolver o problema da "lentidão", é importante verificar se os samples do DHT22 que vc está obtendo, estão ok. Vou explicar porquê.

      Ocorre que o Fabricante do sensor DHT22, especifica que este sensor deve ser lido a cada 2 segundos (próximo disto ou sempre maior que 2 segundos). Caso vc faça leituras a intervalos menores, o Fabricante não garante que esta leitura retornará um resultado correto. Você pode ver esta especificação na figura a seguir : (fonte: "iotbyhvm.ooo" )

(clique na figura para "zoom")

      No seu código original, a "lentidão" que vc relatou, acabava por aumentar o intervalo de leitura do DHT22. Se vc aplicou a sugestão que descrevi no post anterior para eliminar a "lentidão", então reduzirá automaticamente o intervalo de tempo entre uma leitura e a próxima leitura (pois o ajuste torna "fluida" a execução do código). Frente a isso, estaríamos fora do intervalo de leitura que o Fabricante do DHT22 especifica.

      Para que a leitura do DHT22 fique confiavelmente dentro da taxa determinada pelo Fabricante, basta acrescentar uma temporização muito simples no processo de leitura do sensor DHT22. Eu recomendo expressamente que vc faça isso, para estar em conformidade com as especificações do Fabricante do sensor.

      Na sequência, descrevo como vc pode fazer isso de forma muito simples e confiável. Segue a adequação:

      1) na função "loop" do seu código original, remova as 3 linhas de código que fazem a leitura do DHT22. A figura a seguir mostra isso no seu código original:

(clique na figura para "zoom")

      2) no mesmo local no código, insira a linha que faz a leitura através de uma função própria, a "le_DHT()", conforme mostro na figura seguir:

(clique na figura para "zoom")

      3) concluindo, insira no seu código a função "le_DHT()" que fará a leitura temporizada do DHT22. Esta função é mostrada na figura a seguir:

(clique na figura para "zoom")

      E para facilitar a modificação do seu código, "copie e cole" a função "le_DHT()" do trecho que preparei, e que está neste arquivo:   "le_DHT().txt"

      Com isso, a leitura do DHT22 será cadenciada na taxa especificada pelo Fabricante, e mantendo a "fluidez" na execução do seu código.

      Observação final: você pode usar a mesma técnica que usei aqui, para temporizar outro "trecho" do seu código (dentro do loop), e na taxa que vc desejar, e que seja adequada para o funcionamento daquele trecho.

      Caso tenha alguma dúvida, não deixe de perguntar.

      Abrçs,

      Elcids

Boa tarde César, 

Eu não tinha visto o seu código ainda. 

Sobre sensores de umidade, sugiro o meu tutorial como referência para estudo:

http://blog.eletrogate.com/guia-basico-dos-sensores-de-umidade-e-te...

Agora sobre Transceivers nRF24L01, realizei testes no ano passado e tive uma grande decepção!.

Moro em um apto onde deve ter interferência de mais de 20 roteadores WIFI. (mesma faixa de frequência dos transceivers). E por isso, a minha montagem com os transceivers nRF24L01 ficou inviável. 

Eu transmitia do meu Lab (quarto) e o sinal nem chegava na cozinha....

como o projeto se finalizado vai ser utilizado em áreas abertas, loge de roteadores  e os módulos em uma pequena distancia (7metros +-) acredito não ter problema.. apesar agora ficar alerta e apreensivo pela sua experiência:(

por enquanto estou fazendo tesetes dentro de casa, mas sem problemas , nos testes recebo sem problemas tds os pacotes, claro com um pouco de atraso justamente qd adiciono o Gps a ler dados..

Jose e Eduardo fico feliz em ver que estão prontamente sempre dispostos a colaborar.. vou tentar alterar sim a velocidade dessas transmissões seriais. acredito que para a tela nextion posso aumentar, fico ainda em duvida no entendimento de o neo 6m vai aceitar segundo a tabela que o Jose postou.. no máximo se alterar é não ter resposta kk. brincadeiras a parte, sei que o código esta bem bagunçado é realmente falta de praticar. antes msm de ver esses comentários estava estudando sobre theads, e é talvez algo parecido com o que o Alcides quis repassar, a proposito, que aula em alcides , ficaria o dia lendo os comentários, pq ajuda muito!!

fiz as sugestões que o alcides comentou ao que tange a comunicação do nextion e a leitura do gps.

em  relação ao segundo comentário, realmente a temperatura e umidade nesse projeto fia em segundo ponto, não é tao importante , então pode ser lidocom intervalos maiores..

estou absorvendo e repassando para o código .. vou daqui a pouco repassar os resultados

César, 

Ajudar os colegas do lab, para mim é uma satisfação. E também uma forma de aprender sempre mais. 

Sabendo que a gente aprende muito mais quando se ensina! 

Elcids carreguei o código para o arduino, , mas os dados do gps agora não conseguem ser captados, enfim não aparecem.. se voltar para a maneira anterior com usa lentidão eles aparecem.. sera o que pode ser?

olá Cesar.

      Eu já imaginava que isto poderia ocorrer, devido à questão do envio dos dados pelo GPS ser "assíncrono" ao Arduino.

      No seu código original, ele conseguia, porque apesar do GPS ser "assíncrono", o loop dentro da função "leGPS ()" era executado tantas vezes que acabava sincronizando forçadamente.

      Assim modifiquei a função "leGPS ()" para que logo que sincronizar, ele não repita o loop, uma vez que a leitura dos dados foi feita devido ao sincronismo. Veja na figura a seguir:

(clique na figura para "zoom")

      Como antes, para facilitar a modificação do seu código, "copie e cole" do trecho que preparei, substituindo sua função "leGPS ()" por esta "nova" deste arquivo:   "leGPS()_02.txt"

      Vamos ver então se realmente era a questão do sincronismo, e caso seja, explicarei aqui mais detalhes sobre isso.

      Abrçs

      Elcids

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço