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

hai911011 发表于 2020-4-30 17:12

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

看了论坛中制作温湿度器一些作品,我也忍不住做了一个,该温湿度器可以设定湿度开启值和关闭值,可以用手机查看和设置。废话不多说,先看手机界面和制作过程

需要器件:
wifi模块                esp12f   
温湿度传感器      dht11
加湿器   
按键开关
传程序用USB转TTL
接线(自己可以根据情况修改):
温湿度计 D2
加湿继电器 D3
LCD1602 SDA:D4/SCL:D5
按钮模块 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

请问,哪段是图表使用的代码,看的有点蒙

yznj 发表于 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里面添加图表吧。。。开始没那么快显示,,等几分钟就有了

g2552 发表于 2020-12-12 00:36

int d;//定义变量x,储存下限阈值
int g;//定义变量s,储存上限阈值
这里错了吧
int x;//定义变量x,储存下限阈值
int s;//定义变量s,储存上限阈值

diandeng123 发表于 2020-12-19 15:58

大神,我一个8266上传温度,一个8266控制继电器,如何在另外一个8266控制的继电器里面读取温度实现温度控制呢?

HAIFAN 发表于 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();   }编译这个地方错误
页: [1]
查看完整版本: 可以用天猫精灵Blinker设定手/自动控制的温湿度器