ESP8266 红外遥控+触发警报+微信提醒
//====各种乱七八糟的库====================================================
#include
#include
#include
#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();
}
小白的 第一个作品勿喷。。。。。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
