// SPDX-License-Identifier: MIT // Saída digital: acionar um módulo relé (ESP32-S3 DevKitC-1 N16R8) // // Ligações: // Botão A: GPIO4 <-> GND Botão B: GPIO6 <-> GND // Módulo relé: VCC -> pino 5V (VBUS) do DevKit, GND -> GND. // IN1 -> GPIO5 só após confirmar no manual e na medição que a entrada aceita lógica de 3,3 V e não devolve 5 V. // Sem identificar o módulo, não presuma lógica ativa, compatibilidade de tensão nem que o optoacoplador resolve isso. // Se a entrada for incompatível, ela precisa de uma interface dimensionada para o módulo; teste sem carga primeiro. // NUNCA ligue a saída de um sensor/módulo de 5 V a um GPIO do ESP32-S3 (o datasheet só garante o pino até VDD + 0,3 V). const int PINO_BOTAO_LED = 4; const int PINO_BOTAO_RELE = 6; const int PINO_RELE = 5; const bool RELE_ATIVO_EM_LOW = true; void setup() { // No Arduino-ESP32 3.3.11 inspecionado, digitalWrite usa o GPIO depois de pinMode o configurar. // Por isso a sequência é INPUT_PULLUP, digitalWrite e OUTPUT. Ela configura este sketch, não o boot inteiro. // O datasheet lista para GPIO5 pulso baixo típico de 60 us na energização; não é duração máxima nem prevê a resposta da bobina. // O pull-up interno é fraco (~45 kOhm típico) e seu efeito depende do circuito e do módulo. // Fontes: ESP32-S3, Tabela 2-2, pp. 18-19: https://documentation.espressif.com/esp32-s3_datasheet_en.pdf // Arduino-ESP32 3.3.11, gpio.c: https://github.com/espressif/arduino-esp32/blob/189089bb76e74978dc95abebefdad42b0d421ba9/cores/esp32/esp32-hal-gpio.c pinMode(PINO_RELE, INPUT_PULLUP); digitalWrite(PINO_RELE, RELE_ATIVO_EM_LOW ? HIGH : LOW); // grava o nível pedido para a configuração pinMode(PINO_RELE, OUTPUT); // aplica a saída; confira a tensão e o módulo reais pinMode(PINO_BOTAO_LED, INPUT_PULLUP); // ~45 kOhm interno para 3,3 V pinMode(PINO_BOTAO_RELE, INPUT_PULLUP); } void loop() { bool botaoLed = (digitalRead(PINO_BOTAO_LED) == LOW); bool botaoRele = (digitalRead(PINO_BOTAO_RELE) == LOW); if (botaoLed) neopixelWrite(RGB_BUILTIN, 0, 40, 0); // LED RGB da placa em verde else neopixelWrite(RGB_BUILTIN, 0, 0, 0); bool nivelParaLigar = RELE_ATIVO_EM_LOW ? LOW : HIGH; digitalWrite(PINO_RELE, botaoRele ? nivelParaLigar : !nivelParaLigar); }