esp8266+dht11+小爱同学

效果

通过小爱同学询问温湿度情况(天猫精灵或者小度小艺也可,具体调用方法可以看blinker api文档)。

准备

  • Esp8266 node MCU
  • dht11温湿度传感器(也可以用DHT22或者AM23系列)
  • blinker库、dht库
  • android blinker app
#define BLINKER_WIFI
#define BLINKER_MIOT_SENSOR    //接入小爱同学

#include <Blinker.h>
#include <DHT.h>

char auth[] = "8f4520ad443e";    //blinker app 对应的开发板
char ssid[] = "<wifi帐号>";    //填入wifi帐号
char pswd[] = "<wifi密码>";    //填入wifi密码

BlinkerNumber HUMI("humi");    //使用数据(number)组件,命名为HUMI,key为humi
BlinkerNumber TEMP("temp");    //使用数据(number)组件, 命名为TEMP,key为temp

#define DHTPIN D7    //数据传输口定义D7,用于传输温湿度数据

#define DHTTYPE DHT11   // DHT 11    //使用DHT11模块
//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

DHT dht(DHTPIN, DHTTYPE);    //让dht模块知道传输引脚和实物模块类型

float humi_read = 0, temp_read = 0;    //定义温适度的类型和初始值

//心跳包函数,用来同步数据,一切反馈由用户端发起,以节约服务器资源(所以数值不是连续显示的)
//每次打开app都是从0开始显示,然后读取到新的值
void heartbeat()
{
    HUMI.print(humi_read);    //主动读取湿度数据
    TEMP.print(temp_read);    //主动读取温度数据
    HUMI.icon("fas fa-tint");
    TEMP.icon("fas fa-temperature-low");
}

/*
    使用小爱同学唤醒后,通过如下沟通:
    {传感器名称}+室内+{温度}{湿度}
*/
void miotQuery(int32_t queryCode)    //小爱同学接入
{
    BLINKER_LOG("MIOT Query codes: ", queryCode);

    switch (queryCode)
    {
        case BLINKER_CMD_QUERY_PM25_NUMBER :
            BLINKER_LOG("MIOT Query PM25");
            BlinkerMIOT.pm25(20);
            BlinkerMIOT.print();
            break;
        case BLINKER_CMD_QUERY_HUMI_NUMBER :
            BLINKER_LOG("MIOT Query HUMI");
            BlinkerMIOT.humi(20);
            BlinkerMIOT.print();
            break;
        case BLINKER_CMD_QUERY_TEMP_NUMBER :
            BLINKER_LOG("MIOT Query TEMP");
            BlinkerMIOT.temp(20);
            BlinkerMIOT.print();
            break;
        default :
            BlinkerMIOT.temp(20);
            BlinkerMIOT.humi(20);
            BlinkerMIOT.pm25(20);
            BlinkerMIOT.co2(20);
            BlinkerMIOT.print();
            break;
    }
}

void dataStorage()    //储存历史数据,可以通过表格显示历史走势
{
    Blinker.dataStorage("temp", temp_read);
    Blinker.dataStorage("humi", humi_read);
}

void setup()
{
    //初始化串口
    Serial.begin(115200);

    //打开调试功能
    BLINKER_DEBUG.stream(Serial);
    BLINKER_DEBUG.debugAll();
    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, LOW);

    //初始化blink
    Blinker.begin(auth, ssid, pswd);
    Blinker.attachHeartbeat(heartbeat);
    BlinkerMIOT.attachQuery(miotQuery);    //接入小爱同学
    Blinker.attachDataStorage(dataStorage);    //存储数据
    dht.begin();
}

void loop()
{
    Blinker.run();

    float h = dht.readHumidity();   
    float t = dht.readTemperature();

    if (isnan(h) || isnan(t))    //只要有一个没有数据
    {
        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);
}