一、总体方案设计
本系统由传感层、网络层和应用层组成。其中传感层以ESP8266模块为核心形成控制节点,在其上装有控制室内的环境传感器;网络层使用家庭路由器组网并使用MQTT协议通信;应用层以Blinker云平台作为整个系统的服务器,由移动客户端开发的应用服务程序能跨平台展示和控制系统信息[]。
系统工作流程如下:检测对象为空气温湿度信息;传感器把在空气中获取的温湿度信息转变为电信号输出至ESP8266开发板;开发板首先将接收到的空气温湿度信息进行数据处理, 通过比特与数值的换算公式,输出可直接读取的温湿度数字和符号信息,例如“32℃ 78%”;然后开发板通过家用路由器将消息传输到MQTT服务器,MQTT服务器将数据整理后发送到移动应用端相, 移动应用端接收并实时显示开发板输出的温湿度信息,并记录每个时间段的温湿度形成图表直观显示在app中使用户可以远程了解到室内的温湿度变化,同时开发板还连接了OLED,实时显示当前室内的温湿度,用于模拟开发板连接智能家电的显示屏。
二、功能模块
三、接口设计
四、界面设计
五、代码
本人使用的是Ardino进行编写的
代码参考:
app界面:
Esp8266+DHT11+Binker 实现室内温湿度监测-腾讯云开发者社区-腾讯云 (tencent.com)
OLED界面:
Esp8266 DHC11 OLED制作室内温度计-腾讯云开发者社区-腾讯云 (tencent.com)
#define BLINKER_WIFI
#define BLINKER_MIOT_SENSOR //小爱同学定义为传感器设备
#include <Blinker.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
#define DHTPIN 2 // Digital pin connected to the DHT sensor
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
char auth[] = "xxxx"; //你的密匙
char ssid[] = "xxxxxx"; //2.4Gwifi名称,可以是手机热点,不要有中文
char pswd[] = "xxxxxx";//WiFi密码
float humi_read = 0, temp_read = 0;
//新建数据类型组件
BlinkerNumber HUMI("humi");
BlinkerNumber TEMP("temp");
//心跳包
void heartbeat()
{
HUMI.print(humi_read);
TEMP.print(temp_read);
}
void miotQuery(int32_t queryCode) //小爱同学语音命令反馈
{
BLINKER_LOG("MIOT Query codes: ", queryCode);
int humi_read_int=humi_read; //去掉湿度浮点
BlinkerMIOT.humi(humi_read_int); //小爱接收湿度
BlinkerMIOT.temp(temp_read); //小爱接收温度
BlinkerMIOT.print();
}
//实时曲线图组件
void dataStorage()
{
Blinker.dataStorage("temp", temp_read);
Blinker.dataStorage("humi", humi_read);
}
void setup() {
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
// 初始化有LED的IO
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
// 初始化blinker
Blinker.begin(auth, ssid, pswd);
Blinker.attachHeartbeat(heartbeat);//绑定回调函数
dht.begin();
BlinkerMIOT.attachQuery(miotQuery);//注册小爱
Blinker.attachDataStorage(dataStorage);//注册实时曲线
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
delay(2000);
display.clearDisplay();
display.setTextColor(WHITE);
}
void loop() {
delay(5000);
Blinker.run();
//read temperature and humidity
float t = dht.readTemperature();
float h = dht.readHumidity();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
}else
{
BLINKER_LOG("Humidity: ", h, " %");
BLINKER_LOG("Temperature: ", t, " *C");//串口打印
humi_read = h;
temp_read = t;
// clear display
display.clearDisplay();
// display temperature
display.setTextSize(1);
display.setCursor(0,0);
display.print("Temperature: ");
display.setTextSize(2);
display.setCursor(0,17);
display.print(t);
display.print(" ");
display.setTextSize(1);
display.cp437(true);
display.write(167);
display.setTextSize(2);
display.print("C");
// display humidity
display.setTextSize(1);
display.setCursor(0, 35);
display.print("Humidity: ");
display.setTextSize(2);
display.setCursor(0, 45);
display.print(h);
display.print(" %");
display.display();
}
Blinker.delay(2000); //延时2s
}
六、结果