#include // Pinos PS2dev keyboard(18, 19); const int pinBilheteiro = 32; void sendKey(unsigned char scancode) { keyboard.write(scancode); delay(50); keyboard.write(0xF0); keyboard.write(scancode); } void sendExtendedKey(unsigned char scancode) { keyboard.write(0xE0); keyboard.write(scancode); delay(50); keyboard.write(0xE0); keyboard.write(0xF0); keyboard.write(scancode); } void setup() { Serial.begin(115200); pinMode(pinBilheteiro, OUTPUT); digitalWrite(pinBilheteiro, LOW); keyboard.keyboard_init(); Serial.println("[ARDUINO] Sistema on."); } void loop() { if (Serial.available() > 0) { String input = Serial.readStringUntil('\n'); input.trim(); // Limpa espaços vazios if (input.length() == 0) return; // Ignora se vier vazio if (input.startsWith("CRED:")) { int totalPulsos = input.substring(5).toInt(); for (int i = 0; i < totalPulsos; i++) { digitalWrite(pinBilheteiro, HIGH); delay(70); digitalWrite(pinBilheteiro, LOW); delay(50); } Serial.println("CREDITOS_OK"); } else { char key = input.charAt(0); switch (key) { case 'a': sendKey(0x1C); break; // Aposta case 's': sendKey(0x1B); break; // Jogar case 'n': sendKey(0x31); break; // ver numeros case 'c': sendKey(0x21); break; // Cartelas case 'e': sendKey(0x24); break; // Extra/turbo case 'h': sendKey(0x33); break; // Ajuda case '9': sendKey(0x46); break; // fazer leitura case 'p': sendKey(0x4D); break; // cobrar pagto case 't': sendKey(0x0D); break; // suposto tab } Serial.println("TECLA_OK"); } } } //================ATUAL ONLINE============== #include PS2dev keyboard(18, 19); const int pinBilheteiro = 32; void setup() { Serial.begin(115200); pinMode(pinBilheteiro, OUTPUT); // Definindo high low (como LOW pra teste padrão (HIGH se for Normal High) digitalWrite(pinBilheteiro, LOW); } void loop() { if (Serial.available() > 0) { String input = Serial.readStringUntil('\n'); input.trim(); if (input.startsWith("CRED:")) { int totalPulsos = input.substring(5).toInt(); for (int i = 0; i < totalPulsos; i++) { digitalWrite(pinBilheteiro, HIGH); delay(40); digitalWrite(pinBilheteiro, LOW); delay(40); } Serial.println("PULSOS_OK"); } } } void setup() { Serial.begin(115200); keyboard.keyboard_init(); } // Função para teclas normais (Letras, números, etc) void sendKey(unsigned char scancode) { keyboard.write(scancode); delay(50); keyboard.write(0xF0); keyboard.write(scancode); } // Função para teclas estendidas (Insert, Delete, Setas, etc) void sendExtendedKey(unsigned char scancode) { keyboard.write(0xE0); keyboard.write(scancode); delay(50); keyboard.write(0xE0); keyboard.write(0xF0); keyboard.write(scancode); } void loop() { if (Serial.available() > 0) { char key = Serial.read(); switch (key) { // Ja mapeadas case 'a': sendKey(0x1C); break; // Aposta case 's': sendKey(0x1B); break; // Jogar case 'n': sendKey(0x31); break; // ver numeros case 'c': sendKey(0x21); break; // Cartelas case 'e': sendKey(0x24); break; // Extra/turbo case 'h': sendKey(0x33); break; // Ajuda case '9': sendKey(0x46); break; // fazer leitura case 'p': sendKey(0x4D); break; // cobrar pagto case 't': sendKey(0x0D); break; // suposto tab // Falta mapear case 'b': sendKey(0x32); break; // case 'd': sendKey(0x23); break; // case 'f': sendKey(0x2B); break; // case 'g': sendKey(0x34); break; // case 'i': sendKey(0x43); break; // case 'j': sendKey(0x3B); break; // case 'k': sendKey(0x42); break; // case 'l': sendKey(0x4B); break; // case 'm': sendKey(0x41); break; // case 'o': sendKey(0x44); break; // case 'q': sendKey(0x15); break; // case 'r': sendKey(0x2D); break; // case 'u': sendKey(0x3C); break; // case 'v': sendKey(0x2A); break; // case 'w': sendKey(0x1D); break; // case 'x': sendKey(0x22); break; // case 'y': sendKey(0x35); break; // case 'z': sendKey(0x1A); break; // case '0': sendKey(0x45); break; // case '1': sendKey(0x16); break; // case '2': sendKey(0x1E); break; // case '3': sendKey(0x26); break; // case '4': sendKey(0x25); break; // case '5': sendKey(0x2E); break; // case '6': sendKey(0x36); break; // case '7': sendKey(0x3D); break; // case '8': sendKey(0x3E); break; // case '+': sendKey(0x4E); break; // case '-': sendKey(0x5E); break; // case '=': sendKey(0x55); break; // case '\b': sendKey(0x66); break; // case ' ': sendKey(0x29); break; // case '\n': sendKey(0x5A); break; // case 'I': sendExtendedKey(0x70); break; // } Serial.println("OK"); } } //========================================== #include // Pinos de comunicação com a placa da máquina // TOTO veja se sao estes numeros mesmo por favor PS2dev keyboard(25, 26); void setup() { Serial.begin(115200); keyboard.keyboard_init(); Serial.println("🚀 ESP32 PS2 inicializado com sucesso!"); } void sendKey(unsigned char scancode) { keyboard.write(scancode); delay(10); keyboard.write(0xF0); keyboard.write(scancode); } void loop() { if (Serial.available() > 0) { char key = Serial.read(); switch (key) { case 'p': sendKey(0x1C); break; case 'tab': sendKey(0x0D); break; case 'n': sendKey(0x31); break; case 'k': sendKey(0x42); break; case 'b': sendKey(0x32); break; case 'c': sendKey(0x21); break; case 'i': sendKey(0x43); break; case 'e': sendKey(0x24); break; case 'h': sendKey(0x33); break; case 't': sendKey(0x2C); break; case '-': sendKey(0x4A); break; case '+': sendKey(0x55); break; } } } //==========================TOTO================================================== #include PS2dev keyboard(18, 19); void setup() { Serial.begin(115200); // Mantenha alta velocidade keyboard.keyboard_init(); } // Versão de latência mínima void sendKey(unsigned char scancode) { keyboard.write(scancode); // Pressiona delay(10); // 10ms é o mínimo aceitável para a máquina detectar keyboard.write(0xF0); // Prefixo de soltura keyboard.write(scancode); // Solta } void loop() { if (Serial.available() > 0) { char key = Serial.read(); // Switch-case direto, sem lógica complexa switch (key) { case 'a': sendKey(0x1C); break; // Aposta case 's': sendKey(0x1B); break; // Função S case '1': sendKey(0x16); break; case '2': sendKey(0x1E); break; case 'n': sendKey(0x5A); break; // Enter } } } //============================================================================ 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 //===================================================================== //PC Principal → Cabo USB → Arduino Uno (com biblioteca ps2dev) → Cabo PS/2 → Entrada de teclado do PC Dedicado. // USB ESP VIA USB #include #include #include USBHIDKeyboard Keyboard; void setup() { Serial.begin(115200); USB.begin(); Keyboard.begin(); Serial.println("✅ ESP32 Teclado USB pronto!"); } void loop() { if (Serial.available()) { String comando = Serial.readStringUntil('\n'); comando.trim(); int tecla = -1; // ========================================== // MAPEAMENTO DOS BOTÕES DA INTERFACE // ========================================== if (comando == "btn_ajuda") tecla = KEY_TAB; else if (comando == "btn_cobrar") tecla = KEY_C; else if (comando == "btn_numeros") tecla = KEY_N; else if (comando == "btn_aposta") tecla = KEY_P; else if (comando == "btn_sair") tecla = KEY_H; else if (comando == "btn_auto") tecla = KEY_F12; else if (comando == "btn_cartelas") tecla = KEY_K; else if (comando == "btn_extra") tecla = KEY_E; else if (comando == "btn_jogar") tecla = KEY_J; else if (comando == "btn_ver_cartoes") tecla = KEY_B; else if (comando == "btn_turbo") tecla = KEY_T; else if (comando == "inserir_notas5") tecla = KEY_N; else if (comando == "inserir_notas10") tecla = KEY_N; else if (comando == "inserir_notas20") tecla = KEY_N; else if (comando == "inserir_notas50") tecla = KEY_N; else if (comando == "inserir_notas100") tecla = KEY_N; else if (comando == "inserir_notas100") tecla = KEY_N; // ========================================== // EXECUÇÃO FÍSICA DO CLIQUE // ========================================== if (tecla != -1) { Keyboard.press(tecla); delay(50); Keyboard.release(tecla); Serial.print("⌨️ Tecla pressionada: "); Serial.println(tecla); } } delay(10); } //======================================================================= instalar bibliotecas : No Arduino IDE, vá em Ferramentas > Gerenciador de Bibliotecas (ou Sketch > Include Library > Manage Libraries) Na janela que abrir, pesquise por PubSubClient Selecione PubSubClient by Nick O'Leary Clique em Instalar #include #include #include #include #include USBHIDKeyboard Keyboard; // ========================================== // CONFIGURAÇÕES // ========================================== const char* ssid = "NOME_DO_SEU_WIFI"; const char* password = "SENHA_DO_SEU_WIFI"; const char* mqtt_server = "www.xkbitcoin.com"; const int mqtt_port = 1883; const char* MAQUINA_ID = "8059"; String mqtt_topic = "maquina/" + String(MAQUINA_ID) + "/comando"; WiFiClient espClient; PubSubClient client(espClient); // Mapeamento de teclas para comandos MQTT const char* MAPEAMENTO[] = { "btn_carteira", // F1 "btn_ajuda", // F2 "btn_cobrar", // F3 "btn_cartelas", // F4 "btn_ver_cartoes", // F5 "btn_sair", // F6 "btn_turbo", // F7 "btn_aposta", // F8 "btn_extra", // F9 "btn_jogar" // F10 }; void setup() { Serial.begin(115200); // Inicializa o teclado USB USB.begin(); Keyboard.begin(); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\n✅ Wi-Fi Conectado!"); client.setServer(mqtt_server, mqtt_port); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); } void reconnect() { while (!client.connected()) { String clientId = "ESP32-" + String(MAQUINA_ID); if (client.connect(clientId.c_str())) { Serial.println("✅ Conectado ao MQTT!"); } else { Serial.print("."); delay(5000); } } } //CARTEIRA (Depósito/Saque) //Mapeamento de Botões //Botão Pino ESP32 Comando MQTT //CARTEIRA 4 btn_carteira //AJUDA 5 btn_ajuda //COBRAR 18 btn_cobrar //CARTELAS 19 btn_cartelas //VER CARTÕES 21 btn_ver_cartoes //SAIR 22 btn_sair //TURBO 23 btn_turbo //APOSTA 25 btn_aposta //EXTRA 26 btn_extra //JOGAR 27 btn_jogar #include #include // ========================================== // CONFIGURAÇÕES - ALTERE COM SEUS DADOS // ========================================== const char* ssid = "NOME_DO_SEU_WIFI"; const char* password = "SENHA_DO_SEU_WIFI"; const char* mqtt_server = "www.xkbitcoin.com"; const int mqtt_port = 1883; // ID desta máquina física específica const char* MAQUINA_ID = "8059"; // Definição dos Pinos dos Botões // Você pode adicionar mais pinos conforme necessário const int PIN_CARTEIRA = 4; const int PIN_AJUDA = 5; const int PIN_COBRAR = 18; const int PIN_CARTELAS = 19; const int PIN_VER_CARTOES = 21; const int PIN_SAIR = 22; const int PIN_TURBO = 23; const int PIN_APOSTA = 25; const int PIN_EXTRA = 26; const int PIN_JOGAR = 27; // Tópico MQTT gerado dinamicamente: maquina/8059/comando String mqtt_topic = "maquina/" + String(MAQUINA_ID) + "/comando"; // Estados anteriores dos botões (para evitar repetição contínua) int lastStateCarteira = HIGH; int lastStateAjuda = HIGH; int lastStateCobrar = HIGH; int lastStateCartelas = HIGH; int lastStateVerCartoes = HIGH; int lastStateSair = HIGH; int lastStateTurbo = HIGH; int lastStateAposta = HIGH; int lastStateExtra = HIGH; int lastStateJogar = HIGH; // Variáveis para Debounce (evitar ruído elétrico do botão) unsigned long lastDebounceTime = 0; unsigned long debounceDelay = 50; // 50 milissegundos WiFiClient espClient; PubSubClient client(espClient); // ========================================== // FUNÇÃO DE CONEXÃO WI-FI // ========================================== void setup_wifi() { delay(10); Serial.println(); Serial.print("Conectando em: "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\n✨ Wi-Fi Conectado!"); Serial.print("IP do ESP32: "); Serial.println(WiFi.localIP()); } // ========================================== // FUNÇÃO DE CONEXÃO MQTT // ========================================== void reconnect() { while (!client.connected()) { Serial.print("Tentando conexão MQTT..."); // Cria um ID de cliente único para o ESP32 String clientId = "ESP32Client-" + String(MAQUINA_ID); if (client.connect(clientId.c_str())) { Serial.println("✅ Conectado ao Broker MQTT!"); } else { Serial.print("❌ Falhou, rc="); Serial.print(client.state()); Serial.println(" Tentando novamente em 5 segundos..."); delay(5000); } } } void setup() { Serial.begin(115200); // Configura os pinos como entrada com Pull-up interno pinMode(PIN_CARTEIRA, INPUT_PULLUP); pinMode(PIN_AJUDA, INPUT_PULLUP); pinMode(PIN_COBRAR, INPUT_PULLUP); pinMode(PIN_CARTELAS, INPUT_PULLUP); pinMode(PIN_VER_CARTOES, INPUT_PULLUP); pinMode(PIN_SAIR, INPUT_PULLUP); pinMode(PIN_TURBO, INPUT_PULLUP); pinMode(PIN_APOSTA, INPUT_PULLUP); pinMode(PIN_EXTRA, INPUT_PULLUP); pinMode(PIN_JOGAR, INPUT_PULLUP); setup_wifi(); client.setServer(mqtt_server, mqtt_port); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); // Leitura atual dos botões int readingCarteira = digitalRead(PIN_CARTEIRA); int readingAjuda = digitalRead(PIN_AJUDA); int readingCobrar = digitalRead(PIN_COBRAR); int readingCartelas = digitalRead(PIN_CARTELAS); int readingVerCartoes = digitalRead(PIN_VER_CARTOES); int readingSair = digitalRead(PIN_SAIR); int readingTurbo = digitalRead(PIN_TURBO); int readingAposta = digitalRead(PIN_APOSTA); int readingExtra = digitalRead(PIN_EXTRA); int readingJogar = digitalRead(PIN_JOGAR); // Verifica se houve clique (Transição de HIGH para LOW) if ((millis() - lastDebounceTime) > debounceDelay) { // BOTÃO CARTEIRA if (readingCarteira == LOW && lastStateCarteira == HIGH) { Serial.println("Button CARTEIRA pressionado!"); client.publish(mqtt_topic.c_str(), "btn_carteira"); lastDebounceTime = millis(); } // BOTÃO AJUDA if (readingAjuda == LOW && lastStateAjuda == HIGH) { Serial.println("Button AJUDA pressionado!"); client.publish(mqtt_topic.c_str(), "btn_ajuda"); lastDebounceTime = millis(); } // BOTÃO COBRAR if (readingCobrar == LOW && lastStateCobrar == HIGH) { Serial.println("Button COBRAR pressionado!"); client.publish(mqtt_topic.c_str(), "btn_cobrar"); lastDebounceTime = millis(); } // BOTÃO CARTELAS if (readingCartelas == LOW && lastStateCartelas == HIGH) { Serial.println("Button CARTELAS pressionado!"); client.publish(mqtt_topic.c_str(), "btn_cartelas"); lastDebounceTime = millis(); } // BOTÃO VER CARTÕES if (readingVerCartoes == LOW && lastStateVerCartoes == HIGH) { Serial.println("Button VER CARTÕES pressionado!"); client.publish(mqtt_topic.c_str(), "btn_ver_cartoes"); lastDebounceTime = millis(); } // BOTÃO SAIR if (readingSair == LOW && lastStateSair == HIGH) { Serial.println("Button SAIR pressionado!"); client.publish(mqtt_topic.c_str(), "btn_sair"); lastDebounceTime = millis(); } // BOTÃO TURBO if (readingTurbo == LOW && lastStateTurbo == HIGH) { Serial.println("Button TURBO pressionado!"); client.publish(mqtt_topic.c_str(), "btn_turbo"); lastDebounceTime = millis(); } // BOTÃO APOSTA if (readingAposta == LOW && lastStateAposta == HIGH) { Serial.println("Button APOSTA pressionado!"); client.publish(mqtt_topic.c_str(), "btn_aposta"); lastDebounceTime = millis(); } // BOTÃO EXTRA if (readingExtra == LOW && lastStateExtra == HIGH) { Serial.println("Button EXTRA pressionado!"); client.publish(mqtt_topic.c_str(), "btn_extra"); lastDebounceTime = millis(); } // BOTÃO JOGAR if (readingJogar == LOW && lastStateJogar == HIGH) { Serial.println("Button JOGAR pressionado!"); client.publish(mqtt_topic.c_str(), "btn_jogar"); lastDebounceTime = millis(); } } // Atualiza o estado anterior para a próxima leitura lastStateCarteira = readingCarteira; lastStateAjuda = readingAjuda; lastStateCobrar = readingCobrar; lastStateCartelas = readingCartelas; lastStateVerCartoes = readingVerCartoes; lastStateSair = readingSair; lastStateTurbo = readingTurbo; lastStateAposta = readingAposta; lastStateExtra = readingExtra; lastStateJogar = readingJogar; } /// BACKUP //// #include #include // ========================================== // CONFIGURAÇÕES - ALTERE COM SEUS DADOS // ========================================== const char* ssid = "NOME_DO_SEU_WIFI"; const char* password = "SENHA_DO_SEU_WIFI"; const char* mqtt_server = "www.xkbitcoin.com"; const int mqtt_port = 1883; // ID desta máquina física específica const char* MAQUINA_ID = "8059"; // Definição dos Pinos dos Botões const int PIN_COBRAR = 4; const int PIN_JOGAR = 5; const int PIN_APOSTA = 18; // Tópico MQTT gerado dinamicamente: maquina/8059/comando String mqtt_topic = "maquina/" + String(MAQUINA_ID) + "/comando"; // Estados anteriores dos botões (para evitar repetição contínua) int lastStateCobrar = HIGH; int lastStateJogar = HIGH; int lastStateAposta = HIGH; // Variáveis para Debounce (evitar ruído elétrico do botão) unsigned long lastDebounceTime = 0; unsigned long debounceDelay = 50; // 50 milissegundos WiFiClient espClient; PubSubClient client(espClient); // ========================================== // FUNÇÃO DE CONEXÃO WI-FI // ========================================== void setup_wifi() { delay(10); Serial.println(); Serial.print("Conectando em: "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\n✨ Wi-Fi Conectado!"); Serial.print("IP do ESP32: "); Serial.println(WiFi.localIP()); } // ========================================== // FUNÇÃO DE CONEXÃO MQTT // ========================================== void reconnect() { while (!client.connected()) { Serial.print("Tentando conexão MQTT..."); // Cria um ID de cliente único para o ESP32 String clientId = "ESP32Client-" + String(MAQUINA_ID); if (client.connect(clientId.c_str())) { Serial.println("✅ Conectado ao Broker MQTT!"); } else { Serial.print("❌ Falhou, rc="); Serial.print(client.state()); Serial.println(" Tentando novamente em 5 segundos..."); delay(5000); } } } void setup() { Serial.begin(115200); // Configura os pinos como entrada com Pull-up interno pinMode(PIN_COBRAR, INPUT_PULLUP); pinMode(PIN_JOGAR, INPUT_PULLUP); pinMode(PIN_APOSTA, INPUT_PULLUP); setup_wifi(); client.setServer(mqtt_server, mqtt_port); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); // Leitura atual dos botões int readingCobrar = digitalRead(PIN_COBRAR); int readingJogar = digitalRead(PIN_JOGAR); int readingAposta = digitalRead(PIN_APOSTA); // Verifica se houve clique (Transição de HIGH para LOW) if ((millis() - lastDebounceTime) > debounceDelay) { // BOTÃO COBRAR if (readingCobrar == LOW && lastStateCobrar == HIGH) { Serial.println("Button COBRAR pressionado!"); client.publish(mqtt_topic.c_str(), "btn_cobrar"); lastDebounceTime = millis(); } // BOTÃO JOGAR if (readingJogar == LOW && lastStateJogar == HIGH) { Serial.println("Button JOGAR pressionado!"); client.publish(mqtt_topic.c_str(), "btn_jogar"); lastDebounceTime = millis(); } // BOTÃO APOSTA if (readingAposta == LOW && lastStateAposta == HIGH) { Serial.println("Button APOSTA pressionado!"); client.publish(mqtt_topic.c_str(), "btn_aposta"); lastDebounceTime = millis(); } } // Atualiza o estado anterior para a próxima leitura lastStateCobrar = readingCobrar; lastStateJogar = readingJogar; lastStateAposta = readingAposta; }