Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

IR Blaster Wi-Fi: Projeto DIY com ESP8266 e Arduino

Componentes e Materiais

Espressif ESP8266 ESP-01 (pode usar ESP8266 padrão ou kit de desenvolvimento NodeMCU) 1
Arduino Nano R3 1
Transistor NPN de Uso Geral 1
LEDs IR (Adafruit) 1

Ferramentas Necessárias

Aplicativos e Serviços Online

Sobre o Projeto

Dois Passos à Frente...

Parece que os grandes fabricantes de celulares estão abandonando os IR blasters embutidos, então procuro uma forma de "futurizar" meus dispositivos "burros" que não se integram à minha infraestrutura IoT. Tenho uma casa inteligente com rede mesh, mas preciso achar um controle remoto físico para ligar a TV? Tem que haver um jeito melhor.

Recentemente construí um IR blaster que controla condicionadores de ar autônomos em casa e outro projeto anterior foi uma ventilação HVAC conectada com webapp Android. Basicamente, preciso combinar estas duas coisas em um IR blaster conectado à web com frontend webapp para pressionar botões no celular e enviar sinais IR aos meus media centers. Podem ser implantados em cada cômodo e controlados de qualquer lugar por uma única interface, então as aplicações são extremamente amplas.

Prototipagem Rápida

Peguei hardware ocioso e liguei tudo o que precisava para conectar ao WiFi, aceitar conexões HTTP e enviar sinais IR.

IR Blaster Wi-Fi: Projeto DIY com ESP8266 e Arduino

Funcionou bem: eu podia requisitar uma URL específica no IP atribuído ao ESP8266 e fazer o Arduino emitir sinal "Power" para o LED IR. Só precisava descobrir onde hospedar o webapp, fazer ele enviar URLs ao IR blaster e parsear as requisições em códigos IR específicos. Foi muito trabalhoso usando comandos AT com o ESP8266, e havia algo causando atraso de 1-2 segundos entre enviar a requisição e o LED piscar.

IR Blaster Wi-Fi: Projeto DIY com ESP8266 e Arduino

NodeMCU

Optei pela placa de desenvolvimento NodeMCU ESP8266 porque tem regulação de energia onboard, interface USB-para-serial e muitos pinos I/O neste pacote pequeno (também é breadboard-friendly). Descobri que já existe uma biblioteca ESP8266 WebServer que aceita requisições GET, que adaptei para enviar códigos IR, e a biblioteca IRremote comum funciona direto.

IR Blaster Wi-Fi: Projeto DIY com ESP8266 e Arduino

O ESP8266 no NodeMCU não é potente o suficiente para hospedar o webapp, então rodo em um computador C.H.I.P. de $9 subutilizado já na rede doméstica. Outra limitação: o ESP8266 é placa de 3,3V, então LEDs IR ligados diretamente a pinos I/O ficavam muito fracos e precisavam ficar colados ao aparelho. Usei o pino I/O para acionar um transistor NPN que chaveia a alimentação de 5V ligado/desligado.

REST...ish

Após pesquisa, encontrei um ótimo tutorial para implementar API REST para Arduino controlar LEDs na Adafruit. Usei seus arquivos JavaScript e PHP para enviar requisições cURL e hospedei no CHIP que já roda Apache, mas poderia ser na nuvem. Após criar uma página HTML básica para o controle remoto, adicionei manifest.json e arquivos de ícone para rodar como webapp nativo no Android.

IR Blaster Wi-Fi: Projeto DIY com ESP8266 e Arduino

IR Blaster Wi-Fi: Projeto DIY com ESP8266 e Arduino

IR Blaster Wi-Fi: Projeto DIY com ESP8266 e Arduino

No lado do Arduino, simplifiquei o webserver para apenas aceitar requisição GET, parsear a URL, enviar 200 OK e desconectar. Baseado na URL, o Arduino envia o código IR mapeado ao botão pressionado.

Universal Remonster

IR Blaster Wi-Fi: Projeto DIY com ESP8266 e Arduino

IR Blaster Wi-Fi: Projeto DIY com ESP8266 e Arduino

IR Blaster Wi-Fi: Projeto DIY com ESP8266 e Arduino

Tudo funcionando perfeitamente com zero atraso. Descobri que os LEDs IR têm ângulo muito estreito, então preciso apontá-los corretamente. Velcro industrial permite montar sob uma prateleira, fora de vista, e garante que fique apontado aos receptores IR. Adicionei fio de bitola grossa aos terminais do LED para ajuste fino.

Resistores nos LEDs IR os tornavam quase inutilizáveis, então o transistor os alimenta com 5V não regulado. Isso permite refletir IR nas paredes e montar o blaster do outro lado do quarto, mas afetará a longevidade. Espero que, como são usados raramente e os sinais IR são pulsos curtíssimos (duty cycle menor que PWM de dimming), não precise trocar os LEDs por um tempo. Pedi LEDs IR de ângulo largo e maior potência para versão 2; quando estes morrerem, trocarei junto com resistor em série.

Atualização de 3 Meses e Futuras Funcionalidades

Uso isso todo dia e funcionou perfeitamente. Adicionei um segundo dispositivo na sala para controlar ar condicionado de janela e outra TV.

Planos futuros:

Este pequeno IR blaster conectado está preenchendo gradualmente a lacuna entre minha casa inteligente e aparelhos legados.

Código

WiFi IR Blaster para ESP8266 Arduino Sketch C/C++

Precisa da biblioteca ESP8266 wifi e IRremote.h. Opte por não usar códigos IR Raw se seu controle for suportado pela biblioteca. Adaptei este sketch de um controlador de ar condicionado que usava códigos IR não-padrão.

/* 
 * WiFi IR Blaster por Buddy Crotty
 * Use módulo ESP8266 ou dev board para receber requisição HTTP GET
 * e então enviar códigos IR para LED IR anexado baseado nas requisições.
 * Funciona melhor com outro web server como frontend que
 * envia requisições cURL baseadas nos botões pressionados.
 * Formato cURL: https://ESP8266/IRcode
 */
#include <ESP8266WiFi.h>
#include <IRremoteESP8266.h>
#include <ESP8266mDNS.h>

const char* ssid = "AP_SSID";
const char* password = "AP_Pass";
MDNSResponder mdns;
int khz = 38; // frequência portadora 38kHz para NEC e Samsung
IRsend irsend(4); // LED IR conectado ao GPIO4 (pino D2 no NodeMCU)

// Códigos IR RAW para vários comandos (TV Power, Source, Mute, Volume, Canal, Receiver Power, etc.)
// ... (códigos omitidos por brevidade, mantidos no original)

WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  delay(10);
  irsend.begin();
  
  // Conecta à rede WiFi
  Serial.println();
  Serial.println();
  Serial.print("Conectando a ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi Conectado");
  
  // Inicia servidor
  server.begin();
  Serial.println("Servidor HTTP Iniciado");
  
  // Imprime endereço IP
  Serial.print("Endereço IP: ");
  Serial.println(WiFi.localIP());
  
  if (mdns.begin("IRBlasterLR", WiFi.localIP())) {
    Serial.println("MDNS Responder Iniciado");
  }
  Serial.println();
  Serial.println();
}

void loop() {
  // Verifica se cliente conectou
  WiFiClient client = server.available();
  if (!client) { return; }
  
  // Aguarda cliente enviar dados
  Serial.println("novo cliente");
  while(!client.available()){ delay(1); }
  
  // Lê primeira linha da requisição
  String req = client.readStringUntil('\r');
  Serial.println(req);
  client.flush();
  
  // Processa requisição
  if (req.indexOf("/irTVpwr") != -1) {
    irsend.sendRaw(irTVpwr, sizeof(irTVpwr) / sizeof(irTVpwr[0]), khz);
    Serial.println("IRreq irTVpwr enviado");
  } else if (req.indexOf("/irTVsrc") != -1) {
    irsend.sendRaw(irTVsrc, sizeof(irTVsrc) / sizeof(irTVsrc[0]), khz);
    Serial.println("IRreq irTVsrc enviado");
  }
  // ... (demais comandos omitidos por brevidade)
  else {
    Serial.println("requisição inválida");
    client.stop();
    return;
  }
  
  client.flush();
  // Envia resposta ao cliente
  client.print("HTTP/1.1 200 OK\r\n");
  delay(1);
  Serial.println("Cliente Desconectado");
  Serial.println();
}

script.js JavaScript

JavaScript para webapp (requer jquery)

// Função para enviar comandos IR
function buttonClick(clicked_id){
  if (clicked_id == "irTVpwr"){
    $.get("curl.php", { room: "192.168.1.62", button: "irTVpwr" });
  }
  // ... (demais botões omitidos por brevidade)
}

index.html HTML

HTML básico para exibir botões.

<html>
<head>
  <LINK href="style.css" rel="stylesheet" type="text/css" />
  <script type="text/javascript" src="jquery-2.0.3.min.js"></script>
  <script type="text/javascript" src="script.js"></script>
  <link rel="manifest" href="manifest.json">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
  <link rel="icon" type="image/png" href="favicon.ico" />
</head>
<body>
  <div align="center" class="div_text_shadow">
    <button class="btn2" type="button" id="irALLpwr" onClick="buttonClick(this.id)">Power Up Everything</button><BR><BR><BR>
    <H1>TV</H1>
    <button class="btn" type="button" id="irTVpwr" onClick="buttonClick(this.id)">Power</button><BR><BR>
    <button class="btn" type="button" id="irTVvup" onClick="buttonClick(this.id)">Vol +</button>
    <button class="btn" type="button" id="irTVsrc" onClick="buttonClick(this.id)">Source</button>
    <button class="btn" type="button" id="irTVchup" onClick="buttonClick(this.id)">Ch +</button><BR><BR>
    <button class="btn" type="button" id="irTVvdn" onClick="buttonClick(this.id)">Vol -</button> &nbsp;&nbsp;
    <button class="btn" type="button" id="irTVmute" onClick="buttonClick(this.id)">&nbsp;Mute&nbsp;</button>
    &nbsp;&nbsp; <button class="btn" type="button" id="irTVchdn" onClick="buttonClick(this.id)">Ch -</button>
    <br> <br> <br>
    <H1>Receiver</H1>
    <button class="btn" type="button" id="irRECpwr" onClick="buttonClick(this.id)">Power</button><BR><BR>
    <button class="btn" type="button" id="irRECmute" onClick="buttonClick(this.id)">Mute</button>
    <button class="btn" type="button" id="irRECvdn" onClick="buttonClick(this.id)">Vol -</button>
    <button class="btn" type="button" id="irRECvup" onClick="buttonClick(this.id)">Vol +</button>
    <br> <br>
  </div>
</body>
</html>

curl.php PHP

Script PHP para enviar requisições GET ao ESP8266

<?php
$room = $_GET['room'];
$button = $_GET['button'];
// Cria chamada cURL
$service_url = 'https://' . $room . '/' . $button;
$curl = curl_init($service_url);
// Envia cURL para placa
curl_setopt($curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
$curl_response = curl_exec($curl);
curl_close($curl);
// Imprime resposta
echo $curl_response;
?>

manifest.json JSON

Permite a página rodar como webapp nativo no Android.

{
  "name": "WiFi Remote",
  "icons": [
    { "src": "remote_icon_36.png", "sizes": "36x36", "type": "image/png", "density": 0.75 },
    { "src": "remote_icon_48.png", "sizes": "48x48", "type": "image/png", "density": 1.0 },
    { "src": "remote_icon_128.png", "sizes": "128x128", "type": "image/png", "density": 1.0 },
    { "src": "remote_icon_192.png", "sizes": "192x192", "type": "image/png", "density": 1.0 }
  ],
  "scope": "/remote/",
  "start_url": "/remote/index.html",
  "display": "fullscreen",
  "orientation": "portrait"
}

Esquemáticos

Nada complexo, apenas alimentação e um pino conectado a transistor NPN para acionar dois LEDs IR em série (sem resistores) na alimentação de 5V.

IR Blaster Wi-Fi: Projeto DIY com ESP8266 e Arduino

Se quiser mais LEDs ou menos queda de tensão de fonte 3,3V, pode usar transistor NPN para chavear múltiplos transistores PNP (um por LED). Esta configuração permite usar quantos LEDs sua fonte conseguir alimentar.

IR Blaster Wi-Fi: Projeto DIY com ESP8266 e Arduino

Processo de manufatura

  1. Principais Limitações de Sistemas de Localização em Tempo Real Wi‑Fi
  2. Tecnologias Sem Fio Emergentes de 2015: Guia para M2M e IoT
  3. Implante um Servidor Web com TLS em um ESP8266 de $3 em Menos de 30 Minutos
  4. Integração MQTT Perfeita: Sensores NodeMCU DHT22 com Raspberry Pi 3 B+ como Broker
  5. Construa um Robô Controlado por WiFi com Raspberry Pi e Smartphone Android
  6. Construa Robô Raspberry Pi Controlado por Wi-Fi com Python – Guia Passo a Passo
  7. Chamada Wi-Fi Explicada: Como Funciona e Por Que Importa
  8. Construa um Pote Inteligente IoT com ESP8266, Arduino e Sensor Ultrassônico – Monitoramento em Tempo Real
  9. Fechadura Inteligente Wi-Fi com Arduino e ESP8266 - Desbloqueio via Celular
  10. Jateamento de Esferas Explicado: O Guia Definitivo para Acabamentos Lisos e Polidos