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
)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
Postar um comentário