feat(formacoes): módulo 2 (DHT22 + LCD 16x2 no Wokwi), PDFs e página de entrada
Release / Plano (reaproveitar a imagem?) (push) Successful in 7s
CI / Lint e auditorias (push) Successful in 1m48s
CI / Trivy (dependências e segredos) (push) Successful in 12s
CI / Imagem Docker (linux/arm64) (push) Failing after 2m27s
Release / ci (push) Failing after 4m31s
Release / Publica a imagem (linux/arm64) (push) Skipped
Release / Cria a release no Gitea (push) Skipped

- Formação 2 da LASER: slides visuais, apostila, projeto do Wokwi e scanner
  I2C, validados no simulador (leitura normal, temperatura negativa e sensor
  desconectado). Circuito com pull-ups de 10 kΩ e 4,7 kΩ para 3V3 e aviso
  sobre os pull-ups de 5 V da plaquinha PCF8574.
- PDFs prontos dos slides e das apostilas dos módulos 1 e 2;
  slides-pdf agora também exporta a apostila.
- Página de entrada em /formacoes e /formacoes/N, gerada por
  scripts/formacoes-viewer.mjs a partir do formacao.json de cada pasta.
- A apostila passou de index.html para apostila.html.
- Corrige o link do Fritzing da apostila 1 (/apostilas/1 não existe).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Lucas RayanandClaude Opus 5.5 committed 2026-11-02 13:11:28 -03:00
1 parent 71c5708726
commit 1860e34cbb
32 files changed
+6469 -1943

No files matched your search

+183
View File
@@ -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": {}
}
+3
View File
@@ -0,0 +1,3 @@
DHT sensor library
Adafruit Unified Sensor
LiquidCrystal I2C
+23
View File
@@ -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 <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() {}
+59
View File
@@ -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 <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
}