锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

ESP8266远程控制4路继电器和温湿度感应

时间:2022-08-11 23:00:01 612断电延时中间继电器fa40继电器200kg继电器用大量的继电器dht11温度过高关闭继电器

好奇心最近买了智能家居的控制ESP8266套餐回来研究,用BLINKER4路远程控制继电器模块运行 温度和湿度感应,在整个课程发现原始视频后自动断开,在线搜索数据重写代码刷解决,代码使用ardiuno如下参考:

#define BLINKER_WIFI //支持wifi
//#define BLINKER_ESP_SMARTCONFIG //Smartconfig或手机微信扫码自动配网,代码配网请注
#define BLINKER_MIOT_MULTI_OUTLET //支持多路插座,最多4个插座
#define BLINKER_PRINT Serial //串口协议库
#define BLINKER_WITHOUT_SSL //blinker远程通信远程通信进行加密,但通信加密会消耗大量的信息RAM,如果你对通信安全没有要求
//可添加宏BLINKER_WITHOUT_SSL为了获得更多的可用性RAM,BLINKER_WITHOUT_SSL目前只能用于ESP8266,其他设备的RAM足以进行加密通信

#include //使用第三方Blinker库
#include


char auth[] = "e23d36641e5e"; //Blinker APP(阿里云服务器必须连接小爱同学)Secret Key(密钥)
///用这段代码配网
char ssid[] = "YZ01"; //wifi名称
char pswd[] = "YZ688ABC688"; //wifi密码

BlinkerNumber HUMI("humi");//调用湿度检测
BlinkerNumber TEMP("temp");//调用湿度检测

#define DHTPIN D4 //定义IO口
#define DHTTYPE DHT11 // 定义DHT11模块

DHT dht(DHTPIN, DHTTYPE);//运用DHT11针脚和型号

float humi_read = 0, temp_read = 0.//初始化温湿度值为0

void heartbeat()//心跳函数
{
HUMI.print(humi_read);
TEMP.print(temp_read);
}

//定义继电器信号
#define Relay_1 5 ///定义继电器1信号接入GPIO5,D1
#define Relay_2 4 ///定义继电器2信号接入GPIO4,D2
#define Relay_3 0 //定义继电器3信号接入GPIO0,D3
#define Relay_4 14 //定义继电器3信号接入GPI14,D5


///定义本地开关信号
#define KG_1 12 ///定义开关1信号接入GPIO12,D6
#define KG_2 13 ///定义开关2信号接入GPIO13,D7
#define KG_3 3 //定义开关3信号接入GPIO3,RX(GPIO15/D8继续低电平,然后改为GPIO3/RX接口)


// 新建Blinker软件组件对象
BlinkerButton Button("MainSwitch"); //组件对象,要和APP组件中的数据键名一致,总开关
BlinkerButton Button1("Switch1"); //组件对象,要和APP组件中的数据键名一致,开关1
BlinkerButton Button2("Switch2"); //组件对象,要和APP开关2
BlinkerButton Button3("Switch3"); //组件对象,要和APP开关3
BlinkerButton Button4("Switch4"); //组件对象,要和APP组件中的数据键名一致,开关4
BlinkerButton Button5("Refresh"); //APP刷新端按钮状态

///定义插座状态,反馈小爱同学的状态
bool oState[5] = { false };
#define OUTLET_ALL 0 ///所有插孔
#define OUTLET_NO_1 1 ///插座插孔一
#define OUTLET_NO_2 2 //插座插孔二
#define OUTLET_NO_3 3 ///插座插孔三
#define OUTLET_NO_4 4 //插座插孔四

///反馈继电器状态函数
void RelayState(int num)
{
switch(num)
{
case 1: ///插座插孔状态
if(digitalRead(Relay_1)==LOW)
{
Button1.color("#FFFF00"); //设置app按钮为纯黄色,16进制色码
Button1.text("开关1开"); //设置app按键注释开
Button1.print("on");
oState[1] = true;
}
else if(digitalRead(Relay_1==HIGH))
{
Button1.color("#808080"); //设置app按钮为灰色,16进制颜色码
Button1.text("开关1关"); //设置app按键注释关
Button1.print("off");
oState[1] = false;
}
break;
case 2:
if(digitalRead(Relay_2)==LOW)
{
Button2.color("#FFFF00"); //设置app按钮为纯黄色,16进制色码
Button2.text("开关2开"); //设置app按键注释开
Button2.print("on");
oState[2] = true;
}
else if(digitalRead(Relay_2==HIGH))
{
Button2.color("#808080"); //设置app按钮为灰色,16进制颜色码
Button2.text("开关2关"); nbsp;        //设置app按键注释“关”
          Button2.print("off");
          oState[2] = false;
        }
        break;
    case  3:
        if(digitalRead(Relay_3)==LOW)
        {
          Button3.color("#FFFF00");   //设置app按键是纯黄色,16进制颜色码
          Button3.text("开关3开");          //设置app按键注释“开”
          Button3.print("on");
          oState[3] = true;
        }
        else if(digitalRead(Relay_3==HIGH))
        {
          Button3.color("#808080");   //设置app按键是灰色,16进制颜色码
          Button3.text("开关3关");          //设置app按键注释“关”
          Button3.print("off");
          oState[3] = false;
        }
        break;

         case  4:
        if(digitalRead(Relay_4)==LOW)
        {
          Button4.color("#FFFF00");   //设置app按键是纯黄色,16进制颜色码
          Button4.text("开关4开");          //设置app按键注释“开”
          Button4.print("on");
          oState[4] = true;
        }
        else if(digitalRead(Relay_4==HIGH))
        {
          Button4.color("#808080");   //设置app按键是灰色,16进制颜色码
          Button4.text("开关4关");          //设置app按键注释“关”
          Button4.print("off");
          oState[4] = false;
        }
        break;
        default:
            break;
  }
}
 
//小爱同学控制插座多个插孔
void ctrl_multi_outlet(uint8_t num, uint8_t io_level)
{
    switch (num)
        {
            case 0:  //所有插孔
                digitalWrite(Relay_1, io_level);//控制继电器1
                digitalWrite(Relay_2, io_level);//控制继电器2
                digitalWrite(Relay_3, io_level);//控制继电器3
                digitalWrite(Relay_4, io_level);//控制继电器4
                break;
            case 1:  //插座插孔一
                digitalWrite(Relay_1, io_level);//控制继电器1
                break;
            case 2:  //插座插孔二
                digitalWrite(Relay_2, io_level);//控制继电器2
                break;
            case 3:  //插座插孔三
                digitalWrite(Relay_3, io_level);//控制继电器3
                break;
            case 4:  //插座插孔四
                digitalWrite(Relay_4, io_level);//控制继电器4
                break;
            default:
                break;
        }
}
 
//小爱电源类回调,例如:“打开插座”、“打开插座插孔一”、“打开插座插孔二”
void miotPowerState(const String & state, uint8_t num)
{
    BLINKER_LOG("need set outlet: ", num, ", power state: ", state);
 
    if (state == BLINKER_CMD_ON) 
    {
        ctrl_multi_outlet(num, LOW);//打开继电器,num表示是多少路(继电器低电平出发)
        BlinkerMIOT.powerState("on", num);
        BlinkerMIOT.print();
        RelayState(num);
 
        oState[num] = true;
    }
   else if (state == BLINKER_CMD_OFF) 
    {
        ctrl_multi_outlet(num, HIGH);//关闭继电器,num表示是多少路
 
        BlinkerMIOT.powerState("off", num);
        BlinkerMIOT.print();
        RelayState(num);
 
        oState[num] = false;
    }
}

//小爱设备查询的回调函数,查询设备状态,例如:“插座插孔一状态”
void miotQuery(int32_t queryCode,uint8_t num)
{
    BLINKER_LOG("开关",num,"状态",",codes:", queryCode);

    switch (num)
    {
         case 0 :
            BLINKER_LOG("状态:");
            BlinkerMIOT.powerState(oState[1] ? "on" : "off");
            BlinkerMIOT.powerState(oState[2] ? "on" : "off");
            BlinkerMIOT.powerState(oState[3] ? "on" : "off");
            BlinkerMIOT.powerState(oState[4] ? "on" : "off");
            BlinkerMIOT.print();
            break;
         case 1 :
            BLINKER_LOG("开关1状态:");
            BlinkerMIOT.powerState(oState[1] ? "on" : "off");
            BlinkerMIOT.print();
            break;
         case 2 :
            BLINKER_LOG("开关2状态:");
            BlinkerMIOT.powerState(oState[2] ? "on" : "off");
            BlinkerMIOT.print();
            break;
         case 3 :
            BLINKER_LOG("开关3状态:");
            BlinkerMIOT.powerState(oState[3] ? "on" : "off");
            BlinkerMIOT.print();
            break;
         case 4 :
            BLINKER_LOG("开关4状态:");
            BlinkerMIOT.powerState(oState[4] ? "on" : "off");
            BlinkerMIOT.print();
            break;
        
         default :
            BlinkerMIOT.powerState(oState[1] ? "on" : "off");
            BlinkerMIOT.powerState(oState[2] ? "on" : "off");
            BlinkerMIOT.powerState(oState[3] ? "on" : "off");
            BlinkerMIOT.powerState(oState[4] ? "on" : "off"); 
            BlinkerMIOT.print();
            break;
    }
 }

// 在APP控制,按下MainSwitch按键即会执行该函数
void button_callback(const String & state)
{
    BLINKER_LOG("操作了MainSwitch: ", state);//APP中的Monitor控件打印的信息
    if (state=="on") 
    {
        ctrl_multi_outlet(OUTLET_ALL, LOW);//打开继电器--所有
        // 反馈继电器状态
        Button.color("#FFFF00");   //设置app按键是纯黄色,16进制颜色码
        Button.text("开");          //设置app按键注释“开”
        Button.icon("fal fa-power-on");
        Button.print("on");
        Blinker.vibrate();  //开启继电器时反馈,让手机震动
    } else if(state=="off")
    {
        ctrl_multi_outlet(OUTLET_ALL, HIGH);//关闭继电器--所有
        // 反馈继电器状态
        Button.color("#808080");   //设置app按键是纯黄色,16进制颜色码
        Button.text("关");          //设置app按键注释“开”
        Button.icon("fal fa-power-off");
        Button.print("off");
    }
}
 
// 在APP控制,按下Switch1按键即会执行该函数--第1路开关
void button1_callback(const String & state)
{
    BLINKER_LOG("get button state: ", state);//APP中的Monitor控件打印的信息
    if (state=="on") 
    {
        ctrl_multi_outlet(OUTLET_NO_1, LOW);//打开继电器--第1路
        // 反馈继电器1状态
        RelayState(1);    //调用继电器反馈程序
    } else if(state=="off")
    {
        ctrl_multi_outlet(OUTLET_NO_1, HIGH);//关闭继电器--第1路
        // 反馈继电器状态
        RelayState(1);    //调用继电器反馈程序
    }
}
 
// 在APP控制,按下Switch2按键即会执行该函数--第2路开关
void button2_callback(const String & state)
{
    BLINKER_LOG("get button state: ", state);//APP中的Monitor控件打印的信息
    if (state=="on") 
    {
        ctrl_multi_outlet(OUTLET_NO_2, LOW);//打开继电器--第2路
        // 反馈继电器状态
        RelayState(2);    //调用继电器反馈程序
    } else if(state=="off")
    {
        ctrl_multi_outlet(OUTLET_NO_2, HIGH);//关闭继电器--第2路
        // 反馈继电器状态
        RelayState(2);    //调用继电器反馈程序
    }
}
 
 // 在APP控制,按下Switch3按键即会执行该函数--第3路开关
 void button3_callback(const String & state)
{
    BLINKER_LOG("get button state: ", state);//APP中的Monitor控件打印的信息
    if (state=="on") 
    {
        ctrl_multi_outlet(OUTLET_NO_3, LOW);//打开继电器--第3路
        // 反馈继电器状态
        RelayState(3);    //调用继电器反馈程序
    } else if(state=="off")
    {
        ctrl_multi_outlet(OUTLET_NO_3, HIGH);//关闭继电器--第3路
        // 反馈继电器状态
        RelayState(3);    //调用继电器反馈程序
    }
}
// 在APP控制,按下Switch4按键即会执行该函数--第4路开关 
 void button4_callback(const String & state)
{
    BLINKER_LOG("get button state: ", state);//APP中的Monitor控件打印的信息
    if (state=="on") 
    {
        ctrl_multi_outlet(OUTLET_NO_4, LOW);//打开继电器--第4路
        // 反馈继电器状态
        RelayState(4);    //调用继电器反馈程序
    } else if(state=="off")
    {
        ctrl_multi_outlet(OUTLET_NO_4, HIGH);//关闭继电器--第4路
        // 反馈继电器状态
        RelayState(4);    //调用继电器反馈程序
    }
}

//APP端状态手动刷新按钮
void button5_callback(const String & state)
{
  for(int i=0;i<5;i++)
  {
    RelayState(i);
  }
}


 
 //本地开关控制继电器程序
 void bdms()
 {
  if(digitalRead(KG_1)==LOW)
  {
    digitalWrite(Relay_1, !digitalRead(Relay_1));
    //反馈继电器1状态
    RelayState(1);    //调用继电器反馈程序
    Blinker.delay(1000);    //必须加延时,否则灯一直切换状态
  }
  if(digitalRead(KG_2)==LOW)
  {
    digitalWrite(Relay_2, !digitalRead(Relay_2));
    RelayState(2);    //调用继电器反馈程序
    Blinker.delay(1000); 
  }
  if(digitalRead(KG_3)==LOW)
  {
    digitalWrite(Relay_3, !digitalRead(Relay_3));
    RelayState(3);    //调用继电器反馈程序
    Blinker.delay(1000);
  }
 }
 
void setup()
{
    // 初始化串口,用于调试,后期可删除
    Serial.begin(115200);
    BLINKER_DEBUG.stream(Serial);
    BLINKER_DEBUG.debugAll();
    

    pinMode(LED_BUILTIN, OUTPUT);//输出LED点亮
    digitalWrite(LED_BUILTIN, LOW);//LED灯点亮为低电平,指向D4运行


  
    // 初始化有继电器的IO
    pinMode(Relay_1, OUTPUT);
    pinMode(Relay_2, OUTPUT);
    pinMode(Relay_3, OUTPUT);
    pinMode(Relay_4, OUTPUT);
    
    //初始化继电器初始状态
    digitalWrite(Relay_1, HIGH);       //继电器为低电平触发,初始化为HIGH
    digitalWrite(Relay_2, HIGH);
    digitalWrite(Relay_3, HIGH);
    digitalWrite(Relay_4, HIGH);
    //初始化本地按键状态
    pinMode(KG_1, INPUT_PULLUP);   //本地开关输入上拉
    pinMode(KG_2, INPUT_PULLUP);   //本地开关输入上拉
    pinMode(KG_3, INPUT_PULLUP);   //本地开关输入上拉
    
    //初始化blinker
   // Blinker.begin(auth);              //手机配网用这段
    Blinker.begin(auth, ssid, pswd);//代码配网用这段
    Button.attach(button_callback);   //绑定按键回调
    Button1.attach(button1_callback); //绑定按键回调
    Button2.attach(button2_callback); //绑定按键回调
    Button3.attach(button3_callback); //绑定按键回调
    Button4.attach(button4_callback); //绑定按键回调
    Button5.attach(button5_callback);
    
    //小爱同学注册回调
    BlinkerMIOT.attachPowerState(miotPowerState); //注册小爱电源回调
    BlinkerMIOT.attachQuery(miotQuery);           //小爱设备查询的回调函数
    
    //心跳包,初始化
    Blinker.attachHeartbeat(heartbeat);           //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态
        dht.begin();//开始检测dht数值
}
 
void loop() 
{
  bdms();           //本地开关模式
  Blinker.run();

    float h = dht.readHumidity();//读取湿度
    float t = dht.readTemperature();//读取温度

    if (isnan(h) || isnan(t))//isnan意思为空,没有数据意思
    {
        BLINKER_LOG("Failed to read from DHT sensor!");
    }
    else
    {
        BLINKER_LOG("Humidity: ", h, " %");
        BLINKER_LOG("Temperature: ", t, " *C");
        humi_read = h;
        temp_read = t;
    }

    Blinker.delay(2000);//延时检测温湿度时间
}

 

温湿度显示正常,但有一个地方出现了问题,一个心跳反馈引起APP显示按钮不能自动刷新,这样可能会导致小爱不能正常反馈控制,后续看下读到此贴的大神有否解决方案,还想把断电保存记忆的功能写进,听说是用eeprom写进。
 

 

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章