参考:

Home Assistant-自动发现Mqtt设备

http://iotts.com.cn/course/homeassistant/%E8%87%AA%E5%8A%A8%E5%8F%91%E7%8E%B0Mqtt%E8%AE%BE%E5%A4%87/

巴法云esp8266接入home assistant,通过mqtt

https://zhuanlan.zhihu.com/p/398453049

WeMOS D1 Mini 開發板測試

http://yhhuang1966.blogspot.com/2017/07/wemos-d1-mini.html

HOME Assistant:使用nodemcu控制继电器MQTT初步试水

https://zhuanlan.zhihu.com/p/35891175

2020年11月博联Broadlink红外线码、射频码提取教程

https://bbs.hassbian.com/thread-11360-1-1.html

转basse64位网址

http://tomeko.net/online_tools/hex_to_base64.php

#include <WiFiManager.h>//自动配网
#include <ESP8266WiFi.h>//wifi函数
#include <DNSServer.h>
#include <ESP8266WebServer.h>

#include <PubSubClient.h>//MQTT库函数

#include <Ticker.h>//定时器库函数

////////////////////////////////////
#include <IRremoteESP8266.h>//红外函数
#include <IRrecv.h>
#define RECV_PIN 0 //D3 红外接收引脚
IRrecv irrecv(RECV_PIN); //红外遥控初始化
decode_results results; //储存接收到的红外遥控信息
//////////////////////////////////////////////


WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
const char* mqtt_Username = "***";//MQTT登陆用户名
const char* mqtt_Password = "***";//MQTT登陆密码

const char* mqtt_Server = "***";//MQTT服务器地址
const char* ClientID = "esp8266IR_TV";//连接MQTT时,本设备的名字,随意
const char* pubTopic = "ir_TV_Switch";
int irLED = 15; //D8指定LED来作为是否接收红外信号提醒的指示
int ledOutput = LED_BUILTIN;//板载LED灯
bool flag;

Ticker ticker0;//实例化联网状态LED定时器
Ticker ticker1;//是否接收到红外信号LED显示
void setup() {
  ///////////////////////
  pinMode(irLED,OUTPUT);
  digitalWrite(irLED,LOW);
  irrecv.enableIRIn();//启动红外
  ///////////////////////
 Serial.begin(9600);//打开串口通讯
 pinMode(ledOutput,OUTPUT);//初始化LED状态
 ticker0.attach_ms(100,wifiStatus);//100毫秒,定时执行LED的取反,直到WIFI连接
 
 ticker1.attach_ms(400,irTimes);//400毫秒 定时检测是否有红外信号
 WiFiManager wifiManager;//实例化自动配网
 wifiManager.autoConnect("AP");//启动自动配网
 Serial.println("");
 Serial.print("ESP8266 Connected to ");
 Serial.println(WiFi.SSID());
 Serial.print("IP address:\t");
 Serial.println(WiFi.localIP());
 //设置MQTT服务器和端口号
 mqttClient.setServer(mqtt_Server,1883);

 //连接MQTT服务器函数
 connectMqttServer();
}

//红外判断函数,利用ticker中断来调用,试试会不会有问题,有问题只能在主程序中判断红外
void irTimes(){
  flag = true;//作为标志位定时打开,方便程序处理红外请教,处理完就关闭,等待定时到再打开,防止不断处理红外请求
  
  }

//WIFI连接指示灯提醒函数  
void wifiStatus(){
  if (WiFi.status() == WL_CONNECTED){//判断WIFI是否连接,已连接就关闭闪灯定时器
    digitalWrite(ledOutput,HIGH);//设置为高。LED灭
     ticker0.detach();//关闭定时器
    }
  else {
    digitalWrite(ledOutput,!digitalRead(ledOutput));//取返led
    }  
  
  }
void connectMqttServer(){//连接MQTT服务器
    //连接MQTT
    if (mqttClient.connect(ClientID,mqtt_Username,mqtt_Password)){//连接成功返回0,真,
      Serial.print("连接MQTT成功");
  
      }  
  
  }
void loop() {
 
  if (mqttClient.connected()){//检测MQTT服务器有没有连接成功,只检查,不主动去连接
     mqttClient.loop();//心跳函数
   
     if (flag && irrecv.decode(&results)){//判断定时时间是否到及红外是否接收到信息
        if (results.value == 0x40BE629D){//判断是不是电视开关红外信号,
           char* pubMessage;
           pubMessage = "1";
           mqttClient.publish(pubTopic,pubMessage);//是红外开关信号,就发送"1"到MQTT,
           digitalWrite(irLED,!digitalRead(irLED));//led反转,只作为程序测试用,可删
  
          }
          irrecv.resume();//清除红外信息,等待下次数据
  
        }
  
  
    }
  else{
    connectMqttServer();//没连接MQTT重新登陆
    } 
}
最后修改:2022 年 03 月 13 日
如果觉得我的文章对你有用,请随意赞赏