ESP8266-NodeMCU项目(四):将上一项目的空调控制接入小爱同学(Blinker_APP同步控制+DHT11温湿度模块数据接入)

错开の折腾经历:ESP8266 NodeMCU


前言

之前已经进行了项目二:DHT11接入小爱同学以及项目三:空调控制,接下来便是将二者合一,实现app控制,温湿度查看,以及小爱同学进行简单空调控制。


滴滴:以下是本篇文章正文内容

思路:

实现app+小爱双控制
将设备伪装为灯(就让小爱同学把咱设备定义为灯),然后自定义灯模式函数实现多状态控制空调。

官方参考链接:
接入小爱同学の帮助文档
官方示例文件

可以从以上资料中看见以下的模式函数,我们要做的就是将其进行魔改!

void miotMode(uint8_t mode)
{
    BLINKER_LOG("need set mode: ", mode);

    if (mode == BLINKER_CMD_MIOT_DAY) {
        // Your mode function
    }
    else if (mode == BLINKER_CMD_MIOT_NIGHT) {
        // Your mode function
    }
    else if (mode == BLINKER_CMD_MIOT_COLOR) {
        // Your mode function
    }
    else if (mode == BLINKER_CMD_MIOT_WARMTH) {
        // Your mode function
    }
    else if (mode == BLINKER_CMD_MIOT_TV) {
        // Your mode function
    }
    else if (mode == BLINKER_CMD_MIOT_READING) {
        // Your mode function
    }
    else if (mode == BLINKER_CMD_MIOT_COMPUTER) {
        // Your mode function
    }

    wsMode = mode;

    BlinkerMIOT.mode(mode);
    BlinkerMIOT.print();
}

Blinker_APP设备配置:

紧接着上一项目的空调控制器设备进行更改,增加新组建,实现更多功能

请添加图片描述
配置代码如下:

{¨version¨¨2.0.0¨¨config¨{¨headerColor¨¨transparent¨¨headerStyle¨¨dark¨¨background¨{¨img¨¨assets/img/headerbg.jpg¨¨isFull¨«}}¨dashboard¨|{¨type¨¨tex¨¨t0¨¨空调控制器¨¨t1¨¨以指定状态运行¨¨size¨¨22¨¨bg¨Ê¨ico¨¨fad fa-air-conditioner¨¨cols¨Í¨rows¨Ë¨key¨¨tex-cnl¨´x´É´y´Î¨speech¨|÷¨lstyle¨Ì¨clr¨¨#076EEF¨}{ßC¨btn¨ßL¨fad fa-snowflakes¨¨mode¨ÉßE¨25℃、制冷、高凤¨ßG¨文本2¨ßKËßNÍßOÍßP¨btn-on¨´x´É´y´ÐßR|÷ßSËßTßU}{ßCßVßLßWßXÉßE¨25℃、制冷、自动风¨ßGßZßKËßNÍßOÍßP¨btn-on-auto¨´x´Í´y´ÐßR|÷ßSËßTßU}{ßCßVßLßWßXÉßE¨26℃、制冷、最大风¨ßGßZßKËßNÍßOÍßP¨btn-26¨´x´É´y´¤BßR|÷ßTßUßSË}{ßCßVßL¨fad fa-power-off¨ßXÉßE¨关机¨ßGßZßKËßNÍßOÍßP¨btn-off¨´x´Í´y´¤BßR|÷ßSËßTßU}{ßC¨deb¨ßXÉßKÉßNÑßOÌßP¨debug¨´x´É´y´ËßR|÷}{ßC¨num¨ßE¨温度¨ßL¨fad fa-thermometer-three-quarters¨ßTßU¨min¨É¨max¨¢1c¨uni¨´℃´ßKÊßNËßOËßP¨temp¨´x´Í´y´ÎßR|÷ßSÉ}{ßCßkßE¨湿度¨ßL¨fad fa-humidity¨ßTßUßnÉßoº0ßp´%´ßKÊßNËßOËßP¨humi¨´x´Ï´y´ÎßR|÷}÷¨actions¨|÷¨triggers¨|÷}

程序代码

代码如下:

#define BLINKER_PRINT Serial
#define BLINKER_WIFI
#define BLINKER_MIOT_LIGHT //小爱同学定义为灯

#include <IRremoteESP8266.h>
#include <IRsend.h>  //红外头文件      
#include <Blinker.h>  //点灯科技头文件
#include <DHT.h>         //DHT11传感器的头文件
 
#define DHTPIN 4      //定义DHT11模块连接管脚GPIO4(D2脚)
#define DHTTYPE DHT11   // 使用DHT11温度湿度模块

char auth[] = "";//这里面填写设备的密钥
char ssid[] = "";//这里填写你的wifi名字
char pswd[] = "";//这里填写你的WiFi密码

//定义红外发射的管脚
const uint16_t kIrLed = 14;  // 设置kIrLed为GPIO14,D5脚
IRsend irsend(kIrLed);  // 将kIrLed设置发送信息

//空调开:25、制冷、大风
uint16_t power_on[199] = {5998, 7318,  478, 1712,  540, 1622,  474, 1712,  542, 1622,  474, 1712,  542, 1620,  474, 1714,  542, 1622,  474, 596,  568, 532,  456, 618,  568, 532,  476, 598,  570, 532,  478, 596,  570, 532,  478, 1712,  542, 1622,  474, 1712,  542, 1622,  474, 1712,  542, 1622,  474, 1714,  542, 1622,  474, 598,  568, 532,  456, 618,  568, 532,  478, 598,  568, 532,  478, 596,  570, 532,  478, 1712,  544, 1622,  474, 1714,  542, 1622,  474, 1712,  544, 1622,  474, 1712,  544, 1622,  474, 598,  570, 532,  456, 618,  568, 532,  476, 600,  566, 532,  478, 602,  566, 530,  478, 1710,  546, 532,  456, 1732,  522, 556,  454, 1732,  546, 532,  526, 1660,  546, 1622,  526, 576,  514, 1650,  476, 626,  514, 1646,  478, 626,  548, 1612,  510, 594,  554, 522,  506, 596,  552, 1610,  506, 1660,  576, 524,  504, 1662,  572, 528,  502, 1664,  566, 1622,  502, 1664,  562, 536,  504, 574,  536, 1652,  504, 576,  534, 1654,  504, 596,  508, 570,  502, 598,  506, 1660,  502, 598,  506, 1660,  502, 598,  504, 1664,  498, 600,  502, 600,  476, 1692,  474, 626,  472, 1718,  448, 630,  470, 1720,  448, 630,  470, 1720,  448, 1720,  470, 7384,  446};  // GOODWEATHER D5292A000000
//空调开:25、制冷、自动风
uint16_t power_on_auto[199] = {6036, 7330,  476, 1716,  514, 1650,  474, 1716,  516, 1650,  474, 1716,  514, 1652,  520, 1670,  514, 1652,  524, 550,  542, 560,  456, 650,  514, 558,  476, 628,  514, 560,  478, 628,  514, 560,  476, 1718,  514, 1652,  474, 1716,  516, 1650,  476, 1716,  514, 1652,  474, 1716,  514, 1652,  474, 600,  540, 562,  456, 648,  514, 560,  476, 628,  512, 562,  478, 598,  540, 562,  456, 624,  538, 1654,  452, 622,  540, 1654,  452, 1738,  512, 1654,  452, 1738,  512, 1652,  454, 1738,  514, 562,  476, 1718,  514, 560,  456, 650,  514, 560,  476, 630,  512, 562,  476, 1718,  514, 560,  478, 1716,  514, 560,  478, 1718,  512, 1654,  454, 1738,  514, 1652,  454, 650,  510, 1654,  474, 630,  512, 1652,  504, 600,  514, 560,  508, 598,  514, 560,  506, 600,  512, 1652,  504, 1688,  514, 560,  508, 1686,  516, 560,  506, 1686,  516, 1652,  504, 1686,  518, 558,  506, 596,  542, 1624,  506, 596,  546, 1622,  528, 574,  552, 524,  558, 544,  580, 1586,  556, 548,  578, 1586,  562, 540,  578, 1586,  560, 546,  576, 500,  526, 1640,  602, 502,  552, 1614,  602, 500,  524, 1640,  602, 502,  498, 1668,  574, 1616,  502, 7332,  456}; // GOODWEATHER D5290A050000
//空调开:26、制冷、大风
uint16_t power_on_26[199] = {6062, 7302,  476, 1718,  538, 1628,  474, 1716,  540, 1626,  454, 1740,  514, 1650,  472, 1718,  516, 1650,  452, 620,  542, 560,  528, 546,  544, 560,  456, 620,  544, 560,  458, 618,  544, 558,  478, 1716,  516, 1650,  452, 1740,  514, 1650,  454, 1738,  516, 1650,  474, 1718,  514, 1652,  454, 618,  544, 558,  458, 620,  542, 560,  456, 620,  544, 560,  456, 620,  544, 560,  528, 1668,  516, 558,  476, 1718,  540, 1626,  476, 1716,  516, 1650,  454, 1738,  516, 1650,  474, 600,  544, 1650,  476, 598,  544, 560,  476, 602,  542, 560,  476, 604,  540, 560,  456, 1740,  514, 560,  476, 1718,  538, 536,  456, 1740,  538, 536,  456, 1738,  516, 1650,  476, 628,  514, 1652,  454, 648,  514, 1652,  454, 648,  514, 1652,  476, 626,  516, 562,  506, 1684,  546, 532,  532, 1660,  552, 524,  556, 1634,  582, 496,  560, 1634,  580, 1584,  562, 542,  580, 1584,  560, 544,  578, 1586,  530, 574,  576, 1588,  530, 576,  548, 526,  504, 602,  546, 1618,  504, 576,  568, 1620,  502, 578,  564, 1624,  504, 576,  562, 536,  502, 1666,  538, 562,  504, 1666,  536, 564,  504, 1666,  534, 566,  502, 1690,  510, 1658,  504, 7332,  502};  // GOODWEATHER D52A2A020000
//空调关:
uint16_t power_off[199] = {6022, 7290,  476, 1714,  510, 1650,  472, 1714,  512, 1650,  518, 1668,  510, 1652,  472, 1714,  512, 1650,  474, 626,  510, 560,  454, 648,  512, 562,  474, 598,  542, 562,  476, 598,  540, 560,  476, 1714,  512, 1650,  472, 1714,  512, 1648,  474, 1712,  512, 1650,  474, 1712,  512, 1650,  474, 598,  538, 560,  508, 568,  538, 560,  476, 596,  542, 560,  476, 628,  510, 562,  476, 1714,  512, 1650,  474, 1714,  510, 1650,  474, 1714,  512, 1650,  474, 1714,  512, 1650,  474, 626,  510, 562,  506, 596,  512, 560,  476, 628,  512, 560,  500, 602,  512, 562,  476, 1714,  514, 1648,  502, 1686,  512, 560,  502, 1688,  514, 560,  508, 1682,  514, 1648,  506, 594,  514, 560,  504, 598,  514, 1650,  502, 596,  516, 1648,  502, 598,  516, 556,  508, 596,  514, 1650,  504, 1682,  518, 558,  506, 1682,  520, 556,  504, 1684,  522, 1644,  504, 1682,  550, 528,  504, 596,  550, 1614,  530, 570,  578, 1586,  558, 544,  578, 498,  560, 542,  576, 1586,  562, 542,  576, 1586,  560, 544,  576, 1586,  558, 546,  576, 502,  552, 1612,  600, 502,  520, 1644,  598, 532,  470, 1664,  572, 530,  500, 1664,  570, 1620,  500, 7328,  456};  // GOODWEATHER D52928000000

// 新建Blinker组件对象
BlinkerButton Button1("btn-on");
BlinkerButton Button2("btn-on-auto");
BlinkerButton Button3("btn-26");
BlinkerButton Button4("btn-off");

BlinkerNumber HUMI("humi");    //定义湿度数据键名
BlinkerNumber TEMP("temp");    //定义温度数据键名

DHT dht(DHTPIN, DHTTYPE);    //定义dht
float humi_read = 0, temp_read = 0;  //初始化读取的数据

void heartbeat()
{
    HUMI.print(humi_read);        //给blinkerapp回传湿度数据
    TEMP.print(temp_read);        //给blinkerapp回传温度数据
}

void miotMode(uint8_t mode)//用户自定义模式
{
    BLINKER_LOG("need set mode: ", mode);

    if (mode == BLINKER_CMD_MIOT_DAY) {//日光模式
        BLINKER_LOG("宿舍空调开:25,制冷,大风");
        irsend.sendRaw(power_on, 199, 38);
        delay(100);
    }
    else if (mode == BLINKER_CMD_MIOT_NIGHT) {//月光模式
        BLINKER_LOG("宿舍空调开:25,制冷,自动风");
        irsend.sendRaw(power_on_auto, 199, 38);
        delay(100);
    }
    else if (mode == BLINKER_CMD_MIOT_COLOR) {//彩光模式
        BLINKER_LOG("宿舍空调开:26,制冷,大风");
        irsend.sendRaw(power_on_26, 199, 38);
        delay(100);
    }
    else if (mode == BLINKER_CMD_MIOT_WARMTH) {//温馨模式
        BLINKER_LOG("宿舍空调关");
        irsend.sendRaw(power_off, 199, 38);
        delay(100);
    }
    BlinkerMIOT.mode(mode);
    BlinkerMIOT.print();
}

void setup()
{
  BLINKER_DEBUG.stream(Serial);
  //初始化串口
  Serial.begin(115200);
  //注册回调函数/
  Button1.attach(Button1_callback);
  Button2.attach(Button2_callback);
  Button3.attach(Button3_callback);
  Button4.attach(Button4_callback);
 //配网步骤:WIFI接入
  Blinker.begin(auth,ssid,pswd); 
  //红外初始化
  irsend.begin();
  Blinker.attachHeartbeat(heartbeat);//注册心跳函数:向app回传数据
  dht.begin();
  BlinkerMIOT.attachMode(miotMode);//注册自定义模式函数

}

void loop()
{
  Blinker.run(); 
    float h = dht.readHumidity();    //读取DHT11采集的湿度数据
    float t = dht.readTemperature(); //读取DHT11采集的温度数据
 
    if (isnan(h) || isnan(t))//判断温湿度值是否为空
    {
        BLINKER_LOG("读取传感器数据失败");
    }
    else
    {
        BLINKER_LOG("Humidity: ", h, " %");//打印输出调试信息
        BLINKER_LOG("Temperature: ", t, " *C");
        humi_read = h;
        temp_read = t;
    }
    Blinker.delay(500);
}

//回调函数1
void Button1_callback(const String &state)
{

  BLINKER_LOG("get button state: ", state);
  //检测到普通按钮按下(btn-on)
  if (state == BLINKER_CMD_BUTTON_TAP)
  {
    //发送红外指令
    irsend.sendRaw(power_on, 199, 38);
    Button1.print("宿舍空调开:25,制冷,大风");
  
  }

}

//回调函数2
void Button2_callback(const String &state)
{
  BLINKER_LOG("get button state: ", state);
  //检测到btn-on-auto按钮按下
  if (state == BLINKER_CMD_BUTTON_TAP)
  {
    irsend.sendRaw(power_on_auto, 199, 38);
    Button2.print("宿舍空调开:25,制冷,自动风");
  }

}

//回调函数3
void Button3_callback(const String &state)
{

  BLINKER_LOG("get button state: ", state);
  //检测到按钮btn-26按下
  if (state == BLINKER_CMD_BUTTON_TAP)
  {
    //发送红外指令
    irsend.sendRaw(power_on_26, 199, 38);
    Button1.print("宿舍空调开:26,制冷,大风");
  
  }

}

//回调函数4
void Button4_callback(const String &state)
{
  BLINKER_LOG("get button state: ", state);
  //检测到btn-off按钮按下
  if (state == BLINKER_CMD_BUTTON_TAP)
  {
    irsend.sendRaw(power_off, 199, 38);
    Button2.print("宿舍空调关");
  }

}

然后就是按照代码定义的GPIO对应板子的脚,进行接线:
如图:
请添加图片描述

红外模块:数据脚接D5(GPIO14)
DHT11模块:数据脚接D2(GPIO4)
正负脚随便找板子上的3v跟G(接地)都接上即可

小爱训练&测试

代码上传后,进入米家,同步设备:
请添加图片描述
可以看见app已经有数据了
在这里插入图片描述
然后就是对小爱同学进行训练啦:
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

训练是根据你定义的模式函数的实际情况进行配置的,只需要训练唤醒词,然后选中执行动作就OK

这里自定义名为空调控制器,其实小爱同学定义的是灯设备,按最后面的模式,控制不同空调状态
在这里插入图片描述

嘿嘿!
最后就是测试啦

这边唤醒词是:打开宿舍空调
请添加图片描述
PS:效果都实现啦,录视频太麻烦了,就不搞了,基于上次项目的空调控制进行改进的,实现起来并不难,就是有点不完美的就是:小爱同学无法读取温湿度,只能在app查看,DIY设备小爱同学只能定义为一种设备类型,Blinker官方对免费用户也只提供了5种设备类型,不过也很够用了。Nice

总结

基本完善了,自己想要的功能,接下来要考虑的是一套适用的供电方案,以及优化代码、减少功耗,毕竟物联网设备大多数都主打低功耗的嘛!

emmm,今天下了一天的雨,天气转凉了好多,似乎用不上空调了呢。啧,算了,还是相信广东的天气吧!╮(╯﹏╰)╭

项目目录:
错开のESP8266-NodeMCU项目一
错开のESP8266-NodeMCU项目二
错开のESP8266-NodeMCU项目三
错开のESP8266-NodeMCU项目四
错开のESP8266-NodeMCU项目五

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

错开呀!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值