heartlee 发表于 2025-1-30 19:35:12

行空板K10: 仓鼠恒温养护箱

本帖最后由 heartlee 于 2025-1-30 21:39 编辑

一、项目来源年前的集市上人声鼎沸,热闹非凡。在我们穿梭在各个摊位之间时,孩子们的目光突然被一个不起眼的角落吸引。那里有一个小小的仓鼠摊,摊位上摆放着几个透明的塑料笼子,里面住着几只毛茸茸的仓鼠。这些仓鼠有的在笼子里欢快地跑轮,有的在啃着木头,还有的蜷缩在角落里睡觉,可爱极了。孩子们立刻围了上去,眼睛瞪得大大的,满是惊喜和好奇。经过一番比较和商量,孩子们最终选中了一只“布丁”——眼睛乌溜溜的小仓鼠。我们又在摊位上购买了仓鼠的小别墅和营养丰富的仓鼠粮。孩子们开心极了,觉得这是一份完美的新年礼物。但我们马上就遇到了一个大问题,仓鼠在晚上常常蜷缩一团,还发出一些细微的叫声,们在表达自己的不适,孩子们也一直睡不好觉,我们猜想是否是因为冬天晚上温度低的原因。我马上想到了五年级信息科技新教材中的“恒温箱”实验,我们可以做一个恒温箱,让孩子们分析数据来解决问题。
二、项目目标1.利用行空板K10板载声音传感器获取仓鼠的活动状态,并通过数据同步到物联网云平台中,长期追踪数据;通过数据分析,得出当前设置的温度是否适合仓鼠生活。2.利用行空板K10板载温湿度传感器获取环境温湿度,通过扩展板连接制热器和风扇,打造智能恒温系统,实现设备的控制与反馈。3.利用LED灯和人体运动传感器,实现人来开灯,人走关灯的效果,便于观察仓鼠的生活状态。
项目思维导图
显示界面
效果视频: https://www.bilibili.com/video/BV1gQFLeWEdW/?spm_id_from=888.80997.embed_other.whitelist&t=1.579349&bvid=BV1gQFLeWEdW
三、项目硬件
主控板外接传感器执行器显示器扩展板
行空板K10*1人体运动传感器*1声音传感器*1半导体制冷片*1散热风扇*1继电器*1LED*1micro:bit掌控IO扩展板*1

板载温湿度传感器获取温度数据,为恒温系统控制提供数据支撑。检测外界是否来人声音传感器获取环境声音数据,用于监测仓鼠是否躁动。冬天可用发热面制热,夏天可用制冷面制冷用于散热用于控制制冷片的运作用于照明,方便监测提供了数字/模拟引脚,轻松扩展和控制各种设备。

四、项目软件基础知识1.下载安装Mind+软件百度网盘下载(20250103版): https://pan.baidu.com/s/15ORx5VbobeZjiQvOxar21g?pwd=d2aa 提取码: d2aa下载后解压到C盘根目录。2.开始Mind+图形化编程点击”扩展“,在扩展页面中,点击”主控板“,选择”行空板K10“,点击”返回“,完成加载
使用USB线将行空板K10的Type-C口接到电脑USB口,在mind+中点击“连接设备”,找到对应的K10设备并点击,完成设备连接
五、物联网大屏界面设计及硬件接线图1.物联网大屏界面设计这是仓鼠生活环境物联网大屏,监测仓鼠生活环境温度,用声音传感器的数据判断它是否躁动,能够远程设置环境温度范围,便于观察仓鼠。2.硬件连接图
六、重点程序截图1.MQTT连接       
2.SIOT主题设置
3.K10界面显示,并传输环境数据至SIOT
4.人来开灯便于观察
5.恒温设置
七、全部代码/*! * 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 = {"siot/温度","siot/温度设置","siot/湿度","siot/声音强度","siot/光照强度"};const MsgHandleCb msgHandles = {NULL,obloqMqttEventT9e10x,NULL,NULL,NULL};// 创建对象IOBOX_Motormotor_ib;UNIHIKER_K10 k10;uint8_t      screen_dir=2;DFRobot_IotmyIot;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提供的硬件支持。附件
页: [1]
查看完整版本: 行空板K10: 仓鼠恒温养护箱