diff --git a/CHANGELOG.md b/CHANGELOG.md index 13bfc4f..90a1111 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,26 @@ Tudo o que muda de relevante no ESPDocs está aqui. O formato segue o ## [Não lançado] +### Adicionado + +- Formação 2 da LASER em `/formacoes/2`: estação de temperatura e umidade com DHT22, LCD 16x2 + I2C e ESP32-S3, simulada no Wokwi com o framework Arduino. Slides, apostila, projeto do + Wokwi e programa de scanner I2C, tudo validado no simulador. +- Página de entrada para cada formação (`/formacoes/1`, `/formacoes/2`) e lista geral em + `/formacoes`, geradas por `npm run formacoes-viewer` a partir do `formacao.json` de cada pasta. +- PDFs prontos dos slides e das apostilas das formações 1 e 2. `npm run slides-pdf -- N` + agora gera também o PDF da apostila. + +### Alterado + +- A apostila de cada formação passou de `index.html` para `apostila.html`; o `index.html` + agora é a página de entrada. + +### Corrigido + +- O link do arquivo do Fritzing na apostila da formação 1 apontava para `/apostilas/1/`, + caminho que não existe. + ## [1.7.0] - 2026-11-02 ### Adicionado diff --git a/middleware.js b/middleware.js index a91ec8f..9704430 100644 --- a/middleware.js +++ b/middleware.js @@ -65,6 +65,15 @@ export default function middleware(request) { return NextResponse.next(); } + // Material das formações: /formacoes e /formacoes/N mostram a página de + // entrada gerada em public/formacoes. Sem isto a rota cairia na regra de + // URL antiga e iria para /pt/formacoes, que não existe. + if (/^\/formacoes(\/\d+)?\/?$/.test(pathname)) { + const url = request.nextUrl.clone(); + url.pathname = `${pathname.replace(/\/$/, "")}/index.html`; + return NextResponse.rewrite(url); + } + // 1. Raiz: negociação de idioma (307) considerando apenas idiomas ATIVOS if (pathname === "/") { const targetLocale = resolveRootLocale(request); diff --git a/package.json b/package.json index c980cde..cbb242f 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "favicons": "node scripts/generate-favicons.mjs", "auditar-temas": "node scripts/auditar-temas.mjs", "slides-pdf": "node scripts/slides-pdf.mjs", + "formacoes-viewer": "node scripts/formacoes-viewer.mjs", "check:pinos": "NODE_NO_WARNINGS=1 node scripts/verifica-pinos-restricoes.mjs && NODE_NO_WARNINGS=1 node scripts/verifica-pinos-busca.mjs" }, "dependencies": { diff --git a/public/formacoes/1/LASER-ESP32-Modulo-1-Apostila.pdf b/public/formacoes/1/LASER-ESP32-Modulo-1-Apostila.pdf new file mode 100644 index 0000000..74b0968 Binary files /dev/null and b/public/formacoes/1/LASER-ESP32-Modulo-1-Apostila.pdf differ diff --git a/public/formacoes/1/LASER-ESP32-Modulo-1-Slides.pdf b/public/formacoes/1/LASER-ESP32-Modulo-1-Slides.pdf new file mode 100644 index 0000000..84322a9 Binary files /dev/null and b/public/formacoes/1/LASER-ESP32-Modulo-1-Slides.pdf differ diff --git a/public/formacoes/1/apostila.html b/public/formacoes/1/apostila.html new file mode 100644 index 0000000..8219734 --- /dev/null +++ b/public/formacoes/1/apostila.html @@ -0,0 +1,1971 @@ + + + + +LASER · Formação em ESP32 · Módulo 1: Conhecendo a Família + + + + + + + + + + +

Paginando a apostila…

+ + +
+
+ + +
+ LASER + Liga Acadêmica de Sistemas Embarcados
Centro de Informática · UFPE
+
+ +
Formação em ESP32 · Módulo 1
+ +

Conhecendo a
família ESP32

+ +

+ Do silício à bancada: como esses microcontroladores funcionam por dentro, o que cada + uma das doze séries faz e não faz, onde eles superam Arduino e STM32, e como escolher + o chip certo antes de fechar um projeto. +

+ +
+
+ Lucas Rayan Guerra + Ciência Embarcada · ESPDocs + linkedin.com/in/lucasrguerra +
+
+ Material de apoio + Formação presencial · uso livre para fins educacionais +
+
+
+
+ + +
+
+
+

Apresentação

+

Sobre a formação, sobre a liga, e como aproveitar esta apostila.

+
+
+ +

+ A LASER, Liga Acadêmica de Sistemas Embarcados do Centro de Informática + da UFPE tem como propósito fortalecer a área de sistemas embarcados na universidade, + promovendo estudo, pesquisa e aplicação de tecnologias que envolvem tanto hardware quanto + software. Suas frentes vão de automação e Internet das Coisas a IA na borda, robótica, + sistemas críticos, tecnologias veiculares e engenharia biomédica. +

+ +

+ Esta apostila acompanha a formação em ESP32 da liga. A escolha da plataforma não é + acidental: o ESP32 atravessa quase todas as frentes da LASER. Ele é o nó de IoT, é a + placa de automação, roda inferência na borda, e é barato o bastante para que cada pessoa + tenha o seu. +

+ +

O que você vai levar deste módulo

+ + +

Pré-requisitos

+

+ Espera-se que você já tenha ligado um LED em algum microcontrolador e saiba o que é uma + porta digital. Programação em C ou C++ em nível básico ajuda, mas o código da prática é + curto e comentado. Não é preciso saber nada de Wi-Fi, RTOS, RISC-V ou + criptografia. Tudo isso aparece explicado no caminho. +

+ +

Material para a prática

+

+ Uma placa ESP32-S3-DevKitC-1, um sensor DHT11, um + resistor de 10 kΩ, jumpers, protoboard e um cabo USB de dados. A lista + completa e o esquema de ligação estão no capítulo 9. +

+ +

Como esta apostila está organizada

+

+ Os capítulos 1 a 3 constroem o entendimento do hardware. Os capítulos 4 a 6 apresentam a + família e comparam com alternativas. Os capítulos 7 e 8 são de decisão: como escolher série + e ferramenta. O capítulo 9 é a prática, e o 10 fecha com glossário e caminhos de estudo. +

+ +
+

Ao longo do texto você encontra quatro tipos de caixa:

+ +
+
Dica
+

Atalho, boa prática ou recomendação que economiza tempo.

+
+ +
+
Atenção
+

Ponto que costuma causar problema se passar despercebido.

+
+ +
+
Erro comum
+

Armadilha concreta, com o sintoma que ela produz e como escapar.

+
+ +
+
Curiosidade
+

Contexto ou detalhe técnico que ajuda a fixar o conceito.

+
+
+
+ + +
+
+
+

Sumário

+

Dez capítulos, do conceito à bancada.

+
+
+ + +
+ + +
+
+
1
+
+

O que é o ESP32

+

De onde ele veio e por que virou padrão de fato em projetos conectados.

+
+
+ +

+ O ESP32 é uma linha de microcontroladores da Espressif Systems, empresa + fundada em 2008 e sediada em Xangai. A história que interessa começa em 2014, com o + ESP8266: um chip barato de Wi-Fi vendido como "módulo serial para internet", que a + comunidade descobriu ser, na verdade, um microcontrolador completo por poucos dólares. +

+ +

+ Em 2016 veio o ESP32 original, já projetado como plataforma: dois núcleos, Wi-Fi, + Bluetooth e um conjunto grande de periféricos. A partir de 2020 a linha se ramificou, e + hoje são doze séries, cada uma otimizada para um recorte diferente de + custo, consumo, conectividade e desempenho. +

+ +

Linha do tempo

+ + + + + + + + + + + + + + +
AnoLançamentoO que mudou
2014ESP8266Wi-Fi barato ao alcance de qualquer projeto. Ainda muito usado.
2016ESP32Dois núcleos, Bluetooth e periféricos de verdade. O marco da plataforma.
2019ESP32-S2Foco em segurança e USB nativo; abre mão do Bluetooth.
2020ESP32-C3Primeira série RISC-V. Marca a virada de arquitetura da empresa.
2021ESP32-S3Dois núcleos com instruções vetoriais para IA. Vira o carro-chefe.
2022ESP32-C6, H2Chega o rádio 802.15.4: Zigbee, Thread e Matter entram na família.
2023ESP32-P4Alto desempenho sem rádio, com MIPI para câmera e display.
2024 e 2025C5, C61, H4, S31Wi-Fi 6, dual-band de 5 GHz e a geração seguinte de malha.
Datas de anúncio. A disponibilidade comercial e o suporte nas ferramentas costumam vir meses depois.
+ +

O que explica a adoção

+ +

+ Antes do ESP8266, colocar um projeto na internet significava comprar um microcontrolador + e um módulo de rede, ligá-los por serial ou SPI, e gastar boa parte da memória + disponível com a pilha de comunicação. O ESP32 traz o rádio dentro do mesmo + encapsulamento do processador, com as pilhas de Wi-Fi e Bluetooth prontas, + testadas em campo por centenas de milhões de dispositivos. +

+ +

+ Some a isso o preço, já que um módulo custa menos que muitos microcontroladores sem rádio, e + uma documentação pública completa, com datasheets, manuais de referência e código-fonte + abertos. Essa combinação é rara no mercado de semicondutores. +

+ +

SoC, módulo, placa e série: quatro coisas diferentes

+ +

+ Muita confusão nasce de usar "ESP32" para quatro coisas distintas. Vale separar desde já, + porque isso muda o que você compra, quanto custa e como projeta: +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
TermoO que éExemplo
Chip (SoC)O silício nu, num encapsulamento QFN de poucos milímetros. Precisa de antena, + cristal e memória flash externos para funcionar. É o que a Espressif vende em + bobina para fábricas.ESP32-S3
MóduloO chip montado numa plaquinha com flash, cristal, antena, blindagem e, o + mais importante, homologação de rádio. É o que vai dentro + de um produto comercial.ESP32-S3-WROOM-1
Placa de desenvolvimentoO módulo numa placa com regulador de tensão, conector USB, botões de boot e + reset e pinos em barra. É o que usamos para aprender e prototipar.ESP32-S3-DevKitC-1
SérieA família daquele silício: define a arquitetura do processador, quais rádios + existem e quais periféricos estão presentes.Série S3
+ +
+
Homologação pertence ao módulo, não ao chip
+

+ Se um dia você levar um projeto a produto, lembre que as certificações de rádio + (Anatel no Brasil, FCC nos Estados Unidos, CE na Europa) são emitidas para o + módulo. Usar um módulo já homologado evita um processo de certificação + caro e demorado. Projetar com o chip nu significa homologar o seu produto do zero. +

+
+ +
+ Diagrama do ESP32-S3-DevKitC-1 com a pinagem completa, mostrando o módulo ESP32-S3-WROOM soldado no centro da placa. +
+ Os três primeiros níveis numa imagem só. O retângulo prateado no centro é o + módulo ESP32-S3-WROOM, com a antena impressa numa ponta e a blindagem + metálica cobrindo o resto; dentro dele, sem aparecer, está o chip. Todo + o resto (regulador de tensão, conversor USB-serial, botões e as barras de pinos) é a + placa de desenvolvimento. Num produto seu, só o módulo iria para a PCB. +
+
+ +

O que a Espressif entrega junto com o silício

+ +

+ Boa parte do valor do ESP32 não está no chip, e sim no software que vem junto. O + ESP-IDF (Espressif IoT Development Framework) é o ambiente oficial: + baseado em FreeRTOS, traz as pilhas de Wi-Fi, Bluetooth, TCP/IP, TLS, atualização remota + de firmware (OTA), sistemas de arquivos, provisionamento e ferramentas de depuração. É + software que levaria anos para uma equipe escrever do zero. +

+ +

+ Existe também o core Arduino para ESP32, que traduz esse ambiente para as + funções que você já conhece. É a porta de entrada, e é o que usaremos na prática, mas por + baixo continua sendo o ESP-IDF rodando. Entender isso ajuda quando algo não funciona: + muitas respostas estão na documentação do IDF, não na do Arduino. +

+
+ + +
+
+
2
+
+

Anatomia: o que existe dentro do chip

+

Os blocos que aparecem em qualquer série, e por que cada um importa.

+
+
+ +
+ Diagrama de blocos oficial do ESP32-S3: CPU principal, memórias, rádio Wi-Fi e Bluetooth, cadeia de RF, periféricos, domínio RTC e bloco de segurança. +
+ Diagrama de blocos do ESP32-S3, publicado pela Espressif. Vale voltar a ele ao longo da + apostila: o Main CPU com os dois núcleos Xtensa e, ao lado, as memórias + internas (ROM, SRAM e o cache que discutimos adiante). O bloco + RF é a parte analógica do rádio, que fala com a antena. Em + RTC mora o coprocessador ULP, que continua acordado com o resto do chip + dormindo. E o bloco Security é exatamente o assunto do capítulo 5: SHA, + AES, RSA, RNG, HMAC, assinatura digital, Secure Boot e criptografia de flash, tudo em + silício. +

+ Cada série tem o seu diagrama equivalente, com blocos a mais ou a menos. Imagem da + Espressif Systems, reproduzida para fins didáticos. +
+
+ +

Processador: Xtensa ou RISC-V

+ +

+ As séries mais antigas (ESP32, S2, S3) usam núcleos Xtensa, arquitetura + licenciada da Cadence. As séries novas (C2, C3, C5, C6, C61, H2, H4, P4, S31) migraram + para RISC-V, um conjunto de instruções aberto e livre de royalties. +

+ +

+ Para quem programa em C, a diferença é quase invisível, porque o compilador cuida disso. Ela + aparece quando você precisa de assembly, de ferramentas de análise de baixo nível, + ou quando uma biblioteca pré-compilada existe só para uma das arquiteturas. A tendência é + clara: todo lançamento recente é RISC-V. +

+ +

Um ou dois núcleos, e o que fazer com eles

+

+ Séries como ESP32, S3, P4, H4 e S31 têm dois núcleos. No ESP-IDF eles recebem nomes: + PRO_CPU (núcleo 0) e APP_CPU (núcleo 1). Por convenção, as + tarefas do Wi-Fi e do Bluetooth rodam no núcleo 0, deixando o 1 mais livre para o seu + código. É possível fixar uma tarefa em um núcleo específico, recurso valioso quando você + precisa de um laço com temporização mais previsível. +

+ +

O coprocessador de baixo consumo

+

+ Algumas séries trazem um segundo processador de baixíssimo consumo, o ULP + ou LP core. Ele continua acordado enquanto o processador principal dorme, lendo um sensor + de tempos em tempos e só acordando o resto do chip quando algo interessa. É o que permite + um projeto a bateria durar meses em vez de dias. +

+ +

Memória: quatro tipos, quatro papéis

+ + + + + + + + + + + + + + + + + + + + + + + + + +
MemóriaPara que serveOrdem de grandeza
SRAMMemória de trabalho: variáveis, pilha, buffers. Rápida e volátil. É o recurso + que acaba primeiro em projetos com Wi-Fi: a pilha de rede sozinha consome + dezenas de kilobytes.272 KB a 768 KB
ROMGravada de fábrica pela Espressif. Contém o bootloader inicial e rotinas + básicas. Você não altera, e é por isso que um ESP32 é praticamente + impossível de "brickar" de forma permanente.128 KB a 576 KB
Flash externaOnde mora o seu programa. Fica fora do núcleo do chip, num segundo + componente ou dentro do mesmo encapsulamento, e conversa por SPI.2 MB a 16 MB típico
PSRAMRAM extra externa, opcional, para quando a SRAM não basta: buffer de câmera, + tela gráfica, áudio, modelo de rede neural.2 MB a 32 MB
+ +
+
O detalhe que pega todo mundo
+

+ A flash é externa ao núcleo. Isso significa que alguns pinos do chip + já estão ocupados conversando com ela o tempo todo. No ESP32 original, são os GPIO 6 a 11. + Se você usar esses pinos para um LED, o chip trava, porque você está interferindo no + barramento de onde o programa está sendo lido. Todo ESP32 tem um conjunto assim; o + número e a posição mudam conforme a série. +

+
+ +
+ + + O chip + + + Processador + SRAM e ROM internas + + + Cache + MMU + traz o código para dentro + + + Matriz de roteamento: função quase livre por pino + + + + + + + + + + 6 + + SPI + CS, CLK, D, Q, WP e HD + + + Flash externa + o seu firmware mora aqui + + + PSRAM (opcional) + buffers grandes + +
+ O que o diagrama de blocos não deixa evidente: a flash fica fora do + chip. O cache e a MMU escondem isso do seu código, mas os seis pinos desse barramento + ficam ocupados de forma permanente, mesmo com o seu programa rodando. É daí que sai o + primeiro grupo de pinos com restrição, mais adiante neste capítulo. A barra diagonal + com o número é a notação usual de esquemático para um feixe de condutores. +
+
+ +
+
Como o código roda se ele está fora do chip?
+

+ Existe um bloco chamado MMU com cache entre o processador e a flash. + Ele traz para dentro do chip os pedaços de código que estão sendo executados, mantendo + os mais usados em cache. O efeito é que a flash externa "parece" memória interna, com a ressalva de que um acesso fora do cache custa bem mais caro. Esse é um dos + motivos pelos quais o desempenho de um ESP32 varia mais que o de um microcontrolador + com flash interna. +

+
+ +
+

Rádio

+ +

+ É o bloco que distingue o ESP32 da maioria dos microcontroladores. Dependendo da série + você encontra: +

+ + + + + + + + + + +
TecnologiaPara quê
Wi-Fi 4 (802.11 b/g/n)Conexão direta à internet pela rede local. Presente na maioria das séries.
Wi-Fi 6 (802.11ax)Melhor desempenho em redes congestionadas e menor consumo com o recurso Target Wake Time.
Bluetooth LEComunicação com celular, sensores de baixo consumo, provisionamento de rede.
Bluetooth ClássicoÁudio (A2DP) e porta serial sem fio (SPP). Só no ESP32 e no S31.
IEEE 802.15.4Base do Zigbee e do Thread, redes em malha de baixo consumo, e portanto do Matter.
+
+ +

+ O rádio não é de graça: transmitir custa corrente, com picos que passam de 300 mA, ocupa + memória e consome tempo de processamento. Voltaremos a isso no capítulo 7. +

+ +

Periféricos e a matriz de roteamento

+ +

+ GPIO, UART, SPI, I²C, I²S, PWM, ADC, sensor de temperatura interno, USB, controlador CAN + (que a Espressif chama de TWAI), contador de pulsos, transceptor de infravermelho. O + conjunto varia por série. +

+ +

+ Uma característica facilita muito a vida: na maioria das séries existe uma + matriz de roteamento (GPIO matrix) que permite mapear quase + qualquer função para quase qualquer pino, por software. Em um microcontrolador tradicional, + a UART2 só existe nos pinos que o fabricante escolheu; aqui, você decide na hora de + programar. Na prática do projeto de placa isso é ouro: você desenha o traçado da forma mais + limpa e depois adapta o firmware. +

+ +
+
A matriz tem limite
+

+ Sinais de alta velocidade (o SPI da flash, o USB, o cristal, algumas linhas de I²S e + LCD) não passam pela matriz: eles usam IO_MUX, um caminho direto e mais + rápido, disponível apenas em pinos específicos. Se você rotear um SPI rápido por um + pino qualquer, ele funciona, mas a frequência máxima cai. +

+
+ +

Pinos com restrição, e o estrago que eles causam

+ +

+ Aqui está a diferença mais concreta entre ler o datasheet e não ler. Num Arduino UNO, + os vinte pinos são praticamente equivalentes. Num ESP32, uma parte deles já tem dono, e + usar o pino errado não produz um erro de compilação: produz uma placa que não liga, um + firmware que trava, ou pior, um protótipo que funciona na bancada e falha em campo. +

+ +

+ São cinco grupos, e cada um quebra o projeto de um jeito diferente. +

+ +
+ Diagrama de pinagem do ESP32-DevKitC, com legenda indicando pinos de flash, strapping, somente entrada e depuração. +
+ A pinagem do ESP32 clássico já traz as restrições marcadas, se você souber o que + procurar. As barras vermelhas à esquerda dos GPIO 6 a 11 significam + "compartilhado com a memória flash, não pode ser usado como GPIO comum". As etiquetas + rosa STRAP marcam os pinos de boot. As setas simples (em vez de duplas) + nos GPIO 34 a 39 indicam somente entrada. E as etiquetas + DEBUG em azul são as linhas de JTAG. +
+
+ +

1. Ligados à memória flash ou PSRAM

+

+ Estes pinos conversam com a memória de onde o firmware está sendo lido, o tempo todo, + enquanto o chip funciona. Escrever neles interrompe essa conversa no meio. +

+

+ Como falha: o chip reinicia em laço, ou trava no boot com uma mensagem de + erro de leitura da flash. Não é intermitente e não tem contorno em software. +

+

+ Como evitar: no ESP32-S3 são os GPIO 26 a 32; no ESP32 clássico, os GPIO + 6 a 11 (mais o 16 e o 17 em módulos WROVER, que têm PSRAM). Boa notícia: em muitos módulos + esses pinos nem chegam à barra de pinos, justamente para você não ter como errar. +

+ +

2. Strapping (seleção do modo de boot)

+

+ O chip lê o nível destes pinos no instante do reset para decidir como inicializar. Depois + do boot eles voltam a ser GPIO normais, e é aí que mora a armadilha: o pino funciona + perfeitamente enquanto a placa está ligada, mas o que você pendurou nele atrapalha o + próximo reset. +

+

+ Como falha: a placa para de iniciar quando o circuito externo puxa o pino + para o nível errado. Um exemplo comum: você liga um LED com resistor no GPIO0 do ESP32. + O LED funciona. Na próxima energização, o resistor mantém o pino em nível baixo, o chip + entende que deve entrar em modo de gravação e fica esperando um firmware que nunca chega. + A placa parece morta. +

+

+ Como evitar: reserve os pinos de strapping para saídas que ficam em alta + impedância no boot, ou use-os para entradas com o resistor de pull no sentido que o chip + espera. Se puder, simplesmente não use. +

+ +

3. Somente entrada

+

+ Alguns pinos são fisicamente incapazes de acionar uma saída, e não têm resistores de + pull-up nem pull-down internos. +

+

+ Como falha: silenciosamente. O pinMode(pino, OUTPUT) não + reclama, o digitalWrite não reclama, e o pino simplesmente não muda de nível. + Você passa a tarde procurando o problema no código. +

+

+ Como evitar: no ESP32 clássico são os GPIO 34, 35, 36, 37, 38 e 39. Use-os + para leitura, e lembre de colocar o resistor de pull no circuito, já que não existe um + interno para ativar. As séries RISC-V mais novas não têm pinos assim. +

+ +

4. Gravação e depuração

+

+ São a UART0 (por onde o firmware é gravado e as mensagens de Serial saem) e + as quatro linhas de JTAG. +

+

+ Como falha: você não perde o projeto, perde a capacidade de trabalhar + nele. Se um sensor ocupa os pinos da UART0, cada gravação exige desconectar o sensor. Se + algo escreve nesses pinos durante a execução, o monitor serial enche de lixo. +

+

+ Como evitar: deixe a UART0 livre até o projeto estar fechado. Se precisar + de mais uma serial, use a UART1 ou a UART2, que a matriz de roteamento leva para quase + qualquer pino. +

+ +

5. USB nativo

+

+ Nas séries com USB no próprio chip, dois pinos saem de fábrica ligados ao periférico + USB Serial/JTAG. +

+

+ Como falha: ao usá-los como GPIO comum, a porta USB de gravação some do + computador. Recuperar exige o modo de gravação manual pelos botões BOOT e RESET. +

+

+ Como evitar: no ESP32-S3 são o GPIO19 e o GPIO20. Trate-os como + indisponíveis, a não ser que você tenha certeza de que não vai precisar do USB nativo. +

+ +
+

Os pinos com restrição do ESP32-S3

+ +

+ Como a prática do capítulo 9 usa um ESP32-S3, vale ter esta lista à mão. Dos 45 GPIOs + da série, 18 têm alguma condição: +

+ + + + + + + + + + + +
GrupoPinos
Flash e PSRAMGPIO26, 27, 28, 29, 30, 31 e 32
StrappingGPIO0, GPIO45 e GPIO46
Gravação e JTAGGPIO39, 40, 41, 42 (JTAG) e GPIO43, 44 (UART0)
USB nativoGPIO19 e GPIO20
Somente entradaNenhum nesta série
Sobram 27 pinos totalmente livres, incluindo o GPIO12 que usaremos na prática.
+
+ +
+
O erro que mais custa caro
+

+ Fechar o esquemático de uma placa própria distribuindo os sinais pelos pinos "que + sobraram no traçado", sem conferir a lista. O protótipo chega da fábrica, a placa não + liga, e a correção passa por cortar trilha ou mandar refazer o lote. +

+

+ Cinco minutos de conferência antes do envio valem semanas de prazo. E como a matriz de + roteamento deixa quase toda função ir para quase todo pino, quase sempre dá para + reorganizar o traçado sem perder nada. +

+
+ +
+
Onde consultar
+

+ A página de cada série no ESPDocs traz uma seção de pinos com + restrição, com os grupos acima listados pino a pino para aquela série específica, mais + o diagrama de conexões completo com todas as funções de cada pino. + Em espdocs.cienciaembarcada.com.br. +

+
+
+ + +
+
+
3
+
+

Como o chip acorda: boot e execução

+

Entender esta sequência economiza horas de depuração.

+
+
+ + + +
+ + + 1. Energização + CHIP_EN em nível alto + + + 2. Bootloader da ROM + lê os pinos de strapping + + + 3. Segundo estágio + partições, assinatura, + descriptografia + + + 4. Sua aplicação + app_main() ou + setup() + loop() + + + + + + + + + + Modo de gravação + espera firmware pela serial + strapping + em nível de boot + + É este desvio que os botões BOOT e RESET forçam na mão + + +
+ Quando a gravação falha com timeout, é a etapa 2 que não chegou ao desvio. + Segurar BOOT e pressionar RESET força o caminho pontilhado. +
+
+ +

A sequência de partida

+ +
+
1
+
+

Energização e reset

+

+ Ao receber energia, o chip mantém o processador parado até as tensões estabilizarem. + O pino de habilitação (CHIP_EN ou CHIP_PU) precisa estar + em nível alto, e é por isso que ele nunca pode ficar flutuando. +

+
+
+ +
+
2
+
+

Bootloader da ROM

+

+ O processador começa a executar código gravado de fábrica na ROM. Esse código lê o + nível dos pinos de strapping para decidir o que fazer: iniciar + normalmente a partir da flash, ou entrar em modo de gravação e + esperar um firmware chegar pela serial. +

+
+
+ +
+
3
+
+

Bootloader de segundo estágio

+

+ Se o boot for normal, a ROM carrega da flash um segundo bootloader, este sim + gravado por você junto com o firmware. Ele lê a tabela de partições, escolhe qual + imagem executar (importante para OTA, onde há duas), verifica assinatura se o + Secure Boot estiver ativo, e descriptografa se a flash estiver cifrada. +

+
+
+ +
+
4
+
+

Sua aplicação

+

+ Só então o seu programa começa. No ESP-IDF, o ponto de entrada é + app_main(). No Arduino, o core cria uma tarefa que chama + setup() e depois loop() repetidamente. Ou seja: o + loop() que você conhece é, por baixo, uma tarefa do FreeRTOS. +

+
+
+ +
+
Os botões BOOT e RESET
+

+ É por causa do passo 2 que as placas têm esses dois botões. Segurar BOOT + enquanto pressiona e solta RESET força o modo de gravação. A maioria + das placas modernas faz isso automaticamente pelo conversor USB, mas quando a gravação + falha com timeout, esse é o truque manual que resolve. +

+
+ +

FreeRTOS: seu código não está sozinho

+ +

+ Diferente de um Arduino UNO, onde o seu loop() é literalmente a única coisa + executando, no ESP32 há um sistema operacional de tempo real gerenciando + várias tarefas ao mesmo tempo: a sua, as do Wi-Fi, as do Bluetooth, o temporizador de + sistema, o coletor de estatísticas. +

+ +

+ O escalonador distribui o processador entre elas por prioridade. Isso traz dois efeitos + práticos que surpreendem quem vem do Arduino: +

+ +

+ Primeiro: um delay() no ESP32 não trava o chip: ele cede o + processador para outras tarefas. É por isso que o Wi-Fi continua funcionando enquanto o seu + código "espera". +

+ +

+ Segundo: um laço que nunca cede o processador causa problema. Se você + escrever um while(true) sem delay() nem espera, o + watchdog vai reiniciar o chip, reclamando que a tarefa não alimentou o cão de + guarda. Não é bug: é o sistema protegendo as tarefas do rádio. +

+ +
+
"Task watchdog got triggered"
+

+ Esta mensagem no monitor serial quase sempre significa laço apertado sem ceder tempo. + A correção costuma ser um delay(1) ou um vTaskDelay() dentro + do laço. Parece contraintuitivo colocar espera para o programa funcionar, mas em um + sistema com RTOS é exatamente o que se faz. +

+
+ +

Partições: a flash não é um bloco só

+ +

+ A memória flash é dividida segundo uma tabela de partições. Um layout + típico tem: o bootloader, a tabela em si, uma área nvs para guardar + configurações (como a senha do Wi-Fi), uma ou duas partições de aplicação e, às vezes, um + sistema de arquivos. +

+ +

+ Duas partições de aplicação existem para permitir OTA: o firmware novo é + gravado na partição inativa, e só depois de validado o chip passa a iniciar por ela. Se a + imagem nova falhar, ele volta sozinho para a anterior. É por isso que um projeto com + atualização remota precisa de mais que o dobro do espaço do firmware. +

+
+ + +
+
+
4
+
+

A família completa: as 12 séries

+

Cada uma nasceu para resolver um problema diferente.

+
+
+ +

+ A nomenclatura ajuda mais do que parece. A letra indica a vocação da série: + S de sensing, desempenho e USB; C de custo + reduzido em RISC-V; H de malha 802.15.4 sem Wi-Fi; P de + processamento bruto sem rádio. +

+ +
+ +
+
ESP32
+
O clássico
+

O original de 2016. Dois núcleos, Bluetooth Clássico (raro na família), Ethernet e + dois DACs. Ainda é o mais barato e o de maior base instalada.

+
Núcleo
Xtensa LX6 ×2, 240 MHz
+
SRAM
520 KB
GPIO
34
+
+ +
+
ESP32-S2
+
USB e segurança
+

Um núcleo e sem Bluetooth, mas trouxe USB OTG nativo e muitos GPIOs. Bom quando o + projeto precisa se comportar como dispositivo USB.

+
Núcleo
Xtensa LX7, 240 MHz
+
SRAM
320 KB
GPIO
43
+
+ +
+
ESP32-S3
+
O cavalo de batalha
+

Dois núcleos, BLE 5, USB nativo, muita RAM e instruções vetoriais para IA. A série + mais usada em projetos novos, e a da nossa prática.

+
Núcleo
Xtensa LX7 ×2, 240 MHz
+
SRAM
512 KB
GPIO
45
+
+ +
+
ESP32-C2
+
O mínimo viável
+

Também vendido como ESP8684. Feito para custo: poucos pinos, sem I²S e sem + acelerador AES. Para dispositivos simples em altíssimo volume.

+
Núcleo
RISC-V, 120 MHz
+
SRAM
272 KB
GPIO
14
+
+ +
+
ESP32-C3
+
O substituto do clássico
+

O primeiro RISC-V da casa. Wi-Fi, BLE 5 e USB para depuração num chip barato. + Escolha natural para trocar um ESP8266 antigo.

+
Núcleo
RISC-V, 160 MHz
+
SRAM
400 KB
GPIO
22
+
+ +
+
ESP32-C6
+
Matter e malha
+

Wi-Fi 6, BLE 6 e 802.15.4 no mesmo chip: fala Zigbee, Thread e Matter. A porta de + entrada para automação residencial moderna.

+
Núcleo
RISC-V + LP, 160 MHz
+
SRAM
512 KB
GPIO
30
+
+ +
+
ESP32-C5
+
Wi-Fi de duas faixas
+

O primeiro da família com Wi-Fi 6 em 2,4 GHz e 5 GHz. Útil onde a faixa de + 2,4 GHz está congestionada.

+
Núcleo
RISC-V + LP, 240 MHz
+
SRAM
384 KB
GPIO
29
+
+ +
+
ESP32-C61
+
Wi-Fi 6 econômico
+

Wi-Fi 6 com foco em custo, com flash e PSRAM já no encapsulamento. Sem 802.15.4 e + sem acelerador AES.

+
Núcleo
RISC-V, 160 MHz
+
SRAM
320 KB
GPIO
30
+
+ +
+
ESP32-H2
+
Malha a bateria
+

Sem Wi-Fi de propósito: só BLE 6 e 802.15.4. Sem o rádio mais faminto, o consumo + despenca. Ideal para sensor Zigbee/Thread alimentado por pilha.

+
Núcleo
RISC-V, 96 MHz
+
SRAM
320 KB
GPIO
19
+
+ +
+
ESP32-H4
+
Malha, segunda geração
+

Sucessor do H2, com dois núcleos e BLE 5.4 com LE Audio. Ainda em documentação + preliminar, sem datasheet publicado e sem suporte estável.

+
Núcleo
RISC-V ×2, 96 MHz
+
SRAM
384 KB
GPIO
40
+
+ +
+
ESP32-P4
+
Força bruta, sem rádio
+

400 MHz, dois núcleos, MIPI para câmera e display, Ethernet. Não tem Wi-Fi nem + Bluetooth: é para interface gráfica e processamento pesado.

+
Núcleo
RISC-V ×2 + LP, 400 MHz
+
SRAM
768 KB
GPIO
55
+
+ +
+
ESP32-S31
+
O topo de linha
+

320 MHz, Wi-Fi 6, Bluetooth Clássico, 802.15.4, CAN FD e aceleração de IA. Ainda + sem versão estável do ESP-IDF nem suporte no Arduino.

+
Núcleo
RISC-V ×2 + LP, 320 MHz
+
SRAM
512 KB
GPIO
60
+
+ +
+ +

Tabelas comparativas

+ +

Processamento e memória

+ + + + + + + + + + + + + + + + + +
SérieNúcleoClockSRAMGPIOESP-IDF mínimo
ESP32Xtensa LX6 ×2240 MHz520 KB34v3.x
ESP32-S2Xtensa LX7 ×1240 MHz320 KB43v4.2
ESP32-S3Xtensa LX7 ×2240 MHz512 KB45v4.4
ESP32-S31RISC-V ×2320 MHz512 KB60master
ESP32-C2RISC-V ×1120 MHz272 KB14v5.0
ESP32-C3RISC-V ×1160 MHz400 KB22v4.3
ESP32-C5RISC-V ×1240 MHz384 KB29v5.5.2
ESP32-C6RISC-V ×1160 MHz512 KB30v5.1
ESP32-C61RISC-V ×1160 MHz320 KB30v5.5.2
ESP32-P4RISC-V ×2400 MHz768 KB55v5.3
ESP32-H2RISC-V ×196 MHz320 KB19v5.1
ESP32-H4RISC-V ×296 MHz384 KB40master
"master" indica série que ainda não entrou em versão estável do ESP-IDF.
+ +

Rádios

+ + + + + + + + + + + + + + + + +
SérieWi-FiBluetooth802.15.4Matter
ESP32Wi-Fi 4BLE + ClássicoNãoNão
ESP32-S2Wi-Fi 4NãoNãoNão
ESP32-S3Wi-Fi 4BLE 5.4NãoNão
ESP32-S31Wi-Fi 6BLE + ClássicoSimSim
ESP32-C2Wi-Fi 4BLE 5.3NãoNão
ESP32-C3Wi-Fi 4BLE 5.4NãoNão
ESP32-C5Wi-Fi 6 · 2,4 e 5 GHzBLE 6.0SimSim
ESP32-C6Wi-Fi 6BLE 6.0SimSim
ESP32-C61Wi-Fi 6BLE 6.0NãoVia Wi-Fi
ESP32-P4NãoNãoNãoNão
ESP32-H2NãoBLE 6.0SimSim
ESP32-H4NãoBLE 5.4SimSim
+ +

Ferramentas e encapsulamento

+ + + + + + + + + + + + + + + + + +
SérieCore ArduinoDepuraçãoEncapsulamento
ESP32147 placasSonda externaQFN48 (6×6 e 5×5 mm)
ESP32-S226 placasSonda externaQFN56 (7×7 mm)
ESP32-S3158 placasUSB integradoQFN56 (7×7 mm)
ESP32-S31NãoUSB integradoQFN80 (8×8 mm)
ESP32-C21 placaSonda externaQFN24 (4×4 mm)
ESP32-C329 placasUSB integradoQFN32 (5×5) e QFN28 (4×4 mm)
ESP32-C510 placasUSB integradoQFN48 (6×6 mm)
ESP32-C621 placasUSB integradoQFN40 e QFN32 (5×5 mm)
ESP32-C611 placaUSB integradoQFN40 (5×5 mm)
ESP32-P47 placasUSB integradoQFN104 (10×10 mm)
ESP32-H23 placasUSB integradoQFN32 (4×4 mm)
ESP32-H4NãoUSB integradoNão divulgado
Número de definições de placa no core oficial arduino-esp32, um bom termômetro da maturidade do ecossistema.
+ +
+
Lançado não é o mesmo que utilizável
+

+ Um chip anunciado pode levar meses até ter suporte estável nas ferramentas. O + S31 e o H4 hoje só existem no branch de + desenvolvimento do ESP-IDF e não têm suporte no core Arduino. Antes de escolher uma + série recente para um projeto com prazo, verifique em qual versão do ESP-IDF ela entrou + e se ela já tem módulo à venda. +

+
+
+ + +
+
+
5
+
+

Segurança em hardware

+

O que existe no silício, para que serve, e por que isso separa as séries.

+
+
+ +

+ Segurança costuma ser tratada como assunto de software, mas boa parte dela depende de + blocos de hardware. Executar criptografia em hardware é dezenas de vezes mais rápido e + mais econômico que na CPU. E alguns recursos, como esconder uma chave privada do próprio + firmware, são impossíveis sem apoio do silício. +

+ +

+ Este é também o assunto em que as séries mais divergem, o que faz dele um bom critério de + escolha. +

+ +

Os blocos e o que cada um resolve

+ + + + + + + + + + + + + + + + + +
BlocoPara que serve
AESCifra simétrica: é o que protege o tráfego depois que uma conexão TLS é estabelecida.
SHAFunções de resumo (hash). Base de assinaturas, verificação de integridade e HMAC.
RSA / MPIAritmética de números grandes, usada em chave pública clássica. É o que acelera o handshake TLS.
ECCCriptografia de curvas elípticas: mesma segurança do RSA com chaves muito menores, o que importa bastante em microcontrolador.
ECDSAAssinatura digital sobre curvas elípticas. É o que o Matter exige para o atestado de dispositivo.
HMACAutenticação de mensagem com chave secreta.
Digital SignatureAssina usando uma chave RSA guardada em eFuse, sem que o firmware chegue a vê-la.
Key ManagerProvisiona e usa chaves sem que elas fiquem legíveis para o firmware, nem se alguém extrair a imagem.
RNGGerador de números verdadeiramente aleatórios. Sem ele, toda a criptografia fica previsível.
Criptografia de flashCifra o conteúdo da flash, impedindo que alguém leia o firmware soldando um gravador na memória.
Secure BootO chip se recusa a executar firmware que não esteja assinado pela sua chave.
Proteção DPADefesa contra ataque que deduz a chave medindo variações no consumo de energia durante a operação.
+ +

O que cada série tem

+ + + + + + + + + + + + + + + + + + +
SérieAESECCECDSAKey ManagerSecure Boot
ESP32128/192/256NãoNãoNãoV1 (legado)
ESP32-S2128/192/256 + GCMNãoNãoNãoV2 · RSA-3072
ESP32-S3128/256NãoNãoNãoV2 · RSA-3072
ESP32-S31128/256 + GCMP-192/256/384SimSimV2 · RSA-3072
ESP32-C2NãoP-192/256NãoNãoV2 · ECDSA
ESP32-C3128/256NãoNãoNãoV2 · RSA-3072
ESP32-C5128/256P-192/256/384SimSimV2 · RSA/ECDSA
ESP32-C6128/256P-192/256NãoNãoV2 · RSA/ECDSA
ESP32-C61NãoP-192/256SimNãoV2 · ECDSA
ESP32-P4128/256 + GCMP-192/256/384SimSimV2 · RSA/ECDSA
ESP32-H2128/256P-192/256SimNãoV2 · RSA/ECDSA
ESP32-H4128/256P-192/256/384SimNãoPendente
Dados extraídos das definições de hardware (soc_caps.h) do ESP-IDF.
+ +

Três leituras que essa tabela permite

+ +

+ Nem toda série tem acelerador AES. O C2 e o C61 não têm. Eles conseguem + fazer TLS, mas a cifra do tráfego roda na CPU, o que pesa se o dispositivo transmitir + muito dado. +

+ +

+ ECC é um divisor claro. As séries mais antigas (ESP32, S2, S3 e C3) não + têm curvas elípticas em hardware. Como o mundo caminha para ECC (chaves menores, menos + memória), essa é uma diferença que tende a pesar mais com o tempo. +

+ +

+ Key Manager é raro. Só S31, C5 e P4. Se o seu produto precisa que a chave + privada seja inacessível mesmo para quem tem o firmware em mãos, a lista de candidatos é + bem curta. +

+ +
+
eFuse: memória que só grava uma vez
+

+ Os segredos ficam em eFuses, bits que podem ser queimados uma única + vez e nunca mais voltam. É assim que se grava a chave do Secure Boot e da criptografia + de flash, e é por isso que essas operações são irreversíveis: uma vez ativado o Secure + Boot, aquela placa só executa firmware assinado por você. Para sempre. Em bancada, é + uma ótima forma de inutilizar uma placa por engano. Ative apenas quando souber + exatamente o que está fazendo. +

+
+
+ + +
+
+
6
+
+

ESP32, ESP8266, Arduino e STM32

+

Quatro mundos diferentes, e por que "qual é o melhor" não tem resposta.

+
+
+ +

+ Comparar plataformas exige cuidado: "Arduino" é uma marca de placas e um ambiente de + programação, e "STM32" é uma família enorme da STMicroelectronics que vai de chips de + centavos a processadores de 480 MHz. Para a comparação fazer sentido, usaremos + representantes concretos. +

+ + + + + + + + + + + + + + + + + + +
Arduino UNO R3ESP8266ESP32-S3STM32F103
NúcleoAVR 8 bitsXtensa L106Xtensa LX7 ×2Cortex-M3
Clock16 MHz80 a 160 MHz240 MHz72 MHz
SRAM2 KB~50 KB úteis512 KB20 KB
Flash32 KBExterna, 1 a 4 MBExterna, 4 a 16 MB64 a 128 KB
Wi-FiNãoSimSimNão
BluetoothNãoNãoBLE 5Não
Tensão de E/S5 V3,3 V3,3 V3,3 V (alguns 5 V)
ADC10 bits, linear1 canal, 10 bits12 bits, calibrar12 bits, bom
GPIO úteis20~94537
Dormindo~35 µA~20 µA~7 µA~2 µA
Valores típicos para ordem de grandeza. Confira sempre o datasheet da peça exata.
+ +

Onde cada um ganha

+ +

Arduino UNO

+

+ Ganha em simplicidade e previsibilidade. Sem sistema operacional, sem + pilha de rede: o que você escreve é exatamente o que executa, na ordem que escreveu. + Trabalha em 5 V, o que dispensa conversão de nível com muitos sensores e módulos antigos. + É insuperável como primeiro contato e para ensinar eletrônica. Perde feio em memória, porque 2 KB + de SRAM acabam rápido, e não tem qualquer conectividade. +

+ +

ESP8266

+

+ Ganha em preço puro. Ainda é o jeito mais barato de colocar algo simples + no Wi-Fi, e tem uma base gigante de tutoriais. Perde em quase todo o resto: poucos GPIOs + utilizáveis, um único canal de ADC, sem Bluetooth, e uma arquitetura que a Espressif já não + desenvolve. Para projeto novo, o C3 costuma custar quase o mesmo e é melhor em tudo. +

+ +

ESP32

+

+ Ganha em conectividade e relação recurso/preço. Você recebe centenas de + kilobytes de RAM, dois núcleos, Wi-Fi, Bluetooth e criptografia por hardware pelo preço de + um microcontrolador simples. Para qualquer coisa que precise falar com a rede, é difícil + justificar outra escolha. Perde em determinismo de tempo real rígido e na qualidade do + conversor analógico. +

+ +

STM32

+

+ Ganha em controle fino e diversidade. A família cobre desde encapsulamentos + de 8 pinos até chips com centenas, com variantes especializadas em consumo ultrabaixo + (série L), desempenho (H7) ou segurança. Os periféricos de temporização são muito superiores + para controle de motor e conversão de potência, e o ecossistema é padrão industrial, com + ferramentas de certificação e suporte de longo prazo. Perde na curva de aprendizado, já que a HAL + da ST é bem mais verbosa, e não tem rádio integrado, salvo nas séries WB e WL. +

+ +
+
Regra prática para decidir
+

+ Precisa falar com a internet ou com um celular? ESP32, quase sempre.
+ É controle de tempo real crítico, como motor, inversor ou malha rápida? STM32.
+ É para ensinar eletrônica ou um protótipo simples em 5 V? Arduino.
+ É produto comercial com certificação e vida longa? Avalie STM32 e ESP32 + juntos, olhando módulos homologados e compromisso de fornecimento. +

+
+ +
+
"Programar em Arduino" não é o mesmo que "usar um Arduino"
+

+ O ambiente Arduino é só uma camada de software. Você pode programar um ESP32 ou um + STM32 usando a IDE do Arduino, e é exatamente o que faremos no capítulo 9. Placa e + linguagem são escolhas independentes. +

+
+
+ + +
+
+
7
+
+

Pontos fortes e limitações reais

+

O que ninguém conta no vídeo de unboxing.

+
+
+ +

Onde o ESP32 é muito bom

+ +

+ Conectividade sem dor. Subir um cliente MQTT com TLS, um servidor HTTP ou + uma conexão BLE são tarefas de dezenas de linhas, com pilhas maduras. +

+

+ Recursos por real gasto. Nenhuma outra plataforma entrega tanta memória, + clock e rádio nessa faixa de preço. +

+

+ Segurança de verdade. Boot seguro, criptografia de flash e aceleradores + criptográficos estão presentes até nas séries baratas, recursos que em outras famílias + aparecem só nas linhas premium. +

+

+ Flexibilidade de pinos. A matriz de roteamento simplifica muito o traçado + da placa: você adapta o firmware ao layout, não o contrário. +

+

+ Atualização remota. OTA com partição dupla e reversão automática vem + pronto no framework. +

+

+ Documentação aberta. Datasheets, manuais de referência, erratas e o + código-fonte do framework são públicos e versionados. +

+ +

Onde ele decepciona

+ +

O conversor analógico é fraco

+

+ É a queixa mais comum e mais justa. O ADC do ESP32 tem não-linearidade perceptível, ruído + e variação entre unidades; precisa de calibração para medidas sérias. Pior: em várias + séries, o bloco ADC2 fica indisponível enquanto o Wi-Fi está ligado, + porque ambos compartilham recursos internos. Se o seu projeto depende de medida analógica + precisa, use um ADC externo por I²C ou SPI. +

+ +

O rádio consome muito

+

+ Picos de transmissão passam de 300 mA. Um regulador subdimensionado ou uma bateria com + resistência interna alta provoca reinicializações aparentemente aleatórias, que parecem + bug de software e não são. +

+ +

Tempo real é aproximado

+

+ O firmware roda sobre FreeRTOS, e o rádio tem tarefas de alta prioridade que precisam ser + atendidas. Isso introduz variação de alguns microssegundos a milissegundos no seu laço. + Existem soluções, como fixar tarefa em um núcleo, usar o periférico RMT ou delegar a + hardware dedicado, mas todas exigem planejamento. +

+ +

Só 3,3 V

+

+ Os pinos não toleram 5 V. Sensor ou display antigo em 5 V exige conversor de nível; ligar + direto degrada ou destrói a entrada. +

+ +

Documentação viva demais

+

+ A família cresce rápido, e com ela erratas, diferenças entre revisões de silício e + funcionalidades que mudam de comportamento entre versões do IDF. Ler a errata do seu chip + antes de fechar o projeto é hábito recomendado. +

+ +

Consumo em repouso não é mágico

+

+ Os 7 µA de deep sleep que aparecem no datasheet valem para o chip nu, em + condições ideais. Numa placa de desenvolvimento, o regulador, o LED de energia e o + conversor USB-serial costumam consumir muito mais que o próprio ESP32. Medir consumo em + DevKit leva a conclusões erradas. +

+ +
+
Erro clássico de bancada
+

+ Alimentar a placa pela USB do notebook e ligar nela um motor, uma fita de LED ou um + display grande. Na hora em que o Wi-Fi transmite, a corrente ultrapassa o que a porta + fornece, a tensão cai e o chip reinicia. O sintoma parece software travando; a causa é + alimentação. Use fonte externa adequada para as cargas. +

+
+
+ + +
+
+
8
+
+

Como escolher a série do seu projeto

+

Um método em cinco perguntas, na ordem que elimina mais opções primeiro.

+
+
+ +

+ A escolha fica muito mais simples quando feita na ordem certa. Comece pelo que é impossível + contornar depois, que é o rádio, e só no fim olhe para o que é ajustável. +

+ +

Pergunta 1: Como ele se comunica?

+

+ Esta pergunta sozinha elimina a maior parte da família, porque rádio não se acrescenta + depois. +

+ + + + + + + + + + + +
NecessidadeSéries que atendem
Wi-Fi + Bluetooth LEESP32, S3, C3, C6, C5, C61, S31
Bluetooth Clássico (áudio, SPP)ESP32, S31
Zigbee / Thread / Matter em malhaC6, C5, H2, H4, S31
Wi-Fi 5 GHzC5
Ethernet cabeadaESP32, P4
Sem rádio, só processamentoP4
+ +

Pergunta 2: De onde vem a energia?

+

+ Se o projeto vive de bateria ou painel solar, o consumo em repouso passa a mandar em tudo. + Séries com processador de baixo consumo (C5, C6, P4, S31) mantêm uma tarefa simples rodando + com o resto do chip dormindo. E se você não precisa de Wi-Fi, o H2 e o H4 economizam + justamente por não carregarem o rádio mais faminto. +

+ +

Pergunta 3: O que vai ligado nele?

+

+ Conte os pinos de que precisa e verifique as interfaces especiais. Display gráfico grande + ou câmera pedem S3 ou P4 (que tem MIPI). Muitos atuadores pedem uma série com bastante + GPIO, lembrando de descontar os pinos com restrição. USB nativo, para o dispositivo se + apresentar como teclado ou pendrive, existe do S2 em diante e nas séries C recentes. +

+ +

Pergunta 4: Que exigência de segurança existe?

+

+ Para um protótipo, qualquer série serve. Para produto, o requisito define o chip: atestado + de dispositivo Matter pede ECDSA em hardware; chave privada que o firmware nunca pode ler + pede Key Manager. Consulte a tabela do capítulo 5. +

+ +

Pergunta 5: Quando precisa estar pronto?

+

+ Esta é a pergunta esquecida. Uma série recém-anunciada pode não ter suporte estável no + ESP-IDF, não ter core Arduino, não ter módulo à venda e não ter placa de desenvolvimento + acessível. Para trabalho com prazo, prefira séries com pelo menos um ano de estrada. +

+ +

Atalhos por perfil de projeto

+ + + + + + + + + + + + + +
Se o seu projeto é…Comece porPor quê
Primeiro projeto, aprendendoESP32-S3Muita RAM, USB nativo para depurar e o maior ecossistema de exemplos
Sensor Wi-Fi simples e baratoESP32-C3Faz o essencial pelo menor preço, com boa maturidade
Automação residencial / MatterESP32-C6Único caminho maduro com Wi-Fi 6 e 802.15.4 juntos
Sensor a pilha, sem Wi-FiESP32-H2Sem o rádio mais custoso, a autonomia muda de patamar
Tela, câmera ou interface gráficaESP32-P4 ou S3MIPI e RAM suficiente para buffer de vídeo
Áudio por Bluetooth ClássicoESP32Praticamente a única série com BR/EDR
Visão computacional na bordaESP32-S3Instruções vetoriais e PSRAM para o buffer da câmera
Produto em altíssimo volumeESP32-C2O menor custo da família, se os requisitos couberem nele
+ +

ESP-IDF ou Arduino?

+ +

+ Escolhida a série, falta escolher a ferramenta. As duas são oficiais e mantidas pela + Espressif; a diferença é o nível de controle. +

+ + + + + + + + + + + +
Core ArduinoESP-IDF
Curva de entradaBaixa, familiarÍngreme: menuconfig, CMake, componentes
Controle do hardwareParcialTotal
Acesso a recursos novosChega depoisImediato
Bibliotecas de sensoresEnormeMenor, mais técnica
Consumo de memóriaMaiorAjustável
Indicado paraAprender, prototiparProduto, otimização, recursos avançados
+ +
+
Não é escolha definitiva
+

+ Dá para usar o core Arduino como componente dentro de um projeto ESP-IDF, + misturando os dois. Um caminho comum é começar no Arduino para validar a ideia e migrar + para o IDF quando aparecer a necessidade de afinar consumo, segurança ou tempo de boot. +

+
+ +
+
Ferramenta de apoio
+

+ O ESPDocs tem um seletor que faz exatamente estas perguntas e devolve + uma recomendação justificada, além de comparar até quatro séries lado a lado, com + pinagem interativa e ficha de segurança. + Em espdocs.cienciaembarcada.com.br. +

+
+
+ + +
+
+
9
+
+

Prática: lendo um DHT11 com o ESP32-S3

+

Do jumper ao terminal mostrando temperatura e umidade.

+
+
+ +

+ Vamos montar o "olá mundo" dos sensores: ler temperatura e umidade do ambiente e imprimir + no monitor serial. O DHT11 é barato, comum e usa um protocolo digital próprio de um único + fio, o que já ensina algo além de acender um LED. +

+ +

Lista de material

+ + + + + + + + + + + +
ItemQtd.Observação
ESP32-S3-DevKitC-11Qualquer variante de flash/PSRAM serve
Sensor DHT111O componente azul de 4 pinos
Resistor de 10 kΩ1Pull-up do dado (marrom, preto, laranja)
Protoboard1Meia protoboard basta
Jumpers4Vermelho, preto e amarelo, por convenção
Cabo USB1De dados. Cabo só de carga não funciona
+ +

Montagem

+ + + + + + + + + + +
LigaçãoCor na figuraFunção
VCC do DHT11 → 3V3VermelhoAlimentação do sensor
DATA do DHT11 → GPIO12AmareloLinha de dados bidirecional
GND do DHT11 → GNDPretoReferência de terra
10 kΩ entre DATA e 3V3ResistorMantém a linha em nível alto em repouso
O terceiro pino do DHT11 (contando da esquerda) não é usado.
+ +
+ Esquema de ligação do DHT11 ao ESP32-S3-DevKitC: fio vermelho do VCC ao 3V3, fio amarelo do DATA ao GPIO12, fio preto do GND ao GND, e um resistor de 10 kΩ entre a linha de dados e o 3V3. +
+ Ligação completa. O fio amarelo leva o dado ao GPIO12; o resistor de + 10 kΩ conecta essa mesma linha ao 3V3, funcionando como pull-up. Repare que a + placa tem duas portas USB na borda inferior, marcadas UART e USB. A + diferença entre elas importa e está explicada no passo 4. +

+ Arquivo editável do Fritzing: + baixar pratica.fzz +
+
+ +
+
Por que o resistor de pull-up é necessário
+

+ A linha de dados do DHT11 é bidirecional: ora o ESP32 fala, ora o + sensor responde. Para isso funcionar sem que os dois disputem a linha, ambos apenas + "puxam para baixo" quando querem enviar um zero, e soltam a linha quando querem enviar + um um. Só que uma linha solta não tem nível definido: ela flutua e capta ruído. +

+

+ O resistor de 10 kΩ resolve isso mantendo a linha em nível alto em repouso, com força + suficiente para definir o nível, mas fraca o bastante para que qualquer um dos dois + consiga puxá-la para baixo. Módulos DHT11 já montados em plaquinha trazem esse resistor + embutido; o componente azul sozinho, não. +

+
+ +
+

Como o sensor conversa

+ +

+ Vale entender o que a biblioteca faz por você. A cada leitura acontece esta troca, toda + por um único fio: +

+ +
+ + + + + + + alto + baixo + + + + + + + + + + 18 ms + 80 µs + 70 µs + 26 µs + + o ESP32 pede a leitura + o sensor responde + bit 1 + bit 0 + …40 bits + + + a partir daqui, o valor do bit está na largura do pulso alto + +
+ O mesmo fio serve para os dois lados conversarem, em momentos diferentes. Um zero e um + um se distinguem só pela duração do nível alto, e é por isso que a + leitura falha quando o pull-up está ausente: sem ele a linha não sobe rápido o bastante + e os tempos saem errados. +
+
+
+ +
    +
  1. O ESP32 puxa a linha para baixo por cerca de 18 ms, que é o "acorda" do sensor.
  2. +
  3. Solta a linha; o pull-up a leva para alto.
  4. +
  5. O DHT11 responde puxando para baixo por 80 µs e soltando por mais 80 µs.
  6. +
  7. Em seguida envia 40 bits: umidade (2 bytes), temperatura (2 bytes) e + um byte de verificação.
  8. +
  9. Cada bit é codificado pela duração do nível alto: cerca de 26 µs é zero, + cerca de 70 µs é um.
  10. +
+ +

+ A biblioteca mede esses tempos e confere o byte de verificação. Se a soma não bater, + seja por ruído, fio solto ou falta de pull-up, ela devolve NaN, e é isso que o + nosso código testa. +

+ +

Passo a passo

+ +
+
1
+
+

Instale o suporte ao ESP32 na IDE

+

+ Na Arduino IDE, abra Arquivo → Preferências e adicione em "URLs adicionais + para gerenciadores de placas": +

+ +
https://espressif.github.io/arduino-esp32/package_esp32_index.json
+

+ Depois vá em Ferramentas → Placa → Gerenciador de placas, procure por + esp32 e instale o pacote da Espressif Systems. São alguns minutos + de download. +

+
+
+ +
+
2
+
+

Instale a biblioteca do sensor

+

+ Em Ferramentas → Gerenciar bibliotecas, procure por + DHT sensor library, da Adafruit, e instale. A IDE vai perguntar se + quer instalar as dependências. Aceite, porque ela precisa da + Adafruit Unified Sensor junto. +

+
+
+ +
+
3
+
+

Escreva o programa

+
#include <DHT.h>
+
+#define PINO_DHT  12       // fio amarelo
+#define TIPO_DHT  DHT11
+
+DHT dht(PINO_DHT, TIPO_DHT);
+
+void setup() {
+  Serial.begin(115200);
+  delay(1000);              // tempo para a USB enumerar
+  dht.begin();
+  Serial.println("Leitor DHT11 - ESP32-S3");
+}
+
+void loop() {
+  float umidade     = dht.readHumidity();
+  float temperatura = dht.readTemperature();
+
+  if (isnan(umidade) || isnan(temperatura)) {
+    Serial.println("Falha na leitura do sensor");
+  } else {
+    Serial.printf("Temperatura: %.1f C | Umidade: %.1f %%\n",
+                  temperatura, umidade);
+  }
+
+  delay(2000);              // DHT11 nao aceita leitura mais rapida
+}
+

+ O delay(2000) não é enfeite: o DHT11 leva cerca de um segundo para + fazer uma medição e responde com erro se for consultado antes disso. +

+
+
+ +
+
4
+
+

Configure a placa: o passo onde todo mundo tropeça

+

+ Em Ferramentas, selecione a placa ESP32S3 Dev Module. + Agora, o detalhe importante: o DevKitC tem duas portas USB. +

+

+ A porta marcada UART passa por um conversor USB-serial e funciona + como em qualquer Arduino. A porta marcada USB é o USB nativo do + próprio ESP32-S3. +

+

+ Se você ligar o cabo na porta USB, precisa habilitar + USB CDC On Boot → Enabled, senão o monitor serial fica mudo mesmo com o + programa rodando. Ligando na porta UART, deixe essa opção como + Disabled. +

+
+
+ +
+
5
+
+

Grave e observe

+

+ Selecione a porta em Ferramentas → Porta, clique em carregar e abra o + monitor serial em 115200 baud. Depois de alguns segundos: +

+ +
Leitor DHT11 - ESP32-S3
+Temperatura: 26.0 C | Umidade: 61.0 %
+Temperatura: 26.0 C | Umidade: 61.0 %
+Temperatura: 26.1 C | Umidade: 62.0 %
+

+ Segure o sensor entre os dedos e sopre nele: a umidade sobe rápido e a temperatura + acompanha devagar. Essa diferença de velocidade é real: o elemento de umidade + responde muito mais rápido que o termistor. +

+
+
+ +

Quando não funciona

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SintomaCausa provável e solução
Monitor serial vazioCabo na porta USB nativa sem USB CDC On Boot habilitado. Veja o passo + 4. Confira também a velocidade em 115200.
"Falha na leitura" sempreFio de dados no pino errado, VCC não conectado, ou resistor de pull-up ausente + ou mal encaixado na protoboard.
Leitura falha às vezesJumper com mau contato, fio de dados muito longo, ou delay menor + que 2 segundos.
A porta não apareceCabo só de carga (troque por um de dados) ou driver do conversor USB-serial + faltando.
Erro ao gravar, timeoutPlaca não entrou em modo de gravação: segure BOOT, pressione e solte RESET, + solte BOOT e tente de novo.
Temperatura sempre inteiraNão é defeito. O DHT11 tem resolução de 1 °C. O DHT22 dá 0,1 °C.
Valores absurdos e constantesSensor invertido na alimentação. Confira VCC e GND antes de energizar de novo.
+ +
+
Por que o GPIO12?
+

+ No ESP32-S3, o GPIO12 é um pino comum: não participa do boot, não conversa com a flash + e não é usado para depuração. Ele até tem funções alternativas de touch e ADC2, mas + nenhuma delas atrapalha o uso como entrada e saída digital. +

+

+ Em outras séries, cuidado: no ESP32 original o GPIO12 é pino de strapping: + ele seleciona a tensão da flash, e um nível alto durante o reset impede a placa de + iniciar. Mesmo número de pino, comportamento completamente diferente. +

+

+ Se você montasse este mesmo circuito num ESP32 clássico sem trocar o pino, o resistor + de pull-up de 10 kΩ que o DHT11 exige seguraria o GPIO12 em nível alto exatamente + durante o reset. A placa simplesmente não iniciaria, e o sintoma não apontaria para o + sensor em momento algum. É o grupo 2 do capítulo 2 acontecendo na prática. +

+
+ +

Desafios

+ +

Se sobrar tempo na formação, ou para praticar depois:

+ +
    +
  1. Acenda o LED RGB da placa em vermelho quando a temperatura passar de 28 °C e em azul + abaixo disso.
  2. +
  3. Calcule e imprima a média das últimas dez leituras, para suavizar o ruído.
  4. +
  5. Troque o delay por controle de tempo com millis(), de modo + que o programa continue respondendo enquanto espera.
  6. +
  7. Detecte e conte quantas vezes a umidade subiu mais de 5 % entre leituras consecutivas.
  8. +
  9. Publique a leitura numa página web servida pelo próprio ESP32, acessível por qualquer + aparelho na mesma rede.
  10. +
+
+ + +
+
+
10
+
+

Glossário e próximos passos

+

Os termos que aparecem o tempo todo, e para onde seguir.

+
+
+ +

Glossário

+ + + + + + + + + + + + + + + + + + + + + +
TermoSignificado
SoCSystem on Chip: um único chip reunindo processador, memória, rádio e periféricos.
GPIOPino de entrada e saída de uso geral.
StrappingPino lido no reset para definir o modo de boot.
Pull-up / pull-downResistor que define o nível de uma linha em repouso.
ULP / LP coreCoprocessador de baixíssimo consumo que roda com o chip principal dormindo.
PSRAMMemória RAM externa opcional, para buffers grandes.
eFuseMemória que só pode ser gravada uma vez, usada para chaves e configurações permanentes.
Deep sleepModo em que quase tudo desliga, mantendo só o mínimo para acordar depois.
OTAOver-The-Air: atualização de firmware pela rede.
FreeRTOSSistema operacional de tempo real que gerencia as tarefas do ESP32.
WatchdogTemporizador que reinicia o chip se uma tarefa travar.
TWAINome que a Espressif dá ao controlador compatível com CAN.
MatterPadrão de interoperabilidade para casa conectada, sobre Wi-Fi ou Thread.
Thread / ZigbeeProtocolos de rede em malha de baixo consumo sobre IEEE 802.15.4.
Secure BootMecanismo que impede o chip de executar firmware não assinado.
ErrataDocumento com os defeitos conhecidos de uma revisão do silício.
+ +

Onde consultar

+ + + + + + + + + + + + +
FontePara quê
ESPDocsEspecificações, pinagem, segurança e comparação das séries em português. Em espdocs.cienciaembarcada.com.br
Datasheet da sérieVerdade final sobre limites elétricos, pinagem e encapsulamento
Technical Reference ManualDetalhe de registradores e comportamento de cada periférico
ESP-IDF Programming GuideAPI oficial, exemplos e guias de Wi-Fi, BLE, OTA e segurança
Errata do chipDefeitos conhecidos daquela revisão. Leia antes de fechar projeto
Fórum esp32.comDúvidas específicas, com participação de engenheiros da Espressif
GitHub da EspressifCódigo-fonte, exemplos e issues abertas
+ +

Por onde continuar

+

+ Com o sensor funcionando, o caminho natural é tirar o dado da bancada. Na ordem que + costuma render mais aprendizado por hora investida: +

+ +
    +
  1. Conectar ao Wi-Fi e servir uma página com a leitura. É o exercício que + mais amarra os conceitos: rede, memória e o laço principal disputando espaço.
  2. +
  3. Publicar em um broker MQTT, que é o protocolo padrão de IoT e o que + permite o dado chegar a um painel ou a outro dispositivo.
  4. +
  5. Economizar energia com deep sleep, medindo de verdade quanto tempo uma + bateria aguenta.
  6. +
  7. Atualizar o firmware pelo ar com OTA, fechando o ciclo de um produto + que não precisa mais de cabo depois de instalado.
  8. +
  9. Migrar um projeto para o ESP-IDF, para enxergar o que o core Arduino + estava escondendo.
  10. +
+ +
+
Um conselho para levar
+

+ Quando algo não funcionar, resista à vontade de trocar linhas de código no chute. + Pergunte antes: o hardware está certo? A alimentação aguenta? Esse pino tem restrição? + A biblioteca é a certa para esta série? A maior parte dos problemas em sistemas + embarcados não está no algoritmo, e sim na fronteira entre o software e o mundo físico. +

+
+ +
+ + +
+
+
+

Créditos

+

Quem fez, para quem, e o que você pode fazer com este material.

+
+
+ +
+

Sobre este material

+

+ Esta apostila é material de apoio a uma formação presencial da LASER. + Ela foi escrita para ser lida junto com o encontro, não no lugar dele: os capítulos + seguem a ordem da aula, e o capítulo 9 é a prática que acontece na bancada, com o + hardware em mãos e monitoria no local. +

+

+ Ela também funciona sozinha, como referência para consultar depois. As tabelas + comparativas, a lista de pinos com restrição e o guia de solução de problemas foram + escritos pensando em quem volta ao texto meses depois, no meio de um projeto. +

+
+ +

Realização

+ + + + + + + + + + + + + + + + + + + + + +
PapelQuem
RealizaçãoLASER, Liga Acadêmica de Sistemas Embarcados
+ Centro de Informática · Universidade Federal de Pernambuco
+ laser.cin.ufpe.br
Conteúdo e redaçãoLucas Rayan Guerra
+ Ciência Embarcada · cienciaembarcada.com.br
+ linkedin.com/in/lucasrguerra
+ contato@lucasrguerra.dev.br
Dados técnicosESPDocs, plataforma de documentação do ESP32 em português
+ espdocs.cienciaembarcada.com.br
Prática e esquemáticoMontagem em Fritzing, arquivo editável disponível para download no capítulo 9
+ +
+

Fontes e verificação

+ +

+ Nenhum número desta apostila foi estimado. Cada dado tem origem rastreável: +

+ + + + + + + + + + + + + +
InformaçãoOrigem
Arquitetura, memória, periféricosDatasheets oficiais da Espressif Systems
Blocos de segurança por sérieDefinições de hardware do ESP-IDF (soc_caps.h)
Versão mínima do ESP-IDFÍndice de versões publicado pela Espressif
Suporte no core ArduinoRepositório oficial arduino-esp32
EncapsulamentoDatasheets oficiais, capítulo de packaging
Pinos com restriçãoDatasheets, cruzados com a base de pinagem do ESPDocs
Diagrama de blocos do ESP32-S3Imagem da Espressif Systems, reproduzida para fins didáticos
Onde a Espressif ainda não publicou documentação, como no ESP32-H4, isso está dito no texto em vez de preenchido por estimativa.
+
+ +

Uso e distribuição

+ +

+ Este material pode ser usado, copiado e adaptado livremente para fins + educacionais, desde que citada a origem. Se for adaptá-lo para outra formação, + mantenha os créditos desta página e ajuste as partes que dependem do contexto da LASER. +

+ +
+
Independência
+

+ Este é um material independente, produzido pela LASER, sem vínculo, patrocínio + ou revisão da Espressif Systems. Os nomes ESP32, ESP-IDF e demais marcas + citadas pertencem aos seus respectivos titulares. +

+

+ Para decisão de engenharia ou projeto industrial, a referência final é sempre o + datasheet e a errata do fabricante, na revisão de silício que você tem em mãos. +

+
+ +
+
Dúvidas, correções e contato
+

+ Correções e sugestões são bem-vindas e ajudam as próximas turmas. Fale direto com o + autor por contato@lucasrguerra.dev.br + ou pelo LinkedIn, em + linkedin.com/in/lucasrguerra. +

+
+ +

+ LASER · Liga Acadêmica de Sistemas Embarcados · Centro de Informática · UFPE
+ Formação em ESP32 · Módulo 1: Conhecendo a Família +

+
+ + + + + diff --git a/public/formacoes/1/formacao.json b/public/formacoes/1/formacao.json new file mode 100644 index 0000000..305e95b --- /dev/null +++ b/public/formacoes/1/formacao.json @@ -0,0 +1,40 @@ +{ + "modulo": 1, + "titulo": ["Conhecendo a", "família ESP32"], + "subtitulo": "Do silício à bancada: como esses microcontroladores funcionam por dentro, o que cada uma das doze séries faz e não faz, e como escolher o chip certo. Termina com um DHT11 lendo temperatura e umidade num ESP32-S3.", + "descricao": "Slides, apostila e arquivos do módulo 1 da formação em ESP32 da LASER: arquitetura, as doze séries da família e uma prática com DHT11 e ESP32-S3.", + "fichas": [["Duração", "3 horas"], ["Formato", "presencial"], ["Placa", "ESP32-S3-DevKitC-1"], ["Prática", "DHT11 + monitor serial"]], + "pratica": { + "titulo": "Prática na bancada", + "texto": "Esquema de ligação do DHT11 ao ESP32-S3, com o arquivo editável do Fritzing para montar ou adaptar.", + "imagem": "pratica.png", + "meta": "Fritzing · capítulo 9 da apostila", + "acoes": [["Ver esquema", "pratica.png", false], ["Baixar .fzz", "pratica.fzz", true]] + }, + "grupos": [ + { "titulo": "Material de aula", "arquivos": [ + { "arquivo": "slide.html", "tipo": "slides", "descricao": "Os slides da formação. Abrem no navegador, em tela cheia, prontos para projetar.", "abrir": true }, + { "arquivo": "apostila.html", "tipo": "apostila", "descricao": "A apostila completa, paginada em A4 no próprio navegador, com glossário e capítulos extras.", "abrir": true } + ]}, + { "titulo": "Para baixar e imprimir", "arquivos": [ + { "arquivo": "LASER-ESP32-Modulo-1-Slides.pdf", "tipo": "pdf", "descricao": "Os slides em PDF 16:9, um slide por página.", "abrir": true, "baixar": true }, + { "arquivo": "LASER-ESP32-Modulo-1-Apostila.pdf", "tipo": "pdf", "descricao": "A apostila em PDF A4, pronta para imprimir.", "abrir": true, "baixar": true } + ]}, + { "titulo": "Prática", "arquivos": [ + { "arquivo": "pratica.fzz", "tipo": "fritzing", "descricao": "Montagem do DHT11 com o ESP32-S3, editável no Fritzing.", "baixar": true }, + { "arquivo": "pratica.png", "tipo": "imagem", "descricao": "O mesmo esquema em imagem, para consultar sem instalar nada.", "abrir": true } + ]}, + { "titulo": "Imagens", "arquivos": [ + { "arquivo": "esp32-s3-blocos.png", "tipo": "imagem", "descricao": "Diagrama de blocos do ESP32-S3, usado no capítulo 2.", "abrir": true } + ]} + ], + "guias": [ + { "titulo": "Montando a prática", "itens": [ + "Ligue o VCC do DHT11 ao 3V3, o DATA ao GPIO12 e o GND ao GND.", + "Coloque o resistor de 10 kΩ entre DATA e 3V3: é o pull-up da linha de dados.", + "Instale a DHT sensor library, da Adafruit, na IDE do Arduino.", + "Na porta USB da placa, ative USB CDC On Boot; na porta UART, desative." + ]}, + { "titulo": "Abrindo o arquivo do Fritzing", "texto": "O pratica.fzz abre no Fritzing, onde dá para trocar o pino, mover os fios e exportar o esquema em imagem ou PDF." } + ] +} diff --git a/public/formacoes/1/index.html b/public/formacoes/1/index.html index e370b7b..4465161 100644 --- a/public/formacoes/1/index.html +++ b/public/formacoes/1/index.html @@ -2,1970 +2,251 @@ -LASER · Formação em ESP32 · Módulo 1: Conhecendo a Família + +LASER · Formação em ESP32 · Módulo 1: Conhecendo a família ESP32 + - - - - + + + + -

Paginando a apostila…

+
+
+ LASER + Liga Acadêmica de Sistemas Embarcados
Centro de Informática · UFPE
+ +
+
- -
-
- - -
- LASER - Liga Acadêmica de Sistemas Embarcados
Centro de Informática · UFPE
-
- -
Formação em ESP32 · Módulo 1
- -

Conhecendo a
família ESP32

- -

- Do silício à bancada: como esses microcontroladores funcionam por dentro, o que cada - uma das doze séries faz e não faz, onde eles superam Arduino e STM32, e como escolher - o chip certo antes de fechar um projeto. -

- -
-
- Lucas Rayan Guerra - Ciência Embarcada · ESPDocs - linkedin.com/in/lucasrguerra -
-
- Material de apoio - Formação presencial · uso livre para fins educacionais +
+
+
+
+
Formação em ESP32 · Módulo 1
+

Conhecendo afamília ESP32

+

Do silício à bancada: como esses microcontroladores funcionam por dentro, o que cada uma das doze séries faz e não faz, e como escolher o chip certo. Termina com um DHT11 lendo temperatura e umidade num ESP32-S3.

+
  • Duração: 3 horas
  • Formato: presencial
  • Placa: ESP32-S3-DevKitC-1
  • Prática: DHT11 + monitor serial
+
+
+ Capa da apostila do módulo 1 + Capa dos slides do módulo 1 +
+
- -
-
-
-

Apresentação

-

Sobre a formação, sobre a liga, e como aproveitar esta apostila.

-
-
- -

- A LASER, Liga Acadêmica de Sistemas Embarcados do Centro de Informática - da UFPE tem como propósito fortalecer a área de sistemas embarcados na universidade, - promovendo estudo, pesquisa e aplicação de tecnologias que envolvem tanto hardware quanto - software. Suas frentes vão de automação e Internet das Coisas a IA na borda, robótica, - sistemas críticos, tecnologias veiculares e engenharia biomédica. -

- -

- Esta apostila acompanha a formação em ESP32 da liga. A escolha da plataforma não é - acidental: o ESP32 atravessa quase todas as frentes da LASER. Ele é o nó de IoT, é a - placa de automação, roda inferência na borda, e é barato o bastante para que cada pessoa - tenha o seu. -

- -

O que você vai levar deste módulo

-
    -
  • Entender o que existe dentro de um ESP32 e por que ele é diferente de um Arduino.
  • -
  • Saber navegar as doze séries da família sem se perder na nomenclatura.
  • -
  • Ter um método objetivo para escolher a série de um projeto novo.
  • -
  • Reconhecer as limitações reais da plataforma antes de esbarrar nelas.
  • -
  • Sair com um sensor real lendo temperatura e umidade na sua bancada.
  • -
- -

Pré-requisitos

-

- Espera-se que você já tenha ligado um LED em algum microcontrolador e saiba o que é uma - porta digital. Programação em C ou C++ em nível básico ajuda, mas o código da prática é - curto e comentado. Não é preciso saber nada de Wi-Fi, RTOS, RISC-V ou - criptografia. Tudo isso aparece explicado no caminho. -

- -

Material para a prática

-

- Uma placa ESP32-S3-DevKitC-1, um sensor DHT11, um - resistor de 10 kΩ, jumpers, protoboard e um cabo USB de dados. A lista - completa e o esquema de ligação estão no capítulo 9. -

- -

Como esta apostila está organizada

-

- Os capítulos 1 a 3 constroem o entendimento do hardware. Os capítulos 4 a 6 apresentam a - família e comparam com alternativas. Os capítulos 7 e 8 são de decisão: como escolher série - e ferramenta. O capítulo 9 é a prática, e o 10 fecha com glossário e caminhos de estudo. -

- -
-

Ao longo do texto você encontra quatro tipos de caixa:

- -
-
Dica
-

Atalho, boa prática ou recomendação que economiza tempo.

-
- -
-
Atenção
-

Ponto que costuma causar problema se passar despercebido.

-
- -
-
Erro comum
-

Armadilha concreta, com o sintoma que ela produz e como escapar.

-
- -
-
Curiosidade
-

Contexto ou detalhe técnico que ajuda a fixar o conceito.

+
+
+

Comece por aqui

+

Três formas de usar este material

+

Para apresentar, para estudar e para pôr a mão no circuito. Os PDFs são a versão final, para quem só quer o material pronto.

+
+
+ +
+

Slides

+

60 slides para projetar direto do navegador, com navegação por teclado e panorama.

+
PDF · 60 págs · 4,6 MB
+
+ Apresentar + PDF +
+
+
+
+ +
+

Apostila

+

O conteúdo completo, com explicações, tabelas e o código comentado, paginado em A4.

+
PDF · 39 págs · 3,2 MB
+
+ Ler + PDF +
+
+
+
+ +
+

Prática na bancada

+

Esquema de ligação do DHT11 ao ESP32-S3, com o arquivo editável do Fritzing para montar ou adaptar.

+
Fritzing · capítulo 9 da apostila
+ +
+
- -
-
-
-

Sumário

-

Dez capítulos, do conceito à bancada.

-
-
- - -
- - -
-
-
1
-
-

O que é o ESP32

-

De onde ele veio e por que virou padrão de fato em projetos conectados.

-
-
- -

- O ESP32 é uma linha de microcontroladores da Espressif Systems, empresa - fundada em 2008 e sediada em Xangai. A história que interessa começa em 2014, com o - ESP8266: um chip barato de Wi-Fi vendido como "módulo serial para internet", que a - comunidade descobriu ser, na verdade, um microcontrolador completo por poucos dólares. -

- -

- Em 2016 veio o ESP32 original, já projetado como plataforma: dois núcleos, Wi-Fi, - Bluetooth e um conjunto grande de periféricos. A partir de 2020 a linha se ramificou, e - hoje são doze séries, cada uma otimizada para um recorte diferente de - custo, consumo, conectividade e desempenho. -

- -

Linha do tempo

- - - - - - - - - - - - - - -
AnoLançamentoO que mudou
2014ESP8266Wi-Fi barato ao alcance de qualquer projeto. Ainda muito usado.
2016ESP32Dois núcleos, Bluetooth e periféricos de verdade. O marco da plataforma.
2019ESP32-S2Foco em segurança e USB nativo; abre mão do Bluetooth.
2020ESP32-C3Primeira série RISC-V. Marca a virada de arquitetura da empresa.
2021ESP32-S3Dois núcleos com instruções vetoriais para IA. Vira o carro-chefe.
2022ESP32-C6, H2Chega o rádio 802.15.4: Zigbee, Thread e Matter entram na família.
2023ESP32-P4Alto desempenho sem rádio, com MIPI para câmera e display.
2024 e 2025C5, C61, H4, S31Wi-Fi 6, dual-band de 5 GHz e a geração seguinte de malha.
Datas de anúncio. A disponibilidade comercial e o suporte nas ferramentas costumam vir meses depois.
- -

O que explica a adoção

- -

- Antes do ESP8266, colocar um projeto na internet significava comprar um microcontrolador - e um módulo de rede, ligá-los por serial ou SPI, e gastar boa parte da memória - disponível com a pilha de comunicação. O ESP32 traz o rádio dentro do mesmo - encapsulamento do processador, com as pilhas de Wi-Fi e Bluetooth prontas, - testadas em campo por centenas de milhões de dispositivos. -

- -

- Some a isso o preço, já que um módulo custa menos que muitos microcontroladores sem rádio, e - uma documentação pública completa, com datasheets, manuais de referência e código-fonte - abertos. Essa combinação é rara no mercado de semicondutores. -

- -

SoC, módulo, placa e série: quatro coisas diferentes

- -

- Muita confusão nasce de usar "ESP32" para quatro coisas distintas. Vale separar desde já, - porque isso muda o que você compra, quanto custa e como projeta: -

- - - - - - - - - - - - - - - - - - - - - - - - - -
TermoO que éExemplo
Chip (SoC)O silício nu, num encapsulamento QFN de poucos milímetros. Precisa de antena, - cristal e memória flash externos para funcionar. É o que a Espressif vende em - bobina para fábricas.ESP32-S3
MóduloO chip montado numa plaquinha com flash, cristal, antena, blindagem e, o - mais importante, homologação de rádio. É o que vai dentro - de um produto comercial.ESP32-S3-WROOM-1
Placa de desenvolvimentoO módulo numa placa com regulador de tensão, conector USB, botões de boot e - reset e pinos em barra. É o que usamos para aprender e prototipar.ESP32-S3-DevKitC-1
SérieA família daquele silício: define a arquitetura do processador, quais rádios - existem e quais periféricos estão presentes.Série S3
- -
-
Homologação pertence ao módulo, não ao chip
-

- Se um dia você levar um projeto a produto, lembre que as certificações de rádio - (Anatel no Brasil, FCC nos Estados Unidos, CE na Europa) são emitidas para o - módulo. Usar um módulo já homologado evita um processo de certificação - caro e demorado. Projetar com o chip nu significa homologar o seu produto do zero. -

-
- -
- Diagrama do ESP32-S3-DevKitC-1 com a pinagem completa, mostrando o módulo ESP32-S3-WROOM soldado no centro da placa. -
- Os três primeiros níveis numa imagem só. O retângulo prateado no centro é o - módulo ESP32-S3-WROOM, com a antena impressa numa ponta e a blindagem - metálica cobrindo o resto; dentro dele, sem aparecer, está o chip. Todo - o resto (regulador de tensão, conversor USB-serial, botões e as barras de pinos) é a - placa de desenvolvimento. Num produto seu, só o módulo iria para a PCB. -
-
- -

O que a Espressif entrega junto com o silício

- -

- Boa parte do valor do ESP32 não está no chip, e sim no software que vem junto. O - ESP-IDF (Espressif IoT Development Framework) é o ambiente oficial: - baseado em FreeRTOS, traz as pilhas de Wi-Fi, Bluetooth, TCP/IP, TLS, atualização remota - de firmware (OTA), sistemas de arquivos, provisionamento e ferramentas de depuração. É - software que levaria anos para uma equipe escrever do zero. -

- -

- Existe também o core Arduino para ESP32, que traduz esse ambiente para as - funções que você já conhece. É a porta de entrada, e é o que usaremos na prática, mas por - baixo continua sendo o ESP-IDF rodando. Entender isso ajuda quando algo não funciona: - muitas respostas estão na documentação do IDF, não na do Arduino. -

-
- - -
-
-
2
-
-

Anatomia: o que existe dentro do chip

-

Os blocos que aparecem em qualquer série, e por que cada um importa.

-
-
- -
- Diagrama de blocos oficial do ESP32-S3: CPU principal, memórias, rádio Wi-Fi e Bluetooth, cadeia de RF, periféricos, domínio RTC e bloco de segurança. -
- Diagrama de blocos do ESP32-S3, publicado pela Espressif. Vale voltar a ele ao longo da - apostila: o Main CPU com os dois núcleos Xtensa e, ao lado, as memórias - internas (ROM, SRAM e o cache que discutimos adiante). O bloco - RF é a parte analógica do rádio, que fala com a antena. Em - RTC mora o coprocessador ULP, que continua acordado com o resto do chip - dormindo. E o bloco Security é exatamente o assunto do capítulo 5: SHA, - AES, RSA, RNG, HMAC, assinatura digital, Secure Boot e criptografia de flash, tudo em - silício. -

- Cada série tem o seu diagrama equivalente, com blocos a mais ou a menos. Imagem da - Espressif Systems, reproduzida para fins didáticos. -
-
- -

Processador: Xtensa ou RISC-V

- -

- As séries mais antigas (ESP32, S2, S3) usam núcleos Xtensa, arquitetura - licenciada da Cadence. As séries novas (C2, C3, C5, C6, C61, H2, H4, P4, S31) migraram - para RISC-V, um conjunto de instruções aberto e livre de royalties. -

- -

- Para quem programa em C, a diferença é quase invisível, porque o compilador cuida disso. Ela - aparece quando você precisa de assembly, de ferramentas de análise de baixo nível, - ou quando uma biblioteca pré-compilada existe só para uma das arquiteturas. A tendência é - clara: todo lançamento recente é RISC-V. -

- -

Um ou dois núcleos, e o que fazer com eles

-

- Séries como ESP32, S3, P4, H4 e S31 têm dois núcleos. No ESP-IDF eles recebem nomes: - PRO_CPU (núcleo 0) e APP_CPU (núcleo 1). Por convenção, as - tarefas do Wi-Fi e do Bluetooth rodam no núcleo 0, deixando o 1 mais livre para o seu - código. É possível fixar uma tarefa em um núcleo específico, recurso valioso quando você - precisa de um laço com temporização mais previsível. -

- -

O coprocessador de baixo consumo

-

- Algumas séries trazem um segundo processador de baixíssimo consumo, o ULP - ou LP core. Ele continua acordado enquanto o processador principal dorme, lendo um sensor - de tempos em tempos e só acordando o resto do chip quando algo interessa. É o que permite - um projeto a bateria durar meses em vez de dias. -

- -

Memória: quatro tipos, quatro papéis

- - - - - - - - - - - - - - - - - - - - - - - - - -
MemóriaPara que serveOrdem de grandeza
SRAMMemória de trabalho: variáveis, pilha, buffers. Rápida e volátil. É o recurso - que acaba primeiro em projetos com Wi-Fi: a pilha de rede sozinha consome - dezenas de kilobytes.272 KB a 768 KB
ROMGravada de fábrica pela Espressif. Contém o bootloader inicial e rotinas - básicas. Você não altera, e é por isso que um ESP32 é praticamente - impossível de "brickar" de forma permanente.128 KB a 576 KB
Flash externaOnde mora o seu programa. Fica fora do núcleo do chip, num segundo - componente ou dentro do mesmo encapsulamento, e conversa por SPI.2 MB a 16 MB típico
PSRAMRAM extra externa, opcional, para quando a SRAM não basta: buffer de câmera, - tela gráfica, áudio, modelo de rede neural.2 MB a 32 MB
- -
-
O detalhe que pega todo mundo
-

- A flash é externa ao núcleo. Isso significa que alguns pinos do chip - já estão ocupados conversando com ela o tempo todo. No ESP32 original, são os GPIO 6 a 11. - Se você usar esses pinos para um LED, o chip trava, porque você está interferindo no - barramento de onde o programa está sendo lido. Todo ESP32 tem um conjunto assim; o - número e a posição mudam conforme a série. -

-
- -
- - - O chip - - - Processador - SRAM e ROM internas - - - Cache + MMU - traz o código para dentro - - - Matriz de roteamento: função quase livre por pino - - - - - - - - - - 6 - - SPI - CS, CLK, D, Q, WP e HD - - - Flash externa - o seu firmware mora aqui - - - PSRAM (opcional) - buffers grandes - -
- O que o diagrama de blocos não deixa evidente: a flash fica fora do - chip. O cache e a MMU escondem isso do seu código, mas os seis pinos desse barramento - ficam ocupados de forma permanente, mesmo com o seu programa rodando. É daí que sai o - primeiro grupo de pinos com restrição, mais adiante neste capítulo. A barra diagonal - com o número é a notação usual de esquemático para um feixe de condutores. -
-
- -
-
Como o código roda se ele está fora do chip?
-

- Existe um bloco chamado MMU com cache entre o processador e a flash. - Ele traz para dentro do chip os pedaços de código que estão sendo executados, mantendo - os mais usados em cache. O efeito é que a flash externa "parece" memória interna, com a ressalva de que um acesso fora do cache custa bem mais caro. Esse é um dos - motivos pelos quais o desempenho de um ESP32 varia mais que o de um microcontrolador - com flash interna. -

-
- -
-

Rádio

- -

- É o bloco que distingue o ESP32 da maioria dos microcontroladores. Dependendo da série - você encontra: -

- - - - - - - - - - -
TecnologiaPara quê
Wi-Fi 4 (802.11 b/g/n)Conexão direta à internet pela rede local. Presente na maioria das séries.
Wi-Fi 6 (802.11ax)Melhor desempenho em redes congestionadas e menor consumo com o recurso Target Wake Time.
Bluetooth LEComunicação com celular, sensores de baixo consumo, provisionamento de rede.
Bluetooth ClássicoÁudio (A2DP) e porta serial sem fio (SPP). Só no ESP32 e no S31.
IEEE 802.15.4Base do Zigbee e do Thread, redes em malha de baixo consumo, e portanto do Matter.
-
- -

- O rádio não é de graça: transmitir custa corrente, com picos que passam de 300 mA, ocupa - memória e consome tempo de processamento. Voltaremos a isso no capítulo 7. -

- -

Periféricos e a matriz de roteamento

- -

- GPIO, UART, SPI, I²C, I²S, PWM, ADC, sensor de temperatura interno, USB, controlador CAN - (que a Espressif chama de TWAI), contador de pulsos, transceptor de infravermelho. O - conjunto varia por série. -

- -

- Uma característica facilita muito a vida: na maioria das séries existe uma - matriz de roteamento (GPIO matrix) que permite mapear quase - qualquer função para quase qualquer pino, por software. Em um microcontrolador tradicional, - a UART2 só existe nos pinos que o fabricante escolheu; aqui, você decide na hora de - programar. Na prática do projeto de placa isso é ouro: você desenha o traçado da forma mais - limpa e depois adapta o firmware. -

- -
-
A matriz tem limite
-

- Sinais de alta velocidade (o SPI da flash, o USB, o cristal, algumas linhas de I²S e - LCD) não passam pela matriz: eles usam IO_MUX, um caminho direto e mais - rápido, disponível apenas em pinos específicos. Se você rotear um SPI rápido por um - pino qualquer, ele funciona, mas a frequência máxima cai. -

-
- -

Pinos com restrição, e o estrago que eles causam

- -

- Aqui está a diferença mais concreta entre ler o datasheet e não ler. Num Arduino UNO, - os vinte pinos são praticamente equivalentes. Num ESP32, uma parte deles já tem dono, e - usar o pino errado não produz um erro de compilação: produz uma placa que não liga, um - firmware que trava, ou pior, um protótipo que funciona na bancada e falha em campo. -

- -

- São cinco grupos, e cada um quebra o projeto de um jeito diferente. -

- -
- Diagrama de pinagem do ESP32-DevKitC, com legenda indicando pinos de flash, strapping, somente entrada e depuração. -
- A pinagem do ESP32 clássico já traz as restrições marcadas, se você souber o que - procurar. As barras vermelhas à esquerda dos GPIO 6 a 11 significam - "compartilhado com a memória flash, não pode ser usado como GPIO comum". As etiquetas - rosa STRAP marcam os pinos de boot. As setas simples (em vez de duplas) - nos GPIO 34 a 39 indicam somente entrada. E as etiquetas - DEBUG em azul são as linhas de JTAG. -
-
- -

1. Ligados à memória flash ou PSRAM

-

- Estes pinos conversam com a memória de onde o firmware está sendo lido, o tempo todo, - enquanto o chip funciona. Escrever neles interrompe essa conversa no meio. -

-

- Como falha: o chip reinicia em laço, ou trava no boot com uma mensagem de - erro de leitura da flash. Não é intermitente e não tem contorno em software. -

-

- Como evitar: no ESP32-S3 são os GPIO 26 a 32; no ESP32 clássico, os GPIO - 6 a 11 (mais o 16 e o 17 em módulos WROVER, que têm PSRAM). Boa notícia: em muitos módulos - esses pinos nem chegam à barra de pinos, justamente para você não ter como errar. -

- -

2. Strapping (seleção do modo de boot)

-

- O chip lê o nível destes pinos no instante do reset para decidir como inicializar. Depois - do boot eles voltam a ser GPIO normais, e é aí que mora a armadilha: o pino funciona - perfeitamente enquanto a placa está ligada, mas o que você pendurou nele atrapalha o - próximo reset. -

-

- Como falha: a placa para de iniciar quando o circuito externo puxa o pino - para o nível errado. Um exemplo comum: você liga um LED com resistor no GPIO0 do ESP32. - O LED funciona. Na próxima energização, o resistor mantém o pino em nível baixo, o chip - entende que deve entrar em modo de gravação e fica esperando um firmware que nunca chega. - A placa parece morta. -

-

- Como evitar: reserve os pinos de strapping para saídas que ficam em alta - impedância no boot, ou use-os para entradas com o resistor de pull no sentido que o chip - espera. Se puder, simplesmente não use. -

- -

3. Somente entrada

-

- Alguns pinos são fisicamente incapazes de acionar uma saída, e não têm resistores de - pull-up nem pull-down internos. -

-

- Como falha: silenciosamente. O pinMode(pino, OUTPUT) não - reclama, o digitalWrite não reclama, e o pino simplesmente não muda de nível. - Você passa a tarde procurando o problema no código. -

-

- Como evitar: no ESP32 clássico são os GPIO 34, 35, 36, 37, 38 e 39. Use-os - para leitura, e lembre de colocar o resistor de pull no circuito, já que não existe um - interno para ativar. As séries RISC-V mais novas não têm pinos assim. -

- -

4. Gravação e depuração

-

- São a UART0 (por onde o firmware é gravado e as mensagens de Serial saem) e - as quatro linhas de JTAG. -

-

- Como falha: você não perde o projeto, perde a capacidade de trabalhar - nele. Se um sensor ocupa os pinos da UART0, cada gravação exige desconectar o sensor. Se - algo escreve nesses pinos durante a execução, o monitor serial enche de lixo. -

-

- Como evitar: deixe a UART0 livre até o projeto estar fechado. Se precisar - de mais uma serial, use a UART1 ou a UART2, que a matriz de roteamento leva para quase - qualquer pino. -

- -

5. USB nativo

-

- Nas séries com USB no próprio chip, dois pinos saem de fábrica ligados ao periférico - USB Serial/JTAG. -

-

- Como falha: ao usá-los como GPIO comum, a porta USB de gravação some do - computador. Recuperar exige o modo de gravação manual pelos botões BOOT e RESET. -

-

- Como evitar: no ESP32-S3 são o GPIO19 e o GPIO20. Trate-os como - indisponíveis, a não ser que você tenha certeza de que não vai precisar do USB nativo. -

- -
-

Os pinos com restrição do ESP32-S3

- -

- Como a prática do capítulo 9 usa um ESP32-S3, vale ter esta lista à mão. Dos 45 GPIOs - da série, 18 têm alguma condição: -

- - - - - - - - - - - -
GrupoPinos
Flash e PSRAMGPIO26, 27, 28, 29, 30, 31 e 32
StrappingGPIO0, GPIO45 e GPIO46
Gravação e JTAGGPIO39, 40, 41, 42 (JTAG) e GPIO43, 44 (UART0)
USB nativoGPIO19 e GPIO20
Somente entradaNenhum nesta série
Sobram 27 pinos totalmente livres, incluindo o GPIO12 que usaremos na prática.
-
- -
-
O erro que mais custa caro
-

- Fechar o esquemático de uma placa própria distribuindo os sinais pelos pinos "que - sobraram no traçado", sem conferir a lista. O protótipo chega da fábrica, a placa não - liga, e a correção passa por cortar trilha ou mandar refazer o lote. -

-

- Cinco minutos de conferência antes do envio valem semanas de prazo. E como a matriz de - roteamento deixa quase toda função ir para quase todo pino, quase sempre dá para - reorganizar o traçado sem perder nada. -

-
- -
-
Onde consultar
-

- A página de cada série no ESPDocs traz uma seção de pinos com - restrição, com os grupos acima listados pino a pino para aquela série específica, mais - o diagrama de conexões completo com todas as funções de cada pino. - Em espdocs.cienciaembarcada.com.br. -

+
+
- -
-
-
3
-
-

Como o chip acorda: boot e execução

-

Entender esta sequência economiza horas de depuração.

+
+
+

Todos os arquivos

+

O que tem nesta formação

+

Tudo o que foi usado na aula, com o que é cada arquivo e para que serve.

+ +
+

Material de aula

+
    +
  • +
    +
    +
    slide.html
    +
    Os slides da formação. Abrem no navegador, em tela cheia, prontos para projetar.
    + +
    +
    107 KB
    + +
  • +
  • +
    +
    +
    apostila.html
    +
    A apostila completa, paginada em A4 no próprio navegador, com glossário e capítulos extras.
    + +
    +
    96 KB
    + +
  • +
-
- - - -
- - - 1. Energização - CHIP_EN em nível alto - - - 2. Bootloader da ROM - lê os pinos de strapping - - - 3. Segundo estágio - partições, assinatura, - descriptografia - - - 4. Sua aplicação - app_main() ou - setup() + loop() - - - - - - - - - - Modo de gravação - espera firmware pela serial - strapping - em nível de boot - - É este desvio que os botões BOOT e RESET forçam na mão - - -
- Quando a gravação falha com timeout, é a etapa 2 que não chegou ao desvio. - Segurar BOOT e pressionar RESET força o caminho pontilhado. -
-
- -

A sequência de partida

- -
-
1
-
-

Energização e reset

-

- Ao receber energia, o chip mantém o processador parado até as tensões estabilizarem. - O pino de habilitação (CHIP_EN ou CHIP_PU) precisa estar - em nível alto, e é por isso que ele nunca pode ficar flutuando. -

+
+

Para baixar e imprimir

+
    +
  • +
    +
    +
    LASER-ESP32-Modulo-1-Slides.pdf
    +
    Os slides em PDF 16:9, um slide por página.
    + +
    +
    60 págs · 4,6 MB
    + +
  • +
  • +
    +
    +
    LASER-ESP32-Modulo-1-Apostila.pdf
    +
    A apostila em PDF A4, pronta para imprimir.
    + +
    +
    39 págs · 3,2 MB
    + +
  • +
-
- -
-
2
-
-

Bootloader da ROM

-

- O processador começa a executar código gravado de fábrica na ROM. Esse código lê o - nível dos pinos de strapping para decidir o que fazer: iniciar - normalmente a partir da flash, ou entrar em modo de gravação e - esperar um firmware chegar pela serial. -

+
+

Prática

+
    +
  • +
    +
    +
    pratica.fzz
    +
    Montagem do DHT11 com o ESP32-S3, editável no Fritzing.
    + +
    +
    41 KB
    + +
  • +
  • +
    +
    +
    pratica.png
    +
    O mesmo esquema em imagem, para consultar sem instalar nada.
    + +
    +
    76 KB
    + +
  • +
-
- -
-
3
-
-

Bootloader de segundo estágio

-

- Se o boot for normal, a ROM carrega da flash um segundo bootloader, este sim - gravado por você junto com o firmware. Ele lê a tabela de partições, escolhe qual - imagem executar (importante para OTA, onde há duas), verifica assinatura se o - Secure Boot estiver ativo, e descriptografa se a flash estiver cifrada. -

+
+

Imagens

+
    +
  • +
    +
    +
    esp32-s3-blocos.png
    +
    Diagrama de blocos do ESP32-S3, usado no capítulo 2.
    + +
    +
    274 KB
    + +
  • +
- -
-
4
-
-

Sua aplicação

-

- Só então o seu programa começa. No ESP-IDF, o ponto de entrada é - app_main(). No Arduino, o core cria uma tarefa que chama - setup() e depois loop() repetidamente. Ou seja: o - loop() que você conhece é, por baixo, uma tarefa do FreeRTOS. -

-
-
- -
-
Os botões BOOT e RESET
-

- É por causa do passo 2 que as placas têm esses dois botões. Segurar BOOT - enquanto pressiona e solta RESET força o modo de gravação. A maioria - das placas modernas faz isso automaticamente pelo conversor USB, mas quando a gravação - falha com timeout, esse é o truque manual que resolve. -

-
- -

FreeRTOS: seu código não está sozinho

- -

- Diferente de um Arduino UNO, onde o seu loop() é literalmente a única coisa - executando, no ESP32 há um sistema operacional de tempo real gerenciando - várias tarefas ao mesmo tempo: a sua, as do Wi-Fi, as do Bluetooth, o temporizador de - sistema, o coletor de estatísticas. -

- -

- O escalonador distribui o processador entre elas por prioridade. Isso traz dois efeitos - práticos que surpreendem quem vem do Arduino: -

- -

- Primeiro: um delay() no ESP32 não trava o chip: ele cede o - processador para outras tarefas. É por isso que o Wi-Fi continua funcionando enquanto o seu - código "espera". -

- -

- Segundo: um laço que nunca cede o processador causa problema. Se você - escrever um while(true) sem delay() nem espera, o - watchdog vai reiniciar o chip, reclamando que a tarefa não alimentou o cão de - guarda. Não é bug: é o sistema protegendo as tarefas do rádio. -

- -
-
"Task watchdog got triggered"
-

- Esta mensagem no monitor serial quase sempre significa laço apertado sem ceder tempo. - A correção costuma ser um delay(1) ou um vTaskDelay() dentro - do laço. Parece contraintuitivo colocar espera para o programa funcionar, mas em um - sistema com RTOS é exatamente o que se faz. -

-
- -

Partições: a flash não é um bloco só

- -

- A memória flash é dividida segundo uma tabela de partições. Um layout - típico tem: o bootloader, a tabela em si, uma área nvs para guardar - configurações (como a senha do Wi-Fi), uma ou duas partições de aplicação e, às vezes, um - sistema de arquivos. -

- -

- Duas partições de aplicação existem para permitir OTA: o firmware novo é - gravado na partição inativa, e só depois de validado o chip passa a iniciar por ela. Se a - imagem nova falhar, ele volta sozinho para a anterior. É por isso que um projeto com - atualização remota precisa de mais que o dobro do espaço do firmware. -

-
- - -
-
-
4
-
-

A família completa: as 12 séries

-

Cada uma nasceu para resolver um problema diferente.

-
-
- -

- A nomenclatura ajuda mais do que parece. A letra indica a vocação da série: - S de sensing, desempenho e USB; C de custo - reduzido em RISC-V; H de malha 802.15.4 sem Wi-Fi; P de - processamento bruto sem rádio. -

- -
- -
-
ESP32
-
O clássico
-

O original de 2016. Dois núcleos, Bluetooth Clássico (raro na família), Ethernet e - dois DACs. Ainda é o mais barato e o de maior base instalada.

-
Núcleo
Xtensa LX6 ×2, 240 MHz
-
SRAM
520 KB
GPIO
34
-
- -
-
ESP32-S2
-
USB e segurança
-

Um núcleo e sem Bluetooth, mas trouxe USB OTG nativo e muitos GPIOs. Bom quando o - projeto precisa se comportar como dispositivo USB.

-
Núcleo
Xtensa LX7, 240 MHz
-
SRAM
320 KB
GPIO
43
-
- -
-
ESP32-S3
-
O cavalo de batalha
-

Dois núcleos, BLE 5, USB nativo, muita RAM e instruções vetoriais para IA. A série - mais usada em projetos novos, e a da nossa prática.

-
Núcleo
Xtensa LX7 ×2, 240 MHz
-
SRAM
512 KB
GPIO
45
-
- -
-
ESP32-C2
-
O mínimo viável
-

Também vendido como ESP8684. Feito para custo: poucos pinos, sem I²S e sem - acelerador AES. Para dispositivos simples em altíssimo volume.

-
Núcleo
RISC-V, 120 MHz
-
SRAM
272 KB
GPIO
14
-
- -
-
ESP32-C3
-
O substituto do clássico
-

O primeiro RISC-V da casa. Wi-Fi, BLE 5 e USB para depuração num chip barato. - Escolha natural para trocar um ESP8266 antigo.

-
Núcleo
RISC-V, 160 MHz
-
SRAM
400 KB
GPIO
22
-
- -
-
ESP32-C6
-
Matter e malha
-

Wi-Fi 6, BLE 6 e 802.15.4 no mesmo chip: fala Zigbee, Thread e Matter. A porta de - entrada para automação residencial moderna.

-
Núcleo
RISC-V + LP, 160 MHz
-
SRAM
512 KB
GPIO
30
-
- -
-
ESP32-C5
-
Wi-Fi de duas faixas
-

O primeiro da família com Wi-Fi 6 em 2,4 GHz e 5 GHz. Útil onde a faixa de - 2,4 GHz está congestionada.

-
Núcleo
RISC-V + LP, 240 MHz
-
SRAM
384 KB
GPIO
29
-
- -
-
ESP32-C61
-
Wi-Fi 6 econômico
-

Wi-Fi 6 com foco em custo, com flash e PSRAM já no encapsulamento. Sem 802.15.4 e - sem acelerador AES.

-
Núcleo
RISC-V, 160 MHz
-
SRAM
320 KB
GPIO
30
-
- -
-
ESP32-H2
-
Malha a bateria
-

Sem Wi-Fi de propósito: só BLE 6 e 802.15.4. Sem o rádio mais faminto, o consumo - despenca. Ideal para sensor Zigbee/Thread alimentado por pilha.

-
Núcleo
RISC-V, 96 MHz
-
SRAM
320 KB
GPIO
19
-
- -
-
ESP32-H4
-
Malha, segunda geração
-

Sucessor do H2, com dois núcleos e BLE 5.4 com LE Audio. Ainda em documentação - preliminar, sem datasheet publicado e sem suporte estável.

-
Núcleo
RISC-V ×2, 96 MHz
-
SRAM
384 KB
GPIO
40
-
- -
-
ESP32-P4
-
Força bruta, sem rádio
-

400 MHz, dois núcleos, MIPI para câmera e display, Ethernet. Não tem Wi-Fi nem - Bluetooth: é para interface gráfica e processamento pesado.

-
Núcleo
RISC-V ×2 + LP, 400 MHz
-
SRAM
768 KB
GPIO
55
-
- -
-
ESP32-S31
-
O topo de linha
-

320 MHz, Wi-Fi 6, Bluetooth Clássico, 802.15.4, CAN FD e aceleração de IA. Ainda - sem versão estável do ESP-IDF nem suporte no Arduino.

-
Núcleo
RISC-V ×2 + LP, 320 MHz
-
SRAM
512 KB
GPIO
60
-
- -
- -

Tabelas comparativas

- -

Processamento e memória

- - - - - - - - - - - - - - - - - -
SérieNúcleoClockSRAMGPIOESP-IDF mínimo
ESP32Xtensa LX6 ×2240 MHz520 KB34v3.x
ESP32-S2Xtensa LX7 ×1240 MHz320 KB43v4.2
ESP32-S3Xtensa LX7 ×2240 MHz512 KB45v4.4
ESP32-S31RISC-V ×2320 MHz512 KB60master
ESP32-C2RISC-V ×1120 MHz272 KB14v5.0
ESP32-C3RISC-V ×1160 MHz400 KB22v4.3
ESP32-C5RISC-V ×1240 MHz384 KB29v5.5.2
ESP32-C6RISC-V ×1160 MHz512 KB30v5.1
ESP32-C61RISC-V ×1160 MHz320 KB30v5.5.2
ESP32-P4RISC-V ×2400 MHz768 KB55v5.3
ESP32-H2RISC-V ×196 MHz320 KB19v5.1
ESP32-H4RISC-V ×296 MHz384 KB40master
"master" indica série que ainda não entrou em versão estável do ESP-IDF.
- -

Rádios

- - - - - - - - - - - - - - - - -
SérieWi-FiBluetooth802.15.4Matter
ESP32Wi-Fi 4BLE + ClássicoNãoNão
ESP32-S2Wi-Fi 4NãoNãoNão
ESP32-S3Wi-Fi 4BLE 5.4NãoNão
ESP32-S31Wi-Fi 6BLE + ClássicoSimSim
ESP32-C2Wi-Fi 4BLE 5.3NãoNão
ESP32-C3Wi-Fi 4BLE 5.4NãoNão
ESP32-C5Wi-Fi 6 · 2,4 e 5 GHzBLE 6.0SimSim
ESP32-C6Wi-Fi 6BLE 6.0SimSim
ESP32-C61Wi-Fi 6BLE 6.0NãoVia Wi-Fi
ESP32-P4NãoNãoNãoNão
ESP32-H2NãoBLE 6.0SimSim
ESP32-H4NãoBLE 5.4SimSim
- -

Ferramentas e encapsulamento

- - - - - - - - - - - - - - - - - -
SérieCore ArduinoDepuraçãoEncapsulamento
ESP32147 placasSonda externaQFN48 (6×6 e 5×5 mm)
ESP32-S226 placasSonda externaQFN56 (7×7 mm)
ESP32-S3158 placasUSB integradoQFN56 (7×7 mm)
ESP32-S31NãoUSB integradoQFN80 (8×8 mm)
ESP32-C21 placaSonda externaQFN24 (4×4 mm)
ESP32-C329 placasUSB integradoQFN32 (5×5) e QFN28 (4×4 mm)
ESP32-C510 placasUSB integradoQFN48 (6×6 mm)
ESP32-C621 placasUSB integradoQFN40 e QFN32 (5×5 mm)
ESP32-C611 placaUSB integradoQFN40 (5×5 mm)
ESP32-P47 placasUSB integradoQFN104 (10×10 mm)
ESP32-H23 placasUSB integradoQFN32 (4×4 mm)
ESP32-H4NãoUSB integradoNão divulgado
Número de definições de placa no core oficial arduino-esp32, um bom termômetro da maturidade do ecossistema.
- -
-
Lançado não é o mesmo que utilizável
-

- Um chip anunciado pode levar meses até ter suporte estável nas ferramentas. O - S31 e o H4 hoje só existem no branch de - desenvolvimento do ESP-IDF e não têm suporte no core Arduino. Antes de escolher uma - série recente para um projeto com prazo, verifique em qual versão do ESP-IDF ela entrou - e se ela já tem módulo à venda. -

-
- -
-
-
5
-
-

Segurança em hardware

-

O que existe no silício, para que serve, e por que isso separa as séries.

+
+
+

Como usar

+

Passo a passo

+
+
+

Apresentando os slides

+

Abra slide.html no navegador. O palco é 16:9 e se ajusta a qualquer tela ou projetor.

+
+
→←
avançar e voltar (ou clique nas metades da tela)
+
F
tela cheia
+
O
panorama com todos os slides
+
B
tela preta, para pausar a projeção
+
+
+
+

Lendo e imprimindo a apostila

+

A versão online se pagina em A4 sozinha ao abrir, o que leva alguns segundos.

+

Para papel, prefira o PDF pronto: ele já sai com margens, cores e quebras de página certas, sem configurar a impressora.

+
+
+

Montando a prática

+
  1. Ligue o VCC do DHT11 ao 3V3, o DATA ao GPIO12 e o GND ao GND.
  2. Coloque o resistor de 10 kΩ entre DATA e 3V3: é o pull-up da linha de dados.
  3. Instale a DHT sensor library, da Adafruit, na IDE do Arduino.
  4. Na porta USB da placa, ative USB CDC On Boot; na porta UART, desative.
+ +
+
+

Abrindo o arquivo do Fritzing

+ +

O pratica.fzz abre no Fritzing, onde dá para trocar o pino, mover os fios e exportar o esquema em imagem ou PDF.

+
-
- -

- Segurança costuma ser tratada como assunto de software, mas boa parte dela depende de - blocos de hardware. Executar criptografia em hardware é dezenas de vezes mais rápido e - mais econômico que na CPU. E alguns recursos, como esconder uma chave privada do próprio - firmware, são impossíveis sem apoio do silício. -

- -

- Este é também o assunto em que as séries mais divergem, o que faz dele um bom critério de - escolha. -

- -

Os blocos e o que cada um resolve

- - - - - - - - - - - - - - - - - -
BlocoPara que serve
AESCifra simétrica: é o que protege o tráfego depois que uma conexão TLS é estabelecida.
SHAFunções de resumo (hash). Base de assinaturas, verificação de integridade e HMAC.
RSA / MPIAritmética de números grandes, usada em chave pública clássica. É o que acelera o handshake TLS.
ECCCriptografia de curvas elípticas: mesma segurança do RSA com chaves muito menores, o que importa bastante em microcontrolador.
ECDSAAssinatura digital sobre curvas elípticas. É o que o Matter exige para o atestado de dispositivo.
HMACAutenticação de mensagem com chave secreta.
Digital SignatureAssina usando uma chave RSA guardada em eFuse, sem que o firmware chegue a vê-la.
Key ManagerProvisiona e usa chaves sem que elas fiquem legíveis para o firmware, nem se alguém extrair a imagem.
RNGGerador de números verdadeiramente aleatórios. Sem ele, toda a criptografia fica previsível.
Criptografia de flashCifra o conteúdo da flash, impedindo que alguém leia o firmware soldando um gravador na memória.
Secure BootO chip se recusa a executar firmware que não esteja assinado pela sua chave.
Proteção DPADefesa contra ataque que deduz a chave medindo variações no consumo de energia durante a operação.
- -

O que cada série tem

- - - - - - - - - - - - - - - - - - -
SérieAESECCECDSAKey ManagerSecure Boot
ESP32128/192/256NãoNãoNãoV1 (legado)
ESP32-S2128/192/256 + GCMNãoNãoNãoV2 · RSA-3072
ESP32-S3128/256NãoNãoNãoV2 · RSA-3072
ESP32-S31128/256 + GCMP-192/256/384SimSimV2 · RSA-3072
ESP32-C2NãoP-192/256NãoNãoV2 · ECDSA
ESP32-C3128/256NãoNãoNãoV2 · RSA-3072
ESP32-C5128/256P-192/256/384SimSimV2 · RSA/ECDSA
ESP32-C6128/256P-192/256NãoNãoV2 · RSA/ECDSA
ESP32-C61NãoP-192/256SimNãoV2 · ECDSA
ESP32-P4128/256 + GCMP-192/256/384SimSimV2 · RSA/ECDSA
ESP32-H2128/256P-192/256SimNãoV2 · RSA/ECDSA
ESP32-H4128/256P-192/256/384SimNãoPendente
Dados extraídos das definições de hardware (soc_caps.h) do ESP-IDF.
- -

Três leituras que essa tabela permite

- -

- Nem toda série tem acelerador AES. O C2 e o C61 não têm. Eles conseguem - fazer TLS, mas a cifra do tráfego roda na CPU, o que pesa se o dispositivo transmitir - muito dado. -

- -

- ECC é um divisor claro. As séries mais antigas (ESP32, S2, S3 e C3) não - têm curvas elípticas em hardware. Como o mundo caminha para ECC (chaves menores, menos - memória), essa é uma diferença que tende a pesar mais com o tempo. -

- -

- Key Manager é raro. Só S31, C5 e P4. Se o seu produto precisa que a chave - privada seja inacessível mesmo para quem tem o firmware em mãos, a lista de candidatos é - bem curta. -

- -
-
eFuse: memória que só grava uma vez
-

- Os segredos ficam em eFuses, bits que podem ser queimados uma única - vez e nunca mais voltam. É assim que se grava a chave do Secure Boot e da criptografia - de flash, e é por isso que essas operações são irreversíveis: uma vez ativado o Secure - Boot, aquela placa só executa firmware assinado por você. Para sempre. Em bancada, é - uma ótima forma de inutilizar uma placa por engano. Ative apenas quando souber - exatamente o que está fazendo. -

+
- -
-
-
6
-
-

ESP32, ESP8266, Arduino e STM32

-

Quatro mundos diferentes, e por que "qual é o melhor" não tem resposta.

-
+
+
+ LASER · Liga Acadêmica de Sistemas Embarcados · CIn · UFPE + Material de Lucas Rayan Guerra · uso livre para fins educacionais · contato@lucasrguerra.dev.br
- -

- Comparar plataformas exige cuidado: "Arduino" é uma marca de placas e um ambiente de - programação, e "STM32" é uma família enorme da STMicroelectronics que vai de chips de - centavos a processadores de 480 MHz. Para a comparação fazer sentido, usaremos - representantes concretos. -

- - - - - - - - - - - - - - - - - - -
Arduino UNO R3ESP8266ESP32-S3STM32F103
NúcleoAVR 8 bitsXtensa L106Xtensa LX7 ×2Cortex-M3
Clock16 MHz80 a 160 MHz240 MHz72 MHz
SRAM2 KB~50 KB úteis512 KB20 KB
Flash32 KBExterna, 1 a 4 MBExterna, 4 a 16 MB64 a 128 KB
Wi-FiNãoSimSimNão
BluetoothNãoNãoBLE 5Não
Tensão de E/S5 V3,3 V3,3 V3,3 V (alguns 5 V)
ADC10 bits, linear1 canal, 10 bits12 bits, calibrar12 bits, bom
GPIO úteis20~94537
Dormindo~35 µA~20 µA~7 µA~2 µA
Valores típicos para ordem de grandeza. Confira sempre o datasheet da peça exata.
- -

Onde cada um ganha

- -

Arduino UNO

-

- Ganha em simplicidade e previsibilidade. Sem sistema operacional, sem - pilha de rede: o que você escreve é exatamente o que executa, na ordem que escreveu. - Trabalha em 5 V, o que dispensa conversão de nível com muitos sensores e módulos antigos. - É insuperável como primeiro contato e para ensinar eletrônica. Perde feio em memória, porque 2 KB - de SRAM acabam rápido, e não tem qualquer conectividade. -

- -

ESP8266

-

- Ganha em preço puro. Ainda é o jeito mais barato de colocar algo simples - no Wi-Fi, e tem uma base gigante de tutoriais. Perde em quase todo o resto: poucos GPIOs - utilizáveis, um único canal de ADC, sem Bluetooth, e uma arquitetura que a Espressif já não - desenvolve. Para projeto novo, o C3 costuma custar quase o mesmo e é melhor em tudo. -

- -

ESP32

-

- Ganha em conectividade e relação recurso/preço. Você recebe centenas de - kilobytes de RAM, dois núcleos, Wi-Fi, Bluetooth e criptografia por hardware pelo preço de - um microcontrolador simples. Para qualquer coisa que precise falar com a rede, é difícil - justificar outra escolha. Perde em determinismo de tempo real rígido e na qualidade do - conversor analógico. -

- -

STM32

-

- Ganha em controle fino e diversidade. A família cobre desde encapsulamentos - de 8 pinos até chips com centenas, com variantes especializadas em consumo ultrabaixo - (série L), desempenho (H7) ou segurança. Os periféricos de temporização são muito superiores - para controle de motor e conversão de potência, e o ecossistema é padrão industrial, com - ferramentas de certificação e suporte de longo prazo. Perde na curva de aprendizado, já que a HAL - da ST é bem mais verbosa, e não tem rádio integrado, salvo nas séries WB e WL. -

- -
-
Regra prática para decidir
-

- Precisa falar com a internet ou com um celular? ESP32, quase sempre.
- É controle de tempo real crítico, como motor, inversor ou malha rápida? STM32.
- É para ensinar eletrônica ou um protótipo simples em 5 V? Arduino.
- É produto comercial com certificação e vida longa? Avalie STM32 e ESP32 - juntos, olhando módulos homologados e compromisso de fornecimento. -

-
- -
-
"Programar em Arduino" não é o mesmo que "usar um Arduino"
-

- O ambiente Arduino é só uma camada de software. Você pode programar um ESP32 ou um - STM32 usando a IDE do Arduino, e é exatamente o que faremos no capítulo 9. Placa e - linguagem são escolhas independentes. -

-
-
- - -
-
-
7
-
-

Pontos fortes e limitações reais

-

O que ninguém conta no vídeo de unboxing.

-
-
- -

Onde o ESP32 é muito bom

- -

- Conectividade sem dor. Subir um cliente MQTT com TLS, um servidor HTTP ou - uma conexão BLE são tarefas de dezenas de linhas, com pilhas maduras. -

-

- Recursos por real gasto. Nenhuma outra plataforma entrega tanta memória, - clock e rádio nessa faixa de preço. -

-

- Segurança de verdade. Boot seguro, criptografia de flash e aceleradores - criptográficos estão presentes até nas séries baratas, recursos que em outras famílias - aparecem só nas linhas premium. -

-

- Flexibilidade de pinos. A matriz de roteamento simplifica muito o traçado - da placa: você adapta o firmware ao layout, não o contrário. -

-

- Atualização remota. OTA com partição dupla e reversão automática vem - pronto no framework. -

-

- Documentação aberta. Datasheets, manuais de referência, erratas e o - código-fonte do framework são públicos e versionados. -

- -

Onde ele decepciona

- -

O conversor analógico é fraco

-

- É a queixa mais comum e mais justa. O ADC do ESP32 tem não-linearidade perceptível, ruído - e variação entre unidades; precisa de calibração para medidas sérias. Pior: em várias - séries, o bloco ADC2 fica indisponível enquanto o Wi-Fi está ligado, - porque ambos compartilham recursos internos. Se o seu projeto depende de medida analógica - precisa, use um ADC externo por I²C ou SPI. -

- -

O rádio consome muito

-

- Picos de transmissão passam de 300 mA. Um regulador subdimensionado ou uma bateria com - resistência interna alta provoca reinicializações aparentemente aleatórias, que parecem - bug de software e não são. -

- -

Tempo real é aproximado

-

- O firmware roda sobre FreeRTOS, e o rádio tem tarefas de alta prioridade que precisam ser - atendidas. Isso introduz variação de alguns microssegundos a milissegundos no seu laço. - Existem soluções, como fixar tarefa em um núcleo, usar o periférico RMT ou delegar a - hardware dedicado, mas todas exigem planejamento. -

- -

Só 3,3 V

-

- Os pinos não toleram 5 V. Sensor ou display antigo em 5 V exige conversor de nível; ligar - direto degrada ou destrói a entrada. -

- -

Documentação viva demais

-

- A família cresce rápido, e com ela erratas, diferenças entre revisões de silício e - funcionalidades que mudam de comportamento entre versões do IDF. Ler a errata do seu chip - antes de fechar o projeto é hábito recomendado. -

- -

Consumo em repouso não é mágico

-

- Os 7 µA de deep sleep que aparecem no datasheet valem para o chip nu, em - condições ideais. Numa placa de desenvolvimento, o regulador, o LED de energia e o - conversor USB-serial costumam consumir muito mais que o próprio ESP32. Medir consumo em - DevKit leva a conclusões erradas. -

- -
-
Erro clássico de bancada
-

- Alimentar a placa pela USB do notebook e ligar nela um motor, uma fita de LED ou um - display grande. Na hora em que o Wi-Fi transmite, a corrente ultrapassa o que a porta - fornece, a tensão cai e o chip reinicia. O sintoma parece software travando; a causa é - alimentação. Use fonte externa adequada para as cargas. -

-
-
- - -
-
-
8
-
-

Como escolher a série do seu projeto

-

Um método em cinco perguntas, na ordem que elimina mais opções primeiro.

-
-
- -

- A escolha fica muito mais simples quando feita na ordem certa. Comece pelo que é impossível - contornar depois, que é o rádio, e só no fim olhe para o que é ajustável. -

- -

Pergunta 1: Como ele se comunica?

-

- Esta pergunta sozinha elimina a maior parte da família, porque rádio não se acrescenta - depois. -

- - - - - - - - - - - -
NecessidadeSéries que atendem
Wi-Fi + Bluetooth LEESP32, S3, C3, C6, C5, C61, S31
Bluetooth Clássico (áudio, SPP)ESP32, S31
Zigbee / Thread / Matter em malhaC6, C5, H2, H4, S31
Wi-Fi 5 GHzC5
Ethernet cabeadaESP32, P4
Sem rádio, só processamentoP4
- -

Pergunta 2: De onde vem a energia?

-

- Se o projeto vive de bateria ou painel solar, o consumo em repouso passa a mandar em tudo. - Séries com processador de baixo consumo (C5, C6, P4, S31) mantêm uma tarefa simples rodando - com o resto do chip dormindo. E se você não precisa de Wi-Fi, o H2 e o H4 economizam - justamente por não carregarem o rádio mais faminto. -

- -

Pergunta 3: O que vai ligado nele?

-

- Conte os pinos de que precisa e verifique as interfaces especiais. Display gráfico grande - ou câmera pedem S3 ou P4 (que tem MIPI). Muitos atuadores pedem uma série com bastante - GPIO, lembrando de descontar os pinos com restrição. USB nativo, para o dispositivo se - apresentar como teclado ou pendrive, existe do S2 em diante e nas séries C recentes. -

- -

Pergunta 4: Que exigência de segurança existe?

-

- Para um protótipo, qualquer série serve. Para produto, o requisito define o chip: atestado - de dispositivo Matter pede ECDSA em hardware; chave privada que o firmware nunca pode ler - pede Key Manager. Consulte a tabela do capítulo 5. -

- -

Pergunta 5: Quando precisa estar pronto?

-

- Esta é a pergunta esquecida. Uma série recém-anunciada pode não ter suporte estável no - ESP-IDF, não ter core Arduino, não ter módulo à venda e não ter placa de desenvolvimento - acessível. Para trabalho com prazo, prefira séries com pelo menos um ano de estrada. -

- -

Atalhos por perfil de projeto

- - - - - - - - - - - - - -
Se o seu projeto é…Comece porPor quê
Primeiro projeto, aprendendoESP32-S3Muita RAM, USB nativo para depurar e o maior ecossistema de exemplos
Sensor Wi-Fi simples e baratoESP32-C3Faz o essencial pelo menor preço, com boa maturidade
Automação residencial / MatterESP32-C6Único caminho maduro com Wi-Fi 6 e 802.15.4 juntos
Sensor a pilha, sem Wi-FiESP32-H2Sem o rádio mais custoso, a autonomia muda de patamar
Tela, câmera ou interface gráficaESP32-P4 ou S3MIPI e RAM suficiente para buffer de vídeo
Áudio por Bluetooth ClássicoESP32Praticamente a única série com BR/EDR
Visão computacional na bordaESP32-S3Instruções vetoriais e PSRAM para o buffer da câmera
Produto em altíssimo volumeESP32-C2O menor custo da família, se os requisitos couberem nele
- -

ESP-IDF ou Arduino?

- -

- Escolhida a série, falta escolher a ferramenta. As duas são oficiais e mantidas pela - Espressif; a diferença é o nível de controle. -

- - - - - - - - - - - -
Core ArduinoESP-IDF
Curva de entradaBaixa, familiarÍngreme: menuconfig, CMake, componentes
Controle do hardwareParcialTotal
Acesso a recursos novosChega depoisImediato
Bibliotecas de sensoresEnormeMenor, mais técnica
Consumo de memóriaMaiorAjustável
Indicado paraAprender, prototiparProduto, otimização, recursos avançados
- -
-
Não é escolha definitiva
-

- Dá para usar o core Arduino como componente dentro de um projeto ESP-IDF, - misturando os dois. Um caminho comum é começar no Arduino para validar a ideia e migrar - para o IDF quando aparecer a necessidade de afinar consumo, segurança ou tempo de boot. -

-
- -
-
Ferramenta de apoio
-

- O ESPDocs tem um seletor que faz exatamente estas perguntas e devolve - uma recomendação justificada, além de comparar até quatro séries lado a lado, com - pinagem interativa e ficha de segurança. - Em espdocs.cienciaembarcada.com.br. -

-
-
- - -
-
-
9
-
-

Prática: lendo um DHT11 com o ESP32-S3

-

Do jumper ao terminal mostrando temperatura e umidade.

-
-
- -

- Vamos montar o "olá mundo" dos sensores: ler temperatura e umidade do ambiente e imprimir - no monitor serial. O DHT11 é barato, comum e usa um protocolo digital próprio de um único - fio, o que já ensina algo além de acender um LED. -

- -

Lista de material

- - - - - - - - - - - -
ItemQtd.Observação
ESP32-S3-DevKitC-11Qualquer variante de flash/PSRAM serve
Sensor DHT111O componente azul de 4 pinos
Resistor de 10 kΩ1Pull-up do dado (marrom, preto, laranja)
Protoboard1Meia protoboard basta
Jumpers4Vermelho, preto e amarelo, por convenção
Cabo USB1De dados. Cabo só de carga não funciona
- -

Montagem

- - - - - - - - - - -
LigaçãoCor na figuraFunção
VCC do DHT11 → 3V3VermelhoAlimentação do sensor
DATA do DHT11 → GPIO12AmareloLinha de dados bidirecional
GND do DHT11 → GNDPretoReferência de terra
10 kΩ entre DATA e 3V3ResistorMantém a linha em nível alto em repouso
O terceiro pino do DHT11 (contando da esquerda) não é usado.
- -
- Esquema de ligação do DHT11 ao ESP32-S3-DevKitC: fio vermelho do VCC ao 3V3, fio amarelo do DATA ao GPIO12, fio preto do GND ao GND, e um resistor de 10 kΩ entre a linha de dados e o 3V3. -
- Ligação completa. O fio amarelo leva o dado ao GPIO12; o resistor de - 10 kΩ conecta essa mesma linha ao 3V3, funcionando como pull-up. Repare que a - placa tem duas portas USB na borda inferior, marcadas UART e USB. A - diferença entre elas importa e está explicada no passo 4. -

- Arquivo editável do Fritzing: - baixar pratica.fzz -
-
- -
-
Por que o resistor de pull-up é necessário
-

- A linha de dados do DHT11 é bidirecional: ora o ESP32 fala, ora o - sensor responde. Para isso funcionar sem que os dois disputem a linha, ambos apenas - "puxam para baixo" quando querem enviar um zero, e soltam a linha quando querem enviar - um um. Só que uma linha solta não tem nível definido: ela flutua e capta ruído. -

-

- O resistor de 10 kΩ resolve isso mantendo a linha em nível alto em repouso, com força - suficiente para definir o nível, mas fraca o bastante para que qualquer um dos dois - consiga puxá-la para baixo. Módulos DHT11 já montados em plaquinha trazem esse resistor - embutido; o componente azul sozinho, não. -

-
- -
-

Como o sensor conversa

- -

- Vale entender o que a biblioteca faz por você. A cada leitura acontece esta troca, toda - por um único fio: -

- -
- - - - - - - alto - baixo - - - - - - - - - - 18 ms - 80 µs - 70 µs - 26 µs - - o ESP32 pede a leitura - o sensor responde - bit 1 - bit 0 - …40 bits - - - a partir daqui, o valor do bit está na largura do pulso alto - -
- O mesmo fio serve para os dois lados conversarem, em momentos diferentes. Um zero e um - um se distinguem só pela duração do nível alto, e é por isso que a - leitura falha quando o pull-up está ausente: sem ele a linha não sobe rápido o bastante - e os tempos saem errados. -
-
-
- -
    -
  1. O ESP32 puxa a linha para baixo por cerca de 18 ms, que é o "acorda" do sensor.
  2. -
  3. Solta a linha; o pull-up a leva para alto.
  4. -
  5. O DHT11 responde puxando para baixo por 80 µs e soltando por mais 80 µs.
  6. -
  7. Em seguida envia 40 bits: umidade (2 bytes), temperatura (2 bytes) e - um byte de verificação.
  8. -
  9. Cada bit é codificado pela duração do nível alto: cerca de 26 µs é zero, - cerca de 70 µs é um.
  10. -
- -

- A biblioteca mede esses tempos e confere o byte de verificação. Se a soma não bater, - seja por ruído, fio solto ou falta de pull-up, ela devolve NaN, e é isso que o - nosso código testa. -

- -

Passo a passo

- -
-
1
-
-

Instale o suporte ao ESP32 na IDE

-

- Na Arduino IDE, abra Arquivo → Preferências e adicione em "URLs adicionais - para gerenciadores de placas": -

- -
https://espressif.github.io/arduino-esp32/package_esp32_index.json
-

- Depois vá em Ferramentas → Placa → Gerenciador de placas, procure por - esp32 e instale o pacote da Espressif Systems. São alguns minutos - de download. -

-
-
- -
-
2
-
-

Instale a biblioteca do sensor

-

- Em Ferramentas → Gerenciar bibliotecas, procure por - DHT sensor library, da Adafruit, e instale. A IDE vai perguntar se - quer instalar as dependências. Aceite, porque ela precisa da - Adafruit Unified Sensor junto. -

-
-
- -
-
3
-
-

Escreva o programa

-
#include <DHT.h>
-
-#define PINO_DHT  12       // fio amarelo
-#define TIPO_DHT  DHT11
-
-DHT dht(PINO_DHT, TIPO_DHT);
-
-void setup() {
-  Serial.begin(115200);
-  delay(1000);              // tempo para a USB enumerar
-  dht.begin();
-  Serial.println("Leitor DHT11 - ESP32-S3");
-}
-
-void loop() {
-  float umidade     = dht.readHumidity();
-  float temperatura = dht.readTemperature();
-
-  if (isnan(umidade) || isnan(temperatura)) {
-    Serial.println("Falha na leitura do sensor");
-  } else {
-    Serial.printf("Temperatura: %.1f C | Umidade: %.1f %%\n",
-                  temperatura, umidade);
-  }
-
-  delay(2000);              // DHT11 nao aceita leitura mais rapida
-}
-

- O delay(2000) não é enfeite: o DHT11 leva cerca de um segundo para - fazer uma medição e responde com erro se for consultado antes disso. -

-
-
- -
-
4
-
-

Configure a placa: o passo onde todo mundo tropeça

-

- Em Ferramentas, selecione a placa ESP32S3 Dev Module. - Agora, o detalhe importante: o DevKitC tem duas portas USB. -

-

- A porta marcada UART passa por um conversor USB-serial e funciona - como em qualquer Arduino. A porta marcada USB é o USB nativo do - próprio ESP32-S3. -

-

- Se você ligar o cabo na porta USB, precisa habilitar - USB CDC On Boot → Enabled, senão o monitor serial fica mudo mesmo com o - programa rodando. Ligando na porta UART, deixe essa opção como - Disabled. -

-
-
- -
-
5
-
-

Grave e observe

-

- Selecione a porta em Ferramentas → Porta, clique em carregar e abra o - monitor serial em 115200 baud. Depois de alguns segundos: -

- -
Leitor DHT11 - ESP32-S3
-Temperatura: 26.0 C | Umidade: 61.0 %
-Temperatura: 26.0 C | Umidade: 61.0 %
-Temperatura: 26.1 C | Umidade: 62.0 %
-

- Segure o sensor entre os dedos e sopre nele: a umidade sobe rápido e a temperatura - acompanha devagar. Essa diferença de velocidade é real: o elemento de umidade - responde muito mais rápido que o termistor. -

-
-
- -

Quando não funciona

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SintomaCausa provável e solução
Monitor serial vazioCabo na porta USB nativa sem USB CDC On Boot habilitado. Veja o passo - 4. Confira também a velocidade em 115200.
"Falha na leitura" sempreFio de dados no pino errado, VCC não conectado, ou resistor de pull-up ausente - ou mal encaixado na protoboard.
Leitura falha às vezesJumper com mau contato, fio de dados muito longo, ou delay menor - que 2 segundos.
A porta não apareceCabo só de carga (troque por um de dados) ou driver do conversor USB-serial - faltando.
Erro ao gravar, timeoutPlaca não entrou em modo de gravação: segure BOOT, pressione e solte RESET, - solte BOOT e tente de novo.
Temperatura sempre inteiraNão é defeito. O DHT11 tem resolução de 1 °C. O DHT22 dá 0,1 °C.
Valores absurdos e constantesSensor invertido na alimentação. Confira VCC e GND antes de energizar de novo.
- -
-
Por que o GPIO12?
-

- No ESP32-S3, o GPIO12 é um pino comum: não participa do boot, não conversa com a flash - e não é usado para depuração. Ele até tem funções alternativas de touch e ADC2, mas - nenhuma delas atrapalha o uso como entrada e saída digital. -

-

- Em outras séries, cuidado: no ESP32 original o GPIO12 é pino de strapping: - ele seleciona a tensão da flash, e um nível alto durante o reset impede a placa de - iniciar. Mesmo número de pino, comportamento completamente diferente. -

-

- Se você montasse este mesmo circuito num ESP32 clássico sem trocar o pino, o resistor - de pull-up de 10 kΩ que o DHT11 exige seguraria o GPIO12 em nível alto exatamente - durante o reset. A placa simplesmente não iniciaria, e o sintoma não apontaria para o - sensor em momento algum. É o grupo 2 do capítulo 2 acontecendo na prática. -

-
- -

Desafios

- -

Se sobrar tempo na formação, ou para praticar depois:

- -
    -
  1. Acenda o LED RGB da placa em vermelho quando a temperatura passar de 28 °C e em azul - abaixo disso.
  2. -
  3. Calcule e imprima a média das últimas dez leituras, para suavizar o ruído.
  4. -
  5. Troque o delay por controle de tempo com millis(), de modo - que o programa continue respondendo enquanto espera.
  6. -
  7. Detecte e conte quantas vezes a umidade subiu mais de 5 % entre leituras consecutivas.
  8. -
  9. Publique a leitura numa página web servida pelo próprio ESP32, acessível por qualquer - aparelho na mesma rede.
  10. -
-
- - -
-
-
10
-
-

Glossário e próximos passos

-

Os termos que aparecem o tempo todo, e para onde seguir.

-
-
- -

Glossário

- - - - - - - - - - - - - - - - - - - - - -
TermoSignificado
SoCSystem on Chip: um único chip reunindo processador, memória, rádio e periféricos.
GPIOPino de entrada e saída de uso geral.
StrappingPino lido no reset para definir o modo de boot.
Pull-up / pull-downResistor que define o nível de uma linha em repouso.
ULP / LP coreCoprocessador de baixíssimo consumo que roda com o chip principal dormindo.
PSRAMMemória RAM externa opcional, para buffers grandes.
eFuseMemória que só pode ser gravada uma vez, usada para chaves e configurações permanentes.
Deep sleepModo em que quase tudo desliga, mantendo só o mínimo para acordar depois.
OTAOver-The-Air: atualização de firmware pela rede.
FreeRTOSSistema operacional de tempo real que gerencia as tarefas do ESP32.
WatchdogTemporizador que reinicia o chip se uma tarefa travar.
TWAINome que a Espressif dá ao controlador compatível com CAN.
MatterPadrão de interoperabilidade para casa conectada, sobre Wi-Fi ou Thread.
Thread / ZigbeeProtocolos de rede em malha de baixo consumo sobre IEEE 802.15.4.
Secure BootMecanismo que impede o chip de executar firmware não assinado.
ErrataDocumento com os defeitos conhecidos de uma revisão do silício.
- -

Onde consultar

- - - - - - - - - - - - -
FontePara quê
ESPDocsEspecificações, pinagem, segurança e comparação das séries em português. Em espdocs.cienciaembarcada.com.br
Datasheet da sérieVerdade final sobre limites elétricos, pinagem e encapsulamento
Technical Reference ManualDetalhe de registradores e comportamento de cada periférico
ESP-IDF Programming GuideAPI oficial, exemplos e guias de Wi-Fi, BLE, OTA e segurança
Errata do chipDefeitos conhecidos daquela revisão. Leia antes de fechar projeto
Fórum esp32.comDúvidas específicas, com participação de engenheiros da Espressif
GitHub da EspressifCódigo-fonte, exemplos e issues abertas
- -

Por onde continuar

-

- Com o sensor funcionando, o caminho natural é tirar o dado da bancada. Na ordem que - costuma render mais aprendizado por hora investida: -

- -
    -
  1. Conectar ao Wi-Fi e servir uma página com a leitura. É o exercício que - mais amarra os conceitos: rede, memória e o laço principal disputando espaço.
  2. -
  3. Publicar em um broker MQTT, que é o protocolo padrão de IoT e o que - permite o dado chegar a um painel ou a outro dispositivo.
  4. -
  5. Economizar energia com deep sleep, medindo de verdade quanto tempo uma - bateria aguenta.
  6. -
  7. Atualizar o firmware pelo ar com OTA, fechando o ciclo de um produto - que não precisa mais de cabo depois de instalado.
  8. -
  9. Migrar um projeto para o ESP-IDF, para enxergar o que o core Arduino - estava escondendo.
  10. -
- -
-
Um conselho para levar
-

- Quando algo não funcionar, resista à vontade de trocar linhas de código no chute. - Pergunte antes: o hardware está certo? A alimentação aguenta? Esse pino tem restrição? - A biblioteca é a certa para esta série? A maior parte dos problemas em sistemas - embarcados não está no algoritmo, e sim na fronteira entre o software e o mundo físico. -

-
- -
- - -
-
-
-

Créditos

-

Quem fez, para quem, e o que você pode fazer com este material.

-
-
- -
-

Sobre este material

-

- Esta apostila é material de apoio a uma formação presencial da LASER. - Ela foi escrita para ser lida junto com o encontro, não no lugar dele: os capítulos - seguem a ordem da aula, e o capítulo 9 é a prática que acontece na bancada, com o - hardware em mãos e monitoria no local. -

-

- Ela também funciona sozinha, como referência para consultar depois. As tabelas - comparativas, a lista de pinos com restrição e o guia de solução de problemas foram - escritos pensando em quem volta ao texto meses depois, no meio de um projeto. -

-
- -

Realização

- - - - - - - - - - - - - - - - - - - - - -
PapelQuem
RealizaçãoLASER, Liga Acadêmica de Sistemas Embarcados
- Centro de Informática · Universidade Federal de Pernambuco
- laser.cin.ufpe.br
Conteúdo e redaçãoLucas Rayan Guerra
- Ciência Embarcada · cienciaembarcada.com.br
- linkedin.com/in/lucasrguerra
- contato@lucasrguerra.dev.br
Dados técnicosESPDocs, plataforma de documentação do ESP32 em português
- espdocs.cienciaembarcada.com.br
Prática e esquemáticoMontagem em Fritzing, arquivo editável disponível para download no capítulo 9
- -
-

Fontes e verificação

- -

- Nenhum número desta apostila foi estimado. Cada dado tem origem rastreável: -

- - - - - - - - - - - - - -
InformaçãoOrigem
Arquitetura, memória, periféricosDatasheets oficiais da Espressif Systems
Blocos de segurança por sérieDefinições de hardware do ESP-IDF (soc_caps.h)
Versão mínima do ESP-IDFÍndice de versões publicado pela Espressif
Suporte no core ArduinoRepositório oficial arduino-esp32
EncapsulamentoDatasheets oficiais, capítulo de packaging
Pinos com restriçãoDatasheets, cruzados com a base de pinagem do ESPDocs
Diagrama de blocos do ESP32-S3Imagem da Espressif Systems, reproduzida para fins didáticos
Onde a Espressif ainda não publicou documentação, como no ESP32-H4, isso está dito no texto em vez de preenchido por estimativa.
-
- -

Uso e distribuição

- -

- Este material pode ser usado, copiado e adaptado livremente para fins - educacionais, desde que citada a origem. Se for adaptá-lo para outra formação, - mantenha os créditos desta página e ajuste as partes que dependem do contexto da LASER. -

- -
-
Independência
-

- Este é um material independente, produzido pela LASER, sem vínculo, patrocínio - ou revisão da Espressif Systems. Os nomes ESP32, ESP-IDF e demais marcas - citadas pertencem aos seus respectivos titulares. -

-

- Para decisão de engenharia ou projeto industrial, a referência final é sempre o - datasheet e a errata do fabricante, na revisão de silício que você tem em mãos. -

-
- -
-
Dúvidas, correções e contato
-

- Correções e sugestões são bem-vindas e ajudam as próximas turmas. Fale direto com o - autor por contato@lucasrguerra.dev.br - ou pelo LinkedIn, em - linkedin.com/in/lucasrguerra. -

-
- -

- LASER · Liga Acadêmica de Sistemas Embarcados · Centro de Informática · UFPE
- Formação em ESP32 · Módulo 1: Conhecendo a Família -

-
- - - + diff --git a/public/formacoes/1/previa-apostila.jpg b/public/formacoes/1/previa-apostila.jpg new file mode 100644 index 0000000..860fe2e Binary files /dev/null and b/public/formacoes/1/previa-apostila.jpg differ diff --git a/public/formacoes/1/previa-slides.jpg b/public/formacoes/1/previa-slides.jpg new file mode 100644 index 0000000..6bcf4d7 Binary files /dev/null and b/public/formacoes/1/previa-slides.jpg differ diff --git a/public/formacoes/1/slide.html b/public/formacoes/1/slide.html index 0939421..e41d39f 100644 --- a/public/formacoes/1/slide.html +++ b/public/formacoes/1/slide.html @@ -2073,7 +2073,7 @@ Temperatura: 26.1 C | Umidade: 62.0 %

Obrigado.Perguntas?

A apostila completa deste módulo, com o glossário, os capítulos que não couberam no tempo - e o arquivo do Fritzing, está em index.html, na mesma pasta. + e o arquivo do Fritzing, está em espdocs.cienciaembarcada.com.br/formacoes/1.

Lucas Rayan Guerra diff --git a/public/formacoes/2/LASER-ESP32-Modulo-2-Apostila.pdf b/public/formacoes/2/LASER-ESP32-Modulo-2-Apostila.pdf new file mode 100644 index 0000000..c111d40 Binary files /dev/null and b/public/formacoes/2/LASER-ESP32-Modulo-2-Apostila.pdf differ diff --git a/public/formacoes/2/LASER-ESP32-Modulo-2-Slides.pdf b/public/formacoes/2/LASER-ESP32-Modulo-2-Slides.pdf new file mode 100644 index 0000000..92621de Binary files /dev/null and b/public/formacoes/2/LASER-ESP32-Modulo-2-Slides.pdf differ diff --git a/public/formacoes/2/apostila.html b/public/formacoes/2/apostila.html new file mode 100644 index 0000000..06d99f0 --- /dev/null +++ b/public/formacoes/2/apostila.html @@ -0,0 +1,800 @@ + + + + +LASER · Formação em ESP32 · Módulo 2: Estação de Temperatura e Umidade + + + + + + + + + + +

Paginando a apostila…

+ + +
+
+ + +
+ LASER + Liga Acadêmica de Sistemas Embarcados
Centro de Informática · UFPE
+
+ +
Formação em ESP32 · Módulo 2
+ +

Estação de
temperatura e umidade

+ +

+ Um DHT22, um display LCD 16x2 e um ESP32-S3, primeiro no simulador Wokwi e depois na + bancada. Dois protocolos de comunicação, um programa curto e os cuidados elétricos que + fazem o circuito funcionar fora da tela também. +

+ +
+
+ Lucas Rayan Guerra + Ciência Embarcada · ESPDocs + linkedin.com/in/lucasrguerra +
+
+ Material de apoio + Formação presencial · uso livre para fins educacionais +
+
+
+
+ + +
+
+
+

Apresentação

+

O que vamos construir, o que você precisa e como usar esta apostila.

+
+
+ +

+ No módulo 1 lemos um sensor e imprimimos o resultado no monitor serial, que só existe + enquanto há um computador ligado à placa. Neste módulo o projeto ganha uma tela + própria: um display LCD de 16 colunas por 2 linhas mostra a temperatura e a + umidade medidas por um DHT22, e o conjunto passa a funcionar sozinho, + ligado em qualquer carregador USB. +

+ +

+ Toda a formação acontece no Wokwi, um simulador de microcontroladores que + roda no navegador. Ele compila o mesmo código que você gravaria na placa, simula o ESP32-S3, + o sensor e o display, e deixa você mudar a temperatura com um controle deslizante. Assim + cada pessoa monta e testa o circuito sem precisar de componentes, e quem quiser repetir em + casa com peças de verdade encontra no capítulo 7 o que muda fora do simulador. +

+ +

O que você vai levar deste módulo

+
    +
  • Montar e simular um projeto completo de ESP32 no Wokwi, do zero.
  • +
  • Entender como o DHT22 transmite uma medição por um único fio.
  • +
  • Entender o barramento I2C: dois fios, endereços e resistores de pull-up.
  • +
  • Escrever no LCD 16x2, inclusive com um caractere que você mesmo desenha.
  • +
  • Saber o que precisa mudar para o mesmo circuito funcionar na bancada.
  • +
+ +

Pré-requisitos

+

+ Ter acompanhado o módulo 1 ajuda, mas não é obrigatório. Basta saber o que são + setup() e loop() num programa Arduino. Para a simulação você + precisa só de um navegador atualizado; não é preciso instalar nada nem criar conta. +

+ +

Os arquivos deste módulo

+

+ Tudo o que aparece nesta apostila foi compilado e executado no Wokwi, e os arquivos estão + na mesma pasta da formação: +

+ + + + + + + + + + + +
ArquivoConteúdo
sketch.inoO programa da estação
diagram.jsonO circuito: peças, posições e fios
libraries.txtAs bibliotecas que o Wokwi deve instalar
scanner-i2c.inoPrograma de diagnóstico do barramento I2C
modulo-2-wokwi.zipOs quatro arquivos acima num só pacote
Apostila em PDFEsta apostila, pronta para imprimir
Slides em PDFOs slides da formação, em 16:9
+ +
+

Ao longo do texto você encontra quatro tipos de caixa:

+
Dica

Atalho, boa prática ou recomendação que economiza tempo.

+
Atenção

Ponto que costuma causar problema se passar despercebido.

+
Erro comum

Armadilha concreta, com o sintoma que ela produz e como escapar.

+
Curiosidade

Contexto ou detalhe técnico que ajuda a fixar o conceito.

+
+
+ + +
+
+
+

Sumário

+

Oito capítulos, da peça solta ao circuito funcionando.

+
+
+ + +
+ + +
+
+
1
+
+

O projeto

+

Três peças, dois protocolos e uma tela que mostra o ambiente.

+
+
+ +

+ A estação é composta por três peças. O DHT22 mede temperatura e umidade + relativa do ar. O ESP32-S3 pede uma medição a cada dois segundos, formata + os números e os envia ao LCD 16x2, que os mantém na tela até a próxima + atualização. +

+ +
+ Circuito completo no simulador Wokwi: o DHT22 à esquerda, a placa ESP32-S3-DevKitC-1 ao centro, três resistores no alto ligados ao 3V3 e o LCD 16x2 embaixo mostrando Temp: 26.5°C e Umid: 62.0 %. +
+ O circuito deste módulo rodando no Wokwi. O display mostra a leitura que o DHT22 simulado + está informando: 26,5 °C e 62 % de umidade. +
+
+ +

+ Cada peça conversa com o ESP32 de um jeito diferente, e é isso que torna o projeto bom para + aprender. O DHT22 usa um protocolo próprio de um fio, em que o valor de + cada bit está na duração de um pulso. O LCD usa o I2C, um barramento + padronizado de dois fios em que cada dispositivo tem um endereço. Quem entende esses dois + protocolos já entende a maior parte dos sensores e módulos baratos do mercado. +

+ +

Lista de material

+

No Wokwi as peças já existem. Para montar em bancada você vai precisar de:

+ + + + + + + + + + + +
ItemQtd.Observação
ESP32-S3-DevKitC-11Qualquer variante de memória serve
Sensor DHT22 (AM2302)1O componente branco de 4 pinos
Display LCD 16x2 com módulo I2C1A plaquinha PCF8574 vem soldada atrás
Conversor de nível I2C (BSS138)1Explicado no capítulo 7
Resistor de 10 kΩ1Pull-up do DHT22 (marrom, preto, laranja)
Resistor de 4,7 kΩ2Pull-ups do I2C (amarelo, violeta, vermelho)
Protoboard, jumpers e cabo USB de dados—Cabo só de carga não grava a placa
+
+ + +
+
+
2
+
+

O sensor DHT22

+

Dois sensores numa caixinha e um protocolo de um fio só.

+
+
+ +

+ Dentro do DHT22 existem dois elementos de medição e um pequeno microcontrolador. A umidade + é medida por um sensor capacitivo: um material que absorve vapor d'água + e, com isso, muda a capacitância. A temperatura vem de um termistor, um + resistor cujo valor varia com o calor. O microcontrolador interno lê os dois, aplica a + calibração gravada de fábrica e entrega os números já prontos, em formato digital. +

+ +

DHT22 ou DHT11

+

No módulo 1 usamos o DHT11. O DHT22 tem a mesma pinagem e o mesmo protocolo, mas mede melhor:

+ + + + + + + + + + + + +
CaracterísticaDHT11DHT22
Faixa de temperatura0 a 50 °C−40 a 80 °C
Precisão de temperatura±2 °C±0,5 °C
Faixa de umidade20 a 90 %0 a 100 %
Precisão de umidade±5 %±2 a 5 %
Resolução1 °C e 1 %0,1 °C e 0,1 %
Intervalo mínimo entre leituras1 s2 s
Alimentação3,3 a 5 V3,3 a 6 V
Valores típicos dos datasheets da Aosong. Confira sempre o do seu fornecedor.
+ +

+ O preço é a única desvantagem real do DHT22, e o intervalo de dois segundos entre leituras + raramente importa: temperatura e umidade de um ambiente não mudam mais rápido do que isso. +

+ +

Os quatro pinos

+ + + + + + + + + +
PinoNomeLigação
1VCC3V3 do ESP32
2DATAGPIO12, com pull-up de 10 kΩ para o 3V3
3NCNão conectado
4GNDGND do ESP32
Pinos contados da esquerda para a direita, com a grade do sensor virada para você.
+ +

Como uma medição atravessa um único fio

+

+ O ESP32 e o sensor dividem o mesmo fio de dados, e por isso nenhum dos dois "força" nível + alto: os dois apenas puxam a linha para o terra quando precisam de um zero e a soltam no + resto do tempo. Quem traz a linha de volta para o nível alto é o resistor de + pull-up. Uma leitura acontece assim: +

+ +
+
1
+

O ESP32 pede a medição

Puxa a linha para baixo por cerca de 1 ms e depois a solta.

+
+
+
2
+

O sensor confirma

Responde com 80 µs em nível baixo seguidos de 80 µs em nível alto.

+
+
+
3
+
+

Chegam 40 bits

+

+ Cada bit começa com 50 µs em baixo. Depois vem um pulso alto: se ele dura cerca de + 26 µs é um 0; se dura cerca de 70 µs é um 1. + São 16 bits de umidade, 16 de temperatura e 8 de verificação. +

+
+
+ +
+ + + + + alto + baixo + + + ~1 ms80 µs26 µs70 µs + + + ESP32 pedesensor confirmabit 0bit 1…40 bits + + +
+ O valor de cada bit está na largura do pulso alto. Sem o pull-up a + linha sobe devagar demais, os tempos saem errados e a leitura falha. +
+
+ +
+
Sensor solto ou módulo em plaquinha
+

+ O DHT22 também é vendido soldado numa plaquinha de três pinos, que já traz o resistor de + pull-up. Se o seu for assim, o resistor externo de 10 kΩ é dispensável. O sensor solto, + de quatro pinos, precisa dele. +

+
+
+ + +
+
+
3
+
+

O display LCD 16x2 e o barramento I2C

+

Trinta e dois caracteres, quatro fios e um endereço.

+
+
+ +

+ O LCD 16x2 mostra duas linhas de dezesseis caracteres. Cada caractere é uma matriz de + 5 por 8 pontos, e o controlador do display, o HD44780 ou um compatível, + já sabe desenhar letras, números e símbolos comuns. Ele também guarda até + oito caracteres personalizados, que você desenha ponto a ponto. É assim + que este projeto mostra o símbolo de grau. +

+ +

+ Sozinho, o display precisa de pelo menos seis fios de dados e controle. Por isso ele quase + sempre vem com uma plaquinha soldada atrás, baseada no chip PCF8574, que + converte esses sinais para o barramento I2C: com ela, bastam quatro fios + para alimentar e controlar o display. A plaquinha também tem um trimpot + para ajustar o contraste. +

+ +

Como o I2C funciona

+

+ O I2C usa dois fios: SDA, por onde passam os dados, e + SCL, o relógio que marca o ritmo da conversa. O ESP32 é o + controlador: é sempre ele quem inicia a comunicação. Os outros dispositivos são + alvos, e cada um tem um endereço de 7 bits. Vários dispositivos podem dividir os + mesmos dois fios, porque só responde quem tiver o endereço chamado. +

+ + + + + + + + +
PlaquinhaEndereçoComo saber
PCF8574 ou PCF8574T0x27A mais comum, e a usada no Wokwi
PCF8574A0x3FMesma placa, outro chip
Na dúvida, o programa de scanner do capítulo 7 descobre o endereço por você.
+ +

+ Assim como no DHT22, as linhas do I2C são de dreno aberto: os + dispositivos só puxam para baixo, e são resistores de pull-up que trazem SDA e SCL de volta + ao nível alto. Valores entre 2,2 kΩ e 10 kΩ funcionam na velocidade padrão; aqui usamos + 4,7 kΩ, o valor mais comum. +

+ +
+
O display liga mas não mostra nada
+

+ Com o contraste no mínimo, a tela acende e parece vazia; com ele no máximo, aparecem + só retângulos cheios. Antes de desconfiar do código, gire o trimpot azul atrás do + display com uma chave de fenda até os caracteres aparecerem. No Wokwi isso não + existe, porque o contraste simulado já vem ajustado. +

+
+
+ + +
+
+
4
+
+

O simulador Wokwi

+

Um laboratório de eletrônica que abre no navegador.

+
+
+ +

+ O Wokwi simula o processador do ESP32-S3 instrução por instrução e simula também cada peça + ligada a ele. O programa é compilado com o mesmo núcleo Arduino da Espressif + que você instalaria na IDE, então o código que funciona aqui é o mesmo que vai para a placa. +

+ +

Os três arquivos de um projeto

+ + + + + + + +
ArquivoPara que serve
sketch.inoO programa, exatamente como na IDE do Arduino.
diagram.jsonAs peças, a posição de cada uma, os fios e as propriedades, como a temperatura inicial do DHT22.
libraries.txtUma biblioteca por linha. O Wokwi baixa todas antes de compilar.
+ +

Abrindo o projeto deste módulo

+ +
+
1
+

Crie um projeto vazio

Acesse wokwi.com/projects/new/esp32-s3. Não é preciso criar conta para simular.

+
+
+
2
+

Substitua o programa e o circuito

Cole o conteúdo de sketch.ino na aba de mesmo nome e o de diagram.json na aba diagram.json, apagando o que já estava lá.

+
+
+
3
+

Adicione as bibliotecas

Abra a aba Library Manager, clique em + e adicione DHT sensor library e LiquidCrystal I2C. O Wokwi cria o libraries.txt sozinho.

+
+
+
4
+

Simule

Clique no botão verde. A primeira compilação leva alguns segundos; depois o display acende e o monitor serial aparece embaixo.

+
+ +
+
Mude o clima com um clique
+

+ Com a simulação rodando, clique no DHT22: aparecem dois controles deslizantes, um de + temperatura e outro de umidade. Mova-os e veja o display acompanhar na leitura seguinte. + É o jeito mais rápido de testar o que o programa faz com valores extremos. +

+
+ +
+
Salvar exige conta
+

+ Sem login a simulação funciona normalmente, mas o projeto se perde ao fechar a aba. Para + guardar o seu trabalho, entre com uma conta gratuita e clique em Save, + ou mantenha os três arquivos no seu computador. +

+
+
+ + +
+
+
5
+
+

Montagem

+

Nove ligações e três resistores.

+
+
+ +

+ Todos os pinos usados ficam na coluna esquerda da placa, o que deixa a + fiação curta e sem cruzamentos. As cores seguem uma convenção que vale a pena adotar + também na bancada: vermelho para alimentação, preto para terra, e uma cor por sinal. +

+ + + + + + + + + + + + + + + +
DeParaCor e função
DHT22 VCC3V3Vermelho · alimentação
DHT22 DATAGPIO12Amarelo · dados do sensor
DHT22 GNDGNDPreto · terra
Resistor 10 kΩGPIO12 ↔ 3V3Pull-up do DHT22
LCD VCC5VVermelho · o display precisa de 5 V
LCD GNDGNDPreto · terra
LCD SDAGPIO8Azul · dados do I2C
LCD SCLGPIO9Roxo · relógio do I2C
2 resistores de 4,7 kΩGPIO8 e GPIO9 ↔ 3V3Pull-ups do I2C
GPIO8 e GPIO9 são os pinos I2C padrão do ESP32-S3 no núcleo Arduino.
+ +
+ Fiação no Wokwi: um barramento vermelho de 3V3 no alto alimenta o DHT22 e os três resistores; do resistor de 10 kΩ desce um fio amarelo até o GPIO12, e dos dois resistores de 4,7 kΩ descem os fios azul e roxo até o GPIO8 e o GPIO9, que seguem para o SDA e o SCL do LCD. +
+ O fio vermelho no alto funciona como um barramento de 3V3: dele saem a alimentação do + DHT22 e o lado de cima dos três resistores. O lado de baixo de cada resistor encontra a + linha de sinal correspondente. +
+
+ +
+
Por que pull-up para 3V3, e não para 5V
+

+ Os pinos do ESP32-S3 trabalham em 3,3 V e não toleram 5 V. Um resistor + de pull-up define a tensão de repouso da linha, então ligá-lo ao 5V colocaria 5 V + direto no GPIO. O display é alimentado em 5 V, mas as linhas de sinal precisam ficar + em 3,3 V. Na bancada isso exige um cuidado a mais, explicado no capítulo 7. +

+
+
+ + +
+
+
6
+
+

O programa

+

Um programa curto, lido em três partes.

+
+
+ +

+ O programa é lido aqui em três partes, exatamente como foi compilado e executado no Wokwi. + O arquivo completo, pronto para colar, está em wokwi/sketch.ino. +

+ +

1. Configuração

+
#include <Wire.h>
+#include <DHT.h>
+#include <LiquidCrystal_I2C.h>
+
+#define PINO_DHT  12        // fio amarelo
+#define TIPO_DHT  DHT22
+#define PINO_SDA  8         // I2C padrão do ESP32-S3
+#define PINO_SCL  9
+
+DHT dht(PINO_DHT, TIPO_DHT);
+LiquidCrystal_I2C lcd(0x27, 16, 2);   // endereço, colunas, linhas
+
+// Símbolo de grau: 8 linhas de 5 pixels
+byte grau[8] = { 0b01100, 0b10010, 0b10010, 0b01100, 0, 0, 0, 0 };
+

+ As três bibliotecas cuidam do trabalho pesado: Wire é o I2C do ESP32, + DHT fala o protocolo do sensor e LiquidCrystal_I2C traduz + comandos como "escreva na linha 2" para o que a plaquinha PCF8574 entende. Os + #define reúnem no topo tudo o que depende da montagem: se você mudar um fio de + pino, só precisa mudar uma linha. +

+

+ O vetor grau desenha o símbolo de grau. Cada número é uma linha do caractere, + e cada bit 1 acende um dos cinco pontos daquela linha: +

+ +
+ + + 0b011000b100100b100100b01100 + 0000 + + + + + + + + + + + + 26.5°C + o que aparece no display + +
+ lcd.createChar(0, grau) guarda o desenho na posição 0 da memória do display, + e lcd.write(0) o imprime como qualquer outro caractere. +
+
+ +

2. setup()

+
void setup() {
+  Serial.begin(115200);
+  Wire.begin(PINO_SDA, PINO_SCL);
+  dht.begin();
+
+  lcd.init();
+  lcd.backlight();
+  lcd.createChar(0, grau);
+  lcd.setCursor(0, 0);
+  lcd.print("LASER  ESP32-S3");
+  lcd.setCursor(0, 1);
+  lcd.print("Iniciando...");
+  delay(2000);            // o DHT22 precisa de ~2 s para a primeira leitura
+  lcd.clear();
+}
+

+ Wire.begin(8, 9) inicia o I2C nos pinos da montagem. Em seguida o display é + inicializado, a luz de fundo é ligada e o caractere de grau é registrado. A mensagem + "Iniciando..." não é só enfeite: ela cobre os dois segundos que o DHT22 + precisa depois de ligado para entregar a primeira medição válida. +

+ +

3. loop()

+
void loop() {
+  float umidade     = dht.readHumidity();
+  float temperatura = dht.readTemperature();
+
+  if (isnan(umidade) || isnan(temperatura)) {
+    lcd.setCursor(0, 0);
+    lcd.print("Falha no sensor ");
+    Serial.println("Falha na leitura do DHT22");
+  } else {
+    lcd.setCursor(0, 0);
+    lcd.print("Temp: ");
+    lcd.print(temperatura, 1);
+    lcd.write(0);           // o caractere de grau criado acima
+    lcd.print("C   ");
+
+    lcd.setCursor(0, 1);
+    lcd.print("Umid: ");
+    lcd.print(umidade, 1);
+    lcd.print(" %   ");
+
+    Serial.printf("Temperatura: %.1f C | Umidade: %.1f %%\n", temperatura, umidade);
+  }
+
+  delay(2000);              // o DHT22 aceita no máximo uma leitura a cada 2 s
+}
+

+ A cada volta, o programa lê umidade e temperatura. Se qualquer uma vier como + NaN, a sigla de not a number com que a biblioteca avisa que a leitura + falhou, o display mostra "Falha no sensor". Caso contrário, os valores são escritos com + uma casa decimal. O delay(2000) respeita o intervalo mínimo do DHT22. +

+ +
+
Restos de texto na tela
+

+ O LCD só sobrescreve as posições em que você escreve; o resto continua como estava. + Se a temperatura cair de "26.5" para "-5.2" e depois para "8.0", o texto fica mais + curto e sobram caracteres da leitura anterior. Os espaços em "C " e + " % " existem para apagar essas sobras. Chamar lcd.clear() a + cada leitura também resolveria, mas faz a tela piscar. +

+
+ +

Os três testes feitos no Wokwi

+ + + + + + + + +
SituaçãoO que o display mostrou
Sala, 26,5 °C e 62 %LCD mostrando Temp: 26.5°C e Umid: 62.0 %
Frio, −5,2 °C e 88,4 %LCD mostrando Temp: -5.2°C e Umid: 88.4 %
Fio de dados desconectadoLCD mostrando Falha no sensor
O terceiro teste confirma que o programa detecta a falha em vez de mostrar números inventados.
+
+ + +
+
+
7
+
+

Da simulação para a bancada

+

O que o Wokwi perdoa e o hardware de verdade não.

+
+
+ +

+ O simulador é ideal para aprender e testar a lógica, mas ele modela os componentes como + peças perfeitas. Na bancada, três detalhes fazem diferença. +

+ +

1. Os pull-ups escondidos na plaquinha I2C

+

+ Quase toda plaquinha PCF8574 vendida no Brasil já traz resistores de pull-up + ligados ao VCC dela. Com o display alimentado em 5 V, esses resistores puxam SDA e + SCL para 5 V. Somar os nossos 4,7 kΩ para 3V3 não resolve: os dois resistores formam um + divisor, e a linha fica em torno de 4 V, ainda acima do que o ESP32-S3 suporta. +

+

Há duas saídas corretas:

+ + + + + + + + + + + + +
SoluçãoComo fazer
Conversor de nível (recomendado)Um módulo bidirecional com BSS138, de quatro canais. O lado LV vai no 3V3 e nos GPIO8/9; o lado HV vai no 5V e no SDA/SCL do display. O módulo já tem pull-ups dos dois lados, então os 4,7 kΩ externos saem do circuito.
Remover os pull-ups da plaquinhaDessoldar os dois resistores ligados a SDA e SCL na plaquinha e manter os 4,7 kΩ para 3V3, exatamente como no Wokwi. O PCF8574 reconhece 3,3 V como nível alto mesmo alimentado em 5 V.
+ +
+
Como saber se a sua plaquinha tem pull-ups
+

+ Com tudo desligado, meça com o multímetro a resistência entre o pino SDA + e o VCC da plaquinha. Algo entre 2 kΩ e 10 kΩ indica um pull-up. Se não + houver continuidade, ela não tem, e os 4,7 kΩ para 3V3 bastam. +

+
+ +
+
"Mas eu liguei direto e funcionou"
+

+ É comum funcionar: o resistor limita a corrente e o ESP32 tem diodos de proteção que + desviam o excesso. Funcionar não é o mesmo que estar dentro da especificação. A Espressif + não garante os pinos acima de 3,6 V, e um circuito fora da especificação pode falhar + com o tempo ou em outra placa. Em projeto que vai ficar ligado, use o conversor. +

+
+ +

2. Descubra o endereço do display

+

+ Se o display acende mas não mostra nada mesmo com o contraste ajustado, o endereço pode + ser 0x3F em vez de 0x27. Este programa varre o barramento e + imprime o endereço de cada dispositivo que responder. No Wokwi ele encontra o display em + 0x27: +

+ +
// Scanner I2C: lista o endereço de cada dispositivo no barramento.
+// Use antes do programa principal se o LCD não mostrar nada.
+
+#include <Wire.h>
+
+void setup() {
+  Serial.begin(115200);
+  Wire.begin(8, 9);                 // SDA, SCL
+  delay(500);
+
+  Serial.println("Procurando dispositivos I2C...");
+  int encontrados = 0;
+  for (byte endereco = 1; endereco < 127; endereco++) {
+    Wire.beginTransmission(endereco);
+    if (Wire.endTransmission() == 0) {
+      Serial.printf("Dispositivo em 0x%02X\n", endereco);
+      encontrados++;
+    }
+  }
+  if (encontrados == 0) Serial.println("Nenhum dispositivo. Confira SDA, SCL e alimentacao.");
+}
+
+void loop() {}
+ +
Procurando dispositivos I2C...
+Dispositivo em 0x27
+ +

3. Gravando na placa

+

+ Na IDE do Arduino, instale o suporte ao ESP32 e as bibliotecas DHT sensor + library (aceitando a dependência Adafruit Unified Sensor) e + LiquidCrystal I2C, de Frank de Brabander. Selecione a placa + ESP32S3 Dev Module e lembre do detalhe do módulo 1: na porta marcada + USB, a opção USB CDC On Boot precisa estar em + Enabled para o monitor serial funcionar; na porta UART, + em Disabled. +

+
+ + +
+
+
8
+
+

Problemas comuns e desafios

+

O que fazer quando não funciona, e para onde ir quando funcionar.

+
+
+ + + + + + + + + + + +
SintomaCausa provável
"Falha no sensor" o tempo todoFio de dados fora do GPIO12, falta do pull-up de 10 kΩ ou VCC e GND invertidos.
Display aceso e sem textoContraste desajustado, endereço errado ou SDA e SCL trocados.
Retângulos cheios na linha de cimaO display recebeu energia mas não foi inicializado: o I2C não está chegando.
Display apagadoFalta o 5V no VCC do display ou o lcd.backlight().
Caracteres estranhos no fim da linhaSobras da leitura anterior; veja a caixa "Restos de texto na tela".
Erro de compilação com DHT.hBiblioteca não instalada, ou instalada sem a Adafruit Unified Sensor.
+ +

Desafios

+
+
1
+

Mínima e máxima

Guarde a menor e a maior temperatura desde que a placa ligou e alterne a segunda linha entre a umidade e esses dois valores.

+
+
+
2
+

Alerta de calor

Ligue um LED, ou use o LED RGB que já existe no GPIO38 da placa, quando a temperatura passar de 30 °C. Faça a luz de fundo do display piscar junto.

+
+
+
3
+

Sensação térmica

A biblioteca DHT tem a função computeHeatIndex(). Mostre o índice de calor no lugar da umidade quando o ar estiver quente e úmido.

+
+
+
4
+

Sem delay()

Reescreva o loop() usando millis(), para que o programa possa fazer outras coisas, como ler um botão, entre uma leitura e outra.

+
+ +
+
Próximo módulo
+

+ A estação já mede e mostra. O passo natural é publicar esses dados: o ESP32-S3 tem + Wi-Fi, e com poucas linhas a mais a mesma leitura pode ir para uma página web ou para + um servidor MQTT. +

+
+ +
+
Dúvidas, correções e contato
+

+ Correções e sugestões são bem-vindas e ajudam as próximas turmas. Fale direto com o + autor por contato@lucasrguerra.dev.br + ou pelo LinkedIn, em + linkedin.com/in/lucasrguerra. +

+
+ +

+ LASER · Liga Acadêmica de Sistemas Embarcados · Centro de Informática · UFPE
+ Formação em ESP32 · Módulo 2: Estação de Temperatura e Umidade +

+
+ + + + + diff --git a/public/formacoes/2/circuito-wokwi.png b/public/formacoes/2/circuito-wokwi.png new file mode 100644 index 0000000..2f629f7 Binary files /dev/null and b/public/formacoes/2/circuito-wokwi.png differ diff --git a/public/formacoes/2/formacao.json b/public/formacoes/2/formacao.json new file mode 100644 index 0000000..0b3dadf --- /dev/null +++ b/public/formacoes/2/formacao.json @@ -0,0 +1,51 @@ +{ + "modulo": 2, + "titulo": ["Estação de", "temperatura e umidade"], + "subtitulo": "Um DHT22, um display LCD 16x2 e um ESP32-S3, simulados no Wokwi com o framework Arduino. Dois protocolos de comunicação, um programa curto e os cuidados elétricos que fazem o circuito funcionar também fora da tela.", + "descricao": "Slides, apostila, código e projeto do Wokwi do módulo 2 da formação em ESP32 da LASER: DHT22, LCD 16x2 I2C e ESP32-S3.", + "fichas": [["Duração", "2 horas"], ["Formato", "presencial"], ["Simulador", "Wokwi"], ["Framework", "Arduino"]], + "pratica": { + "titulo": "Projeto no Wokwi", + "texto": "O circuito e o código desta formação, testados no simulador: leitura normal, temperatura negativa e sensor desconectado.", + "imagem": "circuito-wokwi.png", + "meta": "4 arquivos · simule sem instalar nada", + "acoes": [["Baixar o projeto", "modulo-2-wokwi.zip", true], ["Abrir o Wokwi", "https://wokwi.com/projects/new/esp32-s3", false]] + }, + "grupos": [ + { "titulo": "Material de aula", "arquivos": [ + { "arquivo": "slide.html", "tipo": "slides", "descricao": "Os slides da formação. Abrem no navegador, em tela cheia, prontos para projetar.", "abrir": true }, + { "arquivo": "apostila.html", "tipo": "apostila", "descricao": "A apostila completa, paginada em A4 no próprio navegador, com o passo a passo e o código comentado.", "abrir": true } + ]}, + { "titulo": "Para baixar e imprimir", "arquivos": [ + { "arquivo": "LASER-ESP32-Modulo-2-Slides.pdf", "tipo": "pdf", "descricao": "Os slides em PDF 16:9, um slide por página.", "abrir": true, "baixar": true }, + { "arquivo": "LASER-ESP32-Modulo-2-Apostila.pdf", "tipo": "pdf", "descricao": "A apostila em PDF A4, pronta para imprimir.", "abrir": true, "baixar": true } + ]}, + { "titulo": "Projeto do Wokwi", "arquivos": [ + { "arquivo": "modulo-2-wokwi.zip", "tipo": "zip", "descricao": "Os quatro arquivos abaixo num só pacote.", "baixar": true }, + { "arquivo": "wokwi/sketch.ino", "tipo": "codigo", "descricao": "O programa da estação: lê o DHT22 e escreve no LCD a cada 2 segundos.", "abrir": true, "baixar": true }, + { "arquivo": "wokwi/diagram.json", "tipo": "codigo", "descricao": "O circuito: peças, posições, fios e os três resistores de pull-up.", "abrir": true, "baixar": true }, + { "arquivo": "wokwi/libraries.txt", "tipo": "codigo", "descricao": "As bibliotecas que o Wokwi instala antes de compilar.", "abrir": true, "baixar": true }, + { "arquivo": "wokwi/scanner-i2c.ino", "tipo": "codigo", "descricao": "Diagnóstico: lista o endereço de cada dispositivo no barramento I2C.", "abrir": true, "baixar": true } + ]}, + { "titulo": "Imagens da simulação", "arquivos": [ + { "arquivo": "circuito-wokwi.png", "tipo": "imagem", "descricao": "O circuito completo rodando no Wokwi.", "abrir": true }, + { "arquivo": "lcd-funcionando.png", "tipo": "imagem", "descricao": "Teste 1: leitura normal, 26,5 °C e 62 %.", "abrir": true }, + { "arquivo": "lcd-frio.png", "tipo": "imagem", "descricao": "Teste 2: temperatura negativa, −5,2 °C e 88,4 %.", "abrir": true }, + { "arquivo": "lcd-falha.png", "tipo": "imagem", "descricao": "Teste 3: fio de dados desconectado, erro detectado.", "abrir": true } + ]} + ], + "guias": [ + { "titulo": "Rodando no Wokwi", "itens": [ + "Abra wokwi.com/projects/new/esp32-s3. Não precisa de conta.", + "Cole o sketch.ino e o diagram.json nas abas de mesmo nome.", + "Em Library Manager, adicione DHT sensor library e LiquidCrystal I2C.", + "Clique no botão verde. Com a simulação rodando, clique no DHT22 para mudar temperatura e umidade." + ]}, + { "titulo": "Montando na bancada", "itens": [ + "Pull-up de 10 kΩ no DATA do DHT22 e de 4,7 kΩ no SDA e no SCL, todos para o 3V3.", + "A plaquinha I2C do LCD costuma trazer pull-ups para 5 V: use um conversor de nível BSS138 ou retire esses resistores.", + "Tela vazia? Gire o trimpot de contraste e rode o scanner-i2c.ino para conferir o endereço.", + "Os detalhes estão no capítulo 7 da apostila." + ]} + ] +} diff --git a/public/formacoes/2/index.html b/public/formacoes/2/index.html new file mode 100644 index 0000000..3520a3a --- /dev/null +++ b/public/formacoes/2/index.html @@ -0,0 +1,572 @@ + + + + + +LASER · Formação em ESP32 · Módulo 2: Estação de temperatura e umidade + + + + + + + + + + + +
+
+ LASER + Liga Acadêmica de Sistemas Embarcados
Centro de Informática · UFPE
+ +
+
+ +
+
+
+
+
Formação em ESP32 · Módulo 2
+

Estação detemperatura e umidade

+

Um DHT22, um display LCD 16x2 e um ESP32-S3, simulados no Wokwi com o framework Arduino. Dois protocolos de comunicação, um programa curto e os cuidados elétricos que fazem o circuito funcionar também fora da tela.

+
  • Duração: 2 horas
  • Formato: presencial
  • Simulador: Wokwi
  • Framework: Arduino
+ +
+
+ Capa da apostila do módulo 2 + Capa dos slides do módulo 2 +
+
+
+
+ +
+
+

Comece por aqui

+

Três formas de usar este material

+

Para apresentar, para estudar e para pôr a mão no circuito. Os PDFs são a versão final, para quem só quer o material pronto.

+
+
+ +
+

Slides

+

31 slides para projetar direto do navegador, com navegação por teclado e panorama.

+
PDF · 31 págs · 1,6 MB
+
+ Apresentar + PDF +
+
+
+
+ +
+

Apostila

+

O conteúdo completo, com explicações, tabelas e o código comentado, paginado em A4.

+
PDF · 20 págs · 761 KB
+
+ Ler + PDF +
+
+
+
+ +
+

Projeto no Wokwi

+

O circuito e o código desta formação, testados no simulador: leitura normal, temperatura negativa e sensor desconectado.

+
4 arquivos · simule sem instalar nada
+ +
+
+
+
+
+ +
+
+

Roteiro da aula

+

6 partes, 31 slides

+

Cada parte abre os slides direto no ponto em que ela começa.

+
    +
  1. 1O DHT22slide 4 · 5 slides
  2. +
  3. 2LCD e I2Cslide 9 · 5 slides
  4. +
  5. 3Wokwislide 14 · 3 slides
  6. +
  7. 4Montagemslide 17 · 2 slides
  8. +
  9. 5O programaslide 19 · 7 slides
  10. +
  11. 6Para a bancadaslide 26 · 6 slides
  12. +
+
+
+ +
+
+

Todos os arquivos

+

O que tem nesta formação

+

Tudo o que foi usado na aula, com o que é cada arquivo e para que serve.

+ +
+

Material de aula

+
    +
  • +
    +
    +
    slide.html
    +
    Os slides da formação. Abrem no navegador, em tela cheia, prontos para projetar.
    + +
    +
    72 KB
    + +
  • +
  • +
    +
    +
    apostila.html
    +
    A apostila completa, paginada em A4 no próprio navegador, com o passo a passo e o código comentado.
    + +
    +
    43 KB
    + +
  • +
+
+
+

Para baixar e imprimir

+
    +
  • +
    +
    +
    LASER-ESP32-Modulo-2-Slides.pdf
    +
    Os slides em PDF 16:9, um slide por página.
    + +
    +
    31 págs · 1,6 MB
    + +
  • +
  • +
    +
    +
    LASER-ESP32-Modulo-2-Apostila.pdf
    +
    A apostila em PDF A4, pronta para imprimir.
    + +
    +
    20 págs · 761 KB
    + +
  • +
+
+
+

Projeto do Wokwi

+
    +
  • +
    +
    +
    modulo-2-wokwi.zip
    +
    Os quatro arquivos abaixo num só pacote.
    + +
    +
    2 KB
    + +
  • +
  • +
    +
    +
    sketch.ino
    +
    O programa da estação: lê o DHT22 e escreve no LCD a cada 2 segundos.
    +
    Ver código
    // Formação em ESP32 · LASER · Módulo 2
    +// Estação de temperatura e umidade: DHT22 + LCD 16x2 I2C + ESP32-S3
    +
    +#include <Wire.h>
    +#include <DHT.h>
    +#include <LiquidCrystal_I2C.h>
    +
    +#define PINO_DHT  12        // fio amarelo
    +#define TIPO_DHT  DHT22
    +#define PINO_SDA  8         // I2C padrão do ESP32-S3
    +#define PINO_SCL  9
    +
    +DHT dht(PINO_DHT, TIPO_DHT);
    +LiquidCrystal_I2C lcd(0x27, 16, 2);   // endereço, colunas, linhas
    +
    +// Símbolo de grau: 8 linhas de 5 pixels
    +byte grau[8] = { 0b01100, 0b10010, 0b10010, 0b01100, 0, 0, 0, 0 };
    +
    +void setup() {
    +  Serial.begin(115200);
    +  Wire.begin(PINO_SDA, PINO_SCL);
    +  dht.begin();
    +
    +  lcd.init();
    +  lcd.backlight();
    +  lcd.createChar(0, grau);
    +  lcd.setCursor(0, 0);
    +  lcd.print("LASER  ESP32-S3");
    +  lcd.setCursor(0, 1);
    +  lcd.print("Iniciando...");
    +  delay(2000);            // o DHT22 precisa de ~2 s para a primeira leitura
    +  lcd.clear();
    +}
    +
    +void loop() {
    +  float umidade     = dht.readHumidity();
    +  float temperatura = dht.readTemperature();
    +
    +  if (isnan(umidade) || isnan(temperatura)) {
    +    lcd.setCursor(0, 0);
    +    lcd.print("Falha no sensor ");
    +    Serial.println("Falha na leitura do DHT22");
    +  } else {
    +    lcd.setCursor(0, 0);
    +    lcd.print("Temp: ");
    +    lcd.print(temperatura, 1);
    +    lcd.write(0);           // o caractere de grau criado acima
    +    lcd.print("C   ");
    +
    +    lcd.setCursor(0, 1);
    +    lcd.print("Umid: ");
    +    lcd.print(umidade, 1);
    +    lcd.print(" %   ");
    +
    +    Serial.printf("Temperatura: %.1f C | Umidade: %.1f %%\n", temperatura, umidade);
    +  }
    +
    +  delay(2000);              // o DHT22 aceita no máximo uma leitura a cada 2 s
    +}
    +
    +
    2 KB
    + +
  • +
  • +
    +
    +
    diagram.json
    +
    O circuito: peças, posições, fios e os três resistores de pull-up.
    +
    Ver código
    {
    +  "version": 1,
    +  "author": "Lucas Rayan Guerra",
    +  "editor": "wokwi",
    +  "parts": [
    +    {
    +      "type": "board-esp32-s3-devkitc-1",
    +      "id": "esp",
    +      "top": 0,
    +      "left": 0,
    +      "attrs": {}
    +    },
    +    {
    +      "type": "wokwi-dht22",
    +      "id": "dht",
    +      "top": 15,
    +      "left": -250,
    +      "attrs": {
    +        "temperature": "26.5",
    +        "humidity": "62"
    +      }
    +    },
    +    {
    +      "type": "wokwi-lcd1602",
    +      "id": "lcd",
    +      "top": 320,
    +      "left": -60,
    +      "attrs": {
    +        "pins": "i2c"
    +      }
    +    },
    +    {
    +      "type": "wokwi-resistor",
    +      "id": "r_dht",
    +      "top": 9,
    +      "left": -173,
    +      "rotate": 90,
    +      "attrs": {
    +        "value": "10000"
    +      }
    +    },
    +    {
    +      "type": "wokwi-resistor",
    +      "id": "r_sda",
    +      "top": 9,
    +      "left": -83,
    +      "rotate": 90,
    +      "attrs": {
    +        "value": "4700"
    +      }
    +    },
    +    {
    +      "type": "wokwi-resistor",
    +      "id": "r_scl",
    +      "top": 9,
    +      "left": -63,
    +      "rotate": 90,
    +      "attrs": {
    +        "value": "4700"
    +      }
    +    }
    +  ],
    +  "connections": [
    +    [
    +      "esp:TX",
    +      "$serialMonitor:RX",
    +      "",
    +      []
    +    ],
    +    [
    +      "esp:RX",
    +      "$serialMonitor:TX",
    +      "",
    +      []
    +    ],
    +    [
    +      "lcd:VCC",
    +      "esp:5V",
    +      "red",
    +      [
    +        "h-20",
    +        "v-100"
    +      ]
    +    ],
    +    [
    +      "lcd:GND",
    +      "esp:GND.1",
    +      "black",
    +      [
    +        "h-30",
    +        "v-90"
    +      ]
    +    ],
    +    [
    +      "lcd:SDA",
    +      "esp:8",
    +      "blue",
    +      [
    +        "h-40",
    +        "v-200"
    +      ]
    +    ],
    +    [
    +      "lcd:SCL",
    +      "esp:9",
    +      "purple",
    +      [
    +        "h-50",
    +        "v-170"
    +      ]
    +    ],
    +    [
    +      "dht:VCC",
    +      "r_dht:1",
    +      "red",
    +      [
    +        "v12",
    +        "h-25",
    +        "v-159",
    +        "h100"
    +      ]
    +    ],
    +    [
    +      "dht:SDA",
    +      "esp:12",
    +      "gold",
    +      [
    +        "v77"
    +      ]
    +    ],
    +    [
    +      "dht:GND",
    +      "esp:GND.1",
    +      "black",
    +      [
    +        "v118"
    +      ]
    +    ],
    +    [
    +      "r_dht:1",
    +      "esp:3V3.1",
    +      "red",
    +      []
    +    ],
    +    [
    +      "r_dht:2",
    +      "esp:12",
    +      "gold",
    +      [
    +        "v181"
    +      ]
    +    ],
    +    [
    +      "r_sda:1",
    +      "esp:3V3.1",
    +      "red",
    +      []
    +    ],
    +    [
    +      "r_sda:2",
    +      "esp:8",
    +      "blue",
    +      [
    +        "v124"
    +      ]
    +    ],
    +    [
    +      "r_scl:1",
    +      "esp:3V3.1",
    +      "red",
    +      []
    +    ],
    +    [
    +      "r_scl:2",
    +      "esp:9",
    +      "purple",
    +      [
    +        "v152"
    +      ]
    +    ]
    +  ],
    +  "dependencies": {}
    +}
    +
    +
    2 KB
    + +
  • +
  • +
    +
    +
    libraries.txt
    +
    As bibliotecas que o Wokwi instala antes de compilar.
    +
    Ver código
    DHT sensor library
    +Adafruit Unified Sensor
    +LiquidCrystal I2C
    +
    +
    61 B
    + +
  • +
  • +
    +
    +
    scanner-i2c.ino
    +
    Diagnóstico: lista o endereço de cada dispositivo no barramento I2C.
    +
    Ver código
    // Scanner I2C: lista o endereço de cada dispositivo no barramento.
    +// Use antes do programa principal se o LCD não mostrar nada.
    +
    +#include <Wire.h>
    +
    +void setup() {
    +  Serial.begin(115200);
    +  Wire.begin(8, 9);                 // SDA, SCL
    +  delay(500);
    +
    +  Serial.println("Procurando dispositivos I2C...");
    +  int encontrados = 0;
    +  for (byte endereco = 1; endereco < 127; endereco++) {
    +    Wire.beginTransmission(endereco);
    +    if (Wire.endTransmission() == 0) {
    +      Serial.printf("Dispositivo em 0x%02X\n", endereco);
    +      encontrados++;
    +    }
    +  }
    +  if (encontrados == 0) Serial.println("Nenhum dispositivo. Confira SDA, SCL e alimentacao.");
    +}
    +
    +void loop() {}
    +
    +
    664 B
    + +
  • +
+
+
+

Imagens da simulação

+
    +
  • +
    +
    +
    circuito-wokwi.png
    +
    O circuito completo rodando no Wokwi.
    + +
    +
    44 KB
    + +
  • +
  • +
    +
    +
    lcd-funcionando.png
    +
    Teste 1: leitura normal, 26,5 °C e 62 %.
    + +
    +
    8 KB
    + +
  • +
  • +
    +
    +
    lcd-frio.png
    +
    Teste 2: temperatura negativa, −5,2 °C e 88,4 %.
    + +
    +
    8 KB
    + +
  • +
  • +
    +
    +
    lcd-falha.png
    +
    Teste 3: fio de dados desconectado, erro detectado.
    + +
    +
    7 KB
    + +
  • +
+
+
+
+ +
+
+

Como usar

+

Passo a passo

+
+
+

Apresentando os slides

+

Abra slide.html no navegador. O palco é 16:9 e se ajusta a qualquer tela ou projetor.

+
+
→←
avançar e voltar (ou clique nas metades da tela)
+
F
tela cheia
+
O
panorama com todos os slides
+
B
tela preta, para pausar a projeção
+
+
+
+

Lendo e imprimindo a apostila

+

A versão online se pagina em A4 sozinha ao abrir, o que leva alguns segundos.

+

Para papel, prefira o PDF pronto: ele já sai com margens, cores e quebras de página certas, sem configurar a impressora.

+
+
+

Rodando no Wokwi

+
  1. Abra wokwi.com/projects/new/esp32-s3. Não precisa de conta.
  2. Cole o sketch.ino e o diagram.json nas abas de mesmo nome.
  3. Em Library Manager, adicione DHT sensor library e LiquidCrystal I2C.
  4. Clique no botão verde. Com a simulação rodando, clique no DHT22 para mudar temperatura e umidade.
+ +
+
+

Montando na bancada

+
  1. Pull-up de 10 kΩ no DATA do DHT22 e de 4,7 kΩ no SDA e no SCL, todos para o 3V3.
  2. A plaquinha I2C do LCD costuma trazer pull-ups para 5 V: use um conversor de nível BSS138 ou retire esses resistores.
  3. Tela vazia? Gire o trimpot de contraste e rode o scanner-i2c.ino para conferir o endereço.
  4. Os detalhes estão no capítulo 7 da apostila.
+ +
+
+
+
+
+ +
+
+ LASER · Liga Acadêmica de Sistemas Embarcados · CIn · UFPE + Material de Lucas Rayan Guerra · uso livre para fins educacionais · contato@lucasrguerra.dev.br +
+
+ + diff --git a/public/formacoes/2/lcd-falha.png b/public/formacoes/2/lcd-falha.png new file mode 100644 index 0000000..2aa3943 Binary files /dev/null and b/public/formacoes/2/lcd-falha.png differ diff --git a/public/formacoes/2/lcd-frio.png b/public/formacoes/2/lcd-frio.png new file mode 100644 index 0000000..8b7459e Binary files /dev/null and b/public/formacoes/2/lcd-frio.png differ diff --git a/public/formacoes/2/lcd-funcionando.png b/public/formacoes/2/lcd-funcionando.png new file mode 100644 index 0000000..18bc833 Binary files /dev/null and b/public/formacoes/2/lcd-funcionando.png differ diff --git a/public/formacoes/2/modulo-2-wokwi.zip b/public/formacoes/2/modulo-2-wokwi.zip new file mode 100644 index 0000000..a529b17 Binary files /dev/null and b/public/formacoes/2/modulo-2-wokwi.zip differ diff --git a/public/formacoes/2/previa-apostila.jpg b/public/formacoes/2/previa-apostila.jpg new file mode 100644 index 0000000..c2698b3 Binary files /dev/null and b/public/formacoes/2/previa-apostila.jpg differ diff --git a/public/formacoes/2/previa-slides.jpg b/public/formacoes/2/previa-slides.jpg new file mode 100644 index 0000000..3fa2d6d Binary files /dev/null and b/public/formacoes/2/previa-slides.jpg differ diff --git a/public/formacoes/2/slide.html b/public/formacoes/2/slide.html new file mode 100644 index 0000000..f67ee4d --- /dev/null +++ b/public/formacoes/2/slide.html @@ -0,0 +1,1811 @@ + + + + + +LASER · Formação em ESP32 · Módulo 2 · Slides + + + + + + + + + + +
+ + + +
+
+ LASER + Liga Acadêmica de Sistemas Embarcados
Centro de Informática · UFPE
+
+
Formação em ESP32 · Módulo 2
+

Estação detemperatura e umidade

+

DHT22 + LCD 16x2 + ESP32-S3, simulados no Wokwi.

+
+ Lucas Rayan Guerra + Ciência Embarcada · ESPDocs
+ linkedin.com/in/lucasrguerra +
+
+ +
+
Hoje
+

Medir, processar, mostrar

+
+
+ + DHT22mede +
+
1 fio
+
+ + ESP32-S3processa +
+
I2C
+
+
Temp: 26.5°C
Umid: 62.0 %
+ LCD 16x2mostra +
+
+
+ +
+
Ao fim das duas horas
+

Isto, rodando no seu navegador

+
+
O circuito completo rodando no Wokwi, com o LCD mostrando Temp: 26.5°C e Umid: 62.0 %.
+
+
+ + + +
+
1
+
Parte um
+

O sensor DHT22

+

Dois sensores numa caixinha, um fio de dados.

+
+ +
+
1 · Sensor
+

Por que o DHT22, e não o DHT11 do módulo 1

+
+
Precisão±2 °C±0,5 °C
+
Faixa0 a 50 °C−40 a 80 °C
+
Resolução1 °C0,1 °C
+
Leituras1 por segundo1 a cada 2 s
+
DHT11DHT22
+
+
+ +
+
1 · Sensor
+

Quatro pinos, um sem uso

+
+ + + + + DHT22 + + + + + + + + + + + + + + + + + + + VCC + DATA + NC + GND + + 10 kΩ + pull-up para o 3V3 + + + GND + GPIO12 + 3V3 + + no ESP32-S3 + +
+
+ +
+
1 · Sensor
+

Uma medição = 40 bits num fio só

+
+ + + + + pede + confirma + 0 + 1 + + + 26 µs + 70 µs + + + + +
+

16 bits de umidade · 16 de temperatura · 8 de verificação

+
+ +
+
1 · Sensor
+

+ Ninguém empurra a linha para cima.
+ Quem puxa é o resistor. +

+

Sem o pull-up de 10 kΩ, a linha sobe devagar demais, os tempos saem errados e a leitura vira "Falha no sensor".

+
+ + + +
+
2
+
Parte dois
+

O display e o I2C

+

32 caracteres, 4 fios, 1 endereço.

+
+ +
+
2 · LCD
+

16 colunas × 2 linhas × (5 × 8 pontos)

+
+
+
Temp: 26.5°C
Umid: 62.0 %
+
+
+ + + + + + + + +
+
+

Cada caractere é uma grade de 5 × 8. E você pode desenhar até 8 caracteres seus.

+
+ +
+
2 · LCD
+

A plaquinha atrás do display

+
+
16fios sem a plaquinha
+
4fios com o PCF8574
VCC · GND · SDA · SCL
+
+

O trimpot azul da plaquinha ajusta o contraste. Tela vazia? Gire ele primeiro.

+
+ +
+
2 · I2C
+

Dois fios, vários dispositivos

+
+ + + ESP32 + controlador + + + SDA · dados + SCL · relógio + + + + + LCD + 0x27 + + + + + pressão + 0x76 + + + + + memória + 0x50 + + + "0x27, é com você." + só responde quem tem o endereço chamado + +
+
+ +
+
2 · I2C
+

O I2C também precisa de pull-up

+
+
DHT2210 kΩ
+
SDA4,7 kΩ
+
SCL4,7 kΩ
+
+

Os três resistores vão para o 3V3. Nunca para o 5V: os pinos do ESP32-S3 não toleram 5 V.

+
+ + + +
+
3
+
Parte três
+

O simulador Wokwi

+

Um laboratório de eletrônica no navegador. Sem instalar nada, sem conta.

+
+ +
+
3 · Wokwi
+

Um projeto = três arquivos

+
+
{ }
sketch.inoo programa
+
◫
diagram.jsonpeças e fios
+
≡
libraries.txtbibliotecas
+
+

Os três estão em formacoes/2/wokwi/, prontos para colar.

+
+ +
+
3 · Wokwi
+

Quatro passos

+
+
1Abrawokwi.com/projects/new/esp32-s3
+
2Colesketch.ino + diagram.json
+
3AdicioneDHT sensor library
LiquidCrystal I2C
+
▶Simulebotão verde
+
+
+ + + +
+
4
+
Parte quatro
+

Montagem

+

Tudo na coluna esquerda da placa.

+
+ +
+
4 · Montagem
+
+
+

O circuito

+
    +
  • 3V3 DHT22 e os 3 resistores
  • +
  • GPIO12 dados do DHT22
  • +
  • GPIO8 SDA do LCD
  • +
  • GPIO9 SCL do LCD
  • +
  • 5V VCC do LCD
  • +
  • GND sensor e LCD
  • +
+
+
Circuito completo no Wokwi.
+
+
+ + + +
+
5
+
Parte cinco
+

O programa

+

Configurar, iniciar, repetir.

+
+ +
+
5 · Código · 1 de 3
+

Configuração

+
+
#include <Wire.h>
+#include <DHT.h>
+#include <LiquidCrystal_I2C.h>
+
+#define PINO_DHT  12        // fio amarelo
+#define TIPO_DHT  DHT22
+#define PINO_SDA  8         // I2C padrão do ESP32-S3
+#define PINO_SCL  9
+
+DHT dht(PINO_DHT, TIPO_DHT);
+LiquidCrystal_I2C lcd(0x27, 16, 2);   // endereço, colunas, linhas
+
+
Mudou um fio?

Mude uma linha. Tudo que depende da montagem está no topo.

+
0x27

O endereço I2C do display.

+
+
+
+ +
+
5 · Código · 1 de 3
+

Desenhando o símbolo de grau

+
+
+
+ + + + + + +
+
0b01100
+0b10010
+0b10010
+0b01100
+0
+0
+0
+0
+
+
+
byte grau[8] = { ... };
+lcd.createChar(0, grau);
+lcd.write(0);
+

Bit 1 = ponto aceso.

+
+
+
+ +
+
5 · Código · 2 de 3
+

setup(): uma vez, ao ligar

+
+
void setup() {
+  Serial.begin(115200);
+  Wire.begin(PINO_SDA, PINO_SCL);
+  dht.begin();
+
+  lcd.init();
+  lcd.backlight();
+  lcd.createChar(0, grau);
+  lcd.setCursor(0, 0);
+  lcd.print("LASER  ESP32-S3");
+  lcd.setCursor(0, 1);
+  lcd.print("Iniciando...");
+  delay(2000);            // o DHT22 precisa de ~2 s para a primeira leitura
+  lcd.clear();
+}
+
+
LASER ESP32-S3
Iniciando...
+

A mensagem cobre os 2 s que o DHT22 leva para a primeira leitura.

+
+
+
+ +
+
5 · Código · 3 de 3
+

loop(): ler, e desconfiar da leitura

+
+
void loop() {
+  float umidade     = dht.readHumidity();
+  float temperatura = dht.readTemperature();
+
+  if (isnan(umidade) || isnan(temperatura)) {
+    lcd.setCursor(0, 0);
+    lcd.print("Falha no sensor ");
+    Serial.println("Falha na leitura do DHT22");
+  } else {
+
+
Falha no sensor
+

isnan(): a leitura falhou. Mostre o erro, não um número inventado.

+
+
+
+ +
+
5 · Código · 3 de 3
+

loop(): mostrar, e esperar 2 segundos

+
+
lcd.setCursor(0, 0);
+lcd.print("Temp: ");
+lcd.print(temperatura, 1);
+lcd.write(0);           // o caractere de grau criado acima
+lcd.print("C   ");
+
+lcd.setCursor(0, 1);
+lcd.print("Umid: ");
+lcd.print(umidade, 1);
+lcd.print(" %   ");
+
+// ... envia o mesmo texto pelo Serial ...
+
+delay(2000);   // 1 leitura a cada 2 s
+
+
Temp: 26.5°C
Umid: 62.0 %
+

Os espaços em "C   " apagam as sobras da leitura anterior.

+
+
+
+ +
+
5 · Código
+

Três testes, três telas

+
+
LCD: Temp 26.5°C, Umid 62.0 %
Sala 26,5 °C · 62 %
+
LCD: Temp -5.2°C, Umid 88.4 %
Frio −5,2 °C · 88,4 %
+
LCD: Falha no sensor
Fio solto erro detectado
+
+

Na simulação, clique no DHT22 e mova os controles de temperatura e umidade.

+
+ + + +
+
6
+
Parte seis
+

Da tela para a bancada

+

O que o Wokwi perdoa e o hardware não.

+
+ +
+
6 · Bancada
+

A plaquinha I2C traz pull-ups para 5 V

+
+
+
≈ 4 V
+

no GPIO, com a plaquinha em 5 V,
mesmo com os 4,7 kΩ para 3V3

+ ✗ fora da especificação +
+
+
3,3 V
+

Conversor de nível BSS138
ou remover os pull-ups da plaquinha

+ ✓ seguro +
+
+

Teste: multímetro entre SDA e VCC da plaquinha. Entre 2 e 10 kΩ, há um pull-up.

+
+ +
+
6 · Bancada
+

Tela vazia? Descubra o endereço

+
+
for (byte endereco = 1; endereco < 127; endereco++) {
+  Wire.beginTransmission(endereco);
+  if (Wire.endTransmission() == 0) {
+    Serial.printf("Dispositivo em 0x%02X\n", endereco);
+    encontrados++;
+  }
+}
+
+
Procurando dispositivos I2C...
+Dispositivo em 0x27
+

Saída real no Wokwi.
Na sua placa pode aparecer 0x3F.

+
+
+
+ +
+
6 · Bancada
+

Quando não funciona

+
+
Falha no sensor
"Falha no sensor"

Pull-up de 10 kΩ, fio no GPIO12, VCC e GND.

+
Aceso e vazio

Contraste, endereço, ou SDA e SCL trocados.

+
████████████████
Linha de blocos

A energia chegou, o I2C não.

+
Tudo apagado

Falta o 5V ou o lcd.backlight().

+
+
+ +
+
Fechamento
+

Desafios

+
+
↕
Mín e máx

Guarde a menor e a maior temperatura desde que a placa ligou.

+
!
Alerta

Acenda o LED RGB do GPIO38 acima de 30 °C.

+
≈
Sensação

Mostre o índice de calor com computeHeatIndex().

+
⏱
Sem delay

Reescreva o loop() usando millis().

+
+
+ +
+
+ LASER + Liga Acadêmica de Sistemas Embarcados
Centro de Informática · UFPE
+
+
Módulo 2 · Encerramento
+

Obrigado.Perguntas?

+

+ Apostila, código e arquivos do Wokwi em espdocs.cienciaembarcada.com.br/formacoes/2. +

+
+ Lucas Rayan Guerra + contato@lucasrguerra.dev.br
+ linkedin.com/in/lucasrguerra
+ espdocs.cienciaembarcada.com.br +
+
+ +
+ + + + + +
+ ← → navegar + O panorama + F tela cheia + B tela preta +
+ + + + + diff --git a/public/formacoes/2/wokwi/diagram.json b/public/formacoes/2/wokwi/diagram.json new file mode 100644 index 0000000..b2faa1a --- /dev/null +++ b/public/formacoes/2/wokwi/diagram.json @@ -0,0 +1,183 @@ +{ + "version": 1, + "author": "Lucas Rayan Guerra", + "editor": "wokwi", + "parts": [ + { + "type": "board-esp32-s3-devkitc-1", + "id": "esp", + "top": 0, + "left": 0, + "attrs": {} + }, + { + "type": "wokwi-dht22", + "id": "dht", + "top": 15, + "left": -250, + "attrs": { + "temperature": "26.5", + "humidity": "62" + } + }, + { + "type": "wokwi-lcd1602", + "id": "lcd", + "top": 320, + "left": -60, + "attrs": { + "pins": "i2c" + } + }, + { + "type": "wokwi-resistor", + "id": "r_dht", + "top": 9, + "left": -173, + "rotate": 90, + "attrs": { + "value": "10000" + } + }, + { + "type": "wokwi-resistor", + "id": "r_sda", + "top": 9, + "left": -83, + "rotate": 90, + "attrs": { + "value": "4700" + } + }, + { + "type": "wokwi-resistor", + "id": "r_scl", + "top": 9, + "left": -63, + "rotate": 90, + "attrs": { + "value": "4700" + } + } + ], + "connections": [ + [ + "esp:TX", + "$serialMonitor:RX", + "", + [] + ], + [ + "esp:RX", + "$serialMonitor:TX", + "", + [] + ], + [ + "lcd:VCC", + "esp:5V", + "red", + [ + "h-20", + "v-100" + ] + ], + [ + "lcd:GND", + "esp:GND.1", + "black", + [ + "h-30", + "v-90" + ] + ], + [ + "lcd:SDA", + "esp:8", + "blue", + [ + "h-40", + "v-200" + ] + ], + [ + "lcd:SCL", + "esp:9", + "purple", + [ + "h-50", + "v-170" + ] + ], + [ + "dht:VCC", + "r_dht:1", + "red", + [ + "v12", + "h-25", + "v-159", + "h100" + ] + ], + [ + "dht:SDA", + "esp:12", + "gold", + [ + "v77" + ] + ], + [ + "dht:GND", + "esp:GND.1", + "black", + [ + "v118" + ] + ], + [ + "r_dht:1", + "esp:3V3.1", + "red", + [] + ], + [ + "r_dht:2", + "esp:12", + "gold", + [ + "v181" + ] + ], + [ + "r_sda:1", + "esp:3V3.1", + "red", + [] + ], + [ + "r_sda:2", + "esp:8", + "blue", + [ + "v124" + ] + ], + [ + "r_scl:1", + "esp:3V3.1", + "red", + [] + ], + [ + "r_scl:2", + "esp:9", + "purple", + [ + "v152" + ] + ] + ], + "dependencies": {} +} \ No newline at end of file diff --git a/public/formacoes/2/wokwi/libraries.txt b/public/formacoes/2/wokwi/libraries.txt new file mode 100644 index 0000000..56bdba5 --- /dev/null +++ b/public/formacoes/2/wokwi/libraries.txt @@ -0,0 +1,3 @@ +DHT sensor library +Adafruit Unified Sensor +LiquidCrystal I2C diff --git a/public/formacoes/2/wokwi/scanner-i2c.ino b/public/formacoes/2/wokwi/scanner-i2c.ino new file mode 100644 index 0000000..e78b7a7 --- /dev/null +++ b/public/formacoes/2/wokwi/scanner-i2c.ino @@ -0,0 +1,23 @@ +// Scanner I2C: lista o endereço de cada dispositivo no barramento. +// Use antes do programa principal se o LCD não mostrar nada. + +#include + +void setup() { + Serial.begin(115200); + Wire.begin(8, 9); // SDA, SCL + delay(500); + + Serial.println("Procurando dispositivos I2C..."); + int encontrados = 0; + for (byte endereco = 1; endereco < 127; endereco++) { + Wire.beginTransmission(endereco); + if (Wire.endTransmission() == 0) { + Serial.printf("Dispositivo em 0x%02X\n", endereco); + encontrados++; + } + } + if (encontrados == 0) Serial.println("Nenhum dispositivo. Confira SDA, SCL e alimentacao."); +} + +void loop() {} diff --git a/public/formacoes/2/wokwi/sketch.ino b/public/formacoes/2/wokwi/sketch.ino new file mode 100644 index 0000000..ed1a04c --- /dev/null +++ b/public/formacoes/2/wokwi/sketch.ino @@ -0,0 +1,59 @@ +// Formação em ESP32 · LASER · Módulo 2 +// Estação de temperatura e umidade: DHT22 + LCD 16x2 I2C + ESP32-S3 + +#include +#include +#include + +#define PINO_DHT 12 // fio amarelo +#define TIPO_DHT DHT22 +#define PINO_SDA 8 // I2C padrão do ESP32-S3 +#define PINO_SCL 9 + +DHT dht(PINO_DHT, TIPO_DHT); +LiquidCrystal_I2C lcd(0x27, 16, 2); // endereço, colunas, linhas + +// Símbolo de grau: 8 linhas de 5 pixels +byte grau[8] = { 0b01100, 0b10010, 0b10010, 0b01100, 0, 0, 0, 0 }; + +void setup() { + Serial.begin(115200); + Wire.begin(PINO_SDA, PINO_SCL); + dht.begin(); + + lcd.init(); + lcd.backlight(); + lcd.createChar(0, grau); + lcd.setCursor(0, 0); + lcd.print("LASER ESP32-S3"); + lcd.setCursor(0, 1); + lcd.print("Iniciando..."); + delay(2000); // o DHT22 precisa de ~2 s para a primeira leitura + lcd.clear(); +} + +void loop() { + float umidade = dht.readHumidity(); + float temperatura = dht.readTemperature(); + + if (isnan(umidade) || isnan(temperatura)) { + lcd.setCursor(0, 0); + lcd.print("Falha no sensor "); + Serial.println("Falha na leitura do DHT22"); + } else { + lcd.setCursor(0, 0); + lcd.print("Temp: "); + lcd.print(temperatura, 1); + lcd.write(0); // o caractere de grau criado acima + lcd.print("C "); + + lcd.setCursor(0, 1); + lcd.print("Umid: "); + lcd.print(umidade, 1); + lcd.print(" % "); + + Serial.printf("Temperatura: %.1f C | Umidade: %.1f %%\n", temperatura, umidade); + } + + delay(2000); // o DHT22 aceita no máximo uma leitura a cada 2 s +} diff --git a/public/formacoes/assets/viewer.css b/public/formacoes/assets/viewer.css new file mode 100644 index 0000000..98f91be --- /dev/null +++ b/public/formacoes/assets/viewer.css @@ -0,0 +1,252 @@ +/* ========================================================================= + Página de entrada de cada formação (/formacoes/N). + + Mesma identidade dos slides: base escura tirada do prussiano da marca, o + feixe como traço de assinatura e as três famílias tipográficas da LASER. + A página é gerada por scripts/formacoes-viewer.mjs a partir do + formacao.json de cada pasta; não edite o index.html à mão. + ========================================================================= */ + +:root { + color-scheme: dark; + + --breu: #041d2b; + --breu-2: #06283a; + --breu-3: #0a3a53; + --prussiano: #003049; + --vermelho: #D62828; + --laranja: #F77F00; + --ambar: #FCBF49; + --creme: #EAE2B7; + + --gelo: #f2f8fb; + --texto: #cddde6; + --texto-2: #93aebd; + --linha: rgba(146, 187, 207, 0.18); + --linha-forte: rgba(146, 187, 207, 0.38); + --painel: rgba(255, 255, 255, 0.04); + --painel-2: rgba(255, 255, 255, 0.07); + + --feixe: linear-gradient(90deg, #1b6d92, var(--creme), var(--ambar), var(--laranja), var(--vermelho)); + + --display: "Outfit", system-ui, sans-serif; + --corpo: "Inter", system-ui, sans-serif; + --mono: "JetBrains Mono", ui-monospace, monospace; + + --largura: 1120px; +} + +* { box-sizing: border-box; } + +html { scroll-behavior: smooth; } + +body { + margin: 0; + background: var(--breu); + color: var(--texto); + font-family: var(--corpo); + font-size: 16px; + line-height: 1.6; + -webkit-font-smoothing: antialiased; +} + +body::before { + content: ""; + position: fixed; + inset: 0; + pointer-events: none; + z-index: -1; + background: + radial-gradient(50% 40% at 85% 0%, rgba(252, 191, 73, 0.10), transparent 70%), + radial-gradient(45% 45% at 0% 100%, rgba(0, 48, 73, 0.6), transparent 70%); +} + +a { color: var(--ambar); text-decoration-thickness: 1px; text-underline-offset: 3px; } +a:hover { color: var(--creme); } +:focus-visible { outline: 2px solid var(--ambar); outline-offset: 3px; border-radius: 6px; } + +code, kbd { + font-family: var(--mono); + font-size: 0.86em; + padding: 0.1em 0.42em; + border-radius: 5px; + background: var(--painel-2); + border: 1px solid var(--linha); + color: var(--gelo); +} +kbd { border-bottom-width: 2px; } + +.envoltorio { max-width: var(--largura); margin: 0 auto; padding: 0 24px; } + +/* ------------------------------------------------------------------------- + Barra do topo + ------------------------------------------------------------------------- */ + +.topo { border-bottom: 1px solid var(--linha); } +.topo .envoltorio { display: flex; align-items: center; gap: 16px; min-height: 68px; } +.topo img { height: 26px; display: block; } +.topo-liga { font-family: var(--mono); font-size: 11px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--texto-2); line-height: 1.4; border-left: 1px solid var(--linha-forte); padding-left: 16px; } +.topo nav { margin-left: auto; display: flex; gap: 20px; } +.topo nav a { color: var(--texto); text-decoration: none; font-size: 14px; } +.topo nav a:hover { color: var(--ambar); } + +/* ------------------------------------------------------------------------- + Abertura + ------------------------------------------------------------------------- */ + +.abertura { padding: 64px 0 56px; } +.abertura .envoltorio { display: grid; grid-template-columns: 1.25fr 0.75fr; gap: 48px; align-items: center; } + +.selo { + display: inline-flex; gap: 10px; align-items: center; + font-family: var(--mono); font-size: 12px; font-weight: 600; letter-spacing: 0.2em; text-transform: uppercase; + color: var(--ambar); +} +.selo::after { content: ""; width: 48px; height: 1px; background: var(--ambar); opacity: 0.5; } + +h1 { + font-family: var(--display); + font-weight: 300; + font-size: clamp(38px, 5.4vw, 60px); + line-height: 1.04; + letter-spacing: -0.02em; + color: var(--gelo); + margin: 18px 0 18px; +} +h1 strong { display: block; font-weight: 800; } + +.abertura-sub { font-size: 18px; color: var(--texto); max-width: 54ch; margin: 0 0 24px; } + +.fichas { display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 30px; padding: 0; list-style: none; } +.fichas li { font-size: 13px; padding: 5px 12px; border-radius: 999px; border: 1px solid var(--linha-forte); color: var(--texto); background: var(--painel); } +.fichas li b { color: var(--gelo); font-weight: 600; } + +.acoes { display: flex; flex-wrap: wrap; gap: 12px; } + +.botao { + display: inline-flex; align-items: center; gap: 10px; + padding: 12px 20px; border-radius: 10px; + font-family: var(--corpo); font-weight: 600; font-size: 15px; text-decoration: none; + border: 1px solid var(--linha-forte); color: var(--gelo); background: var(--painel); + transition: background 0.15s, border-color 0.15s, transform 0.15s; +} +.botao:hover { background: var(--painel-2); border-color: var(--ambar); color: var(--gelo); transform: translateY(-1px); } +.botao svg { width: 18px; height: 18px; flex: none; } +.botao.primario { background: var(--ambar); border-color: var(--ambar); color: #1d1300; } +.botao.primario:hover { background: var(--creme); border-color: var(--creme); color: #1d1300; } +.botao.pequeno { padding: 8px 14px; font-size: 14px; } + +/* Pilha das duas prévias: o slide na frente, a apostila atrás. */ +.previas { position: relative; aspect-ratio: 4 / 3.3; } +.previas a { position: absolute; display: block; border-radius: 10px; overflow: hidden; box-shadow: 0 24px 60px rgba(0, 0, 0, 0.55); border: 1px solid var(--linha-forte); transition: transform 0.2s; } +.previas img { display: block; width: 100%; height: auto; } +.previas .p-apostila { width: 46%; right: 0; top: 0; transform: rotate(4deg); } +.previas .p-slides { width: 88%; left: 0; bottom: 6%; } +.previas a:hover { transform: translateY(-4px) rotate(0deg); z-index: 2; } + +.feixe { height: 3px; background: var(--feixe); border: 0; margin: 0; } + +/* ------------------------------------------------------------------------- + Seções + ------------------------------------------------------------------------- */ + +section.bloco { padding: 64px 0 8px; } + +.rotulo { + font-family: var(--mono); font-size: 12px; font-weight: 600; letter-spacing: 0.2em; text-transform: uppercase; + color: var(--ambar); margin: 0 0 8px; +} +h2 { font-family: var(--display); font-weight: 700; font-size: 32px; line-height: 1.15; color: var(--gelo); margin: 0 0 8px; letter-spacing: -0.01em; } +.bloco-sub { color: var(--texto-2); margin: 0 0 28px; max-width: 70ch; } +h3 { font-family: var(--display); font-weight: 700; font-size: 20px; color: var(--gelo); margin: 0 0 6px; } + +/* Três portas de entrada. */ +.portas { display: grid; grid-template-columns: repeat(3, 1fr); gap: 18px; } +.porta { display: flex; flex-direction: column; border: 1px solid var(--linha); border-radius: 14px; background: var(--painel); overflow: hidden; } +.porta-imagem { aspect-ratio: 16 / 9; background: var(--breu-2); border-bottom: 1px solid var(--linha); overflow: hidden; display: grid; place-items: center; } +.porta-imagem img { width: 100%; height: 100%; object-fit: cover; object-position: top; display: block; } +.porta-imagem.clara img { object-fit: contain; background: #2f2f2f; } +.porta-corpo { padding: 20px 20px 22px; display: flex; flex-direction: column; gap: 10px; flex: 1; } +.porta-corpo p { margin: 0; color: var(--texto); font-size: 15px; } +.porta-meta { font-family: var(--mono); font-size: 12px; color: var(--texto-2); letter-spacing: 0.04em; } +.porta .acoes { margin-top: auto; padding-top: 6px; gap: 8px; } + +/* Lista de arquivos. */ +.grupo-arquivos { margin: 0 0 30px; } +.grupo-arquivos h3 { font-size: 14px; font-family: var(--mono); letter-spacing: 0.16em; text-transform: uppercase; color: var(--texto-2); font-weight: 600; margin: 0 0 10px; } +.arquivos { list-style: none; margin: 0; padding: 0; border: 1px solid var(--linha); border-radius: 12px; overflow: hidden; } +.arquivo { display: grid; grid-template-columns: 44px minmax(0, 1fr) auto auto; gap: 16px; align-items: center; padding: 14px 18px; background: var(--painel); } +.arquivo + .arquivo { border-top: 1px solid var(--linha); } +.arquivo:hover { background: var(--painel-2); } +.icone { width: 44px; height: 44px; border-radius: 10px; display: grid; place-items: center; background: var(--breu-3); color: var(--ambar); } +.icone svg { width: 22px; height: 22px; } +.icone.pdf { color: #ff8b8b; background: rgba(214, 40, 40, 0.14); } +.icone.codigo { color: #6fdcb0; background: rgba(111, 220, 176, 0.1); } +.icone.imagem { color: #7cc4ff; background: rgba(78, 168, 255, 0.12); } +.arquivo-nome { font-family: var(--mono); font-size: 14.5px; color: var(--gelo); font-weight: 600; word-break: break-all; } +.arquivo-desc { font-size: 14px; color: var(--texto-2); margin-top: 2px; } +.arquivo-tam { font-family: var(--mono); font-size: 12.5px; color: var(--texto-2); white-space: nowrap; text-align: right; } +.arquivo-acoes { display: flex; gap: 6px; } +.arquivo-acoes a { font-size: 13px; font-weight: 600; text-decoration: none; padding: 6px 12px; border-radius: 8px; border: 1px solid var(--linha-forte); color: var(--gelo); white-space: nowrap; } +.arquivo-acoes a:hover { border-color: var(--ambar); color: var(--ambar); } + +/* Código embutido: .ino e .txt costumam baixar em vez de abrir, então o + conteúdo vem na própria página. */ +.codigo-fonte { margin-top: 8px; } +.codigo-fonte summary { cursor: pointer; font-size: 13px; font-weight: 600; color: var(--ambar); width: max-content; } +.codigo-fonte pre { margin: 10px 0 0; max-height: 420px; overflow: auto; padding: 14px 16px; border-radius: 10px; background: rgba(0, 14, 22, 0.7); border: 1px solid var(--linha); border-left: 3px solid var(--laranja); font-family: var(--mono); font-size: 13px; line-height: 1.55; color: #dbeaf2; tab-size: 2; } +.codigo-fonte pre code { background: none; border: 0; padding: 0; font-size: inherit; } + +/* Como usar. */ +.guias { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px; } +.guia { border: 1px solid var(--linha); border-radius: 14px; padding: 22px 22px 18px; background: var(--painel); } +.guia ol, .guia ul { margin: 10px 0 0; padding-left: 20px; } +.guia li { margin: 6px 0; font-size: 15px; } +.guia li::marker { color: var(--ambar); font-family: var(--mono); } +.guia p { margin: 8px 0 0; font-size: 15px; } +.atalhos { display: grid; grid-template-columns: auto 1fr; gap: 8px 14px; margin-top: 12px; font-size: 14.5px; align-items: center; } +.atalhos dt { display: flex; gap: 4px; } +.atalhos dd { margin: 0; color: var(--texto); } + +/* Roteiro da aula. */ +.roteiro { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 12px; counter-reset: parte; } +.roteiro a { display: flex; gap: 14px; align-items: baseline; padding: 14px 16px; border-radius: 12px; border: 1px solid var(--linha); background: var(--painel); text-decoration: none; color: var(--texto); height: 100%; } +.roteiro a:hover { border-color: var(--ambar); background: var(--painel-2); } +.roteiro b { font-family: var(--display); font-size: 26px; line-height: 1; color: var(--ambar); min-width: 1.4em; } +.roteiro span { font-weight: 600; color: var(--gelo); } +.roteiro small { display: block; font-family: var(--mono); font-size: 12px; color: var(--texto-2); font-weight: 400; margin-top: 2px; } + +/* Hub /formacoes. */ +.formacoes { display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: 22px; } + +/* Rodapé. */ +.rodape { margin-top: 80px; border-top: 1px solid var(--linha); padding: 28px 0 40px; font-size: 14px; color: var(--texto-2); } +.rodape .envoltorio { display: flex; flex-wrap: wrap; gap: 12px 32px; justify-content: space-between; } +.rodape strong { color: var(--texto); } + +/* ------------------------------------------------------------------------- + Telas menores + ------------------------------------------------------------------------- */ + +@media (max-width: 900px) { + .abertura { padding: 40px 0; } + .abertura .envoltorio { grid-template-columns: 1fr; gap: 40px; } + .previas { max-width: 520px; } + .portas, .guias { grid-template-columns: 1fr; } +} + +@media (max-width: 640px) { + .envoltorio { padding: 0 16px; } + .topo-liga { display: none; } + .topo nav { gap: 14px; } + .arquivo { grid-template-columns: 40px minmax(0, 1fr); row-gap: 10px; padding: 14px; } + .icone { width: 40px; height: 40px; } + .arquivo-tam { grid-column: 2; text-align: left; } + .arquivo-acoes { grid-column: 2; } + h2 { font-size: 26px; } +} + +@media (prefers-reduced-motion: reduce) { + html { scroll-behavior: auto; } + .botao, .previas a { transition: none; } +} diff --git a/public/formacoes/index.html b/public/formacoes/index.html new file mode 100644 index 0000000..7fedcd3 --- /dev/null +++ b/public/formacoes/index.html @@ -0,0 +1,72 @@ + + + + + +LASER · Formação em ESP32 + + + + + + + + + + + +
+
+ LASER + Liga Acadêmica de Sistemas Embarcados
Centro de Informática · UFPE
+ +
+
+ +
+
+
+
+
Formação em ESP32
+

Material dasformações da LASER

+

Slides, apostilas e arquivos de prática de cada módulo, para acompanhar a aula, revisar depois ou imprimir.

+
+
+
+
+
+
+

Módulos

+

2 formações disponíveis

+
+
+ +
+
MÓDULO 1 · 3 HORAS
+

Conhecendo a família ESP32

+

Do silício à bancada: como esses microcontroladores funcionam por dentro, o que cada uma das doze séries faz e não faz, e como escolher o chip certo. Termina com um DHT11 lendo temperatura e umidade num ESP32-S3.

+ +
+
+
+ +
+
MÓDULO 2 · 2 HORAS
+

Estação de temperatura e umidade

+

Um DHT22, um display LCD 16x2 e um ESP32-S3, simulados no Wokwi com o framework Arduino. Dois protocolos de comunicação, um programa curto e os cuidados elétricos que fazem o circuito funcionar também fora da tela.

+ +
+
+
+
+
+
+ +
+
+ LASER · Liga Acadêmica de Sistemas Embarcados · CIn · UFPE + Material de Lucas Rayan Guerra · uso livre para fins educacionais · contato@lucasrguerra.dev.br +
+
+ + diff --git a/scripts/formacoes-viewer.mjs b/scripts/formacoes-viewer.mjs new file mode 100644 index 0000000..2640150 --- /dev/null +++ b/scripts/formacoes-viewer.mjs @@ -0,0 +1,352 @@ +/** + * Gera a página de entrada de cada formação e a lista geral de formações. + * + * npm run formacoes-viewer + * + * Cada pasta public/formacoes/N/ descreve o próprio material num + * formacao.json. Daqui saem: + * public/formacoes/N/index.html a página servida em /formacoes/N + * public/formacoes/index.html a lista servida em /formacoes + * + * O que dá para medir não fica no JSON: tamanho de cada arquivo, número de + * páginas dos PDFs e o roteiro da aula, lido das aberturas de seção do + * slide.html. Assim a página não desatualiza quando o material muda. + * + * Os links são absolutos (/formacoes/N/...) porque o middleware serve a + * página em /formacoes/N, sem barra final, e um link relativo apontaria para + * a pasta de cima. + */ + +import fs from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const raiz = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); +const pastaFormacoes = path.join(raiz, "public", "formacoes"); + +const esc = (s) => String(s).replace(/&/g, "&").replace(//g, ">").replace(/"/g, """); + +function tamanho(bytes) { + if (bytes < 1024) return `${bytes} B`; + if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)} KB`; + return `${(bytes / 1024 / 1024).toFixed(1).replace(".", ",")} MB`; +} + +/* Conta os objetos /Type /Page de um PDF. Basta para os PDFs do Chrome, que + não comprimem a árvore de páginas. */ +function paginasPdf(arquivo) { + const bruto = fs.readFileSync(arquivo, "latin1"); + return (bruto.match(/\/Type\s*\/Page(?![s\w])/g) || []).length; +} + +/* As aberturas de seção do slide.html viram o roteiro da aula, cada uma com + link para o slide em que começa. */ +function roteiro(pasta) { + const html = fs.readFileSync(path.join(pasta, "slide.html"), "utf8"); + const slides = [...html.matchAll(/
]*data-titulo="([^"]*)"/g)]; + const partes = []; + slides.forEach((m, i) => { + if (!/\bsecao\b/.test(m[1])) return; + partes.push({ indice: i + 1, titulo: m[2].replace(/^§\d+\s*·\s*/, "") }); + }); + partes.forEach((p, i) => { + const fim = i + 1 < partes.length ? partes[i + 1].indice - 1 : slides.length; + p.quantos = fim - p.indice + 1; + }); + return { partes, total: slides.length }; +} + +const ICONES = { + slides: '', + apostila: '', + pdf: '', + codigo: '', + zip: '', + imagem: '', + fritzing: '', + seta: '', + baixar: '', + tocar: '', + livro: '', +}; +const icone = (nome) => ``; +const CLASSE_ICONE = { pdf: "pdf", codigo: "codigo", zip: "codigo", imagem: "imagem" }; + +const cabecalho = (titulo, descricao) => ` + + + + +${esc(titulo)} + + + + + + + + + + +`; + +const topo = (nav) => ` +
+
+ LASER + Liga Acadêmica de Sistemas Embarcados
Centro de Informática · UFPE
+ +
+
`; + +const rodape = ` +
+
+ LASER · Liga Acadêmica de Sistemas Embarcados · CIn · UFPE + Material de Lucas Rayan Guerra · uso livre para fins educacionais · contato@lucasrguerra.dev.br +
+
+ + +`; + +function paginaFormacao(pasta, dados) { + const n = dados.modulo; + const base = `/formacoes/${n}`; + const url = (arq) => (/^https?:/.test(arq) ? arq : `${base}/${arq}`); + const info = (arq) => { + const caminho = path.join(pasta, arq); + if (!fs.existsSync(caminho)) throw new Error(`formacao ${n}: não achei ${arq}`); + const bytes = fs.statSync(caminho).size; + const paginas = arq.endsWith(".pdf") ? paginasPdf(caminho) : 0; + return { bytes, paginas }; + }; + const { partes, total } = roteiro(pasta); + const pdfSlides = `LASER-ESP32-Modulo-${n}-Slides.pdf`; + const pdfApostila = `LASER-ESP32-Modulo-${n}-Apostila.pdf`; + const iSlides = info(pdfSlides); + const iApostila = info(pdfApostila); + + const fichas = dados.fichas.map(([k, v]) => `
  • ${esc(k)}: ${esc(v)}
  • `).join(""); + const acao = ([rotulo, arq, baixar], primario) => + `${icone(baixar ? "baixar" : "seta")}${esc(rotulo)}`; + + const grupos = dados.grupos.map((g) => { + const itens = g.arquivos.map((a) => { + const { bytes, paginas } = info(a.arquivo); + const nome = path.basename(a.arquivo); + const meta = paginas ? `${paginas} págs · ${tamanho(bytes)}` : tamanho(bytes); + const botoes = []; + if (a.tipo === "codigo") { + botoes.push(`Baixar`); + } else { + if (a.abrir) botoes.push(`Abrir`); + if (a.baixar) botoes.push(`Baixar`); + } + let codigo = ""; + if (a.tipo === "codigo") { + const fonte = fs.readFileSync(path.join(pasta, a.arquivo), "utf8"); + codigo = `
    Ver código
    ${esc(fonte.trimEnd())}
    `; + } + return ` +
  • +
    ${icone(a.tipo)}
    +
    +
    ${esc(nome)}
    +
    ${a.descricao}
    + ${codigo} +
    +
    ${meta}
    +
    ${botoes.join("")}
    +
  • `; + }).join(""); + return ` +
    +

    ${esc(g.titulo)}

    +
      ${itens} +
    +
    `; + }).join(""); + + const guias = [ + `
    +

    Apresentando os slides

    +

    Abra slide.html no navegador. O palco é 16:9 e se ajusta a qualquer tela ou projetor.

    +
    +
    →←
    avançar e voltar (ou clique nas metades da tela)
    +
    F
    tela cheia
    +
    O
    panorama com todos os slides
    +
    B
    tela preta, para pausar a projeção
    +
    +
    `, + `
    +

    Lendo e imprimindo a apostila

    +

    A versão online se pagina em A4 sozinha ao abrir, o que leva alguns segundos.

    +

    Para papel, prefira o PDF pronto: ele já sai com margens, cores e quebras de página certas, sem configurar a impressora.

    +
    `, + ...dados.guias.map((g) => `
    +

    ${esc(g.titulo)}

    + ${g.itens ? `
      ${g.itens.map((i) => `
    1. ${i}
    2. `).join("")}
    ` : ""} + ${g.texto ? `

    ${g.texto}

    ` : ""} +
    `), + ].join("\n\t\t"); + + const listaRoteiro = partes.map((p, i) => ` +
  • ${i + 1}${esc(p.titulo)}slide ${p.indice} · ${p.quantos} slide${p.quantos > 1 ? "s" : ""}
  • `).join(""); + + const titulo = `LASER · Formação em ESP32 · Módulo ${n}: ${dados.titulo.join(" ")}`; + + return cabecalho(titulo, dados.descricao) + topo(`ArquivosComo usarFormações`) + ` + +
    +
    +
    +
    +
    Formação em ESP32 · Módulo ${n}
    +

    ${esc(dados.titulo[0])}${esc(dados.titulo[1])}

    +

    ${esc(dados.subtitulo)}

    +
      ${fichas}
    + +
    +
    + Capa da apostila do módulo ${n} + Capa dos slides do módulo ${n} +
    +
    +
    +
    + +
    +
    +

    Comece por aqui

    +

    Três formas de usar este material

    +

    Para apresentar, para estudar e para pôr a mão no circuito. Os PDFs são a versão final, para quem só quer o material pronto.

    +
    + +
    + +
    +

    Apostila

    +

    O conteúdo completo, com explicações, tabelas e o código comentado, paginado em A4.

    +
    PDF · ${iApostila.paginas} págs · ${tamanho(iApostila.bytes)}
    + +
    +
    +
    + +
    +

    ${esc(dados.pratica.titulo)}

    +

    ${esc(dados.pratica.texto)}

    +
    ${esc(dados.pratica.meta)}
    +
    ${dados.pratica.acoes.map((a, i) => acao(a, i === 0)).join("")}
    +
    +
    +
    +
    +
    + +
    +
    +

    Roteiro da aula

    +

    ${partes.length} partes, ${total} slides

    +

    Cada parte abre os slides direto no ponto em que ela começa.

    +
      ${listaRoteiro} +
    +
    +
    + +
    +
    +

    Todos os arquivos

    +

    O que tem nesta formação

    +

    Tudo o que foi usado na aula, com o que é cada arquivo e para que serve.

    + ${grupos} +
    +
    + +
    +
    +

    Como usar

    +

    Passo a passo

    +
    + ${guias} +
    +
    +
    +
    +` + rodape; +} + +function paginaLista(formacoes) { + const cartoes = formacoes.map(({ dados }) => { + const base = `/formacoes/${dados.modulo}`; + const duracao = (dados.fichas.find(([k]) => k === "Duração") || [])[1]; + return ` +
    + +
    +
    MÓDULO ${dados.modulo}${duracao ? ` · ${esc(duracao.toUpperCase())}` : ""}
    +

    ${esc(dados.titulo.join(" "))}

    +

    ${esc(dados.subtitulo)}

    + +
    +
    `; + }).join(""); + + return cabecalho("LASER · Formação em ESP32", "Slides, apostilas e arquivos de prática da formação em ESP32 da LASER, Liga Acadêmica de Sistemas Embarcados da UFPE.") + topo(`Módulos`) + ` + +
    +
    +
    +
    +
    Formação em ESP32
    +

    Material dasformações da LASER

    +

    Slides, apostilas e arquivos de prática de cada módulo, para acompanhar a aula, revisar depois ou imprimir.

    +
    +
    +
    +
    +
    +
    +

    Módulos

    +

    ${formacoes.length} formações disponíveis

    +
    ${cartoes} +
    +
    +
    +
    +` + rodape; +} + +const formacoes = fs.readdirSync(pastaFormacoes) + .filter((d) => /^\d+$/.test(d) && fs.existsSync(path.join(pastaFormacoes, d, "formacao.json"))) + .sort((a, b) => a - b) + .map((d) => { + const pasta = path.join(pastaFormacoes, d); + return { pasta, dados: JSON.parse(fs.readFileSync(path.join(pasta, "formacao.json"), "utf8")) }; + }); + +for (const { pasta, dados } of formacoes) { + fs.writeFileSync(path.join(pasta, "index.html"), paginaFormacao(pasta, dados)); + console.log(`public/formacoes/${dados.modulo}/index.html`); +} +fs.writeFileSync(path.join(pastaFormacoes, "index.html"), paginaLista(formacoes)); +console.log("public/formacoes/index.html"); diff --git a/scripts/slides-pdf.mjs b/scripts/slides-pdf.mjs index 2662969..c5b53b1 100644 --- a/scripts/slides-pdf.mjs +++ b/scripts/slides-pdf.mjs @@ -1,12 +1,13 @@ /** - * Exporta os slides de uma formação para PDF em 16:9 exato. + * Exporta o material de uma formação para PDF: os slides em 16:9 exato e a + * apostila em A4, já paginada pelo Paged.js. * * npm run slides-pdf → módulo 1 * npm run slides-pdf -- 2 → módulo 2 * - * A página do PDF tem 1280 x 720 px (338,667 x 190,5 mm), a mesma caixa do - * palco do slide.html, então nada é reescalado nem cortado. Sai um arquivo por - * formação, ao lado do próprio slide.html. + * A página do PDF dos slides tem 1280 x 720 px (338,667 x 190,5 mm), a mesma + * caixa do palco do slide.html, então nada é reescalado nem cortado. Os dois + * arquivos saem ao lado do slide.html e da apostila.html da formação. * * Existe porque a caixa de impressão do navegador depende de o usuário lembrar * de marcar "gráficos de segundo plano" e "margens: nenhuma". Aqui isso é fixo. @@ -22,6 +23,7 @@ const raiz = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); const modulo = (process.argv[2] || "1").replace(/\D/g, "") || "1"; const pastaModulo = path.join(raiz, "public", "formacoes", modulo); const saida = path.join(pastaModulo, `LASER-ESP32-Modulo-${modulo}-Slides.pdf`); +const saidaApostila = path.join(pastaModulo, `LASER-ESP32-Modulo-${modulo}-Apostila.pdf`); if (!fs.existsSync(path.join(pastaModulo, "slide.html"))) { console.error(`Não achei public/formacoes/${modulo}/slide.html`); @@ -38,6 +40,7 @@ const TIPOS = { ".png": "image/png", ".jpg": "image/jpeg", ".json": "application/json", + ".woff2": "font/woff2", }; const servidor = http.createServer((req, res) => { @@ -55,7 +58,7 @@ await new Promise((r) => servidor.listen(0, "127.0.0.1", r)); const porta = servidor.address().port; const url = `http://127.0.0.1:${porta}/formacoes/${modulo}/slide.html`; -console.log(`[1/3] Abrindo ${url}`); +console.log(`[1/4] Abrindo ${url}`); const navegador = await puppeteer.launch({ headless: "new", args: ["--no-sandbox"] }); try { @@ -63,7 +66,7 @@ try { await pagina.goto(url, { waitUntil: "networkidle0", timeout: 60000 }); await pagina.evaluate(() => document.fonts.ready); - console.log("[2/3] Conferindo o encaixe de cada slide no 16:9"); + console.log("[2/4] Conferindo o encaixe de cada slide no 16:9"); await pagina.emulateMediaType("print"); await new Promise((r) => setTimeout(r, 500)); @@ -80,7 +83,7 @@ try { console.log(` ${caixas.length} slides, todos em 1280x720`); } - console.log("[3/3] Gerando o PDF"); + console.log("[3/4] Gerando o PDF dos slides"); await pagina.pdf({ path: saida, printBackground: true, @@ -89,7 +92,30 @@ try { }); const kb = (fs.statSync(saida).size / 1024).toFixed(0); - console.log(`\nPronto: ${path.relative(raiz, saida)} (${kb} KB, ${caixas.length} páginas em 16:9)`); + console.log(` ${path.relative(raiz, saida)} (${kb} KB, ${caixas.length} páginas em 16:9)`); + + /* A apostila é paginada no navegador pelo Paged.js, que não avisa quando + termina. Espera-se o número de folhas parar de crescer. */ + console.log("[4/4] Paginando e gerando o PDF da apostila"); + const apostila = await navegador.newPage(); + await apostila.goto(`http://127.0.0.1:${porta}/formacoes/${modulo}/apostila.html`, { waitUntil: "networkidle0", timeout: 120000 }); + await apostila.waitForFunction(() => document.querySelectorAll(".pagedjs_page").length > 1, { timeout: 120000 }); + let folhas = 0; + for (;;) { + await new Promise((r) => setTimeout(r, 1500)); + const agora = await apostila.evaluate(() => document.querySelectorAll(".pagedjs_page").length); + if (agora === folhas) break; + folhas = agora; + } + await apostila.evaluate(() => document.fonts.ready); + await apostila.pdf({ + path: saidaApostila, + printBackground: true, + preferCSSPageSize: true, + margin: { top: 0, right: 0, bottom: 0, left: 0 }, + }); + const kbA = (fs.statSync(saidaApostila).size / 1024).toFixed(0); + console.log(` ${path.relative(raiz, saidaApostila)} (${kbA} KB, ${folhas} páginas em A4)`); } finally { await navegador.close(); servidor.close();