cd /sites/xkbitcoin/iot/ npm install mercadopago@2.0.0 npm install express express-session https socket.io mqtt mysql2 /// no diretorio do projeto npm install qrcode pix-utils pm2 start server.js --name sniper-sistema Nota elétrica importante: Como os pinos 34 e 35 são apenas de entrada (INPUT), lembre-se de colocar um resistor físico de 10k Ω interligando esses dois pinos na linha de 3.3V do ESP32. Os outros 14 pinos dispensam componentes externos. https://www.arduino.cc/en/software Passo 1: Instalar a IDE Arduino Baixe e instale a IDE Arduino em: https://www.arduino.cc/en/software ✅ Passo 2: Instalar o suporte para ESP32 Abra a IDE Arduino. Vá em Arquivo > Preferências. Em "URLs Adicionais para Gerenciadores de Placas", cole: text https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json Clique em "OK". Vá em Ferramentas > Placa > Gerenciador de Placas. Pesquise por "ESP32" e instale "esp32 by Espressif Systems". ✅ Passo 3: Configurar o ESP32 na IDE Vá em Ferramentas > Placa > ESP32 Arduino. Selecione a sua placa (ex: "ESP32 Dev Module"). Selecione a porta correta em Ferramentas > Porta. ✅ Passo 4: Criar e carregar o código Copie o código que eu te enviei e cole na IDE Arduino. Clique em "Carregar" (seta para a direita). Aguarde a compilação e o upload. ✅ Código completo para o ESP32: adicionar url em file urls : https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json #include #include // ========================================== // CONFIGURAÇÕES DE REDE E ID // ========================================== const char* ssid = "NOME_DO_SEU_WIFI"; const char* password = "SENHA_DO_SEU_WIFI"; const char* mqtt_server = "https://www.xkbitcoin.com"; const int mqtt_port = 1883; // Mude o ID para cada máquina física que for montar (ex: "8059", "8052", "8077") const char* MAQUINA_ID = "8059"; // Total de botões no painel const int NUM_BOTOES = 40; // Pinos selecionados estrategicamente para evitar conflitos no boot do ESP32 const int pinosBotoes[NUM_BOTOES] = { 4, 5, 13, 14, 16, 17, 18, 19, 21, 22, 23, 25, 26, 27, 34, 35 }; // Comandos estáticos enviados ao servidor (btn_1 até btn_16) const char* comandosMqtt[NUM_BOTOES] = { "btn_1", "btn_2", "btn_3", "btn_4", "btn_5", "btn_6", "btn_7", "btn_8", "btn_9", "btn_10", "btn_11", "btn_12", "btn_13", "btn_14", "btn_15", "btn_16" }; // Variáveis de controle para debounce e estado int estadosAnteriores[NUM_BOTOES]; unsigned long ultimosDebounces[NUM_BOTOES]; unsigned long debounceDelay = 50; // Tempo de filtro em milissegundos String mqtt_topic = "maquina/" + String(MAQUINA_ID) + "/comando"; WiFiClient espClient; PubSubClient client(espClient); void setup_wifi() { delay(10); Serial.println("\nConectando Wi-Fi..."); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\n✨ Wi-Fi Conectado!"); } void reconnect() { while (!client.connected()) { Serial.print("Tentando conexão MQTT..."); String clientId = "ESP32Client-" + String(MAQUINA_ID); if (client.connect(clientId.c_str())) { Serial.println("✅ Conectado ao Broker MQTT!"); } else { Serial.print("❌ Falhou, erro do client="); Serial.print(client.state()); Serial.println(" Nova tentativa em 5 segundos..."); delay(5000); } } } void setup() { Serial.begin(115200); setup_wifi(); client.setServer(mqtt_server, mqtt_port); // Inicialização dinâmica dos pinos for (int i = 0; i < NUM_BOTOES; i++) { // Pinos 34 e 35 não possuem resistor Pull-up interno por limitações do chip ESP32 if (pinosBotoes[i] == 34 || pinosBotoes[i] == 35) { pinMode(pinosBotoes[i], INPUT); } else { pinMode(pinosBotoes[i], INPUT_PULLUP); } estadosAnteriores[i] = HIGH; ultimosDebounces[i] = 0; } } void loop() { if (!client.connected()) { reconnect(); } client.loop(); // Escaneamento instantâneo de todos os 16 pinos for (int i = 0; i < NUM_BOTOES; i++) { int leitura = digitalRead(pinosBotoes[i]); if (leitura != estadosAnteriores[i]) { ultimosDebounces[i] = millis(); } if ((millis() - ultimosDebounces[i]) > debounceDelay) { // Identifica clique (Transição de nível lógico alto para baixo) if (leitura == LOW && estadosAnteriores[i] == HIGH) { Serial.print("⚡ Botão Pressionado: "); Serial.println(comandosMqtt[i]); // Publica no broker para o Node.js capturar client.publish(mqtt_topic.c_str(), comandosMqtt[i]); } } estadosAnteriores[i] = leitura; } }