tag:blogger.com,1999:blog-66530258789020147222024-03-15T18:09:21.381-07:00Renato AloiBlog do Renato Aloi sobre Arduino, tecnologia, política e tendências.Renato Aloihttp://www.blogger.com/profile/18145105903940534638noreply@blogger.comBlogger152125tag:blogger.com,1999:blog-6653025878902014722.post-42797119720922652362020-05-24T07:51:00.001-07:002020-05-24T07:51:56.498-07:00Sensores de Final de Curso - Prusa Mendel IT2 | Curso Arduino<iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/DJvwR-H3dlw" width="480"></iframe>Renato Aloihttp://www.blogger.com/profile/18145105903940534638noreply@blogger.com0tag:blogger.com,1999:blog-6653025878902014722.post-84398031503652138572020-05-19T07:37:00.001-07:002020-05-19T07:37:26.365-07:00Chegaram as Peças Finais da Impressora 3D Prusa Mendel IT2<iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/1YnsaVbgO50" width="480"></iframe>Renato Aloihttp://www.blogger.com/profile/18145105903940534638noreply@blogger.com0tag:blogger.com,1999:blog-6653025878902014722.post-58851381554181839072020-05-04T16:15:00.001-07:002020-05-04T16:15:43.174-07:00Instalando Motor No Eixo X - Prusa Mendel IT2 | Curso ArduinoAula final da montagem da estrutura da impressora 3D! Inscreva-se no canal para não perder nada!<br /><br />
<br /><br />
#3D #Impressora3D #prusa #mendel #eixo #motor #alinhamento #regulagem #correia #dentada #cremalheira<br /><br />
<br /><br />
<iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/TP_L74oMkoQ" width="480"></iframe>Renato Aloihttp://www.blogger.com/profile/18145105903940534638noreply@blogger.com0tag:blogger.com,1999:blog-6653025878902014722.post-44570308432324466612020-04-21T12:03:00.001-07:002020-04-21T12:03:56.037-07:00Acoplando Motores no Eixo Z - Prusa Mendel IT2 | Curso Arduino<iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/JSXoOtju2F8" width="480"></iframe>Renato Aloihttp://www.blogger.com/profile/18145105903940534638noreply@blogger.com0tag:blogger.com,1999:blog-6653025878902014722.post-41277236827172875812019-12-25T05:36:00.001-08:002019-12-25T05:36:41.688-08:00Ok Google com ESP8266 | Curso ArduinoAutomação por comando de Voz usando o Google Assistente, basta dizer Ok Google e dizer o comando em português!<br /><br />
<br /><br />
#OkGoogle #ESP8266 #ComandoDeVoz #Lâmpada #Relê #Automação<br /><br />
<br /><br />
<iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/IC2V1a80Lgw" width="480"></iframe>Renato Aloihttp://www.blogger.com/profile/18145105903940534638noreply@blogger.com0tag:blogger.com,1999:blog-6653025878902014722.post-42934448401059875232019-12-01T16:39:00.001-08:002019-12-01T16:39:15.435-08:00Ficou pronta a base da mesa aquecida! - Prusa Mendel IT2 | Curso Arduino<iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/6_Iu6FohZ2s" width="480"></iframe>Renato Aloihttp://www.blogger.com/profile/18145105903940534638noreply@blogger.com0tag:blogger.com,1999:blog-6653025878902014722.post-36785139942935879452019-11-02T20:17:00.001-07:002019-11-02T20:17:28.698-07:00Montagem do Eixo Z - Prusa Mendel IT2 | Curso Arduino<iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/6cVO0mrH_hU" width="480"></iframe>Renato Aloihttp://www.blogger.com/profile/18145105903940534638noreply@blogger.com0tag:blogger.com,1999:blog-6653025878902014722.post-74874613902356194042019-10-21T19:13:00.001-07:002019-10-21T19:13:31.623-07:00Montagem do Eixo X - Prusa Mendel IT2 | Curso Arduino<iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/ntssVg8XG9k" width="480"></iframe>Renato Aloihttp://www.blogger.com/profile/18145105903940534638noreply@blogger.com0tag:blogger.com,1999:blog-6653025878902014722.post-25098219988904936452019-09-08T20:23:00.001-07:002019-09-08T20:23:31.550-07:00Suporte da Mesa Aquecida - Prusa Mendel IT2 | Curso Arduino<iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/_zDbta3dcO4" width="480"></iframe>Renato Aloihttp://www.blogger.com/profile/18145105903940534638noreply@blogger.com0tag:blogger.com,1999:blog-6653025878902014722.post-45228696652953562892019-08-11T16:35:00.001-07:002019-08-11T16:35:48.358-07:00Montagem da Estrutura #5 - Prusa Mendel IT2 | Curso Arduino<iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/Hd-fZbv8t40" width="480"></iframe>Renato Aloihttp://www.blogger.com/profile/18145105903940534638noreply@blogger.com0tag:blogger.com,1999:blog-6653025878902014722.post-39926360617620905082019-08-04T18:06:00.001-07:002019-08-04T18:06:20.930-07:00Unboxing das Vitaminas da Prusa Mendel IT2 | Curso Arduino<iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/EcOUxL_z5f4" width="480"></iframe>Renato Aloihttp://www.blogger.com/profile/18145105903940534638noreply@blogger.com0tag:blogger.com,1999:blog-6653025878902014722.post-27559263481997940012019-08-01T19:30:00.001-07:002019-08-01T19:30:07.104-07:00ESP8266 - Upload de Código | Curso Arduino<iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/zD7XnJBFzVw" width="480"></iframe>Renato Aloihttp://www.blogger.com/profile/18145105903940534638noreply@blogger.com0tag:blogger.com,1999:blog-6653025878902014722.post-91446838715912332492019-07-27T11:11:00.001-07:002019-07-27T11:11:29.540-07:00Automação via WiFi com a placa SiGE | Curso Arduino<iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/I1bGMTwMg-U" width="480"></iframe>Renato Aloihttp://www.blogger.com/profile/18145105903940534638noreply@blogger.com0tag:blogger.com,1999:blog-6653025878902014722.post-4399741442393781042019-07-24T19:15:00.001-07:002019-07-24T19:15:50.447-07:00Montagem da Estrutura #4 - Prusa Mendel IT2 | Curso ArduinoParte 4 da montagem da estrutura! Acompanhe! #impressora3D #prusa #reprap #mendel #estrutura #ferragens #montagem<br /><br />
<br /><br />
<iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/r_OgaAdLkQs" width="480"></iframe>Renato Aloihttp://www.blogger.com/profile/18145105903940534638noreply@blogger.com0tag:blogger.com,1999:blog-6653025878902014722.post-69442411121917493472019-07-21T21:15:00.001-07:002019-07-21T21:15:43.799-07:00Montagem da Estrutura #3 - Prusa Mendel IT2 | Curso ArduinoAgora a impressora 3D está começando a tomar forma! Acompanhe a terceira aula da montagem da estrutura.<br /><br />
<br /><br />
<iframe allowfullscreen="" frameborder="0" height="344" src="https://www.youtube.com/embed/TI3k2HcqBwk" width="459"></iframe>Renato Aloihttp://www.blogger.com/profile/18145105903940534638noreply@blogger.com0tag:blogger.com,1999:blog-6653025878902014722.post-88297187427704039322019-07-18T18:55:00.001-07:002019-07-18T18:55:40.050-07:00Montagem da Estrutura #2 - Prusa Mendel IT2 | Curso ArduinoSegunda parte da montagem da estrutura da impressora 3D! Inscreva-se no canal para não perder nada! #impressora3D #prusa #reprap #mendel #estrutura #ABS #ferragens #montagem<br /><br />
<br /><br />
<iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/4HKOi186x40" width="480"></iframe>Renato Aloihttp://www.blogger.com/profile/18145105903940534638noreply@blogger.com0tag:blogger.com,1999:blog-6653025878902014722.post-1055997403994004262019-07-14T20:17:00.001-07:002019-07-14T20:17:36.399-07:00Montagem da Estrutura #1 - Prusa Mendel IT2 | Curso Arduino<iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/NIIB79gbeoI" width="480"></iframe>Renato Aloihttp://www.blogger.com/profile/18145105903940534638noreply@blogger.com0tag:blogger.com,1999:blog-6653025878902014722.post-31899024838316553862019-07-10T20:50:00.001-07:002019-07-10T20:50:03.841-07:00Depuração de Erros do ESP8266 - Aula #3 | Curso Arduino<iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/Izm0OBZvEB0" width="480"></iframe>Renato Aloihttp://www.blogger.com/profile/18145105903940534638noreply@blogger.com0tag:blogger.com,1999:blog-6653025878902014722.post-81237111870703124162019-07-07T20:08:00.001-07:002019-07-07T20:08:27.844-07:00Conectando a Placa SIGE e Controlando pelo App | Curso Arduino<iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/yyBW-DhJgik" width="480"></iframe>Renato Aloihttp://www.blogger.com/profile/18145105903940534638noreply@blogger.com0tag:blogger.com,1999:blog-6653025878902014722.post-83359451562898661192019-06-23T14:47:00.001-07:002019-06-23T14:47:10.653-07:00Portas de Entrada/Saída (GPIO) do ESP8266 - Aula #2 | Curso Arduino<iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/IXxpSMrGjZA" width="480"></iframe>Renato Aloihttp://www.blogger.com/profile/18145105903940534638noreply@blogger.com0tag:blogger.com,1999:blog-6653025878902014722.post-66312397612375016842019-06-15T05:34:00.001-07:002019-06-15T05:34:03.168-07:00Tudo sobre Filamentos - Prusa Mendel IT2 | Curso Arduino<iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/F-WBmM23cIM" width="480"></iframe>Renato Aloihttp://www.blogger.com/profile/18145105903940534638noreply@blogger.com0tag:blogger.com,1999:blog-6653025878902014722.post-2017991278426201722019-05-26T14:52:00.001-07:002019-05-26T14:52:19.178-07:00Placa SIGE Automação Profissional | Curso ArduinoPlataforma de Automação Profissional ao seu alcance! Profissionalize-se no mundo Arduino e ganhe dinheiro com isso!<br /><br />
<br /><br />
<iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/MnSAPcMTVdk" width="480"></iframe>Renato Aloihttp://www.blogger.com/profile/18145105903940534638noreply@blogger.com0tag:blogger.com,1999:blog-6653025878902014722.post-75570941137541064532019-04-21T14:58:00.001-07:002019-04-21T14:58:55.428-07:00Tutorial Básico de Modelagem 3D com Tinkercad | Curso Arduino<iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/6kL4zm47WME" width="480"></iframe>Renato Aloihttp://www.blogger.com/profile/18145105903940534638noreply@blogger.com0tag:blogger.com,1999:blog-6653025878902014722.post-89775601154042008302016-06-18T20:48:00.003-07:002016-06-18T21:04:19.611-07:00Configurando WiFi do ESP8266 Sem Recompilar<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5lrvwB2WJciZQpy2oOyDoFBBl4gNdyU1FjWxFTg_ENSZevBgGxIwXXzX_7QvZzDYP8LOEXA-wihX1DRsMmd4BmmjP50VqiJAr4QOZZaEgU90KhTmb9KO8zYWh7pXjbHL2OktyGf0w84mZ/s1600/config2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5lrvwB2WJciZQpy2oOyDoFBBl4gNdyU1FjWxFTg_ENSZevBgGxIwXXzX_7QvZzDYP8LOEXA-wihX1DRsMmd4BmmjP50VqiJAr4QOZZaEgU90KhTmb9KO8zYWh7pXjbHL2OktyGf0w84mZ/s400/config2.png" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Pessoal, nesse terceiro artigo da série sobre o ESP8266 vou ensinar a configurar a Rede WiFi através do Navegador de Internet, sem precisar recompilar o código toda vez que mudamos o SSID e a senha do roteador.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Aprendemos no <a href="http://renatoaloi.blogspot.com.br/2016/05/codigo-basico-do-web-server-no-esp8266.html">primeiro artigo</a> a mapear funções do ESP8266 para páginas HTML e formulários que podem ser acessados por um Navegador de Internet.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
E como já aprendemos no <a href="http://renatoaloi.blogspot.com.br/2016/05/tratando-post-no-web-server-do-esp8266_13.html">segundo artigo</a>, podemos criar um formulário e enviar informações para o ESP8266 através de métodos como GET ou POST.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Nesse caso, utilizamos um formulário para preencher o SSID, senha, IP e Gateway e enviar via POST para o ESP8266 mudar suas configurações em tempo real.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Primeiro vamos ver como isso funciona e depois veremos o código necessário para isso.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Antes de mais nada precisamos configurar nosso roteador com as configurações iniciais do ESP8266 para fazermos a primeira conexão e depois podemos configurar os dados novos.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8DEbvIirzk83-Xt8UgzkaxhjOUGncOkfsojlHzh4cIrKQyv0-jcoIO4l3tuODyTF7bpWxArsj7U1aweTxliOrENXlzzRrWAHaluvecdUz9IU0QeXWAfXRam23ewNYvoyNz24pDxmEwhKQ/s1600/roteador1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="247" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8DEbvIirzk83-Xt8UgzkaxhjOUGncOkfsojlHzh4cIrKQyv0-jcoIO4l3tuODyTF7bpWxArsj7U1aweTxliOrENXlzzRrWAHaluvecdUz9IU0QeXWAfXRam23ewNYvoyNz24pDxmEwhKQ/s320/roteador1.png" width="320" /></a></div>
<ul>
<li>1) Acesse a página de configuração do seu roteador e clique na opção das configurações sem fio</li>
<li>2) Altere o nome do SSID para <span style="font-family: "courier new" , "courier" , monospace;">SSIDInicial</span></li>
<li>3) Altere a opção de segurança para <span style="font-family: "courier new" , "courier" , monospace;">WPA-PSK [TKIP] + WPA2-PSK [AES]</span></li>
<li>4) Mude também a senha para <span style="font-family: "courier new" , "courier" , monospace;">senhaInicial</span></li>
</ul>
<div>
Clique em "Enviar" para confirmar as configurações do seu roteador. Isso fará com que o roteador fique com as mesmas configurações iniciais que vamos escrever no código mais adiante.</div>
<div>
<br /></div>
<div>
Na sequência precisamos configurar o IP do roteador, que é o Gateway que configuramos no ESP8266.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAdAWcGKGjD2qwRh0LbDjgjaV4Lpan8ISZrVRI_clfdnbvkOycGthgK3dV1R5sBmF1Q1DJMrYVp1fwrhepEmFQjluMENGbtApP4_3cIeNjizXiSQidBva2vIkqhhtXA1UtDX1ITPP2BVE7/s1600/roteador2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="175" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAdAWcGKGjD2qwRh0LbDjgjaV4Lpan8ISZrVRI_clfdnbvkOycGthgK3dV1R5sBmF1Q1DJMrYVp1fwrhepEmFQjluMENGbtApP4_3cIeNjizXiSQidBva2vIkqhhtXA1UtDX1ITPP2BVE7/s320/roteador2.png" width="320" /></a></div>
<div>
<br /></div>
<div>
<ul>
<li>1) Clique na opção de configuração de IP da LAN (os nomes podem ser um pouco diferentes dependendo da versão do roteador)</li>
<li>2) Configure o Endereço IP para 192.168.0.1</li>
</ul>
<div>
Feita essa configuração, você pode carregar o programa desse post e abrir o terminal Serial para verificar se o ESP8266 conectou no roteador corretamente, conforme imagem abaixo.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNqM1Sp3KNiFhhVnUC_vAIQQ26mOuYX7JpUQVspm-WSUGbIbLPP7fv4_UIhgtxa539QHmXH0_GCbZ_N0-XUM7-v6Dqgzh5LYKJZ04Za6iKP8mFPiER-vVc36Y-qL3pDEXx0xyHPS3lZf6v/s1600/roteador3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNqM1Sp3KNiFhhVnUC_vAIQQ26mOuYX7JpUQVspm-WSUGbIbLPP7fv4_UIhgtxa539QHmXH0_GCbZ_N0-XUM7-v6Dqgzh5LYKJZ04Za6iKP8mFPiER-vVc36Y-qL3pDEXx0xyHPS3lZf6v/s1600/roteador3.png" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
Ligue seu computador via cabo ou através do WiFi neste mesmo roteador. E abra um Navegador de Internet. Acesse o endereço do ESP8266, que na configuração inicial do código deste artigo é <span style="font-family: "courier new" , "courier" , monospace;">192.168.0.125</span>. Configure no código o endereço inicial que você deseja para seu ESP8266.</div>
</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqEag5iIAIZEj676r3Xid-QdqJEJaBvSqr2Kef0otc_BdPZnXaIXqBjK2CmWodkR1a_hGGb5rzm2j9JL9_oieuwdbd2McasS3Xzbl34fv4W0tH-GJ5OaROI05PrgBn4UNrkkW9Va0WpaJJ/s1600/config1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="205" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqEag5iIAIZEj676r3Xid-QdqJEJaBvSqr2Kef0otc_BdPZnXaIXqBjK2CmWodkR1a_hGGb5rzm2j9JL9_oieuwdbd2McasS3Xzbl34fv4W0tH-GJ5OaROI05PrgBn4UNrkkW9Va0WpaJJ/s320/config1.png" width="320" /></a></div>
<div>
<br /></div>
<div>
Clique no link "Configurar WiFi" ou acesse o endereço <a href="http://192.168.0.125/config">http://192.168.0.125/config</a></div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFxBpUDyJ9-L_OcReFM6ENL33oWKurBeiCdLdqhOs5UrVsFQeNcOfpxOB4hsRy2cBiYNo2N2Hz8wMeHSVGpZmRpOSbkdYhNL8pvmSsZGh-EnI-Zs2O53L_i39B733Iv0nEpfuqaqXn5R3T/s1600/config2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="205" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFxBpUDyJ9-L_OcReFM6ENL33oWKurBeiCdLdqhOs5UrVsFQeNcOfpxOB4hsRy2cBiYNo2N2Hz8wMeHSVGpZmRpOSbkdYhNL8pvmSsZGh-EnI-Zs2O53L_i39B733Iv0nEpfuqaqXn5R3T/s320/config2.png" width="320" /></a></div>
<div>
<br /></div>
<div>
Pronto! Agora podemos mudar as configurações para o que quisermos sem precisar recompilar o código! Digite as informações que você quiser e clique em "Enviar"!</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi29Rvab2XGZFEs-pyE6Wsg_I7hhNq0eN6CthB4llbckqPgpnbcvtoYwU6gqQ3VaRd4sCrqLwcfLJCCG8m0n64CtVmlcTAUWz4V4BWQFCXSAS69PhBkIDFbRAapmXAKblrjD2BIL1OYhOJR/s1600/config3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="216" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi29Rvab2XGZFEs-pyE6Wsg_I7hhNq0eN6CthB4llbckqPgpnbcvtoYwU6gqQ3VaRd4sCrqLwcfLJCCG8m0n64CtVmlcTAUWz4V4BWQFCXSAS69PhBkIDFbRAapmXAKblrjD2BIL1OYhOJR/s320/config3.png" width="320" /></a></div>
<div>
<br /></div>
<div>
Isso parece simples, mas é muito poderoso, pois quando você cria um produto que oferece uma funcionalidade de WiFi, como você dá oportunidade para seu cliente configurar o produto para funcionar na rede dele? Esse é o jeito! Além disso com isso podemos oferecer para o cliente uma forma de atualizar o próprio firmware do ESP8266, que veremos no próximo post da série.</div>
<div>
<br /></div>
<div>
Vamos ver como isso é feito!</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDxloZXW-GUvzw49DYTURNKBtVHjxiH3AQM48hSlBtSjjaLHr5D048dS_R1EL3km8aBfqh24RWLh5xoLmhPssRINFuSA68eSkUwRTFe0vM3PrvjK6Tv_cYWXIHVlxrjmYxLc4WXFvMOMus/s1600/codigo1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="66" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDxloZXW-GUvzw49DYTURNKBtVHjxiH3AQM48hSlBtSjjaLHr5D048dS_R1EL3km8aBfqh24RWLh5xoLmhPssRINFuSA68eSkUwRTFe0vM3PrvjK6Tv_cYWXIHVlxrjmYxLc4WXFvMOMus/s320/codigo1.png" width="320" /></a></div>
<div>
<br /></div>
<div>
A primeira coisa que devemos fazer é incluir a biblioteca EEPROM, pois não tem sentido fazer toda essa configuração e depois perder ela quando a energia acabar. Para que as configurações permaneçam gravadas mesmo quando o ESP8266 for desligado, precisamos gravar essas informações na memória conhecida por EEPROM.</div>
<div>
<br /></div>
<div>
O resto do código é, na verdade, composto de coisas que já aprendemos nos outros dois posts. Vejamos os detalhes.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIeJMrCQiSAc9FJVw3WWkoN3NTFu_07TCM2dQy4nNewOmkGMXO7Xuwvx1g03tIFRTVLsswHgZeln6Jrdo5r1Bfaxraei9ialFCbeZXjOEnxKWOQrwQ3fTPWRt9B2CM1TiWaY0GMpu3m0Yf/s1600/codigo2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="291" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIeJMrCQiSAc9FJVw3WWkoN3NTFu_07TCM2dQy4nNewOmkGMXO7Xuwvx1g03tIFRTVLsswHgZeln6Jrdo5r1Bfaxraei9ialFCbeZXjOEnxKWOQrwQ3fTPWRt9B2CM1TiWaY0GMpu3m0Yf/s320/codigo2.png" width="320" /></a></div>
<div>
<br /></div>
<div>
<ul>
<li>1) Definimos algumas macros para marcar posições iniciais da memória EEPROM onde ficarão nosso banco de dados de configuração. Temos uma macro para o início do controle de versão <span style="font-family: "courier new" , "courier" , monospace;">VERSION_START</span> e uma macro para indicar onde a configuração realmente inicia <span style="font-family: "courier new" , "courier" , monospace;">CONFIG_START</span>.</li>
<li>2) Criamos também uma macro para controlar a versão dos dados <span style="font-family: "courier new" , "courier" , monospace;">CONFIG_VERSION</span>. Como a EEPROM grava os dados e não perde mais, temos esse controle para invalidar os dados anteriores em caso de recompilar o código, se necessário.</li>
<li>Por fim, criamos uma estrutura para guardar as configurações, chamada <span style="font-family: "courier new" , "courier" , monospace;">wifiConfig</span>. Utilizaremos essa estrutura para facilitar o trabalho com a EEPROM, pois senão teríamos que lidar com leitura e escrita de bytes, o que é muito massante.</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHvb2fny8Rc_ByQke60Uuiw5oS7IgNt5bbn1FaKTXFhgW2rOuIJwh7vWUSorpJfUni-rzdQvBFP68uL0vY14ml89mOVWXiSLh2WzjGTvWJbdsffubaDZAMHmDg62XrLCwyiBF7wZd30hqZ/s1600/codigo3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="171" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHvb2fny8Rc_ByQke60Uuiw5oS7IgNt5bbn1FaKTXFhgW2rOuIJwh7vWUSorpJfUni-rzdQvBFP68uL0vY14ml89mOVWXiSLh2WzjGTvWJbdsffubaDZAMHmDg62XrLCwyiBF7wZd30hqZ/s400/codigo3.png" width="400" /></a></div>
<div>
<br /></div>
</div>
<div>
Para ajudar com a tarefa massante de lidar com gravação da EEPROM, criamos também uma função que utiliza um laço for para gravar todos os bytes da estrutura e facilitar o trabalho. Repare também que gravamos os bytes de controle da versão; e por fim utilizamos a função <span style="font-family: "courier new" , "courier" , monospace;">EEPROM.commit()</span> para confirmar a gravação.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsPfujLxXz4PS6h5R8GS6I-ALSEhW9s4RI8MKF5tN1VYjtjm4e8cJhfDiTzor6-rLZ7vnXxhCg5afk2GrWoerGXyh6-to-gBcW3vKkIF4ud6MZQ-xrm3AO5-ASWmZFwZxOw1P9586w6PBP/s1600/codigo4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="291" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsPfujLxXz4PS6h5R8GS6I-ALSEhW9s4RI8MKF5tN1VYjtjm4e8cJhfDiTzor6-rLZ7vnXxhCg5afk2GrWoerGXyh6-to-gBcW3vKkIF4ud6MZQ-xrm3AO5-ASWmZFwZxOw1P9586w6PBP/s400/codigo4.png" width="400" /></a></div>
<div>
<br /></div>
<div>
Outra função importante para lidar com a EEPROM é a que faz a leitura e alimenta a estrutura <span style="font-family: "courier new" , "courier" , monospace;">wifiConfig</span>. Primeiro a função faz a leitura e verifica os bytes de controle para saber se existem e se conferem com o código atual. Lembre-se, para invalidar esse código, basta mudar a macro mostrada anteriormente de <span style="font-family: "courier new" , "courier" , monospace;">"1a"</span> para qualquer outro valor, como por exemplo <span style="font-family: "courier new" , "courier" , monospace;">"1b"</span> ou <span style="font-family: "courier new" , "courier" , monospace;">"JJ"</span>, não importa.</div>
<div>
<br /></div>
<div>
Invalidando esses bytes de controle farão com que o ESP8266 utilize os dados da configuração inicial, que é fixa. Por isso configuramos o roteador anteriormente com essas configurações no início desse post.</div>
<div>
<ul>
<li>1) <span style="font-family: "courier new" , "courier" , monospace;">SSIDInicial</span> é o SSID da configuração inicial fixa no código</li>
<li>2) <span style="font-family: "courier new" , "courier" , monospace;">senhaInicial</span> é a senha inicial</li>
<li>3) <span style="font-family: "courier new" , "courier" , monospace;">192.168.0.125</span> é o IP inicial do ESP8266</li>
<li>4) <span style="font-family: "courier new" , "courier" , monospace;">192.168.0.1</span> é o IP do roteador, ou também chamado IP do Gateway</li>
</ul>
<div>
Essa configuração do código dentro do <span style="font-family: "courier new" , "courier" , monospace;">else</span> só é carregada na primeira vez que o ESP8266 inicia. Depois disso as alterações são feitas pelo Navegador, conforme mostrado anteriormente e depois lida pela parte do <span style="font-family: "courier new" , "courier" , monospace;">if</span>.</div>
</div>
<div>
<br /></div>
<div>
Quando acessamos a página de configuração do WiFi, chamamos a função mostrada abaixo, que monta e preenche o formulário HTML com as informações da estrutura <span style="font-family: "courier new" , "courier" , monospace;">wifiConfig</span>, carregadas da EEPROM.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg35nv_OKJ3rIfkDskaEj61rMLPE8v4n4M5EdXpI698mU8fea4PNxdOWIdeRKfvAoAUcx6Paayyb7e3EskOT1f6cJ1JdO9vJ81nu8fsfgMo1dBSgGD2ZvXgv2fsmGMl94dvnCDsveXh5VHg/s1600/codigo5a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="291" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg35nv_OKJ3rIfkDskaEj61rMLPE8v4n4M5EdXpI698mU8fea4PNxdOWIdeRKfvAoAUcx6Paayyb7e3EskOT1f6cJ1JdO9vJ81nu8fsfgMo1dBSgGD2ZvXgv2fsmGMl94dvnCDsveXh5VHg/s400/codigo5a.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEyW_gbfmQfkCjqyW9r-Z_HT8i3cmb-DpTjMAdxh2eoOdb0YrlpzlcrtW-9suN_IBTlAAHg1KsbStFQHZ0LOgUMPLyVX-RRVneRUEkxpkI5JbZ7XUuRqBEwVdA8nqXekpidCDoGhWQM_hn/s1600/codigo5b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="201" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEyW_gbfmQfkCjqyW9r-Z_HT8i3cmb-DpTjMAdxh2eoOdb0YrlpzlcrtW-9suN_IBTlAAHg1KsbStFQHZ0LOgUMPLyVX-RRVneRUEkxpkI5JbZ7XUuRqBEwVdA8nqXekpidCDoGhWQM_hn/s400/codigo5b.png" width="400" /></a></div>
<div>
<br /></div>
<div>
Ao clicar no botão "Enviar" desse formulário, a outra função que chamada é a mostrada abaixo, onde os dados preenchidos são registrados na estrutura <span style="font-family: "courier new" , "courier" , monospace;">wifiConfig</span> e depois gravados na EEPROM, através da função <span style="font-family: "courier new" , "courier" , monospace;">saveConfig()</span> que vimos anteriormente.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgm5QUXC-1hv8S12uFkc5kuXZQVqAjjzfXo-QcL-cyQ_TKHc4_IRveNnoA0rYFGiLuNEj6WIAcxKxjlx15EAc6C4iBKKnTAShCNsfViVSJLt867jI0oPLrVi7-DRqCuw9IKlv_-laHYHnip/s1600/codigo6a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="222" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgm5QUXC-1hv8S12uFkc5kuXZQVqAjjzfXo-QcL-cyQ_TKHc4_IRveNnoA0rYFGiLuNEj6WIAcxKxjlx15EAc6C4iBKKnTAShCNsfViVSJLt867jI0oPLrVi7-DRqCuw9IKlv_-laHYHnip/s400/codigo6a.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiPBv3u9n6G_hOPrzINFqjI7WbVsfV9_CyitWHAkJXh2O89b70W8G-2_NRT-mpmMEeme0Atjk26j4urNAE2RfBFQZt0DP3gw6xZMUTBy5CPvQmHuOMmjqdbNq3vuSBS5nrNowTdNKK5bCY/s1600/codigo6b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="283" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiPBv3u9n6G_hOPrzINFqjI7WbVsfV9_CyitWHAkJXh2O89b70W8G-2_NRT-mpmMEeme0Atjk26j4urNAE2RfBFQZt0DP3gw6xZMUTBy5CPvQmHuOMmjqdbNq3vuSBS5nrNowTdNKK5bCY/s400/codigo6b.png" width="400" /></a></div>
<div>
<br /></div>
<div>
Repare que a última instrução é uma função especial para reiniciar o ESP8266 chamada <span style="font-family: "courier new" , "courier" , monospace;">ESP.restart()</span>. Isso faz com que o WiFi reinicie e tente conectar de novo no roteador, com os dados novos que foram informados.</div>
<div>
<br /></div>
<div>
Quando o ESP8266 reinicia, a função <span style="font-family: "courier new" , "courier" , monospace;">setup()</span> é chamada novamente, então as configurações carregadas são as novas que foram gravadas na EEPROM, conforme vemos a seguir.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiud4oDoSWZTRlCLTKpWobW4lug4HV0OJH7LEAOlIrSrm6oXo3pDJriRipXYlhAckcvv6qQaNEKLJlItXiRVAu93-JDB2urM0stv8qTM5aCTN99iwDxCrtGep7nTqVpCEEtPT-9C_rW54A_/s1600/codigo7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="271" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiud4oDoSWZTRlCLTKpWobW4lug4HV0OJH7LEAOlIrSrm6oXo3pDJriRipXYlhAckcvv6qQaNEKLJlItXiRVAu93-JDB2urM0stv8qTM5aCTN99iwDxCrtGep7nTqVpCEEtPT-9C_rW54A_/s400/codigo7.png" width="400" /></a></div>
<div>
<br /></div>
<div>
Veja que precisamos primeiro iniciar a EEPROM chamando a função <span style="font-family: "courier new" , "courier" , monospace;">EEPROM.begin()</span>, passando o valor 512 que é o tamanho do espaço reservado para essa memória no seu ESP8266. Verifique o tamanho da versão que você estiver usando.</div>
<div>
<br /></div>
<div>
Depois temos a chamada da funão <span style="font-family: "courier new" , "courier" , monospace;">loadConfig()</span> que faz a leitura da EEPROM e carrega os dados da configuração na estrutura <span style="font-family: "courier new" , "courier" , monospace;">wifiConfig</span>.</div>
<div>
<br /></div>
<div>
Finalmente só precisamos usar os valores de <span style="font-family: "courier new" , "courier" , monospace;">wifiConfig</span> para configurar o SSID e senha na função <span style="font-family: "courier new" , "courier" , monospace;">WiFi.begin()</span>, assim como o IP do ESP8266 e IP do Gateway na função <span style="font-family: "courier new" , "courier" , monospace;">WiFi.config()</span>.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXLEv2kf55jOOPvNdvAz3vHzOg0CmZyhUrWkdmRlXcJocNywP-Wnfn62LlR-4tCMQ6fi-g_xq7QfyAgqAEGgbdbO14mCcNFZovMw1Yjmk3O_VufOyJ0zKbYrl54EAO_xsnpMW_VD_dwqiN/s1600/codigo8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="295" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXLEv2kf55jOOPvNdvAz3vHzOg0CmZyhUrWkdmRlXcJocNywP-Wnfn62LlR-4tCMQ6fi-g_xq7QfyAgqAEGgbdbO14mCcNFZovMw1Yjmk3O_VufOyJ0zKbYrl54EAO_xsnpMW_VD_dwqiN/s400/codigo8.png" width="400" /></a></div>
<div>
<br /></div>
<div>
Continuando a função <span style="font-family: "courier new" , "courier" , monospace;">setup()</span> do ESP8266 vemos os detalhes finais:</div>
<div>
<ul>
<li>1) Apresentamos os dados do roteador em que o ESP8266 conectou.</li>
<li>2) Aqui mostramos a configuração da função de chamada do método GET do formulário de configuração</li>
<li>3) E a configuração da chamada do método POST.</li>
</ul>
<div>
A instrução final do <span style="font-family: "courier new" , "courier" , monospace;">setup()</span> é a chamada da função <span style="font-family: "courier new" , "courier" , monospace;">server.begin()</span> que inicia o servidor. </div>
</div>
<div>
<br /></div>
<div>
<blockquote class="tr_bq">
É isso pessoal! Baixem o código completo <a href="http://seriallink.com.br/lab/ESP8266/ESP8266WebServerPost3.zip">aqui</a>.</blockquote>
</div>
<div>
<br /></div>
<div>
Até o próximo artigo!</div>
<div>
<br /></div>
<div>
Abraços,</div>
<div>
Renato Aloi</div>
Renato Aloihttp://www.blogger.com/profile/18145105903940534638noreply@blogger.com0tag:blogger.com,1999:blog-6653025878902014722.post-2480890290205790822016-06-01T20:35:00.001-07:002016-06-01T20:52:28.218-07:00AnalogRead do Arduino no AVR Libc<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcHlPthInwwj9beS5pGxef8O0EN-jbP_66-4Vt-sB8R3D320o6Z12aeTWv_HDbBQqcWUhERojkaj4Qkxz_2PdeQ6tYknCovYuf_teiwJoWAuFETGzHe4-RZ8_SRLpEtgSULvLqmlqWcwbl/s1600/adc1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcHlPthInwwj9beS5pGxef8O0EN-jbP_66-4Vt-sB8R3D320o6Z12aeTWv_HDbBQqcWUhERojkaj4Qkxz_2PdeQ6tYknCovYuf_teiwJoWAuFETGzHe4-RZ8_SRLpEtgSULvLqmlqWcwbl/s1600/adc1.png" /></a></div>
<br />
Veremos nesse artigo como utilizar a conhecida função <span style="font-family: "courier new" , "courier" , monospace;">analogRead()</span> do Arduino no AVR Libc.<br />
<br />
No <a href="http://renatoaloi.blogspot.com.br/2016/05/serial-do-arduino-usando-avr-libc.html">post anterior</a> dessa série, eu falei sobre a Serial usando o AVR Libc, que utilizaremos também nesse post, então se você ainda não estudou esse assunto, leia o outro post primeiro antes de ler esse aqui.<br />
<br />
Mas porque e quando devemos utilizar essa técnica? Vejamos, o Arduino nada mais é senão um conjunto de bibliotecas que implementa de "forma amigável" todas as funcionalidades do microcontrolador ATMega da Atmel.<br />
<br />
O Arduino utiliza a <i>toolchain </i>da Atmel como base e organiza suas próprias funções em bibliotecas customizadas. A função que veremos nesse artigo é a <span style="font-family: "courier new" , "courier" , monospace;">analogRead()</span> que pode ser encontrada no arquivo <span style="font-family: "courier new" , "courier" , monospace;">wiring_analog.c</span>.<br />
<br />
Como sabemos, ao compilar um código do Arduino, acabamos por agregar todas as funções implementadas, inclusive as não utilizadas. Ou seja, ao carregar um programa simples do Arduino que faz piscar um LED, carregamos todas as funções de suas bibliotecas, incluindo de ADC, Serial, Interrupção, Timers etc. Quando queremos um código mais enxuto, utilizamos o AVR Libc e compilamos apenas as bibliotecas que vamos usar, gerando um executável bem menor!<br />
<br />
Você pode estudar todos os arquivos utilizados pelo Arduino navegando na pasta <span style="font-family: "courier new" , "courier" , monospace;">Cores </span>que é uma subpasta encontrada no diretório de instalação do Arduino. No Windows 7, devemos encontrar essa pasta no seguinte caminho:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino</span><br />
<br />
Lá teremos cabeçalhos como o <span style="font-family: "courier new" , "courier" , monospace;">Arduino.h</span>, <span style="font-family: "courier new" , "courier" , monospace;">wiring.h</span> etc. Nos arquivos de implementação (que nos interessam nesse post), podemos encontrar os comandos de iniciação da parte analógica do Arduino no arquivo <span style="font-family: "courier new" , "courier" , monospace;">wiring.c</span> e a função <span style="font-family: "courier new" , "courier" , monospace;">analogRead()</span> em si, no arquivo <span style="font-family: "courier new" , "courier" , monospace;">wiring_analog.c</span>.<br />
<br />
<blockquote class="tr_bq">
<b>O que é ADC?</b></blockquote>
<br />
ADC é uma sigla em inglês para Conversor Analógico Digital. Quando utilizamos funções como a <span style="font-family: "courier new" , "courier" , monospace;">analogRead()</span> para fazer a leitura de uma porta analógica, convertemos tensão analógica em um valor digital, baseado em limites de referência. Os chips ATMega oferecem algumas soluções de níveis de referência para converter os valores analógicos em digitais.<br />
<br />
Para verificar essas opções que temos nos microcontroladores da Atmel, precisamos verificar os registradores que configuram esses circuitos internos de ADC.<br />
<br />
Manipularemos dois registradores para configurar o ADC de um ATMega, sendo eles o <span style="font-family: "courier new" , "courier" , monospace;">ADCSRA</span> e o <span style="font-family: "courier new" , "courier" , monospace;">ADMUX</span>. O primeiro é o registrador de controle e status, já o último é o registrador responsável pela configuração do <i>demuxer</i>.<br />
<br />
Primeiro precisamos configurar o <span style="font-family: "courier new" , "courier" , monospace;">ADCSRA</span> para ligar o circuito que faz a amostragem da leitura e também ativar esse circuito. Para configurar um registrador, atuamos sobre os bits, ligando ou desligando eles. Vejamos o registrador <span style="font-family: "courier new" , "courier" , monospace;">ADCSRA</span> na imagem abaixo:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9Q5baoARFVPb8po9IoUnczUjQJk3Vv3aisCk6Mt8MmXOqVmUczmIpcdo5UfGE82mTblhi_IYUGGy3DVm4a9bwpjcaATyRDYsxJUBJ65wHouNA6gRLo_BPXMmFSg4zVTPiwUzz2IpzeZhyphenhyphen/s1600/datasheet_ADCSRA.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="52" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9Q5baoARFVPb8po9IoUnczUjQJk3Vv3aisCk6Mt8MmXOqVmUczmIpcdo5UfGE82mTblhi_IYUGGy3DVm4a9bwpjcaATyRDYsxJUBJ65wHouNA6gRLo_BPXMmFSg4zVTPiwUzz2IpzeZhyphenhyphen/s400/datasheet_ADCSRA.png" width="400" /></a></div>
<br />
Os bits desse registradores são:<br />
<br />
<ul>
<li><b>Bit 7 - ADEN: Ativação do ADC</b><br />Escrevendo o valor 1 (ativando) nesse bit, ativamos o circuito do ADC do ATMega. Escrevendo o valor 0 (desativando), desligamos.</li>
<li><b>Bit 6 - ADSC: Inicia Conversão ADC</b><br />No modo simples de conversão, ativamos esse bit para iniciar cada conversão. No modo Free Running, ativamos esse bit para iniciar a primeira conversão.</li>
<li><b>Bit 5 - ADFR: Seletor do Modo Free Running</b><br />Quando ativado esse bit, ligamos o modo Free Running, em que o circuito de ADC amostra e atualiza os registradores de dados constantemente.</li>
<li><b>Bit 4 - ADIF: Flag de Interrupção</b><br />Quando o circuito ADC completa um ciclo de amostragem e os registradores de dados são atualizados, esse bit é ativado, indicando que o processo terminou. Se o registrador ADIE (e também o bit I do SREG) estiver ativo, o ADIF é desativado automaticamente e a função de interrupção de hardware executada.</li>
<li><b>Bit 3 - ADIE: Ativação da Interrupção do ADC</b><br />Ativando este bit e também o bit I do SREG, ligamos a interrupção do ADC.</li>
<li><b>Bit 2,1,0 - ADPS2, ADPS1, ADPS0: Seletor do ADC Prescaler</b><br />Estes bits determinam o fator de divisão do cristal e o clock do ADC, conforme tabela abaixo:</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNX5iwrAJH9zsiUdoKBpELGA1nGj6giJIbjyRfB1sTqey1ot1crCJq2hmHJ6pyEiOiRIiGUIPyVs-ec2VENyHvAwzlgtJwxHn5PRHM_I3-1Kt68IknA6-0IFhtRd8K22rFSrHivTIiUcnN/s1600/adc_prescaler.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="173" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNX5iwrAJH9zsiUdoKBpELGA1nGj6giJIbjyRfB1sTqey1ot1crCJq2hmHJ6pyEiOiRIiGUIPyVs-ec2VENyHvAwzlgtJwxHn5PRHM_I3-1Kt68IknA6-0IFhtRd8K22rFSrHivTIiUcnN/s400/adc_prescaler.png" width="400" /></a></div>
<div>
<br /></div>
<div>
Para configurar o ADC, vamos utilizar os bits 7, 2, 1 e 0. Vamos utilizar o bit 7 <span style="font-family: "courier new" , "courier" , monospace;">ADEN</span> para ativar o ADC do microcontrolador, mas antes temos que usar os bits <span style="font-family: "courier new" , "courier" , monospace;">ADPS0</span>, <span style="font-family: "courier new" , "courier" , monospace;">ADPS1</span> e <span style="font-family: "courier new" , "courier" , monospace;">ADPS2</span>, conforme tabela acima para configurar a taxa do <i>prescaler</i>, dependendo do cristal que utilizaremos no ATMega.</div>
<div>
<br /></div>
<div>
Precisamos de uma frequência de amostragem entre 50Khz a 200Khz, então pegamos o valor do cristal e dividimos pelo <i>prescaler</i>. O valor do resultado tem que ficar dentro dessa faixa, conforme equação a seguir:</div>
<div>
<br /></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;">Frequência do Comparador ADC = Frequencia do Cristal / Prescaler</span></div>
<div>
<br /></div>
<div>
Se estamos usando um cristal de 16Mhz, por exemplo, podemos usar o <i>prescaler </i>de 128 para ter uma frequência de 125Khz, que está dentro da faixa de 50~200Khz. Vamos ver o código como fica:</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjj5t2im4MHvV38MUpD9IWXNmOQs0mEzBdkfX7mLF4kgEyo97Xe9eu9IVprbxOnB9RN0G7BO1dW_kyzZj1YzVitrGdElGF_CZSEvsTQVSbpWTNScIHv4STWH28DIfu1Cwg2PQI_B7pbsiyz/s1600/codigo1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="160" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjj5t2im4MHvV38MUpD9IWXNmOQs0mEzBdkfX7mLF4kgEyo97Xe9eu9IVprbxOnB9RN0G7BO1dW_kyzZj1YzVitrGdElGF_CZSEvsTQVSbpWTNScIHv4STWH28DIfu1Cwg2PQI_B7pbsiyz/s400/codigo1.png" width="400" /></a></div>
<div>
<br /></div>
<div>
Criei uma função chamada <span style="font-family: "courier new" , "courier" , monospace;">adc_init()</span> para facilitar, mas ela é bem simples, configurando os bits <span style="font-family: "courier new" , "courier" , monospace;">ADPS2</span>, <span style="font-family: "courier new" , "courier" , monospace;">ADPS1</span> e <span style="font-family: "courier new" , "courier" , monospace;">ADPS0</span> com valor de 1 e atribuindo no registrador <span style="font-family: "courier new" , "courier" , monospace;">ADCSRA</span>. </div>
<div>
<br /></div>
<div>
A linha depois desliga o modo Free Running, mas essa configuração não é necessária pois esse modo vem desabilitado por padrão.</div>
<div>
<br /></div>
<div>
No código acima utilizamos a Macro <span style="font-family: "courier new" , "courier" , monospace;">_BV()</span> para deslocar os bits do registrador e atribuir apenas os bits a serem configurados. Essa Macro é o equivalente a escrever a instrução <span style="font-family: "courier new" , "courier" , monospace;">(1<<bit)</span>.</div>
<div>
<br /></div>
<div>
Portanto na última linha ligamos o bit <span style="font-family: "courier new" , "courier" , monospace;">ADEN</span> para ativar o circuito do ADC. Essa linha poderia ter sido escrita assim:</div>
<div>
<br /></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;">ADCSRA = ADCSRA | (1<<ADEN)</span></div>
<div>
<br /></div>
<div>
Usar o operador <span style="font-family: "courier new" , "courier" , monospace;">OR</span> (|) é uma forma segura de atuar apenas no bit que está sendo configurado, pois todos os outros bits do registrador ficarão com suas configurações anteriores. Essa instrução funciona para quando vamos ligar um bit do registrador.</div>
<div>
<br /></div>
<div>
Quando vamos desligar um bit do registrador, utilizamos o operador <span style="font-family: "courier new" , "courier" , monospace;">AND</span> (&) e invertemos todos os bits para desligar apenas aquele bit específico. No caso de desligar o modo Free Running, poderia ser escrita assim a instrução:</div>
<div>
<br /></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;">ADCSRA = ADCSRA & ~(1<<ADFR)</span></div>
<div>
<br /></div>
<div>
Veja que usamos o operador <span style="font-family: "courier new" , "courier" , monospace;">TIL</span> (~) para inverter todos os bits.</div>
<div>
<br /></div>
<div>
Depois de configurar o circuito de ADC, podemos criar a função <span style="font-family: "courier new" , "courier" , monospace;">analogRead()</span> configurando o registrador <span style="font-family: "courier new" , "courier" , monospace;">ADMUX</span> e ligando o processo de conversão. </div>
<div>
<br /></div>
<div>
O registrador <span style="font-family: "courier new" , "courier" , monospace;">ADMUX</span> pode ser visto na tabela abaixo:</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfhB-lWgYInVaMf2regYoorTOPGiIfh2tKo8DJ0Z3sX0tkpBjiQgfMVlLAhFp-i4dWnmg2DZA-HAhoHx4ecuPYRdMS_hfnR5riV-nBmRNsOHEg5d0wxL_IZpCJqT_vz_qqP2Vb_Atw4oYA/s1600/datasheet_ADMUX.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="55" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfhB-lWgYInVaMf2regYoorTOPGiIfh2tKo8DJ0Z3sX0tkpBjiQgfMVlLAhFp-i4dWnmg2DZA-HAhoHx4ecuPYRdMS_hfnR5riV-nBmRNsOHEg5d0wxL_IZpCJqT_vz_qqP2Vb_Atw4oYA/s400/datasheet_ADMUX.png" width="400" /></a></div>
<div>
<br /></div>
<div>
Os bits desse registrador são:</div>
<div>
<ul>
<li><b>Bit 7, 6 - REFS1, REFS0 - Seletor da Voltagem de Referência</b><br />Estes bits configuram a referência de voltagem para o cálculo do ADC, conforme mostrado na tabela abaixo:</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOsSjiIA4EkZTLaYSqPHEPn6WoFn0wNMlLJNvRVlOIRCoIP-rG_8B5XntpntWn6zf2c5NNyiD_rQw5-zyu7zxpVwB3p9mAzGSHrv4Np0-OBc34604eeCGyoQYWxwSV4lPShE0ZCWJz_WxZ/s1600/adc_vref.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="105" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOsSjiIA4EkZTLaYSqPHEPn6WoFn0wNMlLJNvRVlOIRCoIP-rG_8B5XntpntWn6zf2c5NNyiD_rQw5-zyu7zxpVwB3p9mAzGSHrv4Np0-OBc34604eeCGyoQYWxwSV4lPShE0ZCWJz_WxZ/s400/adc_vref.png" width="400" /></a></div>
<div>
<ul>
<li><b>Bit 5 - ADLAR - Resultado Alinhado a Esquerda</b><br />O bit ADLAR afeta na apresentação do resultado. Se este bit for ativado, o resultado será armazenado no registrador alto de dados, ou seja apenas no ADCH. Mas se for desligado o resultado é armazenado alinhado a direita.</li>
<li><b>Bits 3, 2, 1, 0 - MUX3, MUX2, MUX1, MUX0 - Seletor do Canal Analógico</b><br />Estes bits configuram qual será a porta analógica usada para obter a conversão ADC, conforme tabela abaixo:</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2GVwJCJKXs1TN75lYKI2uhmBu5hc6a8FXGn9ilnEyAdyZO4FKyTZaWKS768_r42nAiPE4QFhU_WsX2CvPbiR9UcsFa2sMRbpEjZ5mNlDhW5Hp6hqmXDCSRK4VOhmZ_YcDYDnoN4FlCHO6/s1600/adc_channel1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="140" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2GVwJCJKXs1TN75lYKI2uhmBu5hc6a8FXGn9ilnEyAdyZO4FKyTZaWKS768_r42nAiPE4QFhU_WsX2CvPbiR9UcsFa2sMRbpEjZ5mNlDhW5Hp6hqmXDCSRK4VOhmZ_YcDYDnoN4FlCHO6/s400/adc_channel1.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRPh6ITWSg-2zvT8IC9k0fLKNF7AzCw6nJyVq5Fl6TvUejo_vN_4wy4c-79zmGVzaTox-vVC-ihryAsaDrQqkN9v8HZu8knBrTYb0JyHpclOvHuRyi7U2WMP7qhzXai2SgmPkpRUiTLDhP/s1600/adc_channel2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="208" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRPh6ITWSg-2zvT8IC9k0fLKNF7AzCw6nJyVq5Fl6TvUejo_vN_4wy4c-79zmGVzaTox-vVC-ihryAsaDrQqkN9v8HZu8knBrTYb0JyHpclOvHuRyi7U2WMP7qhzXai2SgmPkpRUiTLDhP/s400/adc_channel2.png" width="400" /></a></div>
<div>
<br /></div>
<div>
Precisamos então configurar o valor de referência e a porta analógica a ser utilizada. Vejamos o código e analisaremos em seguida:</div>
</div>
</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaKkM-EXAs9HrzkitJ73xYXqEX68yjHgVbmKtxsxsV5MNoz9l8SyntS64U-oT9TTDltedoxvXp2dPrc7yNVZGIgTNzwT4HceUsgOsKDm75-0pNuTlWCmZKa6uVbZBnXyFvh3E9FpM9LFIu/s1600/codigo2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="315" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaKkM-EXAs9HrzkitJ73xYXqEX68yjHgVbmKtxsxsV5MNoz9l8SyntS64U-oT9TTDltedoxvXp2dPrc7yNVZGIgTNzwT4HceUsgOsKDm75-0pNuTlWCmZKa6uVbZBnXyFvh3E9FpM9LFIu/s400/codigo2.png" width="400" /></a></div>
<div>
Nas primeiras linhas declaramos três variáveis, duas para receber o resultado do comparador ADC, sendo <span style="font-family: "courier new" , "courier" , monospace;">low</span> para o byte menos significativo e <span style="font-family: "courier new" , "courier" , monospace;">high</span> para o byte mais significativo.</div>
<div>
<br /></div>
<div>
A variável <span style="font-family: "courier new" , "courier" , monospace;">bToChannel</span> é uma forma exagerada para garantir que utilizaremos apenas os 3 últimos bits para configurar a porta analógica que vamos utilizar, de <span style="font-family: "courier new" , "courier" , monospace;">ADC0</span> até <span style="font-family: "courier new" , "courier" , monospace;">ADC7</span>.</div>
<div>
<br /></div>
<div>
Primeiro atribuímos diretamente o valor da variável <span style="font-family: "courier new" , "courier" , monospace;">bToChannel</span> para o registrador <span style="font-family: "courier new" , "courier" , monospace;">ADMUX</span>. Isso vai afetar os bits <span style="font-family: "courier new" , "courier" , monospace;">MUX2</span>, <span style="font-family: "courier new" , "courier" , monospace;">MUX1</span> e <span style="font-family: "courier new" , "courier" , monospace;">MUX0</span>.</div>
<div>
<br /></div>
<div>
Depois ativamos o bit <span style="font-family: "courier new" , "courier" , monospace;">REFS0</span>, que conforme a tabela acima, configura o ADC para usar a tensão que existe no pino AVCC. Sabemos que esse pino do ATMega é ligado nos 5V, então esse será nosso valor de referência.</div>
<div>
<br /></div>
<div>
A próxima instrução desliga o bit <span style="font-family: "courier new" , "courier" , monospace;">ADLAR</span> para que o alinhamento seja feito a direita e possamos pegar o resultado dos registradores <span style="font-family: "courier new" , "courier" , monospace;">ADCL</span> e <span style="font-family: "courier new" , "courier" , monospace;">ADCH</span>, utilizando todos os 10 bits de resolução, de 0 a 1023. Se ligássemos esse bit <span style="font-family: "courier new" , "courier" , monospace;">ADLAR</span>, o resultado viria apenas no registrador de dados <span style="font-family: "courier new" , "courier" , monospace;">ADCH</span>, com definição de apenas 8 bits, ou seja, de 0 a 255.</div>
<div>
<br /></div>
<div>
Finalmente ativamos o comparador do ADC para iniciar as amostragens, ligando o bit <span style="font-family: "courier new" , "courier" , monospace;">ADSC</span> do registrador <span style="font-family: "courier new" , "courier" , monospace;">ADCSRA</span>. Isso inicia o processo de leitura e amostragem da porta analógica configurada. Quando o circuito ADC termina esse processo ele configura o bit <span style="font-family: "courier new" , "courier" , monospace;">ADIF</span>, portanto usamos a função <span style="font-family: "courier new" , "courier" , monospace;">loop_until_bit_is_set()</span> para ficar em <i>loop</i> até que esse bit seja ativado.</div>
<div>
<br /></div>
<div>
Repare que não utilizamos a configuração de interrupção pelo bit <span style="font-family: "courier new" , "courier" , monospace;">ADIE</span>, pois não existe necessidade. Aqui apenas esperamos terminar o processo e fazemos a leitura dos registradores de controle.</div>
<div>
<br /></div>
<div>
A utilização dessa função pode ser vista no código abaixo:</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMxAoY-zaUFFE6UxND9S5-nQUfpfI4UkBpk-GOdM2luyBl-gMmJf_Y57rCKea-ugTwcISUf9OH_C04hk6CNHD8Cyt9ZUn-K217JV6o8HZ5LR3c4mtlebNLdzam83Egg-OHOhUM4TgBMv_H/s1600/codigo3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="395" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMxAoY-zaUFFE6UxND9S5-nQUfpfI4UkBpk-GOdM2luyBl-gMmJf_Y57rCKea-ugTwcISUf9OH_C04hk6CNHD8Cyt9ZUn-K217JV6o8HZ5LR3c4mtlebNLdzam83Egg-OHOhUM4TgBMv_H/s400/codigo3.png" width="400" /></a></div>
<div>
<br /></div>
<div>
Repare também que utilizamos a Serial, que aprendemos no outro post, e apenas imprimimos o valor de todas as portas analógicas.</div>
<div>
<br /></div>
<div>
O resultado da execução desse código pode ser visto no Monitor da Serial, conforme imagem abaixo:</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDq1pBz9qOC4PWI9YSWDvrv4HuXG7orpBdWawtRpZBX3zorCtk2_lSv1DZ1stJoOPATKF3YHfjpGC5rlc9PruJiNxqPwWtY-nBbMjCjoUo4FslKYfMIG9TqcWAUIBA_Sfi8z-Pq4MRJb_l/s1600/output.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="251" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDq1pBz9qOC4PWI9YSWDvrv4HuXG7orpBdWawtRpZBX3zorCtk2_lSv1DZ1stJoOPATKF3YHfjpGC5rlc9PruJiNxqPwWtY-nBbMjCjoUo4FslKYfMIG9TqcWAUIBA_Sfi8z-Pq4MRJb_l/s400/output.png" width="400" /></a></div>
<div>
<br /></div>
<blockquote class="tr_bq">
O código completo pode ser baixado clicando <a href="http://seriallink.com.br/lab/Arduino/AnalogReadExemplo.zip">aqui</a>!</blockquote>
<div>
<br /></div>
<div>
Até o próximo artigo pessoal!</div>
<div>
<br /></div>Renato Aloihttp://www.blogger.com/profile/18145105903940534638noreply@blogger.com0