2025-1-30 19:35:12 [显示全部楼层]
19浏览
查看: 19|回复: 0

[K10项目分享] 行空板K10: 仓鼠恒温养护箱

[复制链接]
本帖最后由 heartlee 于 2025-1-30 21:39 编辑

一、项目来源
  年前的集市上人声鼎沸,热闹非凡。在我们穿梭在各个摊位之间时,孩子们的目光突然被一个不起眼的角落吸引。那里有一个小小的仓鼠摊,摊位上摆放着几个透明的塑料笼子,里面住着几只毛茸茸的仓鼠。这些仓鼠有的在笼子里欢快地跑轮,有的在啃着木头,还有的蜷缩在角落里睡觉,可爱极了。孩子们立刻围了上去,眼睛瞪得大大的,满是惊喜和好奇。经过一番比较和商量,孩子们最终选中了一只“布丁”——眼睛乌溜溜的小仓鼠。我们又在摊位上购买了仓鼠的小别墅和营养丰富的仓鼠粮。孩子们开心极了,觉得这是一份完美的新年礼物。但我们马上就遇到了一个大问题,仓鼠在晚上常常蜷缩一团,还发出一些细微的叫声,们在表达自己的不适,孩子们也一直睡不好觉,我们猜想是否是因为冬天晚上温度低的原因。我马上想到了五年级信息科技新教材中的“恒温箱”实验,我们可以做一个恒温箱,让孩子们分析数据来解决问题。
行空板K10: 仓鼠恒温养护箱图20

二、项目目标
  1.利用行空板K10板载声音传感器获取仓鼠的活动状态,并通过数据同步到物联网云平台中,长期追踪数据;通过数据分析,得出当前设置的温度是否适合仓鼠生活。
  2.利用行空板K10板载温湿度传感器获取环境温湿度,通过扩展板连接制热器和风扇,打造智能恒温系统,实现设备的控制与反馈。
  3.利用LED灯和人体运动传感器,实现人来开灯,人走关灯的效果,便于观察仓鼠的生活状态。

项目思维导图
行空板K10: 仓鼠恒温养护箱图21

显示界面
行空板K10: 仓鼠恒温养护箱图1

效果视频:

三、项目硬件
  
主控板
外接传感器
执行器
显示器
扩展板
行空板K10*1
人体运动传感器*1
声音传感器*1
半导体制冷片*1
散热风扇*1
继电器*1
LED*1
micro:bit掌控IO扩展板*1
行空板K10: 仓鼠恒温养护箱图2
行空板K10: 仓鼠恒温养护箱图3
行空板K10: 仓鼠恒温养护箱图4
行空板K10: 仓鼠恒温养护箱图5
行空板K10: 仓鼠恒温养护箱图6
行空板K10: 仓鼠恒温养护箱图7
行空板K10: 仓鼠恒温养护箱图8
行空板K10: 仓鼠恒温养护箱图9
板载温湿度传感器获取温度数据,为恒温系统控制提供数据支撑。
检测外界是否来人
声音传感器获取环境声音数据,用于监测仓鼠是否躁动。
冬天可用发热面制热,夏天可用制冷面制冷
用于散热
用于控制制冷片的运作
用于照明,方便监测
提供了数字/模拟引脚,轻松扩展和控制各种设备。

四、项目软件基础知识
  1.下载安装Mind+软件
  百度网盘下载(20250103版): https://pan.baidu.com/s/15ORx5VbobeZjiQvOxar21g?pwd=d2aa 提取码: d2aa
  下载后解压到C盘根目录。
  2.开始Mind+图形化编程
  点击”扩展“,在扩展页面中,点击”主控板“,选择”行空板K10“,点击”返回“,完成加载
  行空板K10: 仓鼠恒温养护箱图10

  使用USB线将行空板K10的Type-C口接到电脑USB口,在mind+中点击“连接设备”,找到对应的K10设备并点击,完成设备连接
  行空板K10: 仓鼠恒温养护箱图11

五、物联网大屏界面设计及硬件接线图
  1.物联网大屏界面设计
  行空板K10: 仓鼠恒温养护箱图12
  这是仓鼠生活环境物联网大屏,监测仓鼠生活环境温度,用声音传感器的数据判断它是否躁动,能够远程设置环境温度范围,便于观察仓鼠。
  
  2.硬件连接图
  行空板K10: 仓鼠恒温养护箱图13

六、重点程序截图
  1.MQTT连接
    行空板K10: 仓鼠恒温养护箱图14
    行空板K10: 仓鼠恒温养护箱图15

  2.SIOT主题设置
  行空板K10: 仓鼠恒温养护箱图16

  3.K10界面显示,并传输环境数据至SIOT
  行空板K10: 仓鼠恒温养护箱图17

  4.人来开灯便于观察
  行空板K10: 仓鼠恒温养护箱图18

  5.恒温设置
  行空板K10: 仓鼠恒温养护箱图19

七、全部代码
/*!
* MindPlus
* esp32s3bit
*
*/
#include <IOBOX_Motor.h>
#include <DFRobot_Iot.h>
#include "unihiker_k10.h"

// 动态变量
volatile float mind_n_WenDu, mind_n_SheZhiWenDu, mind_n_ShiFuLaiRen, mind_n_JiaReQiZhuangTai,
               mind_n_FengShanZhuangTai, mind_n_ShiDu, mind_n_ShengYin, mind_n_GuangZhaoQiangDu;
// 函数声明
void DF_HengWenKongZhi();
void DF_ChuShiHua();
void DF_RenLaiDengLiang();
void DF_siotLianJie();
void obloqMqttEventT9e10x(String& message);
// 静态常量
const String topics[5] = {"siot/温度","siot/温度设置","siot/湿度","siot/声音强度","siot/光照强度"};
const MsgHandleCb msgHandles[5] = {NULL,obloqMqttEventT9e10x,NULL,NULL,NULL};
// 创建对象
IOBOX_Motor  motor_ib;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;
DFRobot_Iot  myIot;
AHT20        aht20;


// 主程序开始
void setup() {
        k10.begin();
        myIot.setMqttCallback(msgHandles);
        k10.initScreen(screen_dir);
        k10.creatCanvas();
        k10.setScreenBackground(0xFFFFFF);
        mind_n_ShiFuLaiRen = 0;
        mind_n_JiaReQiZhuangTai = 0;
        mind_n_FengShanZhuangTai = 0;
        mind_n_SheZhiWenDu = 25;
        motor_ib.motorStop(motor_ib.M1);
        digital_write(eP8, LOW);
        digital_write(eP14, LOW);
        myIot.wifiConnect("MIFI-9009", "88888888");
        while (!myIot.wifiStatus()) {}
        k10.canvas->canvasText("WIFI连接成功", 1, 0x0000FF);
        k10.canvas->canvasText(myIot.getWiFiLocalIP(), 2, 0x0000FF);
        k10.canvas->updateCanvas();
        delay(3000);
        myIot.init("192.168.100.194","siot","594967897988214","dfrobot", topics, 1883);
        myIot.connect();
        while (!myIot.connected()) {}
        k10.canvas->canvasText("MQTT连接成功", 3, 0xFF0000);
        k10.canvas->updateCanvas();
        myIot.subscribeTopic("siot/温度设置");
        delay(3000);
        k10.canvas->canvasClear();
        k10.canvas->canvasText("仓鼠的小窝", 60, 0, 0x33CC00, k10.canvas->eCNAndENFont24, 17, false);
        k10.canvas->updateCanvas();
}
void loop() {
        mind_n_WenDu = (round(aht20.getData(AHT20::eAHT20TempC)));
        mind_n_ShiDu = (round(aht20.getData(AHT20::eAHT20HumiRH)));
        mind_n_ShengYin = (round(analogRead(P0)));
        mind_n_GuangZhaoQiangDu = (round(k10.readALS()));
        k10.canvas->canvasText((String("当前温度:") + String((String((String(mind_n_WenDu).toInt())) + String("℃")))), 3, 0x0000FF);
        k10.canvas->canvasText((String("当前湿度:") + String((String((String(mind_n_ShiDu).toInt())) + String("%RH")))), 4, 0x0000FF);
        k10.canvas->canvasText((String("当前声音强度:") + String((String(mind_n_ShengYin).toInt()))), 5, 0x0000FF);
        k10.canvas->canvasText("设置温度范围:", 6, 0x0000FF);
        k10.canvas->canvasText((String((String((String(((String(mind_n_SheZhiWenDu).toInt()) - 2)) + String("℃"))) + String(" - "))) + String((String(((String(mind_n_SheZhiWenDu).toInt()) + 2)) + String("℃")))), 7, 0xFF0000);
        k10.canvas->canvasText("当前控制器状态:", 9, 0x000000);
        k10.canvas->updateCanvas();
        myIot.publish("siot/温度", mind_n_WenDu, 1);
        myIot.publish("siot/湿度", mind_n_ShiDu, 1);
        myIot.publish("siot/声音强度", mind_n_ShengYin, 1);
        myIot.publish("siot/光照强度", mind_n_GuangZhaoQiangDu, 1);
        if (((digital_read(eP12))==1)) {
                digital_write(eP14, HIGH);
                delay(1000);
        }
        else {
                digital_write(eP14, LOW);
        }
        if (((String(mind_n_WenDu).toInt())<((String(mind_n_SheZhiWenDu).toInt()) - 2))) {
                motor_ib.motorStop(motor_ib.M1);
                digital_write(eP8, HIGH);
                k10.canvas->canvasText("加热中", 10, 0xFF0000);
                k10.canvas->canvasText("风扇停止工作", 11, 0x0000FF);
                k10.canvas->updateCanvas();
        }
        else if (((String(mind_n_WenDu).toInt())>((String(mind_n_SheZhiWenDu).toInt()) + 2))) {
                motor_ib.motorRun(motor_ib.M1, motor_ib.CW, 255);
                digital_write(eP8, LOW);
                k10.canvas->canvasText("加热器停止工作", 10, 0x0000FF);
                k10.canvas->canvasText("散热中", 11, 0xFF0000);
                k10.canvas->updateCanvas();
        }
        else {
                digital_write(eP8, LOW);
                motor_ib.motorStop(motor_ib.M1);
                k10.canvas->canvasText("加热器停止工作", 10, 0x0000FF);
                k10.canvas->canvasText("风扇停止工作", 11, 0x0000FF);
                k10.canvas->updateCanvas();
        }
        delay(500);
}


// 自定义函数
void DF_HengWenKongZhi() {
        if (((String(mind_n_WenDu).toInt())<((String(mind_n_SheZhiWenDu).toInt()) - 2))) {
                motor_ib.motorStop(motor_ib.M1);
                k10.canvas->canvasText("加热中", 9, 0xFF0000);
                k10.canvas->canvasText("风扇停止工作", 10, 0x0000FF);
                k10.canvas->updateCanvas();
        }
        else if (((String(mind_n_WenDu).toInt())>((String(mind_n_SheZhiWenDu).toInt()) + 2))) {
                motor_ib.motorRun(motor_ib.M1, motor_ib.CW, 200);
                k10.canvas->canvasText("加热器停止工作", 9, 0x0000FF);
                k10.canvas->canvasText("散热中", 10, 0xFF0000);
                k10.canvas->updateCanvas();
        }
        else {
                k10.canvas->canvasText("加热器停止工作", 9, 0x0000FF);
                k10.canvas->canvasText("风扇停止工作", 10, 0x0000FF);
                k10.canvas->updateCanvas();
        }
        delay(500);
}
void DF_ChuShiHua() {
        k10.setScreenBackground(0xFFFFFF);
        mind_n_ShiFuLaiRen = 0;
        mind_n_JiaReQiZhuangTai = 0;
        mind_n_FengShanZhuangTai = 0;
        mind_n_SheZhiWenDu = 25;
        motor_ib.motorStop(motor_ib.M1);
        digital_write(eP14, LOW);
}
void DF_RenLaiDengLiang() {
        if (((digital_read(eP12))==1)) {
                digital_write(eP14, HIGH);
                delay(3000);
        }
        else {
                digital_write(eP14, LOW);
        }
}
void DF_siotLianJie() {
        myIot.wifiConnect("MIFI-9009", "88888888");
        while (!myIot.wifiStatus()) {}
        k10.canvas->canvasText("WIFI连接成功", 1, 0x0000FF);
        k10.canvas->canvasText(myIot.getWiFiLocalIP(), 2, 0x0000FF);
        k10.canvas->updateCanvas();
        delay(3000);
        myIot.init("192.168.100.199","siot","47961947059699717","dfrobot", topics, 1883);
        myIot.connect();
        while (!myIot.connected()) {}
        k10.canvas->canvasText("MQTTT连接成功", 3, 0xFF0000);
        k10.canvas->updateCanvas();
        myIot.subscribeTopic("siot/温度设置");
        delay(3000);
}

// 事件回调函数
void obloqMqttEventT9e10x(String& message) {
        mind_n_SheZhiWenDu = (String(message).toInt());
}

八、总结
  由于在外过年,只能先拿纸箱作为外观设计材料了。开学后,可利用激光切割机设计切割外观结构件更为合适。本次只是借助dfrobot组织的活动将小学信息科技的知识运用于实践的小尝试,还有很多不足。比如制冷片效果不够好,后期可采购功率大一些的制热片代替,同时在夏天时可以采用功率大一些的制冷片和散热风扇使用,效果可以更好,还可以制作自动喂食器,方便仓鼠的养护。
  最后再次感谢dfrobot提供的硬件支持。
附件
行空板K10: 仓鼠恒温养护箱图21行空板K10: 仓鼠恒温养护箱图21
ThuJanuary-202501301484..png
ThuJanuary-202501302351..png

物联网大屏界面设置.mpdb

163.79 KB, 下载次数: 0

物联网大屏界面设置.mpdb

163.79 KB, 下载次数: 0

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
关于楼主

楼主的其它帖子

上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail