DS18B20 CAT5 BLINDADO - Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)2024-03-29T09:39:22Zhttps://labdegaragem.com/forum/topics/ds18b20-cat5-blindado?commentId=6223006%3AComment%3A871915&feed=yes&xn_auth=noolá Mateus.
Fiz uma an…tag:labdegaragem.com,2021-07-27:6223006:Comment:8722292021-07-27T18:00:37.869ZElcids Chagashttps://labdegaragem.com/profile/ElcidsChagas
<p><span style="font-size: 12pt;">olá Mateus.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Fiz uma análise sobre diversos pontos relacionados, e obtive algumas conclusões. Algumas são óbvias, e outras nem tanto. Mas algumas certamente são importantes.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Peço que deixe o tópico aberto, pois assim que possível, irei postar sobre estas análises (além do texto, ainda tenho que capturar e preparar algumas figuras para…</span></p>
<p><span style="font-size: 12pt;">olá Mateus.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Fiz uma análise sobre diversos pontos relacionados, e obtive algumas conclusões. Algumas são óbvias, e outras nem tanto. Mas algumas certamente são importantes.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Peço que deixe o tópico aberto, pois assim que possível, irei postar sobre estas análises (além do texto, ainda tenho que capturar e preparar algumas figuras para isso).</span></p>
<p></p>
<p><span style="font-size: 12pt;"> abrçs,</span></p>
<p><span style="font-size: 12pt;"> Elcids</span></p> Que bom que resolveu o proble…tag:labdegaragem.com,2021-07-27:6223006:Comment:8724122021-07-27T17:32:07.077ZJosé Gustavo Abreu Murtahttps://labdegaragem.com/profile/GustavoMurta
<p>Que bom que resolveu o problema e divulgou a solução para todos. </p>
<p>Obrigado. </p>
<p>Que bom que resolveu o problema e divulgou a solução para todos. </p>
<p>Obrigado. </p> Conclusão, pessoal, acabei de…tag:labdegaragem.com,2021-07-27:6223006:Comment:8725192021-07-27T17:05:57.656ZMateus Dielhttps://labdegaragem.com/profile/MateusDiel
<p>Conclusão, pessoal, acabei de testar com 43 unidades ESP32.</p>
<p></p>
<p>Para realizar as leituras do sensor ds18b20 enquanto a wifi do ESP está ativa é necessário que a rotina de leitura esteja sendo executada no Core1 do ESP.</p>
<p></p>
<p>Sendo assim, nas 43 unidades testadas, TODAS tem leitura livre de erros quando executadas no Core1.</p>
<p>Quando as leituras ocorrem no Core0, ao usar a wifi, o ESP consegue ler o sensor somente as vezes. </p>
<p></p>
<p>Dispenso a ideia de ter vindo…</p>
<p>Conclusão, pessoal, acabei de testar com 43 unidades ESP32.</p>
<p></p>
<p>Para realizar as leituras do sensor ds18b20 enquanto a wifi do ESP está ativa é necessário que a rotina de leitura esteja sendo executada no Core1 do ESP.</p>
<p></p>
<p>Sendo assim, nas 43 unidades testadas, TODAS tem leitura livre de erros quando executadas no Core1.</p>
<p>Quando as leituras ocorrem no Core0, ao usar a wifi, o ESP consegue ler o sensor somente as vezes. </p>
<p></p>
<p>Dispenso a ideia de ter vindo um lote de ESP com problema, pois meus ESP's foram adquiridos de diferentes estados/locais.</p>
<p></p>
<p>Em outro fórum este problema já foi relatado e resolvido da mesma maneira, então deixo aqui a conclusão para quem busca um resultado rápido, talvez não seja a melhor forma mas resolveu.</p>
<p></p>
<p>Se alguém tiver outra sugestão, estou disposto a testar.</p>
<p></p>
<p>Um grande abraço, e obrigado à todos pelas sugestões!</p> Oi José,
Olha, eu fui ver ag…tag:labdegaragem.com,2021-07-26:6223006:Comment:8724032021-07-26T19:04:19.619ZMateus Dielhttps://labdegaragem.com/profile/MateusDiel
<p>Oi José,</p>
<p></p>
<p>Olha, eu fui ver agora que disse, simplesmente só adicionei o print ali no método que faz a leitura pra ver em qual core estava sendo executado e retorna no core 1.</p>
<p></p>
<p><a href="https://storage.ning.com/topology/rest/1.0/file/get/9314858658?profile=original" rel="noopener" target="_blank"><img class="align-center" src="https://storage.ning.com/topology/rest/1.0/file/get/9314858658?profile=RESIZE_710x"></img></a></p>
<p>Outra coisa interessante, é que pesquisando agora, há outras pessoas com esse mesmo problema:…</p>
<p>Oi José,</p>
<p></p>
<p>Olha, eu fui ver agora que disse, simplesmente só adicionei o print ali no método que faz a leitura pra ver em qual core estava sendo executado e retorna no core 1.</p>
<p></p>
<p><a href="https://storage.ning.com/topology/rest/1.0/file/get/9314858658?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/9314858658?profile=RESIZE_710x" class="align-center"/></a></p>
<p>Outra coisa interessante, é que pesquisando agora, há outras pessoas com esse mesmo problema: <a href="https://esp32.com/viewtopic.php?t=5396" target="_blank" rel="noopener">Link1</a> <a href="https://community.blynk.cc/t/ds18b20-value-127-but-only-when-connecting-to-blynk-on-esp32/18336/77" target="_blank" rel="noopener">Link2</a></p>
<p></p>
<p>Outro ponto interessante é que o mesmo também resolveu mudando a task de leitura do sensor para o Core1.</p> Mateus,
O projeto do Random…tag:labdegaragem.com,2021-07-26:6223006:Comment:8725042021-07-26T16:41:05.843ZJosé Gustavo Abreu Murtahttps://labdegaragem.com/profile/GustavoMurta
<p>Mateus, </p>
<p>O projeto do Random Nerds usa o Core 0 e você informou que funcionou. </p>
<p>Está confuso isso...</p>
<p>Mateus, </p>
<p>O projeto do Random Nerds usa o Core 0 e você informou que funcionou. </p>
<p>Está confuso isso...</p> Boa tarde José,
Com relação…tag:labdegaragem.com,2021-07-26:6223006:Comment:8723022021-07-26T16:18:06.061ZMateus Dielhttps://labdegaragem.com/profile/MateusDiel
<p>Boa tarde José,</p>
<p></p>
<p>Com relação ao pull-up, quis dizer que já usei várias configurações e valores e todas visivelmente tem o mesmo efeito.</p>
<p></p>
<p>Ao que vejo o problema pode estar no código em função do atrelamento de tarefas (não sei o porque) mas pelos testes é isso. Se eu fazer o Core0 ler o sensor ai da problema, se eu fazer o Core1 ler o sensor então não ocorre problema. Conforme respondi ao Elcids, lá estão alguns print's dos resultados.</p>
<p></p>
<p>Boa tarde José,</p>
<p></p>
<p>Com relação ao pull-up, quis dizer que já usei várias configurações e valores e todas visivelmente tem o mesmo efeito.</p>
<p></p>
<p>Ao que vejo o problema pode estar no código em função do atrelamento de tarefas (não sei o porque) mas pelos testes é isso. Se eu fazer o Core0 ler o sensor ai da problema, se eu fazer o Core1 ler o sensor então não ocorre problema. Conforme respondi ao Elcids, lá estão alguns print's dos resultados.</p>
<p></p> Boa tarde Elcids,
Primeirame…tag:labdegaragem.com,2021-07-26:6223006:Comment:8722062021-07-26T16:10:42.037ZMateus Dielhttps://labdegaragem.com/profile/MateusDiel
<p>Boa tarde Elcids,</p>
<p></p>
<p>Primeiramente, parabéns pelo seu código, muito bem organizado! </p>
<p></p>
<p>Elcids, tive alguns problemas em executar seu código, como mencionado por você mesmo o "background" do ESP é FreeRTOS, dessa forma no FreeRTOS nenhuma tarefa pode terminar sem algum "retorno" dito isso precisamos chamar um "vTaskDelete(NULL);" antes que ela chegue ao fim ou até mesmo usar um loop infinito (que é o que eu faço) para manter a execução. Caso a tarefa termine sem uma…</p>
<p>Boa tarde Elcids,</p>
<p></p>
<p>Primeiramente, parabéns pelo seu código, muito bem organizado! </p>
<p></p>
<p>Elcids, tive alguns problemas em executar seu código, como mencionado por você mesmo o "background" do ESP é FreeRTOS, dessa forma no FreeRTOS nenhuma tarefa pode terminar sem algum "retorno" dito isso precisamos chamar um "vTaskDelete(NULL);" antes que ela chegue ao fim ou até mesmo usar um loop infinito (que é o que eu faço) para manter a execução. Caso a tarefa termine sem uma chamada ao método de delete o ESP reinicia continuamente (foi o que aconteceu comigo utilizando seu código) conforme imagem abaixo.</p>
<p></p>
<p><a href="https://storage.ning.com/topology/rest/1.0/file/get/9314270253?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/9314270253?profile=RESIZE_710x" class="align-center"/></a></p>
<p></p>
<p>Caso optarmos por finalizar a tarefa a mesma precisa ser criada novamente utilizando o "xTaskCreate..." para que execute mais "n" vezes quantas forem necessárias. Ou utilizaremos um loop infinito para que a tarefa nunca termine e fique sempre em execução, neste caso se torna "obrigatório" alimentar o contador interno do ESP dentro do loop infinito, quando chamamos "delay(1)" o contador interno é automaticamente alimentado, o delay chama "<span>vTaskDelay (x) "</span>. Há outras formas de resolvermos esse problema do watchdog, mas esta acredito ser a mais simples. Se não utilizarmos um delay o ESP também reiniciará, conforme imagem abaixo. </p>
<p><a href="https://storage.ning.com/topology/rest/1.0/file/get/9314282882?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/9314282882?profile=RESIZE_710x" class="align-center"/></a></p>
<p>Dito isso, optei por colocar um loop infinito no seu código, após isso o ESP não reinicia mais e segue executando o seu código normalmente. No entanto, os erros ainda persistem (descobri uma possível solução, ainda não sei se é válida para todos os ESP, irei testar mais...). Ao usar a wifi, o seu código também apresenta falhas de leituras.</p>
<p><a href="https://storage.ning.com/topology/rest/1.0/file/get/9314286096?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/9314286096?profile=RESIZE_710x" class="align-center"/></a></p>
<p>Uma solução por mim encontrada, que funciona tanto no seu código quanto no meu, é inverter as tarefas atreladas aos núcleos. Usamos o Core0 para a "taskDim" e usamos o Core1 para a "taskConn". Se invertermos os núcleos, funciona perfeitamente sem erros de leituras, ainda não sei o porque, mas funciona.</p>
<p></p>
<p>Dessa forma, usarei então a "taskDim" no Core1 e a "taskConn" no Core0. Pelos testes que fiz funciona, conforme imagem abaixo.</p>
<p><a href="https://storage.ning.com/topology/rest/1.0/file/get/9314289700?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/9314289700?profile=RESIZE_710x" class="align-center"/></a></p>
<p></p>
<p>Resumindo, a solução que encontrei foi essa, agora basta saber se é válida para todos os meus ESP's.</p>
<p>Antes era:</p>
<p>"xTaskCreatePinnedToCore( taskConn, "taskConn", 10000, NULL, 2, NULL, 1);"<br/>"xTaskCreatePinnedToCore( taskDim, "taskDim", 10000, NULL, 1, NULL, 0);"</p>
<p>e agora passa a ser:</p>
<p>"xTaskCreatePinnedToCore( taskConn, "taskConn", 10000, NULL, 2, NULL, 0);"<br/>"xTaskCreatePinnedToCore( taskDim, "taskDim", 10000, NULL, 1, NULL, 1);"</p>
<p></p>
<p>OBS.: Vi que usa seções criticas no seu código "portENTER_CRITICAL...", as mesmas não podem serem utilizadas no meu modelo atual pois uso interrupções externas (rede elétrica quando passa pelo ponto 0 - zero cross para controle do TRIAC), se houver uma interrupção externa enquanto estou em uma seção critica o ESP reinicia.</p> olá Mateus.
Vi que usa…tag:labdegaragem.com,2021-07-24:6223006:Comment:8718322021-07-24T19:31:39.228ZElcids Chagashttps://labdegaragem.com/profile/ElcidsChagas
<p><span style="font-size: 12pt;">olá Mateus.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Vi que usando o exemplo do site RandomNerds, vc conseguiu fazer os ESP32 funcionarem com o Sensor, sem apresentar problemas de leitura.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Isto vai de encontro ao que mencionei no post anterior, sobre ainda existir uma possibilidade de solucionar a questão.</span></p>
<p><span style="font-size: 12pt;"> Esta possibilidade reside em…</span></p>
<p><span style="font-size: 12pt;">olá Mateus.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Vi que usando o exemplo do site RandomNerds, vc conseguiu fazer os ESP32 funcionarem com o Sensor, sem apresentar problemas de leitura.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Isto vai de encontro ao que mencionei no post anterior, sobre ainda existir uma possibilidade de solucionar a questão.</span></p>
<p><span style="font-size: 12pt;"> Esta possibilidade reside em inicializar adequadamente o Sistema de forma a encontrar os Sensores no <em><strong>barramento</strong></em> "<strong>One Wire</strong>", e subsequentemente acessar esses sensores em um processo confiável, executando corretamente as operações de leitura do Sensor.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Assim, baseado no código que vc postou aqui (o "<strong>DB18B20 código.ino</strong>"), fiz uma implementação bastante robusta do Sistema.</span></p>
<p><span style="font-size: 12pt;"> Essa implementação permite vc facilmente acrescentar as demais tarefas de processamento para os valores obtidos da <strong><em>temperatura</em> </strong>(o que provavelmente vc faz através de algum "<strong><em>server</em></strong>" implementado no <strong><em>ESP32</em> </strong>com respectivo protocolo). O código implementado está no final deste post, para download.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Como vc tem formação em Ciência da Computação, acredito que não precise de esclarecimentos adicionais sobre o funcionamento dessa implementação. Além disso todo o código está <em>comentado funcionalmente</em>, e totalmente organizado (inclusive em termos de hierarquia). Mas caso tenha algum ponto que vc deseje esclarecimento adicional, basta perguntar aqui.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Ainda assim, mostrando aqui alguns pontos, acredito poupará tempo pra vc. Os principais <em><strong>settings do Sistema</strong></em>, vc encontrará logo no início do código, facilmente identificáveis (ex.: definição do <strong><em>pino</em></strong> do <strong><em>ESP32</em></strong> onde o <strong><em>Sensor DS18B20</em></strong> está conectado).</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Outro ponto, é no seu <strong><em>Task</em></strong> de nome "<strong><em>taskDim</em></strong>", que trata os valores de temperatura. Este Task pode ser visto na figura a seguir:</span></p>
<p></p>
<p style="text-align: center;"><span style="font-size: 8pt;"><strong><em>(clique na figura para "zoom")</em></strong></span></p>
<p><span style="font-size: 12pt;"><a href="https://storage.ning.com/topology/rest/1.0/file/get/9307321078?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/9307321078?profile=RESIZE_710x" class="align-center" width="718" height="524"/></a></span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> Na figura anterior, na área marcada em azul, é feito todo o gerenciamento do <strong><em>Sensor DS18B20</em></strong>. Isto inclui detectar o Sensor, obter seu endereço no <strong><em>barramento</em></strong> "<strong><em>One Wire</em></strong>", e subsequentemente fazer <strong><em>leituras assíncronas</em></strong> dos valores de temperatura. Na detecção do Sensor, também há um mecanismo que informa vc quantas tentativas foram feitas para encontrar o Sensor, informando também o endereço do mesmo (quando detectado). Funcionalmente, é uma <em><strong>Máquina de Estados</strong></em> que gerencia todo o processo.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Na área marcada na cor amarela, é informado via <strong><em>Serial</em></strong> do <em><strong>Arduino</strong></em>, a <strong><em>temperatura</em></strong> lida do <strong><em>Sensor</em></strong>. <span style="text-decoration: underline;"><em>Importante notar</em></span>, que logo após o Sensor ser detectado, as primeiras leituras podem ser inválidas, pois o Sensor propriamente dito pode levar vários segundos para estar "pronto" para conversão (mas apenas após a detecção inicial).</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Na área marcada em verde, corresponde àquele trecho no seu código original, que faz um processamento específico quando a temperatura está dentro de uma faixa. Então é só vc acrescentar ali o código para isto.</span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> Já em relação ao <strong><em>Task</em></strong> de nome "<strong><em>taskConn</em></strong>" para tratamento da <strong><em>conexão WiFi</em></strong>, ele é mostrado na figura a seguir:</span></p>
<p style="text-align: center;"><span style="font-size: 8pt;"><strong><em>(clique na figura para "zoom")</em></strong></span></p>
<p><span style="font-size: 12pt;"><a href="https://storage.ning.com/topology/rest/1.0/file/get/9307322060?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/9307322060?profile=RESIZE_710x" class="align-center" width="490" height="229"/></a></span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> Na figura anterior, na área marcada em azul, é feito todo o processamento para a <strong><em>conexão WiFi</em></strong>, de uma forma temporizada. Ali é setado o <strong><em>modo de operação</em></strong> (no caso, "<strong><em>STATION</em></strong>"), e aguardado que a conexão seja inicialmente estabelecida. Todo o processamento também é feito por uma <strong><em>Máquina de Estados</em></strong>. Embora não tenha sido implementado um código específico, ao analisar o funcionamento vc verá que já está preparado para executar ações no Sistema para o caso de eventual perda da conexão WiFi (veja no <strong><em>estado</em></strong> "<strong><em>WiFi_ready</em></strong>").</span></p>
<p></p>
<p><span style="font-size: 12pt;"> A área marcada em verde, corresponde justamente ao restante do processamento do seu código, que ao que vc deixou a entender é a manipulação de um Banco de Dados (provavelmente com histórico das temperaturas e outros dados). Então está fácil de vc incluir isso ali.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> O código foi testado e está funcionando perfeitamente. Mas é claro que um retorno da sua parte sobre resultados de sua implementação particular, poderá ajudar outras pessoas que estejam visitando este tópico.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Uma dica: embora no "<em>background</em>" o <strong><em>ESP32</em> </strong>esteja executando um <strong><em>RTOS</em></strong>, onde seus tasks são executados rotineiramente, aconselho evitar usar "<em>delays</em>" e "<em>loops infinitos</em> " dentro dos tasks (como <em><strong>while(true)</strong></em> ), pois estes fazem com que o <strong><em>RTOS</em> </strong>avalie de forma errônea o tempo de processamento gasto, resultando em algo próximo a 100% de uso, quando na realidade o percentual efetivo é muito menor (exatamente como nos códigos executados no PC, quando códigos pequenos e simples parecem usar 100% da CPU).</span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> O código implementado está aqui: <a href="https://storage.ning.com/topology/rest/1.0/file/get/9307321895?profile=original" target="_blank" rel="noopener">"<span style="text-decoration: underline;"><strong><em>DS18B20_ESP32_teste_02.zip</em></strong></span>"</a></span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> Espero ter ajudado. Qualquer dúvida que esteja a meu alcance, pergunte aqui.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Abrçs,</span></p>
<p><span style="font-size: 12pt;"> Elcids</span></p> Boa tarde,
"Como pull-up est…tag:labdegaragem.com,2021-07-24:6223006:Comment:8718312021-07-24T17:33:13.511ZJosé Gustavo Abreu Murtahttps://labdegaragem.com/profile/GustavoMurta
<p>Boa tarde,</p>
<p></p>
<p><span>"Como pull-up estou usando um resistor 4k7 que fica ao lado do ESP. Já testei usando o resistor próximo ao DS18b20 e o resultado foi o mesmo."</span></p>
<p></p>
<p><span>Quer dizer que o problema está no seu código? Seus comentários estão confusos. </span></p>
<p></p>
<p>Boa tarde,</p>
<p></p>
<p><span>"Como pull-up estou usando um resistor 4k7 que fica ao lado do ESP. Já testei usando o resistor próximo ao DS18b20 e o resultado foi o mesmo."</span></p>
<p></p>
<p><span>Quer dizer que o problema está no seu código? Seus comentários estão confusos. </span></p>
<p></p> José, trago noticias bombásti…tag:labdegaragem.com,2021-07-24:6223006:Comment:8718302021-07-24T14:51:43.099ZMateus Dielhttps://labdegaragem.com/profile/MateusDiel
<p>José, trago noticias bombásticas! </p>
<p>Montei o esquema do seu post em randomnerd... Adivinha? Tudo funcionou perfeitamente, sem erro de leitura nenhum. Só fiz pequenas alterações, usei um resistor de pull-up de 5k (2x10k em paralelo que é o que eu tinha bem disposto na mesa kkk) e alterei a porta do seu código pra ler os sensores na GPIO15 (mesma do meu código que lê errado, você usa a porta 4).</p>
<p>Tudo funcionando perfeitamente sem erros...…</p>
<p></p>
<p>José, trago noticias bombásticas! </p>
<p>Montei o esquema do seu post em randomnerd... Adivinha? Tudo funcionou perfeitamente, sem erro de leitura nenhum. Só fiz pequenas alterações, usei um resistor de pull-up de 5k (2x10k em paralelo que é o que eu tinha bem disposto na mesa kkk) e alterei a porta do seu código pra ler os sensores na GPIO15 (mesma do meu código que lê errado, você usa a porta 4).</p>
<p>Tudo funcionando perfeitamente sem erros...</p>
<p><a href="https://storage.ning.com/topology/rest/1.0/file/get/9306607852?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/9306607852?profile=RESIZE_710x" class="align-center"/></a></p>
<p>Detalhe, não baixei nenhuma biblioteca do seu post, porque tenho todas elas e são as mesmas que uso.</p>
<p></p>
<p>Nesse caso, qual é o problema do meu código meu deusssss? Aqui no seu você lê os sensores por endereço, eu leio por índice, como só uso um sensor então uso "sensors.getTempCByIndex(0);". Também estou atrelando as tarefas a núcleos específicos, seria esse o problema será? Vou testar não atrelando elas....</p>