19| 0
|
[K10项目分享] 行空板K10: 仓鼠恒温养护箱 |
本帖最后由 heartlee 于 2025-1-30 21:39 编辑 一、项目来源 年前的集市上人声鼎沸,热闹非凡。在我们穿梭在各个摊位之间时,孩子们的目光突然被一个不起眼的角落吸引。那里有一个小小的仓鼠摊,摊位上摆放着几个透明的塑料笼子,里面住着几只毛茸茸的仓鼠。这些仓鼠有的在笼子里欢快地跑轮,有的在啃着木头,还有的蜷缩在角落里睡觉,可爱极了。孩子们立刻围了上去,眼睛瞪得大大的,满是惊喜和好奇。经过一番比较和商量,孩子们最终选中了一只“布丁”——眼睛乌溜溜的小仓鼠。我们又在摊位上购买了仓鼠的小别墅和营养丰富的仓鼠粮。孩子们开心极了,觉得这是一份完美的新年礼物。但我们马上就遇到了一个大问题,仓鼠在晚上常常蜷缩一团,还发出一些细微的叫声,们在表达自己的不适,孩子们也一直睡不好觉,我们猜想是否是因为冬天晚上温度低的原因。我马上想到了五年级信息科技新教材中的“恒温箱”实验,我们可以做一个恒温箱,让孩子们分析数据来解决问题。 二、项目目标 1.利用行空板K10板载声音传感器获取仓鼠的活动状态,并通过数据同步到物联网云平台中,长期追踪数据;通过数据分析,得出当前设置的温度是否适合仓鼠生活。 2.利用行空板K10板载温湿度传感器获取环境温湿度,通过扩展板连接制热器和风扇,打造智能恒温系统,实现设备的控制与反馈。 3.利用LED灯和人体运动传感器,实现人来开灯,人走关灯的效果,便于观察仓鼠的生活状态。 项目思维导图 显示界面 效果视频: 三、项目硬件
四、项目软件基础知识 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[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提供的硬件支持。 附件 |
© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed