查看: 251|回复: 2

[项目] 基于wifiduino和blinker的智能加湿器

[复制链接]
  • TA的每日心情
    擦汗
    2019-7-18 09:56
  • 签到天数: 37 天

    [LV.5]常住居民I

    发表于 2019-6-22 10:41 | 显示全部楼层 |阅读模式
    本帖最后由 Kyle1995 于 2019-6-22 10:43 编辑

    首先感谢奈何大神每次都会出现在我的求助帖内给予我帮助,这个项目的完工非常感谢他。

    我是一名做stem行业的产品教研人,上个月总监给我安排了一个任务:做一个智能家居的例子,要新颖,与物联网接轨,同时不能与市面上的智能家居有功能上的重叠(例如小米啥啥啥的)

    于是乎,我就绞尽脑汁想,作为一名stem行业的从业者,做这种项目都是本着要解决生活中遇到的实际困难。深圳的五月就开始燥热起来,住在破旧城中村的我只能通宵开空调,但我总是会在第二天醒来的时候有喉咙痛、说不出话来的感觉。我项目的灵感也是由此而来:一款可以受空气湿度控制的加湿器

    这是我最初的想法,其实制作一款这样的加湿器对于论坛各路大咖来说都是小case,只需要用温湿度传感器控制加湿器就可以了。

    但是,应着总监的要求,我只能往上加功能了。首先,加湿器何时关闭、何时开启是受一个阈值控制的,也就是说当humi<xxx的时候,加湿器开启,大概humi>xxx的时候,加湿器关闭。这两个阈值我使用4个按键模块来进行增减控制。(因为对湿度的感觉是因人而异的)

    其次,给加湿器增加一个酷炫的LCD显示屏,来显示具体的当前温度和湿度,以及上面的两个阈值。这样子,这个加湿器还是很简单,所以我开始逛论坛,学习关于esp8266的知识。总结了一下,认为wifiduino和blinker比较适合我这种新人选手。

    经过一番学习,最终决定将上一个产品的所有功能全部可在手机app也就是blinker上显示。在这里上一下手机界面截图:

    键位设置

    键位设置


    学习了blinker上的几种模块的使用:数据、按键以及滑块。

    最开始用的是blinker里的例程DHT_Wifi,很简单就使得手机与加湿器同步显示温湿度了(这里埋了一个坑)。后面又通过例程以及帖子学习了如何使用按键控制开关。最后使用滑块控制了两个阈值。附上完整代码:
    #define BLINKER_WIFI
    #include <Blinker.h>
    #include <Arduino.h>
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    #include "dht11.h"//加载各类库文件
    dht11 DHT11;
    int dht11temp(int pin){
      DHT11.read(pin);
      return DHT11.temperature;
    }
    int dht11humi(int pin){
      DHT11.read(pin);
      return DHT11.humidity;
    }//温湿度传感器设置
    LiquidCrystal_I2C lcd(0x27, 16, 2);//LCD配置地址0x27
    char auth[] = "";//设备id
    char ssid[] = "";//wifi名称
    char pswd[] = "";//wifi密码
    
    int x;//定义变量x,储存下限阈值
    int s;//定义变量s,储存上限阈值
    
    BlinkerButton F5("f5");//刷新按键
    BlinkerButton SWITCH("switch");//手动开关
    BlinkerNumber HUMI("humi");//湿度显示
    BlinkerNumber TEMP("temp");//温度显示
    BlinkerNumber YZ1("yz1");//x阈值显示
    BlinkerNumber YZ2("yz2");//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 heartbeat()//心跳函数,在app中显示的数值需要写在这里
    {
        HUMI.print(dht11humi(D2));//APP输出湿度值
        TEMP.print(dht11temp(D2));//APP输出温度值
        YZ1.print(x);//APP输出x值
        YZ2.print(s);//APP输出s值
    }
    
    void setup()
    { 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显示设置
    
        Serial.begin(115200);
        BLINKER_DEBUG.stream(Serial);//在波特率115200串口开启调试
        pinMode(D3, OUTPUT);//设置3号为继电器,输出模块
        pinMode(D6, OUTPUT);pinMode(D7, OUTPUT);pinMode(D8, OUTPUT);pinMode(D9, OUTPUT);
        digitalWrite(D3, HIGH);//设置3号初始为高电
        SWITCH.attach(SWITCH_callback);//绑定回调函数
        F5.attach(F5_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()
    { lcd.setCursor(5, 0);
      lcd.print(dht11temp(D2));//LCD显示温度
      lcd.setCursor(13, 0);
      lcd.print(dht11humi(D2));//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(dht11humi(D2)<x){;
        digitalWrite(D3, LOW);
      }}//湿度低于下限阈值时,加湿器开启(如果继电器设置的是低电平触发)
      if(dht11humi(D2)>s){;
        digitalWrite(D3, HIGH);
      }//湿度高于上限阈值时,加湿器关闭(如果继电器设置的是低电平触发)
        Blinker.run();
    }


    前面说,埋了一个坑,其实这套程序大概在半个月之前我就做好了。因为个人原因,我写代码总喜欢在例程上进行修改,这里我就是用DHT_WIFI这个例程进行修改的。最终得出的程序和上面的程序其实差不多,但是功能除了显示温湿度数据以外其余的都无法实现。后面在论坛上发帖求助,最终得到的结果也是只能自己排查问题。就在前几天,我将温湿度显示的程序改掉以后发现,所有的功能都可以使用了,这一刻简直泪奔(虽然我到现在还是不知道为什么使用例程的温湿度显示的话无法实现我的功能,希望有大咖看看我在blinker专区贴出来的代码帮忙解答一哈)。

    上图

    ....

    ....

    内部安装

    内部安装

    整体外观

    整体外观



    物料清单:
    加湿器*1
    wifiduino*1
    3.3v继电器*1
    DHT1*1
    LCD1602*1
    按钮模块*4

    接线:
    加湿器D2
    3.3V继电器D3
    LCD1602 SDA:D4/SCL:D5
    按钮模块 D6 D7 D8 D9
    9bedde63432dda0592419439f6057c9.png
  • TA的每日心情
    擦汗
    2019-4-22 13:17
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2019-6-22 15:00 | 显示全部楼层
    菜鸟给大佬双击666
  • TA的每日心情
    奋斗
    2019-3-6 11:40
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2019-6-25 22:11 | 显示全部楼层
      点赞,点赞
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表