基于Arudino+Esp8266+Blinker实现简易智能家居

1.效果展示

可实现的功能:

  1. 温湿度测量+OLED显示+手机显示
  2. 检测火焰+OLED提醒+手机显示+蜂鸣器报警提示
  3. 手机控制开启小风扇(模拟空调),也可根据需求设置成温度过高过低时开启
  4. 一个为了凑数的控制开灯功能

最终实现产品
blinker

2.前置准备

2.1 购买清单

硬件:

  1. ESP8266开发板
  2. 杜邦线若干
  3. 火焰传感器
  4. 继电器
  5. Dht11温湿度传感器
  6. OLED(不必须)
  7. 蜂鸣器
  8. 小风扇
  9. 面包板
  10. 数据线一条(是数据线!不是普通用的那种安卓充电线!)

软件:

  1. Arduino(电脑)
  2. Blinker(手机)

2.2 驱动安装+Arduino的配置

Arduino IDE基础配置具体内容可参考以下文章,写的很详细

https://blog.csdn.net/weixin_36193839/article/details/113070306

基础配置完毕后我们还需要在Arudino中添加一些要用到的库文件,在工具→管理库弹出的框中输入blinker并安装
在这里插入图片描述
在这里插入图片描述
同理,分别搜索dht(温湿度检测所用库)和u8g2(OLED模块所用库,如果不需要此功能的可以不添加)
在这里插入图片描述
在这里插入图片描述

2.3 Blinker的配置

在软件商城或百度搜索Blinker并下载
在这里插入图片描述
下载完成后打开Blinker,点击右上角的新建设备
在这里插入图片描述
选择独立设备
在这里插入图片描述
选择右下角的网络接入
在这里插入图片描述
会自动生成密钥,这串数字很重要以后会用到
在这里插入图片描述
点击返回设备后一个新设备就创建完成了,如果上面的密钥没记住可以在右上角圆圈中随时查看

在这里插入图片描述
在这里插入图片描述
点击右上角可以开启编辑模式,在编辑模式中可以自定义一些需要的组件
在这里插入图片描述
在这里插入图片描述
注意:组件名称接下来会用,建议起一些自己能看懂的名称
在这里插入图片描述
还可以自定义界面的背景之类的,自定义完成后如下图所示:
在这里插入图片描述
不想自己做界面的同学可以直接用我定义的界面,在设置→界面设计中可以直接粘贴代码
已经定义好的同学直接忽略此步骤
在这里插入图片描述
在这里插入图片描述
配置代码如下:

{¨version¨¨2.0.0¨¨config¨{¨headerColor¨¨transparent¨¨headerStyle¨¨dark¨¨background¨{¨img¨¨assets/img/bg/f1.jpg¨¨isFull¨»}}¨dashboard¨|{¨type¨¨btn¨¨ico¨¨fal fa-power-off¨¨mode¨Ê¨t0¨¨空调已关闭¨¨t1¨¨文本2¨¨bg¨Ì¨cols¨Í¨rows¨Í¨key¨¨btn-door¨´x´Í´y´É¨lstyle¨Ë}{ßCßDßEßFßGÊßH¨灯已关闭¨ßJßKßLÌßMÍßNÍßO¨btn-light¨´x´É´y´ÉßQË}{ßC¨num¨ßH¨温度¨ßE¨fal fa-question¨¨clr¨¨#389BEE¨¨min¨É¨max¨¢1c¨uni¨´℃´ßLÉßMÍßNÍßO¨num-temp¨´x´É´y´ÎßQÎ}{ßCßTßH¨湿度¨ßEßVßWßXßYÉßZº0ßa´%´ßLÉßMÍßNÍßO¨num-humi¨´x´Í´y´ÎßQÎ}{ßC¨deb¨ßGÉßLÉßMÑßNÌßO¨debug¨´x´É´y´¤D}{ßC¨tex¨ßH¨没有明火出现¨ßJ´´¨size¨¤EßLÉßE¨fad fa-fire-alt¨ßMÑßNËßO¨tex-fire¨´x´É´y´¤AßQÏßW¨#00A90C¨}÷¨actions¨|÷¨triggers¨|÷¨rt¨|÷}

以上,基础配置就完成了,可以正式开始硬件设计部分了。

3. 硬件连线

ESP8266引脚说明如下图
在这里插入图片描述

因为要接的东西比较多,建议配块面包板一起食用~
面包板主要分为两种孔,一种是纵向孔,一种是横向孔
如图所示,红色区域圈起来的五个孔就是一组纵向孔,他们内部是联通的,也就是他们五个之间是有导体相连的,可以导电。
绿色区域圈住的孔。整个一横排孔(一横排的蓝或一横排的红)的内部,都是联通的。通常我们用蓝线的孔连接地线(电压为0),用红线连接电源(电压为5V或3.3V)。在这里插入图片描述

仪器 管脚
继电器-IN D0
温湿度传感器-DATA D5
蜂鸣器-I/O D6
火焰传感器-AO A0
火焰传感器-DO D7
OLED-SCL D1
OLED-SDA D2
GND GND
VCC 3V

风扇的接法如图:
在这里插入图片描述

4. 代码部分

4.1 绑定Blinker

在这里插入图片描述

    char auth[] = "xxxxxxxx";
    char ssid[] = "111";//WiFi用户名
    char pswd[] = "123456789";//WiFi密码

注意,如果用手机热点记得在设置里将AP频段调成2.4Ghz
在这里插入图片描述
下面是组件的绑定
括号里的名称是之前在blinker里定义的组件名称


/*****************************  Blinker组件  **************************************/
    BlinkerButton Button1("btn-door");
    BlinkerButton Button2("btn-light");
    BlinkerNumber HUMI("num-humi");    //定义湿度数据键名
    BlinkerNumber TEMP("num-temp");    //定义温度数据键名
    BlinkerText Fire("tex-fire");      //定义火焰检测键名
/**********************************************************************************/

4.2 代码

直接附上源码,按照代码里的注释操作即可。

#include <Arduino.h>
#include <DHT.h>            //dht11库
#include <U8g2lib.h>        //u8g2库
#include <SoftwareSerial.h> //软串口
#include <Blinker.h>        //blinker库
#include <Servo.h>
#define BLINKER_WIFI
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0,SCL,SDA); //配置构造函数      



/*****************************  WIFI账号密码  **************************************/
    char auth[] = "1ea39f22dca6";
    char ssid[] = "111";//WiFi用户名
    char pswd[] = "123456789";//WiFi密码
/**********************************************************************************/



/*****************************  Blinker组件  **************************************/
    BlinkerButton Button1("btn-door");
    BlinkerButton Button2("btn-light");
    BlinkerNumber HUMI("num-humi");    //定义湿度数据键名
    BlinkerNumber TEMP("num-temp");    //定义温度数据键名
    BlinkerText Fire("tex-fire");      //定义火焰检测键名
/**********************************************************************************/


/********************   继电器(空调)   **********************/
  int jidianqi=16;      //定义继电器的引脚
  void button1_callback(const String & state) {
    
    
    BLINKER_LOG("状态: ", state);
    if (state=="on") {
    
           
        digitalWrite(jidianqi, HIGH);
        Button1.color("#90EE90");   //1#按钮按下时,app按键颜色状态显示是绿色
        // 反馈开关状态
        Button1.text("空调已开启");
        Button1.print("on");
        BLINKER_LOG ("1#空调已开启on");  //串口打印
    } else if(state=="off"){
    
       
        digitalWrite(jidianqi, LOW);
        Button1.color("#F08080");  2#按钮没有按下时,app按键颜色状态显示是红色
        // 反馈开关状态
        Button1.text("空调已关闭");
        Button1.print("off");
        BLINKER_LOG ("1#空调已关off");
    }
    delay(1000);
}
/***************************************************************/

/********************   温湿度传感器   **********************/

#define DHTTYPE DHT11    //定义类型DHT dht(DHTPIN,DHTTYPE);//进行初始化设
#define DHTPIN 14        //定义14号引脚
DHT dht(DHTPIN,DHTTYPE); //进行初始化设置

float humi_read = 0, temp_read = 0;//定义浮点型全局变量 储存传感器读取的温湿度数据
void dht11(){
    
    
  float h = dht.readHumidity();//读取DHT11传感器的湿度 并赋值给h
  float t = dht.readTemperature();//读取传感器的温度   并赋值给t
  //打印
  BLINKER_LOG("Humidity: ", h, " %");
  BLINKER_LOG("Temperature: ", t, " *C");
  humi_read = h;   //将读取到的湿度赋值给全局变量humi_read
  temp_read = t;   //将读取到的温度赋值给全局变量temp_read
  if(temp_read > 30)  
  {
    
    
      digitalWrite(jidianqi,HIGH);//打开空调降低温度  
      delay(1000);
  }
  else {
    
    
      digitalWrite(jidianqi,LOW);//关闭空调
      delay(1000);
    }
    delay(1000);  //延时
  }
/***************************************************************/


/***************************灯*********************************************/
void button2_callback(const String & state) {
    
    
     BLINKER_LOG("get button state: ", state);
     if (state=="on") {
    
    
        digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
        Button2.color("#90EE90");   //1#按钮按下时,app按键颜色状态显示是绿色
        // 反馈开关状态
        Button2.text("灯已开启");
        Button2.print("on");
        BLINKER_LOG ("1#灯已开启on");  //串口打印
    } else if(state=="off"){
    
    
        digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
        Button2.color("#F08080");  2#按钮没有按下时,app按键颜色状态显示是红色
        // 反馈开关状态
        Button2.text("灯已关闭");
        Button2.print("off");
        BLINKER_LOG ("1#灯已关off");
    }
    delay(1000);
}


/***************************火焰传感器及蜂鸣器*********************************************/
int buzzer =12;  //定义蜂鸣器引脚
void fire(){
    
         
  int i=analogRead(A0); 
  Serial.println(i,10); 
  delay(1000);
   if(i<=800){
    
    
      digitalWrite(buzzer,HIGH); 
      Fire.print("有明火出现");
      Fire.color("#F08080");
      delay(1000);
      }
   else {
    
    
      digitalWrite(buzzer,LOW); 
      Fire.print("没有明火出现");
      Fire.color("#90EE90");
      delay(1000); 
      }
}

 void heartbeat()  //心跳包
{
    
    
    HUMI.print(humi_read);
    TEMP.print(temp_read);    
}

/**********************************************************************************/

/***************************OLED*********************************************/
void OLED()
{
    
    
    delay(1000);//延时
    float h = dht.readHumidity();//读湿度
    float t = dht.readTemperature();//读湿度
    float f = analogRead(A0);//读酒精
    char   c[10];
    dtostrf(t,1,2,c);  //float 转换成char
    char   d[10];
    dtostrf(h,1,2,d);       
    
    u8g2.clearBuffer();                                    //清空显示屏缓存
    u8g2.setFont(u8g2_font_open_iconic_human_2x_t);        //设置英文字体
    u8g2.setFont(u8g2_font_unifont_t_chinese2);            //设置字体
    u8g2.drawUTF8(2,15,"wendu:");  //显示文字
    u8g2.drawUTF8(70,15,c);  //显示文字
    u8g2.drawUTF8(2,35,"shidu:");  //显示文字
    u8g2.drawUTF8(70,35,d);  //显示文字
    if(f<=800){
    
    
      u8g2.drawUTF8(2,55,"warning: fire!!!!");  //显示文字
      } 
      else{
    
    
        u8g2.drawUTF8(30,55,"no fire");  //显示文字
        }   
    u8g2.sendBuffer();                                     //加载以上内容
}

/**********************************************************************************/


//初始化
void setup() 
{
    
    
/******************************u8g2******************************************/
    u8g2.begin();                                          //启动u8g2驱动程序
    u8g2.clearBuffer();                                    //清空显示屏缓存
    dht.begin();//DHT开始工作
    
/************************************************************************/
    // 初始化串口,并开启调试信息
    Serial.begin(115200);   
    BLINKER_DEBUG.stream(Serial);
    // 初始化有LED的IO
    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, HIGH);
    //初始化蜂鸣器
    pinMode(buzzer,OUTPUT); 
    // 初始化blinker
    Blinker.begin(auth, ssid, pswd);
    Button1.attach(button1_callback);
    Button2.attach(button2_callback);
    //将传感器获取的数据传给blinker app上
    Blinker.attachHeartbeat(heartbeat);
    dht.begin();//初始化DHT传感器
    //在回调函数中反馈该控制状态  
    pinMode(jidianqi,OUTPUT);
    digitalWrite(jidianqi,LOW);
}

void loop() 
{
    
    
   
    OLED();                                                //调用函数,显示图案
    delay(1000);                                           //持续一秒钟
    Blinker.run();
    dht11();
    fire();
    
}
 

5.0 总结

一个之前在学校里做的小demo,算是自己在啥也不懂的阶段上自己慢慢摸索出来的一个小东西了,当时在CSDN上查了很多资料也看了很多教程,但大多数的资料并不是特别完整,所以出了一篇很详细的教程(要是自己当时能看见一些这样的资料也不会像无头苍蝇乱转了),希望能帮助到一些同样啥也不会的同学~
有问题可以私聊问我~

猜你喜欢

转载自blog.csdn.net/P9ulp/article/details/128602584