| 
 1076| 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提供的硬件支持。 附件   | ||||||||||||||||||||||||||||||||
 沪公网安备31011502402448
 沪公网安备31011502402448© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed