JVC Compu Link Final

#include #include #define D1 26 const char* ssid = "Your network here"; const char* password = "Network password"; // Configuração de IP fixo // Dica: Se o IP sumir, mude o final de 6 para um número alto (ex: 210) para evitar conflito na rede IPAddress local_IP(192, 168, 1, 6); IPAddress gateway(192, 168, 1, 1); IPAddress subnet(255, 255, 255, 0); IPAddress primaryDNS(8, 8, 8, 8); IPAddress secondaryDNS(8, 8, 4, 4); WiFiServer server(80); const unsigned long reconnectInterval = 30000; const unsigned long clientTimeout = 500; unsigned long previousReconnectMillis = 0; bool wifiInitialized = false; // HTML otimizado armazenado na Flash com script Fetch para controle assíncrono const char HTML_PAGE[] PROGMEM = R"rawliteral( Controle JVC
Play A
Side A
On
Off
FF A
▶▶
REW A
◀◀
STOP A
■
PLAY B
SIDE B
PAUSE B
FF B
▶▶
REW B
◀◀
STOP B
■
REC B
🔴
Estado: )rawliteral"; const char HTML_FOOTER[] PROGMEM = R"rawliteral(
JVC
TD-W218
REMOTE CONTROL
)rawliteral"; void initWiFi() { if (!wifiInitialized) { Serial.println("Configurando Wi-Fi..."); WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); wifiInitialized = true; } } void checkWiFiReconnect() { unsigned long currentMillis = millis(); if (WiFi.status() == WL_CONNECTED) return; if (currentMillis - previousReconnectMillis >= reconnectInterval) { previousReconnectMillis = currentMillis; Serial.println("Wi-Fi desconectado! Tentando reconectar..."); if(wifiInitialized) { WiFi.disconnect(); WiFi.reconnect(); } else { initWiFi(); } } } // Envio do bit individual do protocolo JVC void sendBit(bool bitValue) { digitalWrite(D1, HIGH); delayMicroseconds(5000); // 5ms digitalWrite(D1, LOW); if (bitValue) { delayMicroseconds(15000); // 15ms } else { delayMicroseconds(5000); // 5ms } } // Envio do byte com interrupções desativadas para proteção do timing do sinal void sendByte(uint8_t data) { noInterrupts(); for (int i = 7; i >= 0; i--) { sendBit(data & (1 << i)); } digitalWrite(D1, HIGH); delayMicroseconds(5000); // 5ms digitalWrite(D1, LOW); interrupts(); } String getStatusFromRequest(const String& request) { if (request.indexOf(F("/D1/on")) >= 0) { sendByte(0x20); return F("PLAY B"); } if (request.indexOf(F("/D2/on")) >= 0) { sendByte(0x25); return F("PAUSE B"); } if (request.indexOf(F("/D3/on")) >= 0) { sendByte(0x29); return F("REC B"); } if (request.indexOf(F("/D4/on")) >= 0) { sendByte(0x27); return F("SIDE B"); } if (request.indexOf(F("/D5/on")) >= 0) { sendByte(0x23); return F("FF B"); } if (request.indexOf(F("/D6/on")) >= 0) { sendByte(0x22); return F("STOP B"); } if (request.indexOf(F("/D7/on")) >= 0) { sendByte(0x24); return F("REW B"); } if (request.indexOf(F("/D8/on")) >= 0) { sendByte(0x60); return F("PLAY A"); } if (request.indexOf(F("/D9/on")) >= 0) { sendByte(0x67); return F("SIDE A"); } if (request.indexOf(F("/D10/on")) >= 0) { sendByte(0x63); return F("FF A"); } if (request.indexOf(F("/D11/on")) >= 0) { sendByte(0x64); return F("REW A"); } if (request.indexOf(F("/D12/on")) >= 0) { sendByte(0x62); return F("STOP A"); } if (request.indexOf(F("/D13/on")) >= 0) { sendByte(0xBF); return F("POWER OFF"); } if (request.indexOf(F("/D14/on")) >= 0) { sendByte(0xBE); return F("POWER ON"); } return F(""); } String readHttpRequest(WiFiClient& client) { String request = ""; String currentLine = ""; unsigned long startMillis = millis(); while (client.connected() && (millis() - startMillis <= clientTimeout)) { if (client.available()) { char c = client.read(); request += c; if (request.length() > 400) { break; } if (c == '\n') { if (currentLine.length() == 0) break; currentLine = ""; } else if (c != '\r') { currentLine += c; } } } return request; } void handleClient(WiFiClient& client) { String request = readHttpRequest(client); // Limpa agressivamente qualquer sobra de dados enviados pelo navegador no buffer while(client.available()) { client.read(); } String status = getStatusFromRequest(request); if (status.length() > 0) { Serial.print("Comando processado: "); Serial.println(status); client.println(F("HTTP/1.1 200 OK")); client.println(F("Content-Type: text/plain")); client.println(F("Connection: close")); // Diz ao browser para fechar a porta client.println(); client.print(status); } else { Serial.println("Enviando interface web completa para o cliente."); client.println(F("HTTP/1.1 200 OK")); client.println(F("Content-Type: text/html; charset=UTF-8")); client.println(F("Connection: close")); client.println(); client.print((const __FlashStringHelper*)HTML_PAGE); client.print(F("Aguardando comando")); client.print((const __FlashStringHelper*)HTML_FOOTER); } } void setup() { Serial.begin(115200); delay(500); Serial.println("\n--- Inicializando Sistema JVC Remote ---"); pinMode(D1, OUTPUT); digitalWrite(D1, LOW); initWiFi(); server.begin(); Serial.println("Servidor HTTP iniciado na porta 80."); } void loop() { checkWiFiReconnect(); WiFiClient client = server.available(); if (client) { Serial.println("\nNovo cliente conectado."); handleClient(client); // Pequena janela para garantir a entrega física dos pacotes TCP/IP antes de cortar o socket delay(10); client.stop(); Serial.println("Conexao com o cliente finalizada com sucesso."); } }

Comentários

Postagens mais visitadas deste blog

JVC Compulink, COMPU LINK, JVC, Tape Deck, Arduino, DCS Codes

RTTY, PSK31, FT8, JS8CALL, NBTV, RDS FM, OLIVIA, SSTV, SSTV AUTO,CW, ASCII Encoder / Decoder