首先让我们安装库 IRremoteESP8266 。为此,请转到 Sketch | Include Library | Manage Libraries 并搜索 IRremoteESP8266 库,如下面的屏幕截图所示:
安装库并完成与ESP的连接后,让我们使用以下代码通过MQTT主题发送一个命令来打开或关闭Panasonic电视。由于使用相同的红外线命令打开电源或关闭电源,您只需要在MQTT主题上接收一些内容即可向电视发送红外命令:
#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <PubSubClient. h>
#include <IRremoteESP8266.h>
#include <IRsend.h>
#define PanasonicAddress 0x4004.
#define PanasonicPower Ox1OOBCBD / / Pana-sonic Power button
在下一个变量中添加 Wi-Fi 和 MQTT 凭据:
#define wifi_ssid "YOUR_WIFI_SSID"
#define wifi_password "YOUR_WIFI_PASS"
#define mqtt server "YOUR_MQTT_SERVER "
#define mqtt_user "YOUR_MQTT_USER '
#define mqtt_password "YOUR_MQTT_PASSWORD"
#define mqtt_port 1883
将红外线引脚设置为 NodeMCU 和 WeMos 板上的 GPIO12 或 D6 ,以及将接收 打开/关闭 电视信息的主题:
#define IR PIN 12
#define ir_topic "/62/ir/command"
void rx_mqtt_callback(char* topic, byte* payload, unsigned int length);
#define DEBUG false .
#define Serial if (DEBUG)Serial
#define DEBUG OUTPUT Serial
IRsend irsend(IR_PIN); //IR LED连接到.GPIO引脚
WiFiClient espClient;
PubSubClient client (mqtt_server, mqtt_port, rx_mqtt_callback, espClient);
StaticJsonBuffer<512> jsonDeviceStatus;
JsonObject& jsondeviceStatus = jsonDeviceStatus.createObject();
char dev_name[50];
char json_buffer_status[512];
char my_ip_s[16];
启动 Wi-Fi 并连接到 Wi-Fi 网络:
void setup_wifi()
{
delay(10);
//我们首先连接到 WiFi 网络
Serial.println();
Serial.print("Connecting to");
Serial.println(wifi_ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(wifi_ssid, wifi_password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
连接并重新连接到MQTT代理。如果发生错误,请尝试每5秒重新连接一次:
void reconnect() {
//循环直到我们重新连接
while (!client.connected()) {
Serial.print("Attempting MQTT connection. . .");
if (client.connect(dev_name, mqtt_user, mqtt_password)) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println("try again in 5 seconds");
//等待5秒再重试
delay(5000);
}
}
}
这是从MQTT代理接收消息时将调用的函数。获取消息并将红外命令发送到电视:
void rx_mqtt_callback(char* topic, byte* payload, unsigned int length )
{
//为预定信息预留空间
StaticJsonBuffer<256> jsonRxMqttBuffer;
inti=O;
char rxj[256];
Serial.println(dev_name);
Serial.print(F("Topic:"));
Serial.println(topic);
for(i=O;i <length; i++)
{
rxj[i] = payload[i];
}
Serial.println(rxj);
JsonObject& root = jsonRxMqttBuffer.parseObject(rxj);
if (!root.success())
{
Serial.println(F("parseObject() failed" ));
return;
}
const char* device name = root["device_name"];
const char* type = root["type"];
const char* value = root["value"];
Serial.println(device_name);
Serial.println(type);
Serial.println(value);
sendIR();
return;
}
在这里,我们将消息代码发送到电视。如果它第一次不起作用,请尝试靠近电视。这取决于红外LED的质量,红外LED的数量和环境光:
void sendIR( )
{
inti=0;
Serial.print("sendIR for 2 sec") ;
for(i=O;i<20; i++)
{
irsend.sendPanasonic(PanasonicAddress , PanasonicPower); //这应该可以打开和关闭电视
delay(100);
}
}
void setup( )
{
delay(1000);
irsend.begin();
Serial.begin(115200);
sprintf(dev_name,"ESP_%d", ESP.getChipId());
setup_wifi();
client.setServer (mqtt_server, mqtt_port);
client.connect(dev_name, mqtt_user, mqtt_password);
client.subscribe(ir_topic);
if (!client.connected())
{
reconnect( ) ;
}
}
void loop() {
client.loop();
}
现在,使用 MyMQTT Android 应用程序,尝试向 ir_topic 发送命令以启动或停止电视。
您可能已经注意到我没有使用 WiFiManager 来设置 ESP8266,但去完成章节和项目对你来说非常好的练习。研究Linux中的 LIRC库,并尝试找到可以使用红外线和ESP8266控制的其他设备。