豆爸 发表于 2025-2-20 23:48:55

义教信息科技 基于行空板K10的博物馆环境监测物联系统

本帖最后由 豆爸 于 2025-2-21 06:44 编辑

## 义教信息科技课程 物联网实践与探索 第21 课文物保护新手段——基于行空板K10的博物馆环境监测物联系统




## 项目来源

本节课源自《义务教育信息科技教学指南》八年级 “物联网实践与探索” 中的第21 课文物保护新手段。

结合《义务教育信息科技教学指南》课程中对博物馆环境监测系统实践要求,我们利用行空板K10、空气质量传感器、加湿器模块设计了模拟博物馆环境监测物联实验。实验通过温度、湿度、二氧化碳(CO₂)、甲醛(CH₂O)、总挥发性有机物(TVOC)、PM2.5、PM10 以及光照强度等环境数据,经无线网络传至物联网服务平台。平台分析处理数据,依结果自动控制空调、恒湿器等设备,调控环境参数,超出阈值时报警,保障文物保存环境适宜。

## 学习目标



## 硬件准备

| 序号 | 名称         | 数量 | 链接                                       |
| ---- | -------------- | ---- | ------------------------------------------ |
| 1    | 行空板K10      | 1    | https://www.dfrobot.com.cn/goods-4014.html |
| 2    | 空气质量传感器 | 1    |                                          |
| 3    | 加湿器模块   | 1    |                                          |

## 接线图



## 流程图



## 软件准备

### 1. 下载SIoT V2

下载链接:

腾讯微云下载(推荐):
链接: https://share.weiyun.com/6SFhgLQj

百度云盘下载:
链接:https://pan.baidu.com/s/17clVjJXWTZh02FteKy3mcA?pwd=mind
提取码:mind

阿里云盘下载:
https://www.aliyundrive.com/s/tCqwJwGtZzL
提取码: 3h4x

谷歌云盘下载:
链接: [点击下载](https://drive.google.com/drive/folders/16Lf0itQ-v2oZrUJEFHrOhjfgS68eN6bn?usp=sharing)

### 2. 启动SIoT V2

下载后win版本的SIoT V2解压,双击start SIoT.bat即可启动新版SIoT。



注意:启动时需要将SIoT添加到允许应用通过防火墙,勾选专用网络和公用网络,否则外部设备可能无法访问


启动之后会弹出小黑窗启动服务器。


在浏览器输入 上图中地址172.26.192.1:8080 即可打开网页,输入账号siot,密码dfrobot,点击“登录”。



登录成功后,即可单击“新建主题(Topic)”创建主题。



新建主题如下:


### 3. 下载 Mind+

下载行空板K10公测版Mind+压缩包:

- 网页下载(20250103版):[点击下载](https://download3.dfrobot.com.cn/K10/win-ia32-unpacked20250103.zip)
- 百度网盘下载(20250103版): https://pan.baidu.com/s/15ORx5VbobeZjiQvOxar21g?pwd=d2aa 提取码: d2aa
- 夸克网盘下载(20250103版): https://pan.quark.cn/s/db00cf6ae510

将压缩包解压,注意解压过程中关闭杀毒软件,解压后文件夹路径不含中文,解压后文件夹路径不易过长。

若编译任何代码都报错,请查看:[公测版解压问题](https://www.unihiker.com.cn/wiki/k10/FAQ#程序编译报错类问题)

## 编写程序

### 1. 添加主控板

打开Mind+,切换到“上传模式”。


点击”扩展“,在扩展页面中,点击”主控板“,选择”行空板K10“,点击”返回“,完成加载。


### 2. 连接设备

使用USB线将行空板K10的Type-C口接到电脑USB口


在mind+中点击“连接设备”,找到对应的K10设备并点击,完成设备连接。


### 3. 添加扩展

点击”扩展“,在扩展页面中,点击“网络服务”,选择”MQTT“、“Wi-Fi”,点击”返回“,完成加载。


点击”扩展“,在扩展页面中,点击“用户库”,加载“环境空气质量传感器”,点击”返回“,完成加载。


### 4. 编写程序

编写程序,如下图所示。




## 主要程序代码及说明

#### 1. 头文件包含

```cpp
#include <AirQuality.h>
#include <DFRobot_Iot.h>
#include "unihiker_k10.h"
```

- `AirQuality.h`:用于读取空气质量相关数据,如温度、湿度、CO₂、CH₂O 等。
- `DFRobot_Iot.h`:实现与 MQTT 服务器的通信,用于数据的发布和订阅。
- `unihiker_k10.h`:操作 UNIHIKER K10 开发板的功能,如屏幕显示、RGB 灯带控制等。

#### 2. 全局变量定义

```cpp
unsigned long airConditionerStartTime = 0;
unsigned long humidistatStartTime = 0;
bool airConditionerRunning = false;
bool humidistatRunning = false;
DFRobot_IotmyIot;
UNIHIKER_K10 k10;
uint8_t      screen_dir = 2;
AirQuality   aq(Serial1);
Music      music;
```

- `airConditionerStartTime` 和 `humidistatStartTime`:分别记录空调和恒湿器的启动时间。
- `airConditionerRunning` 和 `humidistatRunning`:标记空调和恒湿器是否正在运行。
- `myIot`:用于 MQTT 通信的对象。
- `k10`:操作 UNIHIKER K10 开发板的对象。
- `screen_dir`:屏幕显示方向。
- `aq`:空气质量传感器对象。
- `music`:用于播放声音报警的对象。

#### 3. `setup()` 函数

```cpp
void setup() {
    k10.begin();
    pinMode(P1, OUTPUT);
    k10.initScreen(screen_dir);
    k10.creatCanvas();
    myIot.setCustomMqttCallback(obloqMqttEventTsiot47ws2812, "siot/ws2812");
    myIot.setCustomMqttCallback(obloqMqttEventTsiot47airconditioner, "siot/airconditioner");
    myIot.setCustomMqttCallback(obloqMqttEventTsiot47humidistat, "siot/humidistat");
    myIot.wifiConnect("GOCLOUD", "L2100Hbb");
    while (!myIot.wifiStatus()) {}
    k10.canvas->canvasText(myIot.getWiFiLocalIP(), 1, 0x0000FF);
    k10.canvas->updateCanvas();
    myIot.init("192.168.123.14","siot","6524750546018316","dfrobot", topics, 1883);
    myIot.connect();
    while (!myIot.connected()) {}
    k10.canvas->canvasText("MQTT已连接", 3, 0x0000FF);
    k10.canvas->updateCanvas();
    myIot.subscribeTopic("siot/humidistat");
    myIot.subscribeTopic("siot/airconditioner");
    myIot.subscribeTopic("siot/ws2812");
    aq.begin(9600, SERIAL_8N1, P0, P1);
    delay(5000);
    k10.setScreenBackground(0xFFFFFF);
}
```

- 初始化 UNIHIKER K10 开发板,设置 P1 引脚为输出模式。
- 初始化屏幕并创建画布。
- 设置 MQTT 消息的回调函数。
- 连接 WiFi 和 MQTT 服务器,显示连接信息。
- 订阅 MQTT 主题。
- 初始化空气质量传感器。
- 延时 5 秒,最后设置屏幕背景颜色为白色。

#### 4. `loop()` 函数

```cpp
void loop() {
    if (aq.readAllData()) {
      // 显示环境数据
      k10.canvas->canvasText("   博物馆环境监测", 0, 10, 0x0000FF, k10.canvas->eCNAndENFont24, 50, true);
      k10.canvas->canvasText((String(aq.getTemperature()) + String(aq.getTemperatureUnit())), 0, 60, 0x0000FF, k10.canvas->eCNAndENFont24, 50, true);
      // 其他数据显示...
      k10.canvas->updateCanvas();

      // 发布环境数据到MQTT服务器
      myIot.publish("siot/CO2", (String(aq.getCO2()) + String(aq.getCO2Unit())), 1);
      myIot.publish("siot/CH2O", (String(aq.getCH2O()) + String(aq.getCH2OUnit())), 1);
      // 其他数据发布...

      // 空调控制与计时报警
      if (((aq.getTemperature()<18) || (aq.getTemperature()>22))) {
            if (!airConditionerRunning) {
                airConditionerStartTime = millis();
                airConditionerRunning = true;
            }
            k10.rgb->write(1, 0x00FF00);
            digitalWrite(P1, HIGH);
            if (millis() - airConditionerStartTime >= 30000) {
                music.playTone(131,8000);
            }
      }
      else {
            if (airConditionerRunning) {
                airConditionerRunning = false;
                k10.rgb->write(1, 0x000000);
                digitalWrite(P1, LOW);
                music.stopPlayTone();
            }
      }

      // 恒湿器控制与计时报警
      if (((aq.getHumidity()<50) || (aq.getHumidity()>60))) {
            if (!humidistatRunning) {
                humidistatStartTime = millis();
                humidistatRunning = true;
            }
            k10.rgb->write(2, 0x0000FF);
            if (millis() - humidistatStartTime >= 30000) {
                music.playTone(131,8000);
            }
      }
      else {
            if (humidistatRunning) {
                humidistatRunning = false;
                k10.rgb->write(2, 0x000000);
                music.stopPlayTone();
            }
      }
    }
    delay(1000);
}
```

- 若成功读取空气质量数据,将环境数据显示在屏幕上,并通过 MQTT 协议发布到服务器。
- **空调控制**:当温度不在 18 - 22 范围时,若空调未运行则记录启动时间并启动空调和对应 RGB 灯;运行超过 30 秒则播放报警音。温度达标时,关闭空调、RGB 灯和报警音。
- **恒湿器控制**:当湿度不在 50 - 60 范围时,若恒湿器未运行则记录启动时间并启动恒湿器和对应 RGB 灯;运行超过 30 秒则播放报警音。湿度达标时,关闭恒湿器、RGB 灯和报警音。
- 最后延时 1 秒。

#### 5. 事件回调函数

```cpp
void obloqMqttEventTsiot47ws2812(String& message) {
    if ((message==String("on"))) {
      k10.rgb->write(0, 0xFFFF00);
    }
    else if ((message==String("off"))) {
      k10.rgb->write(0, 0x000000);
    }
}
// 其他回调函数类似...
```

- 处理订阅的 MQTT 主题消息,根据消息内容控制 WS2812 灯带、空调、恒湿器对应的 RGB 灯开关。
可视化面板点击可视化面板图标,进入可视化项目管理页面。点击“新建项目”,“新建空白项目”。输入项目名称:博物馆环境检测系统,点击“确认”按钮。点击“编辑”设置服务器地址为SIOT V2的地址:172.26.192.1,用户名siot,密码dfrobot,点击“完成”按钮。依次添加折线图组件、开关组件、单行文本组件,调整布局。按下表所示,完成各个组件的Topic配置。


上传程序点击“上传到设备”,等待直到出现“上传成功”
系统运行结果1. K10运行展示
2. 可视化显展示

3. SIOT服务数据展示

附件
1. 程序代码













页: [1]
查看完整版本: 义教信息科技 基于行空板K10的博物馆环境监测物联系统