ESP8266 红外遥控+触发警报+微信提醒

//====各种乱七八糟的库====================================================
#include //8266的IRremote库,
#include //接收库
#include //这个很重要,一定要include一下(resultToTimingInfo就是这个库的)
#include //发射库
#include
#include
#include

//====WiFi设置============================================================
#define DEFAULT_STASSID  "2G"
#define DEFAULT_STAPSW   "************"

//====巴发设置============================================================
#define TCP_SERVER_ADDR "bemfa.com"
#define TCP_SERVER_PORT "8344"
String UID   = "c3a3d927a************4dbd9225bcf2";     //用户私钥,可在控制台获取,修改为自己的UID
String  TOPIC1 = "JB001";     //主题名字,可在控制台新建
String  TOPIC2 = "DS001";     //主题名字,可在控制台新建
//====初始化巴发设置库==================================================
#define MAX_PACKETSIZE 512
#define KEEPALIVEATIME 30*1000
WiFiClient TCPclient;
String TcpClient_Buff = "";
unsigned int TcpClient_BuffIndex = 0;
unsigned long TcpClient_preTick = 0;
unsigned long preHeartTick = 0;//心跳
unsigned long preTCPStartTick = 0;//连接
bool preTCPConnected = false;

//====初始化WiFiClient库==================================================
static uint32_t lastWiFiCheckTick = 0;//wifi 重连计时
WiFiClient client;  //初始化wifi客户端
HTTPClient http;  //初始化http
//====容错率之类的参数====================================================
const uint16_t kCaptureBufferSize = 1024;
#if DECODE_AC
const uint8_t kTimeout = 50;
#else   // DECODE_AC
const uint8_t kTimeout = 15;
#endif  // DECODE_AC
const uint16_t kMinUnknownSize = 12;
const uint8_t kTolerancePercentage = kTolerance;
#define LEGACY_TIMING_INFO false
//=====================================================================
void irrecv_IR_k();
void irrecv_IR_g();
void state_D7();
void turnOn_D1();
void turnOff_D1();
void ir_ESP();        //红外
void doWiFiTick();    //WIFI
void startSTA();      //WIFI
void doHttpStick_1();   //微信
void doHttpStick_2();
void doTCPClientTick();
void startTCPClient();
void sendtoTCPServer(String p);
//==============引脚=====================================================
#define sensor    D7  //传感器输入口
const int D1_Pin = D0;     //单片机引脚值
const int D2_Pin = D1;
const uint16_t kRecvPin = 14; //接收管的引脚 )
IRrecv irrecv(kRecvPin, kCaptureBufferSize, kTimeout, true);//传进所有的参数,固定写上即可(没有kCaptureBufferSize, kTimeout可以不填,只填kRecvPin也ok)
decode_results results;//固定写上即可,红外接收数据的results变量

const uint16_t kIrLed = 4;//发射的引脚(
IRsend irsend(kIrLed);//传进发射引脚参数
//====用户私钥,可在控制台获取===============================================
String ApiUrl = "http://ai.bemfa.com/api/wechat/v1/";        //默认 api 网址
String postData1 = "uid=c3a3d92************dbd9225bcf2&type=1&time=0&device=防盗警报预警&msg=!!!防区警报已触发!!!&msg2=!警报!";
String postData2 = "uid=f169873c************d5cc0b7bee7caef&type=1&time=0&device=防盗警报预警&msg=!!!防区警报已触发!!!&msg2=!警报!";
int jb;
//====红外raw编码=========================================================
uint16_t rawData_Results[555]; //存放红外发射用的raw码数组,注意必须是uint16_t这个类型(这里研究了好久233),然后长度设置长一点,300左右差不多,我这比较夸张
uint16_t rawData_Q[71] = {8998, 4456,  596, 554,  566, 558,  562, 562,  570, 1644,  598, 552,  568, 556,  566, 560,  562, 562,  568, 1646,  598, 1644,  598, 1642,  590, 560,  570, 1642,  590, 1652,  590, 1650,  592, 1648,  594, 1646,  596, 1646,  598, 552,  568, 1646,  596, 554,  568, 556,  564, 560,  570, 554,  568, 556,  564, 560,  570, 1644,  600, 552,  568, 1646,  596, 1644,  590, 1650,  590, 1650,  592, 39904,  8998, 2218,  592};
//===== WIFI重新连接函数=================================================
void startSTA() {
  WiFi.disconnect();//断开连接
  WiFi.mode(WIFI_STA);//设置wifi模式
  WiFi.begin(DEFAULT_STASSID, DEFAULT_STAPSW);// 开始连接
}
//==== WIFI状态检测函数,如果WIFI断开自动重连============================
void doWiFiTick() {
  if ( WiFi.status() != WL_CONNECTED ) {//如果没连接
    if (millis() - lastWiFiCheckTick > 1000) { //未连接1s重连,检查是否大于1秒
      lastWiFiCheckTick = millis();
      startSTA();//重新连接
    }
  }
}


//=====setup 初始化====================================================
void setup() {
  Serial.begin(115200);//串口的波特率,不一样的话串口会乱码
  //=============初始化红外===============================================
  irsend.begin();//初始化irsend发射的这个库,必须要有
  irrecv.enableIRIn();     // 初始化irrecv接收的这个库,必须要有
  while (!Serial)          //等待初始化完成,防止莫名其妙的bug
    delay(55);
  //=============初始化引脚===============================================
  pinMode(sensor, INPUT);   // 传感器输入口 sensor as input
  delay(500);
  pinMode(LED_BUILTIN, OUTPUT); //设置引脚模式LED
  delay(500);
  pinMode(D1_Pin, OUTPUT); //设置引脚模式为输出
  delay(500);
  pinMode(D2_Pin, OUTPUT); //设置引脚模式为输出
  delay(500);
  digitalWrite(D1_Pin, HIGH); //设置引脚为HIGH
  digitalWrite(D2_Pin, HIGH); //设置引脚为HIGH
  //=============初始化WiFi===============================================
  WiFi.mode(WIFI_OFF);        //设置wifi模式
  delay(1000);
  WiFi.mode(WIFI_STA);         //设置wifi模式
  WiFi.begin(DEFAULT_STASSID, DEFAULT_STAPSW);     //开始连接wifi
  Serial.println("");
  Serial.print("Connecting");  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) { //检查是否连接成功
    delay(300);
    //   Serial.print(".");
    digitalWrite(LED_BUILTIN, HIGH);
    delay(200);
    digitalWrite(LED_BUILTIN, LOW);
  }

  jb = 1;
}
//====TCP初始化连接=========================================================
void sendtoTCPServer(String p) {
  if (!TCPclient.connected())
  {
    Serial.println("Client is not readly");
    return;
  }
  TCPclient.print(p);
  Serial.println("[Send to TCPServer]:String");
  Serial.println(p);
}

//====发送主题=========================================================
void startTCPClient() {
  if (TCPclient.connect(TCP_SERVER_ADDR, atoi(TCP_SERVER_PORT))) {
    Serial.print("\nConnected to server:");
    Serial.printf("%s:%d\r\n", TCP_SERVER_ADDR, atoi(TCP_SERVER_PORT));
    String subStr = "";
    subStr = "cmd=1&uid=" + UID + "&topic=" + TOPIC1 + "\r\n";
    sendtoTCPServer(subStr);
    subStr = "";
    subStr = "cmd=1&uid=" + UID + "&topic=" + TOPIC2 + "\r\n";
    sendtoTCPServer(subStr);
    subStr = "";
    preTCPConnected = true;
    preHeartTick = millis();
    TCPclient.setNoDelay(true);
  }
  else {
    Serial.print("Failed connected to server:");
    Serial.println(TCP_SERVER_ADDR);
    TCPclient.stop();
    preTCPConnected = false;
  }
  preTCPStartTick = millis();
}
//====检查数据,发送心跳=========================================================
void doTCPClientTick() {   //检查是否断开,断开后重连
  if (WiFi.status() != WL_CONNECTED) return;
  if (!TCPclient.connected()) {//断开重连
    if (preTCPConnected == true) {
      preTCPConnected = false;
      preTCPStartTick = millis();
      Serial.println();
      Serial.println("TCP Client disconnected.");
      TCPclient.stop();
    }
    else if (millis() - preTCPStartTick > 1 * 1000) //重新连接
      startTCPClient();
  }
  else
  {
    if (TCPclient.available()) {//收数据
      char c = TCPclient.read();
      TcpClient_Buff += c;
      TcpClient_BuffIndex++;
      TcpClient_preTick = millis();

      if (TcpClient_BuffIndex >= MAX_PACKETSIZE - 1) {
        TcpClient_BuffIndex = MAX_PACKETSIZE - 2;
        TcpClient_preTick = TcpClient_preTick - 200;
      }
      preHeartTick = millis();
    }
    if (millis() - preHeartTick >= KEEPALIVEATIME) { //保持心跳
      preHeartTick = millis();
      Serial.println("--Keep alive:");
      sendtoTCPServer("cmd=0&msg=keep\r\n");
    }
  }
  //====收数据,判断=========================================================
  if ((TcpClient_Buff.length() >= 1) && (millis() - TcpClient_preTick >= 200))
  { //data ready
    TCPclient.flush();
    //    Serial.println("Buff111");
    Serial.println(TcpClient_Buff);
    Serial.println(digitalRead(sensor));
    jb = 1;
    if ((TcpClient_Buff.indexOf("&msg=on") > 0))    //判断为on
    {
      if (TcpClient_Buff.indexOf(TOPIC1) > 0) {
        turnOn_D1();  //topic1
      }
      if (TcpClient_Buff.indexOf(TOPIC2) > 0) {
        turnOn_D2();  //topic2
      }
    }
    else if ((TcpClient_Buff.indexOf("&msg=off") > 0))   //判断为off
    {
      if (TcpClient_Buff.indexOf(TOPIC1) > 0) {
        turnOff_D1(); //topic1
      }
      if (TcpClient_Buff.indexOf(TOPIC2) > 0) {
        turnOff_D2(); //topic2
      }
    }
    TcpClient_Buff = "";
    TcpClient_BuffIndex = 0;
  }
}
//=============/微信消息推送函数===========================================
void doHttpStick_1() {
  http.begin(client, ApiUrl);             //Specify request destination
  http.addHeader("Content-Type", "application/x-www-form-urlencoded");    //Specify content-type header
  int httpCode = http.POST(postData1);   //微信消息推送函数
  String payload = http.getString();    //Get the response payload
  Serial.println(httpCode);   //Print HTTP return code
  Serial.println(payload);    //Print request response payload
  http.end();  //Close connection
  Serial.println("send success");
}
//=============/微信消息推送函数===========================================
void doHttpStick_2() {
  http.begin(client, ApiUrl);             //Specify request destination
  http.addHeader("Content-Type", "application/x-www-form-urlencoded");    //Specify content-type header
  int httpCode = http.POST(postData2);   //微信消息推送函数
  String payload = http.getString();    //Get the response payload
  Serial.println(httpCode);   //Print HTTP return code
  Serial.println(payload);    //Print request response payload
  http.end();  //Close connection
  Serial.println("send success");
}
//=======================================================================
/*
  void ir_ESP() {
  // delay(5000);
  // irsend.sendRaw(rawData_Q, 71, 38);
  digitalWrite(LED_BUILTIN, HIGH);
  delay(500);
  digitalWrite(LED_BUILTIN, LOW);
  delay(500);
  doHttpStick_1();//在想推送消息的地方执行推送函数即可
  delay(1000);
  doHttpStick_2();//在想推送消息的地方执行推送函数即可
  }
*/
void turnOn_D1() {
  digitalWrite(D1_Pin, LOW); //打开
  // delay(200); //点动开关
  // digitalWrite(D1_Pin, HIGH); //关闭
  digitalWrite(LED_BUILTIN, LOW);
}
void turnOn_D2() {
  Serial.println("电视开 ");
    // irsend.sendRaw(rawData_Q, 71, 38);
}
void turnOff_D1() {
  //  digitalWrite(D2_Pin, LOW); //打开
  // delay(200); //点动开关
  digitalWrite(D1_Pin, HIGH); //关闭
  digitalWrite(LED_BUILTIN, HIGH);
}
void turnOff_D2() {
  Serial.println("电视关 ");
    // irsend.sendRaw(rawData_Q, 71, 38);
}
void state_D7() {
  long state = digitalRead(sensor);
  if (state == LOW && jb == 1) { //判断d7触发
    doHttpStick_1();//在想推送消息的地方执行推送函数即可
    delay(100);
    doHttpStick_2();//在想推送消息的地方执行推送函数即可
    jb = 0;
  }
}

//==== 主循环============================================================
void loop() {
  doTCPClientTick();
  doWiFiTick();
  state_D7();
}

小白的 第一个作品勿喷。。。。。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部