物联网多控开关智能家居方案

有很多错误,请大家指教

/*目前程序支持通过检测电流状态来判断是否执行继电器转换触点
 * 支持微信消息推送,能实时根据电流状态向主题发送开关
* 智能语言控制控制,支持同时天猫、小爱、小度、google Assistent控制
* 也同时支持web控制、小程序控制、app控制,定时控制等
*
*/

#include <ESP8266WiFi.h>               //WIFI库文件
#include <PubSubClient.h>              //MQTT推送库文件
#include <ESP8266HTTPClient.h>        //TCP库

//********************需要修改的部分*******************//
//const char* ssid = "**********";           //WIFI名字
//const char* password = "********";     //WIFI密码
const char* ssid = "*******";           //WIFI名字
const char* password = "********";     //WIFI密码
#define ID_MQTT  "***************************"     //用户私钥,控制台获取
const char*  topic = "light001002";        //主题名字,可在巴法云控制台自行创建,名称随意
const int outputpin1 = D1;       //单片机引脚值,D系列是NodeMcu引脚命名方式,用于继电器触点转换
const int outputpin2 = D2;       //单片机引脚值,D系列是NodeMcu引脚命名方式
int currents; //定义电流为整数型变量

String uid = "************************";             // 用户私钥,巴法云控制台获取,用于微信推送消息
String msg = "";
String title = "客厅灯";                           // 消息标题
String msg2 = "已打开";                             //发送的消息
String msg3 = "已关闭";
//**************************************************//

String ApiUrl = "http://go.bemfa.com/v1/sendwechatcard";  
bool relay="ture";  //定义布尔变量,用于继电器转换
bool cloudpush="false";//mqtt和微信消息推送布尔变量


const char* mqtt_server = "bemfa.com"; //默认,MQTT服务器
const int mqtt_server_port = 9501;      //默认,MQTT服务器


WiFiClient Client;
WiFiClient espClient;
PubSubClient client(espClient);
HTTPClient http;  //初始化http

void setup() {
  pinMode(outputpin1, OUTPUT); //设置引脚为输出模式
  pinMode(outputpin2, OUTPUT); //设置引脚为输出模式
  Serial.begin(9600);     //设置波特率9600,hlw8110的未9600
  setup_wifi();           //设置wifi的函数,连接wifi
  client.setServer(mqtt_server, mqtt_server_port);//设置mqtt服务器
  client.setCallback(callback); //mqtt消息处理
}

void loop() {
  if (!client.connected()) {
    reconnect();
  } 
  
  //状态实时反馈语句段  
  if(currents>10 && cloudpush=="false"){
    statebackON();//电流状态返馈,反馈到mqtt服务器同步
    doHttpStickON(); //微信消息推送函数
    cloudpush="true";
  }else if(currents<10 && cloudpush=="true"){
    statebackOFF();//电流状态返馈,反馈到mqtt服务器同步
    doHttpStickOFF();//微信消息推送函数
    cloudpush="false";
  }else{  
    Serial.println(" ”已开“/”已关“状态已推送至maqtt服务器,不在重复推送");
  }

  client.loop();
  delay(10);
}


//wifi连接
void setup_wifi() {
  delay(10);
  //Serial.println();
  Serial.println("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(1000);
    Serial.println("wait connect to wifi.");
    }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}


//回调函数
void callback(char* topic, byte* payload, unsigned int length) 
{
  Serial.print("get Topic:");
  Serial.println(topic);
  for (int i = 0; i < length; i++) 
  {
    msg += (char)payload[i];
    }
  Serial.print("Msg:");
  Serial.println(msg);
  if (msg == "on" && currents<10) //如果接收字符on,且电流小于10ma,亮灯
  {
    SwitchRelay();//继电器触点转换
    Serial.println("switch relay succeed");
  } 
  else if (msg == "off"&&currents>=10)//如果接收字符off,且电流大于10ma,灭灯
  {
    SwitchRelay();//继电器触点转换
    Serial.println("switch relay succeed");
  }
  else if (msg == "off" && currents<10)
  {
   Serial.println("Closed. Please do not repeat order.");
   } 
  else if (msg == "on"&& currents>=10){
    Serial.println("Opened. Please do not repeat order.");
  }
  else{}
  msg = ""; 
}


  
//mqtt重连函数
void reconnect() {
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    if (client.connect(ID_MQTT)) {
      Serial.println("connected");
      Serial.print("subscribe:");
       client.subscribe(topic);
       Serial.println(topic);
      //订阅主题,如果需要订阅多个主题,可发送多条订阅指令client.subscribe(topic2);client.subscribe(topic3);
     
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);} } 
}

//继电器触点转换
void SwitchRelay(){
  if(relay){      //通过布尔函数对继电器连接的触点进行切换
    digitalWrite(outputpin1,HIGH);   //D2为此处的引脚编号,根据需要更改-
    delay(70);   //脉冲电流宽度>=50ms,括弧单位毫秒
    digitalWrite(outputpin1,LOW); 
    relay=false;
  }else if (!relay){
    digitalWrite(outputpin2,HIGH);  //D5为此处的引脚编号,根据需要更改-
    delay(70);
    digitalWrite(outputpin2,LOW);
    relay=true;}
}


//电流状态返馈,反馈到mqtt服务器同步
void statebackON(){
    String litemsg1 = "on" ;//数据封装 状态关#亮度100
    client.publish(topic, litemsg1.c_str());//mqtt数据上传  
}
void statebackOFF(){
  String litemsg2 = "off" ;//数据封装 状态关#亮度100
  client.publish(topic, litemsg2.c_str());
  }//mqtt数据上传}

 
//******微信消息推送函数********//
 void doHttpStickON(){  //微信消息推送函数
           http.begin(Client,ApiUrl+"?uid="+uid+"&title="+title+"&msg="+msg2);  //初始化请求
           int httpCode = http.GET();                                  //发送请求
          if (httpCode > 0) { // 检查状态码
            String payload = http.getString();   //获取响应信息
            Serial.println(payload); }            //打印响应信息
          http.end();   //关闭http
  }
   void doHttpStickOFF(){  //微信消息推送函数
           http.begin(Client,ApiUrl+"?uid="+uid+"&title="+title+"&msg="+msg3);  //初始化请求
           int httpCode = http.GET();                                  //发送请求
          if (httpCode > 0) { // 检查状态码
            String payload = http.getString();   //获取响应信息
            Serial.println(payload); }            //打印响应信息
          http.end();   //关闭http
  }

具体详见智能多控开关_哔哩哔哩_bilibili

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值