可以用天猫精灵Blinker设定手/自动控制的温湿度器-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4917|回复: 8

[分享] 可以用天猫精灵Blinker设定手/自动控制的温湿度器

[复制链接]
发表于 2020-4-30 17:12 | 显示全部楼层 |阅读模式
看了论坛中制作温湿度器一些作品,我也忍不住做了一个,该温湿度器可以设定湿度开启值和关闭值,可以用手机查看和设置。废话不多说,先看手机界面和制作过程
微信图片_20200409151605.jpg
需要器件:
wifi模块                esp12f   
温湿度传感器        dht11
加湿器     
按键开关
传程序用USB转TTL
接线(自己可以根据情况修改):
温湿度计 D2
加湿继电器 D3
LCD1602 SDA4/SCL5
按钮模块 D6 D7 D8 D9

怎么在手机上建立相关的组件在论坛中太多教程了,所以在这我就不写了。
我把相关的程序代码贴出供大家参考。


#define BLINKER_WIFI
#define BLINKER_ESP_SMARTCONFIG//采用EspTouch/SmartConfig方式配网
//---------------------------------------------------------------
//#define BLINKER_DUEROS_SENSOR//小度
#define BLINKER_ALIGENIE_LIGHT//天猫
//#define BLINKER_MIOT_LIGHT //小爱灯
//#define BLINKER_MIOT_SENSOR //小爱传感器
//#define BLINKER_MIOT_MULTI_OUTLET //小爱插座



//-------------------------------------------------------------
#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

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

char auth[] = "**********";//设备ID
//char ssid[] = "**********";//wifi名称
//char pswd[] = "**********";//wifi密码
BlinkerNumber HUMI("humi");    //定义湿度数据键名
BlinkerNumber TEMP("temp");    //定义温度数据键名

#define DHTTYPE DHT11        // 使用DHT 11温度湿度模块
#define DHTPIN 2             //定义DHT11模块连接管脚io2
DHT dht(DHTPIN, DHTTYPE, 11);//定义DHT

float humi_read = 0, temp_read = 0;
//-----------------------------------------------------
LiquidCrystal_I2C lcd(0x27, 16, 2);//LCD配置地址0x27

int d;//定义变量x,储存下限阈值
int g;//定义变量s,储存上限阈值

BlinkerButton F5("f5");//刷新按键
BlinkerButton SWITCH("switch");//手动开关
//BlinkerNumber HUMI("humi");//湿度显示
//BlinkerNumber TEMP("temp");//温度显示
BlinkerNumber YZ1("d1");//x阈值显示
BlinkerNumber YZ2("g2");//s阈值显示
BlinkerSlider Slider1("set1");//x滑块调整
BlinkerSlider Slider2("set2");//s滑块调整

void slider1_callback(int32_t value1)
  {
      x=value1;
  }//x滑块回调函数

void slider2_callback(int32_t value2)
  {
      s=value2;
  }//s滑块回调函数

void F5_callback(const String & state) //刷新键回调函数
  {
      heartbeat();
  }

void SWITCH_callback(const String & state) //手动开关回调函数
  {
      if (state == BLINKER_CMD_ON)
        {
            digitalWrite(D3, LOW);
            SWITCH.text("", "手动开关(开)");
            SWITCH.print("on");
         }//定义3号为继电器,当APP按键输出为On时,手动开启继电器
       else
       if (state == BLINKER_CMD_OFF)
         {
             digitalWrite(D3, HIGH);
             SWITCH.text("", "手动开关(关)");
             SWITCH.print("off");
          }//定义3号为继电器,当APP按键输出为off时,手动关闭继电器
    }

void setup()
  {
      Serial.begin(115200);
      BLINKER_DEBUG.stream(Serial);
      BLINKER_DEBUG.debugAll();

      Blinker.begin(auth);
      Blinker.attachData(dataRead);
      Blinker.attachHeartbeat(heartbeat);

      dht.begin();

      // BlinkerDuerOS.attachQuery(duerQuery);//小度
//-------------------------------------------------
      x = 50;// 将x初始值设为50
      s = 75;// 将s初始值设为75      
  //    lcd.begin();


      lcd.setBacklight(HIGH);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Temp:");
      lcd.setCursor(7, 0);
      lcd.print("c");
      lcd.setCursor(8, 0);
      lcd.print("Humi:");
      lcd.setCursor(15, 0);
      lcd.print("\%");
      lcd.setCursor(0, 1);
      lcd.print("Set1:");
      lcd.setCursor(7, 1);
      lcd.print("\%");
      lcd.setCursor(8, 1);
      lcd.print("Set2:");
      lcd.setCursor(15, 1);
      lcd.print("\%");//LCD显示设置
      //-------------------------------------------------
      //-------------------------------------------------
      pinMode(D3, OUTPUT);//
      pinMode(D6, OUTPUT);//
      pinMode(D7, OUTPUT);//
      pinMode(D8, OUTPUT);//
      pinMode(D9, OUTPUT);//
      digitalWrite(D3, HIGH);//
      //-------------------------------------------------
      //-------------------------------------------------
      SWITCH.attach(SWITCH_callback);//绑定回调函数
      Slider1.attach(slider1_callback);//绑定回调函数
      Slider2.attach(slider2_callback);//绑定回调函数

      Blinker.delay(1000);
      Blinker.notify("智能加湿器已上线!");
//      Blinker.begin(auth, ssid, pswd);//绑定设备、wifi、密码
      Blinker.attachHeartbeat(heartbeat);//绑定心跳函数

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(100);
//---------------------------------------------------------
      lcd.setCursor(5, 0);
      lcd.print(temp_read);//LCD显示温度
      lcd.setCursor(13, 0);
      //lcd.print(dht11humi(D2));//LCD显示湿度
      lcd.print(humi_read);//LCD显示湿度
      lcd.setCursor(5, 1);
      lcd.print(x);//LCD显示x
      lcd.setCursor(13, 1);
      lcd.print(s);//LCD显示s
      if(digitalRead(D6)==1)
        {
            ;
            x += 1;
        }
      if(digitalRead(D7)==1)
        {
            ;
            x += -1;
         }
      if(digitalRead(D8)==1)
         {
             ;
             s += 1;
          }
      if(digitalRead(D9)==1)
          {
              ;
              s += -1;
          }//按键增减阈值
    //{
      if(humi_read<x)
        {
            ;
            digitalWrite(D3, LOW);
        }
    //}//湿度低于下限阈值时,加湿器开启(如果继电器设置的是低电平触发)
      if(humi_read>s)
        {
            ;
            digitalWrite(D3, HIGH);
        }//湿度高于上限阈值时,加湿器关闭(如果继电器设置的是低电平触发)



//----------------------------------------------------------  
}
void heartbeat()                  //心跳包
  {
      if (humi_read  < 45)
        {
            HUMI.color("#DC143C");//红
            HUMI.unit("%RH(干燥)");
        }
      else
      if (humi_read  > 75)
        {
            HUMI.color("#1E90FF");//蓝
            HUMI.unit("%RH(湿润)");
        }
      else
        {
            HUMI.color("#00DE00");//绿
            HUMI.unit("%RH(舒适)");
        }

      if (temp_read  < 15)
        {
            TEMP.color("#1E90FF");//蓝
            TEMP.unit("℃(寒冷)");
        }
      else
      if (temp_read  > 25)
        {
            TEMP.color("#DC143C");//红
            TEMP.unit("℃(炎热)");
        }
      else
        {
            TEMP.color("#00DE00");//绿
            TEMP.unit("℃(舒适)");
        }

      HUMI.print(humi_read );      //给blinker app回传湿度数据
      TEMP.print(temp_read );      //给blinker app回传温度数据
//-----------------------------------------------------------
//     HUMI.print(humi_read);//APP输出湿度值
//     TEMP.print(temp_read);//APP输出温度值
      YZ1.print(x);//APP输出x值
      YZ2.print(s);//APP输出s值

}
//----------------------小度-------------------------------------  
/*
void duerQuery(int32_t queryCode)
{
  BLINKER_LOG("DuerOS Query codes: ", queryCode);
  int humi_read_int = humi_read;    //去掉湿度浮点
  switch (queryCode)
  {
    case BLINKER_CMD_QUERY_HUMI_NUMBER :
      BLINKER_LOG("DuerOS Query HUMI");
      BlinkerDuerOS.humi(humi_read_int + 7); //小度接收湿度
      BlinkerDuerOS.print();
      break;
    case BLINKER_CMD_QUERY_TEMP_NUMBER :
      BLINKER_LOG("DuerOS Query TEMP");
      BlinkerDuerOS.temp(temp_read - 7);  //小度接收温度
      BlinkerDuerOS.print();
      break;
    case BLINKER_CMD_QUERY_TIME_NUMBER :
      BLINKER_LOG("DuerOS Query time");
      BlinkerDuerOS.time(millis());     //小度接收运行时间
      BlinkerDuerOS.print();
      break;
    default :
      BlinkerDuerOS.temp(0);
      BlinkerDuerOS.humi(0);
      BlinkerDuerOS.time(millis());
      BlinkerDuerOS.print();
      break;
  }
}

*/
//------------------------天猫---------------------------------
void aligenieQuery(int32_t queryCode)
{
    switch (queryCode)
    {
        case BLINKER_CMD_QUERY_ALL_NUMBER :
            BLINKER_LOG("AliGenie Query All");
            BlinkerAliGenie.temp(temp_read);
            BlinkerAliGenie.humi(humi_read);
            BlinkerAliGenie.print();
            break;
        case BLINKER_CMD_QUERY_TEMP_NUMBER :
            BlinkerAliGenie.temp(temp_read);
            BlinkerAliGenie.print();
            break;
        case BLINKER_CMD_QUERY_HUMI_NUMBER :
            BlinkerAliGenie.humi(humi_read);
            BlinkerAliGenie.print();
            break;
        default :
            BlinkerAliGenie.temp(20);
            BlinkerAliGenie.humi(20);
            BlinkerAliGenie.print();
            break;
    }
}
//---------------------------------------------------------
void dataRead(const String & data)
  {
      BLINKER_LOG("Blinker readString: ", data);
      Blinker.vibrate();
      uint32_t BlinkerTime = millis();
      Blinker.print("millis", BlinkerTime);
  }



发表于 2020-5-4 15:22 | 显示全部楼层
请问,哪段是图表使用的代码,看的有点蒙
发表于 2020-11-6 00:01 | 显示全部楼层
想改成温,湿度自动控制,不太会呀
发表于 2020-12-1 22:50 | 显示全部楼层
夜渡风陵 发表于 2020-5-4 15:22
请问,哪段是图表使用的代码,看的有点蒙

setup 中间加上一句
    Blinker.attachDataStorage(dataStorage);
然后加一段这个
void dataStorage() {
    //添加数据存储 以便于图标数据展示
    Blinker.dataStorage("humi", humi_read);
    //添加数据存储 以便于图标数据展示
    Blinker.dataStorage("temp", temp_read);
}

在APP里面添加图表吧。。。开始没那么快显示,,等几分钟就有了
发表于 2020-12-12 00:36 | 显示全部楼层
int d;//定义变量x,储存下限阈值
int g;//定义变量s,储存上限阈值
这里错了吧
int x;//定义变量x,储存下限阈值
int s;//定义变量s,储存上限阈值
发表于 2020-12-19 15:58 | 显示全部楼层
大神,我一个8266上传温度,一个8266控制继电器,如何在另外一个8266控制的继电器里面读取温度实现温度控制呢?
发表于 2022-2-23 23:02 | 显示全部楼层
yznj 发表于 2020-11-6 00:01
想改成温,湿度自动控制,不太会呀

老哥有把温度自动控制改出来吗?能不能借代码参考下,谢谢
发表于 2022-3-25 15:05 | 显示全部楼层
Blinker.attachData(dataRead);       Blinker.attachHeartbeat(heartbeat);  这个是没有定义吧
发表于 2022-3-25 15:27 | 显示全部楼层
void F5_callback(const String & state) //刷新键回调函数   {       heartbeat();   }  编译这个地方错误
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 09:32 , Processed in 0.097799 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表