<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Ronaldo Henrique Correia on Medium]]></title>
        <description><![CDATA[Stories by Ronaldo Henrique Correia on Medium]]></description>
        <link>https://medium.com/@ronaldohcorreia?source=rss-164cfcc019cd------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*ra25LAVIwjluX8Q6lkdPBw.jpeg</url>
            <title>Stories by Ronaldo Henrique Correia on Medium</title>
            <link>https://medium.com/@ronaldohcorreia?source=rss-164cfcc019cd------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 20:04:44 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@ronaldohcorreia/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Conhecendo a Biblioteca HTTPSRedirect.h (Parte 1)]]></title>
            <link>https://ronaldohcorreia.medium.com/conhecendo-a-biblioteca-httpsredirect-h-parte-1-5500f1eb88a1?source=rss-164cfcc019cd------2</link>
            <guid isPermaLink="false">https://medium.com/p/5500f1eb88a1</guid>
            <category><![CDATA[iot]]></category>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[esp8266]]></category>
            <category><![CDATA[google-app-script]]></category>
            <dc:creator><![CDATA[Ronaldo Henrique Correia]]></dc:creator>
            <pubDate>Mon, 08 Jan 2024 16:45:59 GMT</pubDate>
            <atom:updated>2024-01-08T16:45:59.404Z</atom:updated>
            <content:encoded><![CDATA[<p>Resumo do conteúdo:</p><ul><li>Introdução à estrutura da parte 1 e 2 desse capítulo;</li><li>Introdução à biblioteca HTTPSRedirect.h;</li><li>Criação das funções de setup e validação de requisições HTTP;</li><li>Envio de payload <strong>json</strong> via requisição HTTP para o servidor Google Apps Script para armazenar dados em uma planilha (Google Sheets);</li></ul><p>Começando agora oficialmente o ano de 2024 (ou será que só começa depois do carnaval? 🤔😂), vou também dar início à segunda parte do projeto: a etapa de organização e armazenamento dos dados!</p><p>Na primeira etapa, explorei algumas possibilidades da biblioteca FS.h para ESP8266, onde preparei o terreno para fazer uso de suas funcionalidades no projeto como forma de backup local do último dado de monitoramento do meu sistema para manter os dados sempre consistentes, mesmo em caso de queda de energia.</p><p>Nessa segunda etapa, irei utilizar a biblioteca <a href="https://github.com/jbuszkie/HTTPSRedirect">HTTPSRedirect.h</a> para realizar redirecionamentos HTTP pra poder me conectar ao servidores da Google e enviar meus dados para serem armazenados no sheets. Essa foi uma forma simples que encontrei de armazenar os dados fazendo requisições públicas em HTTP, atualizando uma tabela privada no Sheets.</p><p>Normalmente, para fazer um banco de dados simples, se usa o formato <strong><em>.csv,</em></strong> entretanto isso tornaria o projeto um pouco mais complexo, visto que a ideia é ter como utilizar os dados gerados pela ESP6 para fazer análise de dados em um computador, e exportar arquivos da SPIFFS para algum meio que disponibilizasse o download deste arquivo adiciona uma complexidade desnecessária.</p><p>Usando a HTTPSRedirect.h, eu posso simplesmente mandar os dados via requisição para um arquivo Sheets do Google via <strong>json</strong> e os dados já ficarão organizados lá.</p><p>Além disso, por estar usando um método de redirecionamento, eu não preciso registrar um API Token na minha conta Google para enviar os arquivos, apenas preciso autorizar as requisições vindas do meu dispositivo, que nesse caso, é uma ESP8266.</p><p>Introduções à parte, vamos ao que interessa. A estrutura do planejamento dessa primeira parte, que será executada pela ESP8266 é a seguinte:</p><ul><li>Primeiro eu preciso criar um objeto de redirecionamento;</li><li>Depois, configurar a conexão com o servidor do host;</li><li>Configurar a minha payload com os dados da leitura do sensor;</li><li>E por fim, realizar o envio do payload;</li></ul><p>Na segunda parte, irei preparar a recepção dos dados, que será feita pelo próprio Sheets. Para isso, utilizarei a plataforma <a href="https://www.google.com/script/start/">Google Apps Script</a>.</p><p>Para quem não conhece, o Google Apps Script é uma plataforma da Google que permite que você desenvolva scripts de automação ou até mesmo aplicações e extensões inteiras utilizando uma linguagem baseada no JavaScript. Essa plataforma é 100% integrada com a suíte Google, ou seja, você pode utilizá-la para desenvolver integrações com qualquer serviço da súite Google, como Google Drive, Google Docs, Google Sheets, Gmail, etc.</p><p>Nessa parte, que vai ficar para o próximo artigo, irei criar uma função que responde a uma requisição HTTP (realizada pela ESP), interpreta o conteúdo dessa requisição, e realiza o <strong><em>parsing</em></strong> dos dados que estão sendo recebidos e, ao final, adiciona esses dados na tabela.</p><p>Então vamos começar com o programa da ESP que realizará as requisições para os servidores da Google.</p><p>Primeiro, vou declarar o básico para utilizarmos a biblioteca:</p><pre>#include &quot;ESP8266WiFi.h&quot;<br>#include &quot;HTTPSRedirect.h&quot;<br>const char* nome_wifi = &quot;sua_rede_wifi&quot;;<br>const char* senha_wifi = &quot;senha_rede_wifi&quot;;<br>HTTPSRedirect* cliente;</pre><p>Além disso, vou também já criar algumas variáveis de apoio que irão armazenar informações importantes para o funcionamento das requisições:</p><pre>String id_implementacao = &quot;&quot;;<br>const char* host = &quot;script.google.com&quot;;<br>const int porta_http = 443;<br><br>String payload_dados = &quot;{\&quot;command\&quot;: \&quot;adicionar_linha\&quot;, \&quot;sheet_name\&quot;: \&quot;Página1\&quot;, \&quot;values\&quot;: &quot;;<br>String payload;<br>String url = &quot;&quot;;<br>int sensor1 = 0;</pre><p>Explicando um pouquinho sobre as variáveis:</p><ul><li>id_implementacao → o ID único da implementação do script do Google Apps Script a ser gerado na plataforma;</li><li>host → host (duh) do Google Apps Script;</li><li>porta_http → porta HTTP utilizada para as requisições/respostas;</li><li>payload_dados → string contendo o <strong>json</strong> com as instruções que iremos enviar para o Google Apps Script (pode também ser feito de forma mais “bonitinha” utilizando ArduinoJson.h). na estrutura do <strong><em>json</em></strong>, eu utilizo a chave sheet_name como “Página1” pois esse é o nome default que uma planilha é criada no sheets;</li><li>payload → payload final onde vou concatenar todos os dados que irei enviar junto com a variável payload_dados;</li><li>url → url que irei criar concatenando a informação armazenada em id_implementacao. essa url é onde a requisição será feita pela ESP.</li><li>sensor1 → variável que armazenará os dados de leitura do sensor (que nesse código, será simulado com a função random();</li></ul><p>Aproveitando que ainda estou nos preparos iniciais, já criei a função que lidará com a conexão da ESP com a WiFi (de praxe, né?):</p><pre>void setup_wifi(const char* rede, const char* senha) {<br>  WiFi.begin(rede, senha);<br>  Serial.println(&quot;&quot;);<br><br>  while (WiFi.status() != WL_CONNECTED) {<br>    delay(500);<br>    Serial.print(&quot;. &quot;);<br>  }<br><br>  Serial.println(&quot; &quot;);<br>  Serial.print(&quot;Conectado na rede: &quot;);<br>  Serial.println(rede);<br>}</pre><p>Agora vou destrinchar cada etapa do processo de redirecionamento HTTP.</p><ol><li>Popular o objeto cliente e tentar conexão com o servidor:</li></ol><pre>void setup_http(HTTPSRedirect* cliente, int porta_http) {<br>  cliente = new HTTPSRedirect(porta_http);<br>  cliente-&gt;setInsecure();<br>  cliente-&gt;setPrintResponseBody(true);<br>  cliente-&gt;setContentTypeHeader(&quot;application/json&quot;);<br>  Serial.println(&quot;Conectando ao servidor Google. . .&quot;);<br><br>  bool flag = false;<br><br>  for (int i = 0; i &lt; 5; i++) {<br>    int valor_retorno = cliente-&gt;connect(host, porta_http);<br><br>    if (valor_retorno == 1) {<br>      flag = true;<br>      Serial.println(&quot;Conectado ao servidor com sucesso.&quot;);<br>      break;<br>    } <br>  else {<br>      Serial.println(&quot;Erro ao conectar no servidor.&quot;);<br>    }<br>  }<br><br>  if (!flag) {<br>    Serial.print(&quot;Erro ao conectar no host &quot;);<br>    Serial.println(host);<br>  }<br><br>  delete cliente;<br>  cliente = nullptr;<br>}</pre><p>Essa talvez seja a parte mais complicada do código, mas vamos lá.</p><p>Primeiro estou dizendo que minha variável cliente será um objeto do tipo HTTPSRedirect. Esse objeto passará por alguns settings através de alguns métodos. O método setInsecure() permite que eu realize a requisição sem precisar validá-la todas as vezes. A validação da requisição é realizada pelo id armazenado em id_implementacao. O método setPrintResponseBody() permite a impressão da resposta da requisição na porta serial da ESP, então podemos verificar as respostas de erro/sucesso sem precisar tratá-las no nosso código. Por fim, o método setContentTypeHeader() define padrão em que o header está sendo preenchido, que no nosso caso é no formato <strong>json</strong>.</p><p>Na segunda parte dessa função, o cliente tentará se conectar ao servidor. Coloquei em um for loop de 5 tentativas, mas você pode fazer com menos, com mais, ou nem tentar mais de uma vez também. E no fim, eu deleto o cliente e faço ele apontar para um espaço nulo.</p><p>Nessa parte final, eu preciso resetar o conteúdo do cliente, pois esse objeto é recriado e repopulado a cada chamada da próxima função (checa_conexao()), mas não entendi muito bem porque eu <strong>preciso</strong> resetar o e recriar o conteúdo desse objeto. Tentei de algumas formas realizar a persistência desse objeto, mas sempre acabava quebrando o código e causando um erro de memória, então… em time que tá ganhando não se mexe (por enquanto).</p><p>2. Checar e validar a conexão:</p><pre>void checa_conexao(HTTPSRedirect* cliente, int porta_http) {<br>  static bool flag = false;<br><br>  if (!flag) {<br>    cliente = new HTTPSRedirect(porta_http);<br>    cliente-&gt;setInsecure();<br>    cliente-&gt;setPrintResponseBody(true);<br>    cliente-&gt;setContentTypeHeader(&quot;application/json&quot;);<br>    flag = true;<br>  }<br><br>  if (cliente != nullptr) {<br>    if (!cliente-&gt;connected()) {<br>      cliente-&gt;connect(host, porta_http);<br>    }<br>  } else {<br>    Serial.println(&quot;Erro ao conectar no servidor http&quot;);<br>  }<br>}</pre><p>Essa função é quem valida a conexão antes de fazer o envio do payload para o host. Então inicio criando uma variável booleana que se torna <em>true</em> se o objeto cliente ainda não tiver sido corretamente criado ou populado. Caso ela já seja verdadeira, checamos se cliente está apontando para um ponteiro nulo (conforme fazemos no final da função setup_http()). Caso verdade, se checa se o cliente já está conectado. Caso não esteja, realiza a conexão.</p><p>3. Enviar o payload:</p><pre>void envia_payload() {<br>  payload = payload_dados + &quot;\&quot;&quot; + String(sensor1) + &quot;\&quot;}&quot;;<br><br>  if (cliente-&gt;POST(url, host, payload)) {<br>      Serial.println(&quot;Dados enviados para o servidor.&quot;);<br>    }    <br>    else {<br>      Serial.println(&quot;Erro ao enviar dados para o servidor.&quot;);<br>    }<br>}</pre><p>Já essa função, tem como papel realizar o envio do payload. Caso a função setup_http() ou checa_conexao() falhem, obviamente a função envia_payload() não vai funcionar também.</p><p>Nessa função, eu concateno as informações da variável payload_dados com a leitura do sensor que será ralizada no void_loop(), e então faço uma requisição do tipo <strong>POST</strong> e passo como parâmetro as variáveis url, host, e payload.</p><p>Com essa primeira parte finalizada, basta organizarmos agora o código na estrutura da Arduino IDE, com o void_setup() e void_loop():</p><ul><li>Bibliotecas e variáveis:</li></ul><pre>#include &quot;ESP8266WiFi.h&quot;<br>#include &quot;HTTPSRedirect.h&quot;<br><br><br>// ## variaveis<br>unsigned long previousMillis = 0;<br>const char* nome_wifi = &quot;sua_rede_wifi&quot;; // alterar para uma rede wi-fi real<br>const char* senha_wifi = &quot;senha_rede_wifi&quot;; // alterar para a senha da rede wi-fi<br><br>HTTPSRedirect* cliente;<br><br>String pega_id_implementacao = &quot;&quot;; // alterar com id da implementação do Google Apps Script<br>String id_implementacao = &quot;&quot;;<br><br>const char* host = &quot;script.google.com&quot;;<br>const int porta_http = 443;<br>String payload_dados = &quot;{\&quot;command\&quot;: \&quot;adicionar_linha\&quot;, \&quot;sheet_name\&quot;: \&quot;Página1\&quot;, \&quot;values\&quot;: &quot;;<br>String payload;<br>String url = &quot;&quot;;<br>int sensor1 = 0;</pre><p>observação: criei uma variável previousMillis para poder realizar um controle de tempo nas requisições sem usar interrupções com delay().</p><ul><li>void_setup():</li></ul><pre>void setup() {<br>  Serial.begin(9600);<br>  setup_wifi(nome_wifi, senha_wifi);  <br>  setup_http();<br>  checa_conexao();<br>}</pre><p>No void_setup(), faço a conexão com a WiFi, o setup inicial da requisição e valido a conexão com o servidor.</p><ul><li>void_loop():</li></ul><pre>void loop() {<br>  sensor1 = random(0, 101);<br><br>  if (millis() - previousMillis &gt;= 10000) {<br>    previousMillis = millis();<br>    checa_conexao();<br>    envia_payload();<br>  }<br>}</pre><p>Aqui no void_loop(), atribuo um valor de leitura aleatório à minha variável sensor1 e determino o tempo em que irei executar as funções responsáveis para o envio do payload.</p><p>Finalizando então essa primeira parte sobre a biblioteca HTTPSRedirect.h, o código produzido é capaz de gerar dados aleatórios e enviá-los a cada 10 segundos para serem interpretados por um script (baseado no ID armazenado na variável id_implementacao) e serem dispostos na planilha.</p><p>Na parte 2 desse artigo, que irei postar até o fim da semana, pretendo demonstrar o processo de desenvolvimento e aplicação de um script no Google Apps Script para integrar a ESP com a minha planilha no sheets.</p><p>Lembrando que todos os códigos dessa segunda parte do projeto estão disponíveis no repositório do projeto em: <a href="https://github.com/ronaldneves/ESP8266_SHEETS/tree/main">ronaldneves/ESP8266_SHEETS</a>.</p><p>Vejo vocês em breve e até logo!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5500f1eb88a1" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ESP8266 — Sistema de backup usando a memória Flash]]></title>
            <link>https://ronaldohcorreia.medium.com/esp8266-sistema-de-backup-usando-a-mem%C3%B3ria-flash-ed95fe7e9f42?source=rss-164cfcc019cd------2</link>
            <guid isPermaLink="false">https://medium.com/p/ed95fe7e9f42</guid>
            <category><![CDATA[internet-das-coisas]]></category>
            <category><![CDATA[iot]]></category>
            <category><![CDATA[data-visualization]]></category>
            <category><![CDATA[esp8266]]></category>
            <dc:creator><![CDATA[Ronaldo Henrique Correia]]></dc:creator>
            <pubDate>Mon, 18 Dec 2023 13:23:00 GMT</pubDate>
            <atom:updated>2023-12-18T13:23:00.508Z</atom:updated>
            <content:encoded><![CDATA[<h3>ESP8266 — Sistema de backup usando a memória Flash</h3><p>Para finalizar o tema memória flash, o último mini-projeto desse primeiro capítulo que tem como objetivo armazenar algum dado para que, caso haja uma queda de energia, esse dado seja rapidamente recuperado.</p><p>A vantagem disso é que se torna possível recuperar uma variável de controle antes do sistema entrar no void loop().</p><p>Neste exemplo, criei uma variável chamada contador_evento, que serve para armazenar quantas vezes um tanque chegou ao nível mínimo durante o tempo em que a ESP ficou em operação. Porém, por se tratar de uma variável armazenada em memória dinâmica, ela se perde caso a ESP seja reiniciada, então fiz o código pensando em guardar e recuperar esse valor em caso de reinício.</p><p>Então vamos direto ao assunto.</p><p>Diferente do mini-projeto anterior, neste exemplo eu só utilizei a biblioteca FS.h mesmo, já que é um caso de uso mais simples.</p><p>Começando com a declaração de bibliotecas e variáveis:</p><pre>#include &quot;FS.h&quot;<br><br><br>int leitura_sensor = 0;<br>int contador_evento = 0;<br>int comparador_evento = 1; // 1 significa tanque vazio. quero contar quantas vezes o tanque ficou vazio<br>unsigned long millis_sensor = 0;<br>unsigned long tempo_sensor = 2000;<br>unsigned long tempo_backup = 5000;<br>unsigned long millis_backup = 0;<br>const char* nome_do_arquivo = &quot;/backup.txt&quot;;</pre><p>Além da variável contador_evento, também adicionei uma variável de controle, que é a variável que será comparada com a leitura do sensor para que o sistema registre aquele evento. Como eu estou monitorando o tanque vazio, eu simulei a leitura do sensor com a função random() tendo como valores limite 1 e 3, ou seja, quando o sensor retornar 1, seria o equivalente ao evento que eu quero monitorar (tanque vazio).</p><p>As variáveis do tipo unsigned long serão utilizadas para controle do tempo de execução das rotinas. Eu escolhi 2000ms (ou 2s) como tempo de leitura do sensor e 5000ms (ou 5s) como tempo de backup.</p><p>Primeiro eu criei a função responsável por checar se já existe um arquivo de backup com dados disponíveis, de forma similar à forma que eu tratei os arquivos de log do projeto anterior (<a href="https://ronaldohcorreia.medium.com/esp8266-sistema-de-log-usando-a-mem%C3%B3ria-flash-a613f5ea5ee8">link caso queira dar uma olhada</a>), então não vou entrar muito em detalhes. Mas basicamente, eu solicito uma busca pelo arquivo declarado na variável nome_do_arquivo e checo se há algum valor armazenado nele. Caso exista, eu converto essa variável em um tipo <strong><em>int</em></strong> e entrego como retorno da função.</p><pre>int restaura_backup(const char* nome_do_arquivo, int contador) {<br>  if (SPIFFS.exists(nome_do_arquivo)) {<br>    Serial.println(&quot;Arquivo de backup encontrado. Restaurando valor do contador.&quot;);<br>    File backup = SPIFFS.open(nome_do_arquivo, &quot;r&quot;);<br><br>    while(backup.available()) {<br>      String linha = backup.readStringUntil(&#39;\n&#39;);<br>      contador = linha.toInt();        <br>    }<br>  }<br>  return contador;<br>}</pre><p>Essa conversão é importante pois, após o retorno da função, eu vou utilizar esse valor pra dar continuidade no meu contador de eventos.</p><p>Depois de checar se o arquivo de backup já existia, os próximos passos são: simular a leitura do sensor, realizar a contagem dos eventos e guardar esse dado no arquivo <strong><em>.txt.</em></strong></p><p>Para simular o sensor, fiz uma simples função com random():</p><pre>int simulador_sensor(int sensor) {<br>  sensor = random(1, 4); // 4 não incluso. ele conta de 1 a 3 (1, 2, 3)<br>  return sensor;<br>}</pre><p>e para a função de registrar quando o tanque está vazio:</p><pre>int contador(int sensor, int contador_evento, int comparador) {<br>  if (sensor == comparador) {<br>    contador_evento += 1;<br>    Serial.print(&quot;Evento detectado. &quot;);<br>  }<br>  return contador_evento;<br>}</pre><p>e por fim, a função responsável por fazer o backup:</p><pre>void salva_backup(int contador, const char* nome_do_arquivo) {<br>  File backup = SPIFFS.open(nome_do_arquivo, &quot;w&quot;);<br>  backup.println(contador);<br>  backup.close();<br><br>  Serial.println(&quot;Backup realizado com sucesso.&quot;);<br>}</pre><p>Sendo assim, no void setup() eu inicializo a serial, a SPIFFS e chamo a função restaura_backup() para verificar se já tinha algum valor de backup na memória.</p><pre>void setup() {<br>  Serial.begin(9600);<br>  SPIFFS.begin();<br>  contador_evento = restaura_backup(nome_do_arquivo, contador_evento);<br>}</pre><p>E no void loop() eu adiciono os controles de tempo para leitura e para backup. Conforme declarado nas variáveis no começo do código, são 2000ms de tempo de espera para a leitura do sensor e 5000ms para que esse valor seja armazenado no arquivo de backup.</p><pre>void loop() {<br>  if ((millis() - millis_sensor) &gt; tempo_sensor) {<br>    millis_sensor = millis();<br>    leitura_sensor = simulador_sensor(leitura_sensor);<br>    Serial.print(&quot;Valor de leitura do sensor da caixa d&#39;água: &quot;);<br>    Serial.println(leitura_sensor);<br>    Serial.print(&quot;Valor do contador de eventos: &quot;);<br>    contador_evento = contador(leitura_sensor, contador_evento, comparador_evento);<br>    Serial.println(contador_evento);<br>  } <br><br>  if ((millis() - millis_backup) &gt; tempo_backup) {<br>    millis_backup = millis();<br>    salva_backup(contador_evento, nome_do_arquivo);<br>  }<br>}</pre><p>Com esse código, a cada 2 segundos a ESP requere um valor do nosso simulador, e a cada 5 segundos o backup do último valor retornado pelo simulador é armazenado num arquivo .txt. Em caso de reinício, o último valor salvo em backup é recuperado, permitindo que o sistema não perca esse dado e dê continuidade à contagem de eventos.</p><p>Lembrando que todos os códigos desse primeiro capítulo do projeto estão disponíveis no repositório do projeto em <a href="https://github.com/ronaldneves/ESP8266_SPIFFS">ronaldneves/ESP8266_SPIFFS</a>!</p><p>No próximo capítulo, vou iniciar a integração da ESP com o Google Sheets, para que possamos armazenar e acessar os dados gerados de forma online.</p><p>Até logo e boas festas a todos!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ed95fe7e9f42" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ESP8266 — Sistema de Log usando a memória Flash]]></title>
            <link>https://ronaldohcorreia.medium.com/esp8266-sistema-de-log-usando-a-mem%C3%B3ria-flash-a613f5ea5ee8?source=rss-164cfcc019cd------2</link>
            <guid isPermaLink="false">https://medium.com/p/a613f5ea5ee8</guid>
            <category><![CDATA[internet-das-coisas]]></category>
            <category><![CDATA[esp8266]]></category>
            <category><![CDATA[iot]]></category>
            <category><![CDATA[data-visualization]]></category>
            <category><![CDATA[spiff]]></category>
            <dc:creator><![CDATA[Ronaldo Henrique Correia]]></dc:creator>
            <pubDate>Mon, 11 Dec 2023 13:27:27 GMT</pubDate>
            <atom:updated>2023-12-11T13:27:27.798Z</atom:updated>
            <content:encoded><![CDATA[<h3>ESP8266 — Sistema de Log usando a memória Flash</h3><p>Na última livestream que fiz na twitch, desenvolvi dois projetos de caso de uso prático para entendermos melhor como podemos utilizar a biblioteca FS.h na ESP8266: um sistema de controle de acesso, onde um log era criado toda vez que uma pessoa entrava ou saía de um local, substituindo o sensor de presença por um botão que foi utilizado para simular os inputs. O segundo projeto, foi um sistema de backup, onde o último dado de uma série de leituras de sensores era armazenado na memória flash da ESP, para em caso de queda de energia, o último valor de leitura seja recuperado, evitando que o sistema execute alguma ação inesperada até realizar uma nova leitura.</p><p>No post de hoje, vou falar do sistema de log.</p><p>Para a criação do sistema de log, eu utilizei, em conjunto com a biblioteca FS.h, as bibliotecas NTPClient.h e TimeLib.h para que também pudessem ser gerados dados de hora e data para salvar no log em conjunto à informação do botão.</p><p>Para a criação dessa “<em>timestamp</em>”, primeiro declaro as variáveis e objetos necessários para trabalhar com essas bibliotecas:</p><pre>#include &quot;ESP8266WiFi.h&quot;<br>#include &quot;NTPClient.h&quot;<br>#include &quot;TimeLib.h&quot; // biblioteca para fazer conversões de tempo para data<br>#include &quot;WiFiUdp.h&quot;<br><br>const char* nome_wifi = &quot;&quot;; // substituir por nome da wifi<br>const char* senha_wifi = &quot;&quot;; // substituir por senha da wifi<br>const char* servidor_ntp = &quot;pool.ntp.org&quot;;<br>unsigned long ajuste_fuso = (-3 * 3600);<br>WiFiUDP udp;<br>NTPClient cliente_tempo(udp, &quot;pool.ntp.org&quot;, ajuste_fuso);<br>String hora_data = &quot;&quot;;</pre><p>As variáveis nome_wifi e senha_wifi devem ser alteradas de acordo com a rede que você desejar se conectar!</p><p>As demais variáveis são de configuração, como a criação de um objeto udp para ser passada como argumento na obtenção de dados de tempo NTP e uma variável <strong>String</strong> para armazenar o nosso timestamp.</p><p>Depois disso, eu criei a função que pega os dados de data e hora. Nesse caso, não vou entrar em muitos detalhes, pois é um método bem padrão, que pode ser lido com mais tranquilidade checando a documentação da biblioteca TimeLib.h.</p><pre>String pega_data_hora(NTPClient cliente) { <br>  unsigned long epochTime = cliente.getEpochTime(); // epochTime = estrutura de tempo unix, conta segundos passados desde 1900<br>  struct tm *ptm = gmtime((time_t *)&amp;epochTime);<br>  tmElements_t tm;<br>  breakTime(epochTime + (7 * 24 * 3600), tm); // criação do objeto dia / mês / ano<br>  int dia = (tm.Day);<br>  int mes = (tm.Month);<br>  int ano = (tm.Year + 1970);<br>  String data = (String(dia) + &quot;/&quot; + String(mes) + &quot;/&quot; + String(ano));<br>  String hora = cliente_tempo.getFormattedTime();<br>  String data_hora = (hora + &quot; &quot; + data);<br>  return data_hora;<br>}</pre><p>Obviamente, também criei uma função que se torna responsável pela conexão com a rede wi-fi:</p><pre>void setup_wifi(const char* rede, const char* senha) {<br>  WiFi.begin(rede, senha);<br>  Serial.println(&quot;&quot;);<br><br>  while (WiFi.status() != WL_CONNECTED) {<br>    delay(300);<br>    Serial.print(&quot;.&quot;);<br>  }<br>  Serial.print(&quot;Conectado na rede: &quot;);<br>  Serial.println(rede);<br>}</pre><p>Agora na parte de simular o sistema de acesso com um push-button, fica um pouquinho complicado, caso você não tenha muito conhecimento em prototipagem eletrônica com microcontroladores.</p><p>Basicamente, eu precisei criar uma função que calcula o <strong>debounce</strong> do push button, que tem como objetivo evitar erros de leitura no pressionamento do botão. Basicamente, seria como se eu adicionasse um período de espera quando o botão é pressionado, para garantir de que a leitura desse botão só seria realizada quando ele realmente tivesse sido pressionado.</p><p>Além disso, para evitar mais de uma leitura, criei uma função que trata da leitura da mudança de estado do botão, para que só fosse contabilizado o momento de pressionamento do botão, e não quando ele fosse “despressionado”.</p><pre>int botao_acesso = 4;<br>int estado_botao = 1;<br>int ultimo_estado_botao = 1;<br>unsigned long debounce_delay = 50;<br>unsigned long debounce = 0;<br>int botao_com_debounce = 0;<br><br>int debounce_botao(int porta_do_botao) {<br>  int leitura_botao = digitalRead(porta_do_botao);<br>  <br>  if (leitura_botao != ultimo_estado_botao) {<br>    debounce = millis();<br>  }<br>  if ((millis() - debounce) &gt; debounce_delay) {<br>    if (leitura_botao != estado_botao) {<br>      estado_botao = leitura_botao;      <br>      }<br>    }<br>  ultimo_estado_botao = leitura_botao;<br>  return estado_botao;<br>}</pre><p>Para finalizar, criei algumas funções que já conhecemos com a biblioteca FS.h.</p><p>Primeiro uma função que checa se o arquivo de log já existe na memória. Caso não exista, cria um novo:</p><pre>void checa_arquivo(const char* nome_do_arquivo) {<br>  if (!SPIFFS.exists(nome_do_arquivo)) {<br>    File arquivo_inicial = SPIFFS.open(nome_do_arquivo, &quot;w&quot;);<br>    arquivo_inicial.println(&quot;Início do Log de Acesso.&quot;);<br>    arquivo_inicial.close();<br>    Serial.println(&quot;Arquivo base criado com sucesso.&quot;);<br>  }<br>  else {<br>    Serial.println(&quot;Arquivo base encontrado na memória.&quot;);<br>  }<br>}</pre><p>E por fim, uma função que recebe os dados do arquivo e de log para salvar os dados na memória:</p><pre>void salva_log(const char* nome_arquivo, String log_hora_data) {<br>  File arquivo = SPIFFS.open(nome_arquivo, &quot;a&quot;);<br>  arquivo.println(log_hora_data);<br>  arquivo.close();<br>  Serial.println(&quot;Log gerado.&quot;);<br>}</pre><p>Com essas funções criadas, o escopo do void setup() e do void loop() ficaram da seguinte maneira:</p><pre>void setup() {<br>  Serial.begin(9600);<br>  pinMode(botao_acesso, INPUT_PULLUP);<br>  setup_wifi(nome_wifi, senha_wifi);<br><br>  cliente_tempo.begin();<br>  SPIFFS.begin();<br>  checa_arquivo(nome_do_arquivo);<br>}<br><br>void loop() {<br>  cliente_tempo.update();  <br>  botao_com_debounce = debounce_botao(botao_acesso);<br>  if (botao_com_debounce == 0 &amp;&amp; controle_impressao == 0) {<br>    log_template = &quot;Botão pressionado: &quot; + pega_data_hora(cliente_tempo);<br>    salva_log(nome_do_arquivo, log_template);<br>    controle_impressao = 1;  // controle de impressão<br>  }  <br>  else if (botao_com_debounce != 0) {<br>    controle_impressao = 0;  // reset do controle <br>  }<br>}</pre><p>No void setup(), a ESP configura o push button, se conecta na rede wi-fi, inicializa a SPIFFS com a biblioteca FS.h, inicializa o cliente de tempo da biblioteca NTPClient.h e, por fim, executa a função checa_arquivo().</p><p>Já no void loop(), chamo o método .update() do cliente de tempo e faço uma pequena lógica de controle de estado para evitar leituras duplicadas do estado do botão.</p><p>Com esse programa, cada vez que o botão é pressionado, um registro é armazenado no nosso arquivo /log.txt com a hora e data que o botão foi pressionado.</p><p>Caso tenha interesse em ver o código completo, ele está disponível no repositório do projeto em <a href="https://github.com/ronaldneves/ESP8266_SPIFFS/blob/main/spiffs_log/spiffs_log.ino">ESP8266_SPIFFS/spiffs_log/spiffs_log.ino</a>.</p><p>No próximo post, vou trazer como desenvolver um sistema de backup com a biblioteca FS.h, então fiquem ligados. 😉</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a613f5ea5ee8" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Listando e Interagindo com Arquivos na Memória Flash de uma ESP8266]]></title>
            <link>https://ronaldohcorreia.medium.com/listando-e-interagindo-com-arquivos-na-mem%C3%B3ria-flash-de-uma-esp8266-e5926d5326a9?source=rss-164cfcc019cd------2</link>
            <guid isPermaLink="false">https://medium.com/p/e5926d5326a9</guid>
            <category><![CDATA[embedded-systems]]></category>
            <category><![CDATA[sistemas-embarcados]]></category>
            <category><![CDATA[spiff]]></category>
            <category><![CDATA[programação]]></category>
            <category><![CDATA[esp8266]]></category>
            <dc:creator><![CDATA[Ronaldo Henrique Correia]]></dc:creator>
            <pubDate>Mon, 27 Nov 2023 15:35:51 GMT</pubDate>
            <atom:updated>2023-11-27T15:37:20.506Z</atom:updated>
            <content:encoded><![CDATA[<p>Nos dois últimos posts, aprendemos a criar e posteriormente a ler conteúdo de arquivos <strong>.txt</strong> utilizando a biblioteca FS.h, que permite interagir com a memória flash de uma ESP8266.</p><p>Agora, pra finalizar essa etapa inicial, em que aprendemos os métodos básicos de objetos criados com o auxílio dessa biblioteca, vamos aprender mais alguns destes métodos.</p><p>Vamos começar com a listagem de arquivos.</p><p><strong>Observação: para esta demonstração, utilizarei a Arduino IDE 2.1.1, e a configuração de placa selecionada para NodeMCU 1.0 (ESP-12E).</strong></p><p><strong>Observação 2: nos testes de demonstração dos códigos de hoje, minha ESP estava imprimindo caracteres de lixo na saída serial. Esse output não atrapalha as funcionalidades implementadas pelos códigos.</strong></p><p>Para listar arquivos, primeiro precisamos criar um objeto do tipo <strong><em>Dir.</em></strong> Essa classe permite a atribuição de alguns elementos interessantes para lidarmos com informações da memória flash e de seus arquivos, como o endereço dos arquivos, seus nomes e até mesmo a data de criação dos mesmos.</p><p>O primeiro passo para listarmos os nomes dos arquivos que estão na nossa memória flash, precisamos criar nosso objeto do tipo <strong><em>Dir</em></strong>. Então vamos começar fazendo o setup inicial que já estamos acostumados a fazer:</p><pre>#include &quot;FS.h&quot;<br><br>void setup() {<br> Serial.begin(9600);<br> SPIFFS.begin();<br><br> Dir diretorio = SPIFFS.openDir(&quot;/&quot;);<br>}</pre><p>Nesse primeiro momento, estamos criando um objeto do tipo <strong><em>Dir</em></strong> chamado diretório, que vai receber todo o conteúdo que está sendo aberto no nosso diretório base da memória flash, representado por uma barra.</p><p>Agora, podemos utilizar um dos métodos de checagem do nosso diretório: o <strong><em>.next()</em></strong>. Esse método “lê” o conteúdo da memória flash da ESP8266 que está na nossa variárel <strong><em>diretorio</em></strong> e retorna um <strong>booleano</strong> para indicar se existem arquivos ou não naquele diretório que foi aberto. Caso o retorno seja <strong>True</strong>, ele passa para o próximo arquivo, até chegar ao fim.</p><p>Nesse processo de checar a existência dos arquivos, a variável <strong><em>diretório</em></strong> passa a apontar, temporariamente, para valores que possuem informações desse arquivo, como seu nome, por exemplo.</p><p>Então, para pegarmos os nomes de todos os arquivos .txt na memória flash do nosso dispositivo, podemos criar um <em>while loop, </em>cujo controle será realizado pelo próprio objeto <em>diretório </em>e, durante cada iteração do objeto, iremos extrair o nome do arquivo para qual esse objeto está temporariamente apontando utilizando o método <em>.fileName().</em></p><pre>while (dir.next()) {<br> Serial.println(dir.fileName());<br>}</pre><p>Podemos então finalizar esse código da seguinte maneira:</p><pre>#include &quot;FS.h&quot;<br>String nome_do_arquivo = &quot;&quot;;<br><br>void setup() {<br>  Serial.begin(9600);<br>  SPIFFS.begin();  <br><br>  Dir dir = SPIFFS.openDir(&quot;/&quot;);<br><br>  while (dir.next()) {<br>    Serial.println(dir.fileName());<br>  }<br><br>  Serial.println(&quot;Listagem de arquivos concluída.&quot;);<br>}<br><br>void loop() {<br>}</pre><p>Dessa forma, ao executar o código, a ESP8266 irá imprimir o nome de todos os arquivos armazenados em sua memória flash na saída serial. Adicionei um <em>Serial.println</em> extra no final apenas para dar uma embelezada.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8uyaKYiWvzQDwNQ5b70b4A.png" /><figcaption>perdoe o lixo impresso no começo do output serial heheheh</figcaption></figure><p>Além de podermos criar, listar, ler e editar arquivos <strong>.<em>txt</em></strong><em> </em>na memória flash da ESP, vou passar rapidamente por mais algumas funções úteis dessa biblioteca.</p><h4>Checar a existência de arquivos específicos</h4><p>Ao invés de sempre listar e buscar arquivos de forma <strong>hard coded</strong>, você pode checar pela existência de um arquivo específico usando o método <strong><em>.exists(path)</em></strong>, onde “<strong>path”</strong> pode ser substituído por uma variável do tipo <strong>string</strong> ou <strong><em>const char</em></strong>*. Seu conteúdo precisa ser o local onde o arquivo está. Então, se quisermos checar se o arquivo “<strong><em>teste.txt”</em></strong> que criamos anteriormente, de fato existe, basta utilizarmos este método.</p><pre>#include &quot;FS.h&quot;<br>String nome_do_arquivo = &quot;/teste.txt&quot;;<br><br>void setup() {<br> Serial.begin(9600);<br> SPIFFS.begin();<br><br> if (SPIFFS.exists(nome_do_arquivo)) {<br>  Serial.println(&quot;Arquivo &quot; + nome_do_arquivo + &quot; encontrado!&quot;);<br> }<br>}<br><br>void loop() {<br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pOIQDnSb08G_XVUAF26z7g.png" /></figure><h4>Apagar arquivos:</h4><p>Para apagar arquivos, utilizamos o método <strong><em>.remove(path)</em></strong>. Então, por exemplo, se quisermos apagar o arquivo “<strong><em>log.txt”</em></strong>, que está presente na nossa memória, basta utilizarmos o método <strong>.remove(),</strong> que funciona de forma similar ao <strong><em>.exists()</em></strong>. Adicionarei uma listagem de arquivos após a remoção para checarmos se o arquivo “<strong><em>log.txt”</em></strong> foi corretamente apagado.</p><pre>#include &quot;FS.h&quot;<br>String nome_do_arquivo = &quot;/log.txt&quot;;<br><br>void setup() {<br> Serial.begin(9600);<br> SPIFFS.begin();<br><br> SPIFFS.remove(nome_do_arquivo);<br><br> Dir dir = SPIFFS.openDir(&quot;/&quot;);<br><br>  while (dir.next()) {<br>    Serial.println(dir.fileName());<br>  }<br><br>  Serial.println(&quot;Listagem de arquivos concluída.&quot;);<br>}<br><br>void loop() {<br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Nk9B90E4GdMd_UA8URBKKw.png" /></figure><h4>Formatar a memória flash:</h4><p>Caso não queira listar e buscar para apagar arquivos individualmente, você também pode simplesmente usar o método <strong>.format()</strong> e apagar tudo de vez!</p><pre>#include &quot;FS.h&quot;<br><br>void setup() {<br> Serial.begin(9600);<br> SPIFFS.begin();<br><br> SPIFFS.format();<br>}<br><br>void loop() {<br>}</pre><p>Agora que já sabemos como manipular arquivos e seus conteúdos na memória flash da ESP, no próximo capítulo iremos criar um projeto com essa biblioteca! Vamos criar um sistema de <strong><em>log</em></strong>, que irá armazenar os dados de um sensor de forma local, em um arquivo <strong>.txt</strong> na memória flash da ESP.</p><p>Além disso, esse projeto também será desenvolvido em livestream! A live será no dia 01/12 (sexta-feira), às 21h, no meu canal da twitch: <a href="https://www.twitch.tv/ronaldohcorreia">ronaldohcorreia — Twitch</a>.</p><p>Mas não se preocupe caso não possa acompanhar ao vivo. Também postarei a gravação (editada) no youtube e farei a transcrição por aqui. 🙂</p><p>Para mais detalhes, acesse o repositório do projeto: <a href="https://github.com/ronaldneves/ESP8266_SPIFFS">ronaldneves/ESP8266_SPIFFS (github.com)</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e5926d5326a9" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Lendo Arquivos na Memória Flash de uma ESP8266]]></title>
            <link>https://ronaldohcorreia.medium.com/lendo-arquivos-na-mem%C3%B3ria-flash-de-uma-esp8266-405ebc84bb82?source=rss-164cfcc019cd------2</link>
            <guid isPermaLink="false">https://medium.com/p/405ebc84bb82</guid>
            <category><![CDATA[spiff]]></category>
            <category><![CDATA[esp8266]]></category>
            <category><![CDATA[c-programming]]></category>
            <category><![CDATA[programação]]></category>
            <category><![CDATA[sistemas-embarcados]]></category>
            <dc:creator><![CDATA[Ronaldo Henrique Correia]]></dc:creator>
            <pubDate>Mon, 20 Nov 2023 17:26:16 GMT</pubDate>
            <atom:updated>2023-11-20T17:26:16.918Z</atom:updated>
            <content:encoded><![CDATA[<p>No <a href="https://ronaldohcorreia.medium.com/armazenando-dados-na-mem%C3%B3ria-flash-de-uma-esp8266-c3842d00ba23">primeiro capítulo</a> dessa série de posts, nós vimos como criar arquivos .txt e escrever informações nele. Agora, vamos criar uma rotina que permita a ler esses arquivos, manipular e interpretar seus dados.</p><p><strong>Observação: para esta demonstração, utilizarei a Arduino IDE 2.1.1, e a configuração de placa selecionada para NodeMCU 1.0 (ESP-12E).</strong></p><p>Já que temos o nosso arquivo “teste.txt” salvo na memória, vamos começar então chamando a biblioteca <strong><em>FS.h </em></strong>e criando a nossa variável que armazenará o nome do arquivo que vamos buscar e nosso objeto do tipo <strong><em>File </em></strong>e definir o método de manipulação desse arquivo como “r” (read):</p><pre>#include &quot;FS.h&quot;<br>String nome_do_arquivo = &quot;/teste.txt&quot;;<br><br>void setup() {<br>  Serial.begin(9600);<br>  SPIFFS.begin();<br>  File arquivo = SPIFFS.open(nome_do_arquivo, &quot;r&quot;);<br>}</pre><p>Vou aproveitar esse momento também para explicar algo que esqueci no post anterior: a minha escolha de tipagem para a variável <strong><em>nome_do_arquivo</em></strong>. Eu cheguei a citar no primeiro post dessa série que o método <strong><em>.open() </em></strong>recebe dois argumentos: o caminho do arquivo e o método da manipulação do arquivo, e pode ser tanto no formato <strong><em>const char*</em></strong> quanto <strong><em>String</em></strong>, conforme a biblioteca define o método:</p><pre>File open(const char* path, const char* mode);<br>File open(const String&amp; path, const char* mode);</pre><p>Porém, como para o projeto que estou desenvolvendo, essa variável terá seu valor dinamicamente alterado em versões futuras dessa aplicação, fica mais fácil trabalhar com a variável <strong><em>nome_do_arquivo </em></strong>sendo do tipo<strong><em> String.</em></strong></p><p>Dando continuidade, já criamos nosso objeto do tipo <strong><em>File</em></strong> e demos o nome de <strong><em>arquivo</em></strong>. Agora vamos checar se esse arquivo pôde ser aberto e imprimir o seu conteúdo na saída serial da ESP8266 — que nesse caso será pela IDE do Arduino.</p><pre>if (arquivo) {<br>    Serial.println(&quot;Conteúdo do arquivo:&quot;);<br><br>    while (arquivo.available()) {<br>      Serial.write(arquivo.read());<br>    }<br>  }<br>  arquivo.close();</pre><p>É importante sempre lembrar de fechar o arquivo com <strong><em>.close()</em></strong> ao final da execução do algoritmo.</p><p>O <strong><em>if </em></strong>checa se a variável <strong><em>arquivo</em></strong> não tem valor nulo, o que significa que ela está corretamente carregando os dados do nosso arquivo “teste.txt”. Já o <strong><em>while loop</em></strong>, utiliza o método <strong><em>.available()</em></strong> que retorna quantos bytes ainda estão disponíveis para leitura no arquivo a cada iteração do loop. Então, enquanto houverem bytes disponíveis, eles serão impressos na saída serial.</p><p>E com esse código, podemos imprimir o conteúdo do arquivo “teste.txt” na saída serial da ESP8266!</p><pre>#include &quot;FS.h&quot;<br>String nome_do_arquivo = &quot;/teste.txt&quot;;<br><br>void setup() {<br>  Serial.begin(9600);<br>  SPIFFS.begin();<br><br>  File arquivo = SPIFFS.open(nome_do_arquivo, &quot;r&quot;);<br>  <br>  if (arquivo) {<br>    Serial.println(&quot;Conteúdo do arquivo:&quot;);<br><br>    while (arquivo.available()) {<br>      Serial.write(arquivo.read());<br>    } <br>  }  <br>  arquivo.close();<br>}<br><br>void loop() {<br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/985/1*2rVKHhye4Nv5DBeTAZFn3Q.png" /><figcaption>Conteúdo do arquivo “/teste.txt” sendo impresso na saída serial da IDE</figcaption></figure><p>No próximo post, vamos listar todos os arquivos armazenados na memória flash da ESP8266, acessá-los e imprimir seus conteúdos na saída serial.</p><p>Para mais detalhes, acesse o repositório do projeto: <a href="https://github.com/ronaldneves/ESP8266_SPIFFS">ronaldneves/ESP8266_SPIFFS (github.com)</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=405ebc84bb82" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Armazenando Dados na Memória Flash de uma ESP8266]]></title>
            <link>https://ronaldohcorreia.medium.com/armazenando-dados-na-mem%C3%B3ria-flash-de-uma-esp8266-c3842d00ba23?source=rss-164cfcc019cd------2</link>
            <guid isPermaLink="false">https://medium.com/p/c3842d00ba23</guid>
            <category><![CDATA[esp8266]]></category>
            <category><![CDATA[arduino]]></category>
            <category><![CDATA[spiff]]></category>
            <category><![CDATA[embedded-systems]]></category>
            <category><![CDATA[sistemas-embarcados]]></category>
            <dc:creator><![CDATA[Ronaldo Henrique Correia]]></dc:creator>
            <pubDate>Tue, 14 Nov 2023 02:26:01 GMT</pubDate>
            <atom:updated>2023-11-20T00:44:43.796Z</atom:updated>
            <content:encoded><![CDATA[<p>Quem precisa armazenar dados de forma persistente ao trabalhar com microcontroladores e placas de prototipagem como Arduinos e ESPs da vida, muitas vezes acaba recorrendo à EEPROM. Entretanto, este método pode não ser o mais indicado se esses dados são gravados de forma recorrente ou constante, visto que a EEPROM possui um limite de vezes em que pode ser reescrita.</p><p>Para armazenar e ler dados em arquivos <em>.txt</em> ou até mesmo <em>.json </em>de forma dinâmica, sem gastar os ciclos de gravação da EEPROM, eu gosto de utilizar a biblioteca <a href="https://github.com/esp8266/Arduino/blob/master/cores/esp8266/FS.h">FS.h</a>, inclusa no repositório de bibliotecas de núcleo do Arduino para ESP32/ESP8266.</p><p><strong>Observação: para esta demonstração, utilizarei a Arduino IDE 2.1.1, e a configuração de placa selecionada para NodeMCU 1.0 (ESP-12E).</strong></p><p>Essa biblioteca nos permite interagir com a SPIFFS (SPI Flash File System) de um controlador ESP, possibilitando que dados que não serão enviados para um servidor na nuvem, mas que precisam persistir em caso de queda de energia, sejam armazenados localmente, na memória do controlador.</p><p>Para trabalhar com arquivos na SPIFFS, precisamos criar objetos do tipo File, que possui métodos para leitura e escrita de arquivos, similar ao método <em>open</em> presente em linguagens como python.</p><p>A criação de um objeto do tipo File segue a seguinte sintaxe:</p><pre>#include &quot;FS.h&quot;<br>String nome_do_arquivo = &quot;/teste.txt&quot;;<br><br>void setup() {<br> SPIFFS.begin();<br> File novo_arquivo = SPIFFS.open(nome_do_arquivo, &quot;w&quot;);<br>}</pre><p>O primeiro argumento da função é o nome do arquivo, que pode ser tanto uma variável String dinâmica ou const char*, caso o arquivo a ser lido seja sempre o mesmo durante a execução do programa.</p><p>O segundo argumento da função é o método de interação com o arquivo. Existem 3 principais métodos, que seguem a nomenclatura <em>read </em>(“r”), <em>write </em>(“w”) e <em>append (“</em>a<em>”). </em>Entretanto, vale notar que o método <em>write</em> sempre sobrescreve o conteúdo do arquivo. Para casos em que informações serão adicionadas, deve-se utilizar o método <em>append</em>.</p><p>Após criar o arquivo do tipo objeto File e definir o como será a interação com o arquivo, iremos utilizar os métodos desse tipo de objeto para ler o arquivo. No primeiro momento, criamos um objeto do tipo File de nome “arquivo”.</p><p>Vamos então, criar um novo arquivo .txt com o texto “Hello World!” e armazená-lo na SPIFFS.</p><pre>if (novo_arquivo) {<br>  novo_arquivo.print(&quot;Hello world!&quot;);<br>  novo_arquivo.close();<br>}</pre><p>É feita uma checagem se a variável “aquivo” é um objeto válido do tipo File. Após essa checagem, caso verdadeira, utilizamos o método <em>.print()</em> para escrever a string “Hello World” dentro do nosso arquivo. Ao final da execução, o arquivo é fechado com .<em>close()</em>.</p><p>Então, um código simples para criar um novo arquivo no formato <em>.txt</em> que e armazena-lo na SPIFFS seria algo mais ou menos assim:</p><pre>#include &quot;FS.h&quot;<br>String nome_do_arquivo = &quot;/teste.txt&quot;;<br><br>void setup() {<br>  SPIFFS.begin();<br>  File novo_arquivo = SPIFFS.open(nome_do_arquivo, &quot;w&quot;);<br>  <br>  if (novo_arquivo) {<br>    novo_arquivo.print(&quot;Hello world!&quot;);<br>    novo_arquivo.close();<br>  }<br>}<br><br>void loop() {<br>}</pre><p>No próximo post, irei demonstrar como listar e ler os arquivos e armazenados na SPIFFS de um controlador do tipo ESP e interagir com seus conteúdos.</p><p>Para mais detalhes, acesse o repositório do projeto: <a href="https://github.com/ronaldneves/ESP8266_SPIFFS">ronaldneves/ESP8266_SPIFFS (github.com)</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c3842d00ba23" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Meus Álbuns Favoritos 2021]]></title>
            <link>https://ronaldohcorreia.medium.com/meus-%C3%A1lbuns-favoritos-2021-8e5bb1456645?source=rss-164cfcc019cd------2</link>
            <guid isPermaLink="false">https://medium.com/p/8e5bb1456645</guid>
            <category><![CDATA[music]]></category>
            <category><![CDATA[música]]></category>
            <category><![CDATA[2021]]></category>
            <dc:creator><![CDATA[Ronaldo Henrique Correia]]></dc:creator>
            <pubDate>Tue, 04 Jan 2022 22:50:37 GMT</pubDate>
            <atom:updated>2022-01-04T22:50:37.117Z</atom:updated>
            <content:encoded><![CDATA[<p>Será que isso vira mais uma tradição de fim de ano minha? Bom, vamos tentar continuar.</p><p>Em 2021, álbuns importantes, esperados e inesperados foram lançados. Foi um ano diferente pra mim, em diversos aspectos. E, por incrível que pareça, ouvi menos música (em geral) do que em 2020. Entretanto, a diversidade do que ouço aumentou ainda mais em relação ao ano passado — o que pra mim, é bom.</p><p>Então, sem mais delongas, seguem meus destaques de 2021.</p><h3><strong>Duda Beat — Te Amo Lá Fora</strong></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*m8AdwUnOct5_Iwuh.jpg" /></figure><p>Três anos após lançar seu primeiro álbum, que teve como maior sucesso a música “Bixinho”, Duda lança Te Amo Lá Fora, cuja única semelhança com seu predecessor é a mistura de ritmos e a temática de relacionamento, comum à cantora.</p><p>Nesse álbum, Duda traz mais ritmos nordestinos em suas canções, como o piseiro, ritmo que se tornou bastante popular em todo o Brasil nos últimos anos, além de também trazer em suas faixas a mistura desses ritmos com o trap, algo que fica bastante em evidência na música Nem Um Pouquinho.</p><p><strong>Músicas destaque pra mim:<br></strong><em>Meu Pisêro<br>Nem Um Pouquinho<br>50 Meninas<br>Decisão de Te Amor</em></p><h3><strong>The Killers — Pressure Machine</strong></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/0*-EqSldigST9nlgVw.jpg" /></figure><p>Pouco menos de um ano após lançar Imploding The Mirage, os matadores lançam Pressure Machine, um álbum que é, de uma certa forma, diferente de tudo que a banda já havia lançado anteriormente. Com uma pegada mais folk, o álbum trata de contos inspirados na infância do vocalista Brandon Flowers no interior de Utah. Pressure Machine também é, o primeiro álbum desde o Battle Born, a ter todos os membros originais da banda envolvidos em sua produção.</p><p>Apesar de o álbum ser bem diferente do que estamos acostumados com a banda, ele não abandona por completo a ideia de seguir o caminho de criar músicas com refrões marcantes para tocar em estádios lotados, como prova In The Car Outside.</p><p>Num contexto geral, Pressure Machine é um álbum íntimo, sobre as memórias e sentimentos nostálgicos de Brandon, acompanhado pelos instrumentais de seus amigos de 20 anos de estrada.</p><p><strong>Músicas destaque para mim:<br></strong><em>Quiet Town <br>Sleepwalker<br>Runaway Horses<br>In The Car Outside</em></p><h3><strong>Twenty One Pilots — Scaled and Icy</strong></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/425/0*s1aEsG0woKWr6mwR.jpg" /></figure><p>Twenty One Pilots. Muito difícil passar um lançamento da minha banda favorita sem falar a respeito. Eu já tinha escrito minhas primeiras impressões sobre SAI aqui no Medium quando ele saiu (<a href="https://ronaldohcorreia.medium.com/scaled-and-icy-4faff6bb9d2d">https://ronaldohcorreia.medium.com/scaled-and-icy-4faff6bb9d2d</a>) e minha opinião sobre algumas de suas músicas e do conceito geral do álbum mudou um pouco de lá para cá.</p><p>Duas coisas que mudaram bastante minha opinião e até mesmo minha interpretação de algumas das músicas desse álbum foram a Live Experience e ver a gravação de alguns shows que fizeram durante essa retomada da música ao vivo pós-pandemia.</p><p>Essas duas coisas me permitiram perceber melhor qual e como são as histórias que eles tentam contar com esse álbum, que continuo afirmando ser muito diferente dos anteriores.</p><p>Entretanto, eu mantenho minha opinião de que esse definitivamente não é dos melhores trabalhos deles, pois precisou se apoiar bastante nas narrativas sendo contadas através dos clipes, dos shows e da live experience para “fazerem sentido”.</p><p>Porém, gostaria de deixar claro aqui que eu tenho gostado bastante do que eu tenho visto nos shows, como estão conseguindo linkar as narrativas dos álbuns anteriores com os atuais.</p><p><strong>Músicas destaque para mim:<br></strong><em>Good Day<br>Saturday<br>Mulberry Street<br>Redecorate</em></p><h3><strong>Lil Nas X — MONTERO</strong></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Rb5xJ7ZtbxEJEUzK.jpg" /></figure><p>Álbum de estreia do Lil Nas X (7 é um EP), Montero nasce — literalmente, dentro de diversas controvérsias na vida do cantor. Nos anos que precederam o lançamento do álbum, Lil Nas X declarou ser gay, produziu um clipe que gerou polêmica por dançar lap dance no colo do capiroto, um projeto de tênis modificado da Nike que possuía um pouco de seu sangue embutido nele e ter postado fotos com uma prótese de barriga para dizer que estava “grávido” do álbum.</p><p>Antes de lançar o álbum, o próprio cantor brincou com isso com um vídeo super bem humorado para comentar o que todo mundo já sabia: na verdade boa parte da reclamação por parte da mídia e dos críticos tinham mais a ver com o fato dele ser gay.</p><p>Montero é um álbum em que Lil Nas X explora mais sua capacidade criativa, tanto na produção quanto nas letras e nos estilos envolvidos. Diferente do EP 7, cujo estilo predominante é o trap, em Montero temos algo mais pop, um pouco de guitarras e baterias acústicas, com temáticas bastante pessoais da vida do artista, além de hits indiscutíveis como MONTERO e INDUSTRY BABY.</p><p>É com certeza um dos meus álbuns favoritos desse ano, mas gostaria que HOLIDAY também tivesse sido incluído na setlist, porém consigo imaginar o porquê de não ter sido.</p><p><strong>Músicas destaque para mim:<br></strong><em>MONTERO (call me by your name)<br>INDUSTRY BABY<br>LOST IN THE CITADEL<br>SUN GOES DOWN<br>AM I DREAMING</em></p><h3><strong>Tyler The Creator — CALL ME IF YOU GET LOST</strong></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/0*AkKu7BufNbEqIJbE.jpg" /></figure><p>Seguindo o processo de evolução musical iniciado em Flower Boy e na sua sequência, IGOR, Tyler continua surpreendendo e crescendo enquanto artista. Apesar de não ter sido quase um trabalho de um homem só, como IGOR, o recente trabalho do rapper demonstra como sua capacidade de escrita e composição só tem melhorado ao longo do ano. Como todo álbum de Tyler, CMIYGL possui o já clássico “jeito Tyler” de se montar uma música, misturando trilhas de piano, samples de músicas antigas e beats agressivos, fofos e diferentões. Além disso, o álbum tem toda uma estética acompanhada por pôsteres, encartes, uma linha de perfumes e esmaltes, também produzidos por Tyler. Pra mim, esse é o álbum do ano.</p><p><strong>Músicas destaque para mim:<br></strong><em>CORSO<br>WUSYANAME<br>LUMBERJACK<br>MASSA<br>SWEET / I TOUGHT YOU WANTED TO DANCE</em></p><h3><strong>Billie Eilish — Happier Than Ever</strong></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/450/0*6lrF6fq2V2eBkYVg.jpg" /></figure><p>Depois de indiscutivelmente ter bombado com seu primeiro álbum, Billie Eilish lança Happier Than Ever com uma escolha difícil: explorar um pouco mais o estilo musical em que ela se lançou originalmente e ficou conhecida, com beats de trap e seu canto sussurrado ou atingir novos horizontes. No fim, a cantora optou pela segunda opção. Em Happier Than Ever, Billie Eilish fala sobre crescer, abuso emocional, assédio e relacionamentos abusivos em faixas bem diferentes do que imaginaríamos a cantora, apesar de músicas com um estilo similar ao seu álbum de estreia também estarem presentes nesse álbum.</p><p>Apesar da mudança, eu acho que Happier Than Ever ainda não demonstra o potencial da cantora em suas letras e menos ainda em sua capacidade vocal. Entretanto, a qualidade das composições melhorou consideravelmente, o que demonstra um amadurecimento da cantora, algo que foi extremamente necessário, considerando que os temas abordados nesse álbum não poderiam ter sido explorados de forma suficientemente aceitável se suas letras fossem desenvolvidas similarmente ao álbum When We All Fall Asleep Where Do We Go, apesar de faixas como My Future e Therefore I Am seguirem mais esse estilo.</p><p><strong>Músicas destaque para mim:</strong><br><em>Getting Older<br>my future<br>Lost Cause<br>Happier Than Ever</em></p><h3><strong>Men I Trust — Untourable Album</strong></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*C152HAiRbnqPrkui.jpg" /></figure><p>Men I Trust foi uma banda que acabei conhecendo em 2020 enquanto eu navegava infinitamente madrugada adentro pelos recomendados do youtube e foi mais uma grata surpresa. Com um estilo que consegue ser, ao mesmo tempo relaxante e animado, os dois últimos álbuns de Men I Trust são perfeitos pra quem quer tanto ficar deitado numa rede quanto focar no trabalho ou ler um livro. As letras variam entre temas existenciais e historias simples sobre a vida ou relacionamentos, e suas faixas são sempre agradáveis de se ouvir. Apesar de ter escolhido apenas 4 músicas em destaque, raramente eu não ouço o álbum inteiro, pois é muito bom mesmo.</p><p><strong>Músicas destaque para mim:<br></strong><em>Oh Dove<br>Sugar<br>Tree Among Shrubs<br>Always Lone</em></p><h3><strong>Kanye West — Donda</strong></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/0*u4b34NuLEAzfUC93.jpg" /></figure><p>Cercado de polêmicas, tretas, ameaças de processos e hype, Kanye (agora Ye) lança mais um álbum com temática pessoal e religiosa, seguindo o que foi estabelecido em seu álbum anterior, Jesus Is King. Donda foi adiado algumas vezes e teve alguns shows de “audição”, que consistiam em basicamente um público convidado ouvir as músicas do álbum ainda em processo de mixagem e pós-produção junto com Kanye, pra avaliar se elas já estavam prontas o suficiente. Entretanto, por conta de conflitos entre o artista e a gravadora sobre a data de lançamento do álbum, acabou que as músicas foram lançadas do jeito que foram apresentadas nas audições.</p><p>Eu não acho que Donda seja o melhor trabalho de Ye. Temos algumas músicas repetidas e outras excessivamente longas com instrumentais repetitivos, mas esse álbum foi lançado num processo muito conturbado em que ele vivia — seu divórcio e a exploração de sua espiritualidade, o que ele tem feito desde o álbum anterior e, por conta disso, me tocou bastante.</p><p><strong>Músicas destaque para mim:</strong><br><em>Jail<br>Hurricane<br>Praise God<br>Jesus Lord<br>Pure Souls</em></p><h3><strong>Dayglow — Harmony House</strong></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/640/0*LYP5NJ2RXMVrqPVn" /></figure><p>Mesmo quem nunca ouviu nada de Dayglow, bem provavelmente já deve ter se deparado com o clipe de Can I Call You Tonight no youtube. Se nunca teve vontade ou incentivo para assisti-lo, assista. É bem engraçado e a música é boa.</p><p>Em seu primeiro álbum, Sloan já tinha como objeto de inspiração a nostalgia. Tanto os ritmos quanto a direção de arte dos clipes parecem ser tirados diretamente de um filme de romance adolescente dos anos 90. Em Harmony House, Sloan volta ainda mais no tempo, nos anos 80. Quer sintetizadores enfadonhos? Tem. Quer reverb a torto e a direita? Tem também. Até os vlogs da turnê do álbum foram filmados de forma a parecer um diário de estrada dos anos 80. Pra quem gosta de pop indie e também curte essa vibe anos 80 que muitos artistas estão surfando, pode ir sem medo em Harmony House.</p><p><strong>Musicas destaque para mim:<br></strong><em>Medicine<br>Close To You<br>Crying On The Dancefloor<br>Woah Man</em></p><h3><strong>Lorde — Solar Power</strong></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/640/0*YMeJ9g8I-fiDtRDP" /></figure><p>Solar Power, ou como ficou popularmente conhecido no twitter, “xerecão da Lorde”, foi motivo de diversas tretas na internet e dividiu seus fãs. Mas pra deixar bem claro, ninguém questionou a qualidade do álbum e de suas músicas. O motivo da discussão foi sobre a temática do álbum, que se distanciou do que fez a cantora famosa. Seus dois primeiros álbuns tratavam muito de temas como melancolia, perda e até mesmo auto sabotagem.</p><p>Em Solar Power, os temas de saúde mental ainda estão presentes, mas a cantora trás novas perspectivas sobre sua visão de mundo, sua relação com a fama e com a vida. Em seus clipes também fica bem claro como Solar Power é um divisor de águas, com cores mais vibrantes e quentes, ambientação mais vívida, muitas flores e muito sol.</p><p><strong>Músicas destaque para mim:<br></strong><em>Solar Power<br>Stoned at the Nail Saloon<br>Secrets from a Girl (Who’s Seen It All)</em></p><h3><strong>Silk Sonic — An Evening With Silk Sonic</strong></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/400/0*z_o7ZFTRLBy_lQCo.png" /></figure><p>Sendo bem sincero, eu acho que esse provavelmente foi um dos álbuns mais aguardados do ano e dispensa comentários. Depois do lançamento de Leave The Door Open como primeiro single, hype era o que não faltava para essa nova parceria entre Bruno Mars e Anderson .Paak. O álbum é bom do começo ao fim, e eu queria colocar todas as músicas como destaque. Sério, apenas vá ouvir.</p><p><strong>Músicas destaque para mim:<br></strong><em>Leave The Door Open<br>Fly As Me<br>Smokin Out The Window<br>777</em></p><h3>Menções Honrosas:</h3><p>eat ya veggies — bbno$<br>Man’s Best Friend — Cavetown<br>Planet Her — Doja Cat<br>= — Ed Sheeran<br>LET’S JUST SAY THE WORLD ENDED A WEEK FROM NOW, WHAT WOULD YOU DO? — HONNE<br>LP! — JPEGMAFIA<br>Civilisation — Kero Kero Bonito</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8e5bb1456645" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[A importância da vacinação]]></title>
            <link>https://ronaldohcorreia.medium.com/a-import%C3%A2ncia-da-vacina%C3%A7%C3%A3o-6bab324418f8?source=rss-164cfcc019cd------2</link>
            <guid isPermaLink="false">https://medium.com/p/6bab324418f8</guid>
            <category><![CDATA[brasil]]></category>
            <category><![CDATA[lockdown]]></category>
            <category><![CDATA[vacinas]]></category>
            <category><![CDATA[covid]]></category>
            <dc:creator><![CDATA[Ronaldo Henrique Correia]]></dc:creator>
            <pubDate>Mon, 07 Jun 2021 13:03:15 GMT</pubDate>
            <atom:updated>2021-06-09T13:22:48.842Z</atom:updated>
            <content:encoded><![CDATA[<p>Na última quarta-feira (03/06), FINALMENTE chegamos à marca de 100 milhões de doses de vacinas distribuídas no território brasileiro!! Obviamente esse número seria bem maior se nosso presidente e sua equipe tivessem sido menos displicentes com a saúde pública.</p><p>Mas você tem dúvidas ainda sobre porque a vacinação é o melhor caminho pra gente sair dessa pandemia? Venho então te trazer alguns dados mastigados pra você.</p><p>A CoronaVac hoje, é a vacina com menor taxa prática (baseada em dados da vida real e não testes clínicos ou de laboratório) de proteção contra covid-19. Os dados do recente experimento de vacinação em massa realizado na cidade de Serrana no interior de São Paulo apontam que a CoronaVac possui cerca de 80% de efetividade contra casos sintomáticos, ou seja, das pessoas desenvolverem sintomas da doença, mesmo que leves. Já nos dados coletados no Chile, esse número cai pra 67%. Porém, em ambos os casos, há uma constante comum: a redução na taxa de hospitalizações por COVID foi de quase 75%. Ou seja, de todo mundo que tomou duas doses da CoronaVac, só 1/4 das pessoas desenvolveram sintomas que mais graves.</p><p>Hoje no Brasil, a CoronaVac é a responsável por quase 60% das pessoas vacinadas contra COVID, então estima-se que o numero de vacinados com CoronaVac no Brasil é de cerca de 24 milhoes de pessoas.</p><p>Dados recentes de mortalidade por COVID de pessoas após vacinadas com as duas doses mostram que apenas 0,004% dos vacinados com a CoronaVac vieram a óbito por COVID, dentro dos 25 mil dessa amostragem que vieram a contrair a doença mesmo depois de vacinados.</p><p>E de acordo com o último estudo sobre a eficácia da CoronaVac, ela possui uma eficácia prática de 50%, ou seja, metade das pessoas vacinadas com a segunda dose ainda podem se contaminar num período de até 1 mês após a segunda dose. Passado esse período de um mês, essa eficácia sobe para quase 100%.</p><p>Porém, dessa quase metade que pode contrair a doença nesse período de um mês após a segunda dose, só 0,004% vieram a óbito, sendo que desses 0,004% que vieram a óbito, todos possuíam alguma comorbidade crônica ou idade avançada, que diminuem a imunidade da pessoa e a efetividade da vacina.</p><p>Ou seja, mesmo que ainda existam óbitos registrados após a vacinação, esse número é muitíssimo baixo e eles ainda podem ser melhorados com a melhoria da qualidade de vida dessas pessoas, como acompanhamento médico constante e respeitando o tempo que o corpo leva para desenvolver a imunidade pós-vacinação.</p><p>E isso levando em consideração dados apenas da CoronaVac. Os dados de taxa de eficácia e proteção das vacinas da AstraZeneca, Pfizer e Oxford são ainda melhores e mais animadores que os da CoronaVac.</p><p>E o que eu quero dizer com tudo isso? Que a vacinação está mostrando seus frutos, e que é o único caminho viável comprovado para realmente sairmos dessa pandemia. Os outros países já estão dando seu exemplo. Estados Unidos, Israel e o Reino Unido são países que focaram na vacinação rápida e eficiente de sua população e já permitem que as pessoas circulem sem máscaras em alguns ambientes públicos.</p><p>Uma vacinação veloz, eficaz e eficiente, poderia ter evitado centenas de milhares de mortes. Poderia ter evitado o colapso no sistema de saúde e na economia do país. Poderia inclusive ter evitado a necessidade de um novo Auxílio Emergencial e Benefício Emergencial, que o governo reclamou tanto em estender.</p><p>Se hoje temos novas variantes, toques de recolher, lockdowns mais pesados, fechamento do comércio, desemprego acima da média e inflação, é por conta da demora para se adquirir e distribuir vacinas para os brasileiros. É por conta de nós termos ficado mais tempo expostos ao vírus do que o necessário.</p><p>Então vamos pedir por mais vacinas e vamos nos vacinar!<br>Vacinem-se assim que puderem.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6bab324418f8" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Scaled and Icy]]></title>
            <link>https://ronaldohcorreia.medium.com/scaled-and-icy-4faff6bb9d2d?source=rss-164cfcc019cd------2</link>
            <guid isPermaLink="false">https://medium.com/p/4faff6bb9d2d</guid>
            <category><![CDATA[musica]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[music]]></category>
            <category><![CDATA[twenty-one-pilots]]></category>
            <category><![CDATA[scaled-and-icy]]></category>
            <dc:creator><![CDATA[Ronaldo Henrique Correia]]></dc:creator>
            <pubDate>Fri, 21 May 2021 20:27:09 GMT</pubDate>
            <atom:updated>2021-05-21T20:27:09.808Z</atom:updated>
            <content:encoded><![CDATA[<p>Ok. A essa altura do campeonato eu já acompanho Twenty One Pilots há 9 anos e posso dizer com toda a certeza do mundo que SAI é diferente de tudo que eles já fizeram anteriormente.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/0*wuwoCXU-WdZzFy6O.jpeg" /></figure><p>Para muitos fãs, principalmente os que conheceram a banda através do álbum Blurryface, SAI foge completamente das expectativas — de uma forma ruim. Indo mais pro pop e com um álbum menos coeso musicalmente, SAI é realmente um ponto fora da curva para a banda.</p><p>Mas sejamos honestos, SAI não é um álbum ruim. Talvez a lore criada em Blurryface e desenvolvida posteriormente em Trench nos deixou com expectativas muito altas para o que poderia vir a ser o terceiro capítulo da história. Mas a realidade é que não consideramos se Tyler e Josh, enquanto artistas, gostariam de seguir esse caminho.</p><p>Tendo isso em mente, é possível perceber como SAI é um álbum que eles queriam testar coisas novas. A grande questão é que, nesse processo, a banda passou a soar um pouco menos como ela própria, lançando músicas que se apresentadas a pessoas que não conhecem a banda, jamais adivinhariam que se trata de Twenty One Pilots. A identidade da banda de sempre surgir com ideias originais, tanto na sonoridade quanto nas letras, foi deixada um pouco de lado para experimentar a construção de uma nova, mesmo que isso signifique não fugir do óbvio.</p><p>Ainda com essa exposição inicial, reitero: <strong>SAI não é um álbum ruim.</strong></p><p>Acredito que se a proposta do álbum era experimentar novos estilos e musicalidades, ele faz isso muito bem. Os fãs vão sentir falta das letras mais existencialistas, sobre as conspirações de DEMA e dos Banditos, que foram substituídas por músicas mais alegres como Good Day (but the lyrics are so down) e Saturday. Formidable vem pra preencher a cota de “música bonita sobre amor e sua pessoa especial”. Never Take It, Bounce Man e Redecorate se destacam no álbum de 11 faixas por serem músicas que realmente demonstram a capacidade do Tyler de integrar estilos diferentes numa mesma composição.</p><p>Temos que levar em consideração também um fator muito importante, principalmente se tratando de uma banda como Twenty One Pilots, que é uma banda que costuma escrever em suas músicas como eles se sentem atualmente. Isso explica muito boa parte das letras e dos ritmos, visto que foi um álbum majoritariamente produzido durante uma pandemia que já chega no seu segundo ano (Saturday é um ótimo exemplo de música de quarantine feelings) e além disso, Tyler se tornou pai, que é algo que muda e MUITO sobre a forma que as pessoas passam a enxergar o mundo ao seu redor.</p><p>Penso que dada a temática mais leve e a curta duração do álbum, provavelmente veremos coisas novas num futuro próximo. SAI definitivamente não entra como meu álbum favorito da banda, mas possui uma sonoridade diferente e explora bem novos horizontes que podem vir a agregar bastante nos próximos trabalhos da banda.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4faff6bb9d2d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Meus Álbuns Favoritos 2020]]></title>
            <link>https://ronaldohcorreia.medium.com/meus-%C3%A1lbuns-favoritos-2020-e28e3aa4ecd5?source=rss-164cfcc019cd------2</link>
            <guid isPermaLink="false">https://medium.com/p/e28e3aa4ecd5</guid>
            <category><![CDATA[música]]></category>
            <category><![CDATA[music]]></category>
            <dc:creator><![CDATA[Ronaldo Henrique Correia]]></dc:creator>
            <pubDate>Thu, 24 Dec 2020 14:49:56 GMT</pubDate>
            <atom:updated>2020-12-24T14:58:24.383Z</atom:updated>
            <content:encoded><![CDATA[<p>2020 está acabando e eu ouvi bastante música esse ano.</p><p>Na verdade, de acordo com meu perfil na last.fm (<a href="https://www.last.fm/pt/user/RonaldNeves">https://www.last.fm/pt/user/RonaldNeves</a>), esse foi o ano que mais ouvi música desde 2012, tendo ouvido cerca de 3.200 faixas a mais que 2019.</p><p>Segue aqui então os álbuns que mais gostei e foram lançados esse ano, seja por ter me identificado com a temática ou por ser um álbum muito bem feito mesmo.</p><h3>Boy Pablo — Wachito Rico</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/1*q_3D-BAJ-IQqfRGxcfzGPA.png" /></figure><p>Apesar de já ser velho conhecido da galera que acompanha essa vertente da música independente que ficou conhecida como “bedroom pop”, eu só fui conhecer Boy Pablo esse ano. No começo da quarentena, acabei diversificando mais o que eu ouvia e Boy Pablo foi um dos artistas que tive o prazer de conhecer. O que eu não esperava, no entanto, é que seu primeiro álbum seria lançado esse ano, o que foi, pra mim, uma surpresa agradável.</p><p>Com uma vibe muito boa e com cara de álbum de verão, nesse novo álbum Pablo mostra um pouco das suas raízes chilenas inserindo diversos trechos em espanhol nas músicas, o que achei bem legal. Além disso, antes do lançamento do álbum, foram lançados 5 singles com clipes que contavam uma historinha que se encaixam muito bem com as músicas.</p><p><strong>Músicas destaque para mim: </strong><br><em>i hope she loves me back <br>leave me alone! <br>rest up <br>wachito rico</em></p><h3>The Killers — Imploding The Mirage</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/1*fYxj-l1aFQzBGOVF17Smog.png" /></figure><p>3 anos (e muitas entrevistas sobre novo álbum) após Wonderful Wonderful, The Killers também volta com um álbum novo em 2020. Imploding The Mirage é um álbum que, por conta da quarentena, atrasou um pouco, mas também permitiu uma certa interação entre os fãs da banda e seus atuais “cabeças”, Brandon Flowers e Ronnie Vannucci.</p><p>Durante a quarentena, diversas lives foram feitas nas redes sociais para falar sobre o novo álbum e seu processo de produção, além de músicas terem sido mostradas antes da hora, como o caso de “Dying Breed”. Nesse álbum, a banda tenta mostrar um processo de evolução, tanto em aspectos da vida pessoal do vocalista Brandon Flowers, quanto na música, trazendo de volta os famosos sintetizadores da era Hot Fuss e novos refrões perfeitos para cantar em arenas lotadas.</p><p><strong>Músicas destaque para mim: </strong><br><em>My Own Soul’s Warning<br>Dying Breed<br>Imploding The Mirage</em></p><h3>The Strokes — The New Abnormal</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/1*jusmauCe0VDQU6pEjb1DVw.png" /></figure><p>Provavelmente meu álbum favorito de 2020, The New Abnormal traz um Strokes repaginado, com letras mais profundas e composições (nem sempre) complexas e extremamente envolventes. Álbum de retorno da banda, 7 longos anos após Comedown Machine, The New Abnormal é um álbum completo. Possui 9 músicas com 45 minutos e essa linda capa com o quadro “Bird On Money”, do artista Basquiat.</p><p>Suas músicas contam histórias da vida pessoal do vocalista Julian Casablancas através de metáforas e analogias, sem perder sua característica clássica de muitas vezes escrever letras sem sentidos e frases soltas de forma poética.</p><p>A forma que o álbum foi montado passa a sensação de estarmos dentro de um filme bem produzido, com começo meio e fim. E que fim! Ode To The Mets, começando logo após Not The Same Anymore, fecha o álbum com chave de ouro, sendo minha música favorita da banda dos últimos tempos. A música começa devagar, os instrumentos aos poucos são introduzidos, com direito a uma frase candidata a ícone da banda (drums, please, Fab?).</p><p>Eu gosto de dizer que Ode To The Mets é como escalar uma montanha, em que à medida que você vai subindo, você vai olhando os arredores e tendo mais vontade de continuar, ao ponto que quando chega no final, você está em êxtase contemplando a vista proporcionada pela escalada.</p><p>The New Abnormal fez com que eu me reapaixonasse pela banda e foi o segundo álbum que eu mais ouvi durante esse ano.</p><p><strong>Músicas destaque para mim: </strong><br><em>Selfless <br>Why Are Sundays So Depressing <br>Ode To The Mets</em></p><h3>Joji — Nectar</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/1*PwoJ_LsWmh6jf9TCapR7Ow.png" /></figure><p>Duas vezes adiado e quase esquecido por mim, Nectar foi um dos poucos álbums em que eu estava ansioso e/ou com altas expectaticas, visto que BALLADS1 jogou Joji para os braços abertos do público mainstream e agora ele tinha uma importante missão: manter o hype rolando. Nectar tem de tudo. De tudo mesmo. Beat de trap clássica estilo trap de soundcloud, músicas super produzidas, músicas que parecem que foram criadas na fila do banco, vários feats e muitos, mas muitos dos falsetes característicos do Joji. No álbum de 18 músicas e 53 minutos, sobrou espaço até para uma música mais no estilo Pink Guy, relembrando os tempos de youtuber do Joji.</p><p>Seus singles Sanctuary, Run, Gimme Love e Upgrade possuem clipes com histórias que se conectam, com os fãs criando várias teorias sobre o que o artista quer explicar com elas, sendo algo bem interessante de se acompanhar.</p><p>Outra coisa legal de se citar é a participação do renomado DJ Diplo na faixa Daylight, que inclusive é a faixa mais bem produzida do álbum, fugindo daquele estilo mais lo-fi que as músicas do Joji costumam ter.</p><p><strong>Músicas destaque para mim: <br></strong><em>Tick Tock <br>Daylight <br>Gimme Love <br>Pretty Boy</em></p><h3>Cavetown — Sleepyhead</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/1*17Z48ew6Kh7nsb5tYX0HYA.png" /></figure><p>Cavetown também entra pra lista de artistas que conheci esse ano por conta da quarentena. Não tive tempo de ouvir muito da obra do artista até então, me limitando ao recém lançado Sleepyhead e seu trabalho prévio, o Animal Kingdom. Cavetown possui um som calmo e relaxante, com poucos instrumentos, porém muito bem produzido. Possui letras fofinhas, e relativamente fáceis de se identificar, abordando diversos temas da vida de um jovem adulto.</p><p><strong>Músicas destaque para mim: <br></strong><em>Sweet Tooth <br>Trying <br>Things Tha Make It Warm</em></p><h3>DAY6 — The Book of Us: The Demon</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/1*Xs1ByY1ri_6USbrFtxXe6g.png" /></figure><p>Banda que eu descobri da forma mais aleatória possível. Observe o fluxo dos acontecimentos: assisti vídeos de Among Us do Disguised Toast no youtube e conheci o Jae (ou eaJ) → Rich Brian lança uma versão de Love In My Pocket com participação do Jae → eu descubro que ele é músico → eu descubro DAY6.</p><p>Fui procurar ouvir o trabalho dele sem muitas expectativas, visto que eu tenho uma certa resistência com a indústria pop coreana por questões políticas e ideológicas, e me surpreendo positivamente. A banda possui um som de rock alternativo que lembra os primeiros trabalhos de Foo Fighters e Paramore, só que em coreano e obviamente com alguns aspectos específicos do pop coreano.</p><p><strong>Músicas destaque para mim: </strong><br><em>Day and Night <br>Tick Tock <br>Afraid</em></p><h3>HYUKOH — Through Love</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/1*dSXDxfrMqe1rs7PyV-8i5w.png" /></figure><p>Banda apresentada à mim por um amigo alguns anos atrás, me apaixonei desde a primeira escutada. Se você acha que música coreana se resume aos pops da vida, recomendo sair um pouco da bolha do mainstream e escutar Hyukoh.</p><p>Nesse álbum (que não é bem um álbum, tá mais pra EP), a banda experimenta ainda mais na sua sonoridade, trazendo elementos de bossa nova, slow blues e até alguns upbeats mais eletrônicos, porém sem perder aquela sonoridade “chill” característica da banda. Vale muito a pena ouvir a discografia dos caras, é uma música muito gostosinha de se ouvir.</p><p><strong>Músicas destaque para mim: <br></strong><em>Help <br>Silverhair Express <br>New born</em></p><h3>Phoebe Bridgers — Punisher</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/1*Jvd5Hh9uYqkCDXfKjTphuA.png" /></figure><p>Artista que tem literalmente uns 2 meses que descobri, após ter visto a música I Know The End aparecendo nos recomendados do youtube, possui uma sonoridade que me agrada muito, misturando elementos de bedroom pop e rock indie alternativo. Phoebe Bridgers que antes fazia parte do grupo boygenius, se lançou como artista solo no álbum Stranger in the Alps, onde conseguiu alcançar sucesso quase que imediato entre os amantes do gênero. Ouvir Punisher é muito agradável, mesmo as músicas mais agitadas como Kyoto conseguem passar uma sensação de conforto ao ouvir.</p><p>Além do álbum Punisher, Bridgers também lançou um EP intitulado If We Make It Through Decembrer, que eu ainda não ouvi, mas com certeira ouvirei antes do ano novo pra entender o EP dentro do contexto que as músicas foram feitas para serem ouvidas.</p><p><strong>Músicas destaque para mim: <br></strong><em>Kyoto <br>Punisher <br>ICU <br>I Know The End</em></p><h3>Rich Brian — 1999</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/1*2355Js-Af4a7IpR9yWVJMw.png" /></figure><p>Rich Brian, artista que conheci ainda com seu antigo e ofensivo nome artístico, desde seu álbum de estreia em 2018, não passou um ano em branco sem lançar um álbum ou EP, característica de muitos rappers. Fugindo um pouco da sonoridade experimental e orgânica de seu álbum The Sailor e partindo pra algo mais mainstream, flertando um pouco com o trap pop estilo Post Malone. 1999 é um EP que não foge do “estilo Rich Brian” quando se trata de letras, conseguindo viajar, na mesma música, entre temas como sentimentos, riqueza, ostentação e um pouco de seu ego.</p><p>Minha grande crítica a esse álbum é não ter a versão de Love In My Pocket com Jae nele, estando apenas disponível no youtube. Brincadeiras à parte, essa música é o grande destaque do EP, tendo cerca de 4 videoclipes, além dos diversos clipes não-oficiais que fizeram parte da brincadeira promovida pelo artista no clipe original.</p><p><strong>Músicas destaque para mim: <br></strong><em>Don’t Care <br>DOA <br>Love In My Pocket</em></p><h3>Vivendo do Ócio — Vivendo do Ócio</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/1*f4uB9k6D25CVcWl1yv39CQ.png" /></figure><p>5 anos após seu interessantíssimo álbum Selva Mundo, Vivendo do Ócio lança seu self-titled em 2020, com a sonoridade mais madura que ouvi da banda até então. O álbum mostra como é o processo de evolução de uma banda que consegue ser uma síntese dela mesma. É um álbum que faz a gente sentir que está ouvindo aquela primeira Vivendo do Ócio que lançou Som Luzes e Terror durante Cê Pode e magicamente somos teletransportados para O Amor Passa no Teste com sua sonoridade mais moderna, com sintetizadores e linhas de baixo marcantes.</p><p>Nesse álbum, não tiveram medo de experimentar e muito menos de sofrer com aquele problema clássico do nicho do rock de serem acusados de “não serem mais tão rock quanto antes”, e essa coragem tornou possível ouvirmos um álbum gostoso de se ouvir, com músicas para todos os momentos e moods, sem abandonar o bom e velho rock and roll.</p><p><strong>Músicas destaque para mim: <br></strong><em>O Amor Passa no Teste <br>Evolução <br>Nova Ordem <br>Il Tempo</em></p><h3>Menções honrosas — álbuns que valem a pena serem escutados:</h3><p>JPEGMAFIA — EP! <br>Djonga — Histórias da Minha Área <br>Declan McKenna — Zeros <br>Wallows — Remote</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e28e3aa4ecd5" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>