4-2-2 该项目的软件和库

首先让我们安装库 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

将红外线引脚设置为 NodeMCUWeMos 板上的 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控制的其他设备。

猜你喜欢

转载自blog.csdn.net/countofdane/article/details/87901515