做中学·探未来|基于时序模型的大话三国之 K10 借东风

2026-11-135
做中学·探未来|基于时序模型的大话三国之 K10 借东风_image_1.webp

项目背景

      《三国演义》中,曹操亲率大军南下攻吴,大军驻扎长江北岸。庞统献上连环计,诱使曹操将战船用铁索相连,便于东吴实施火攻,曹操中计。但隆冬时节江面多刮西北风,缺少东南风,火势无法吹向曹军水寨,周瑜为此忧心忡忡、一病不起。

 

问题提出

        周瑜:诸葛兄,曹操大军南下,势不可挡,你可有破敌良策?

        诸葛亮:想要大破曹军,唯有火攻一计。公瑾只需备好行空板 K10,助我打造孔明八卦扇,我便可借得东风,火烧曹营!

功能实现

本项目以时序大模型为核心,搭配行空板 K10、八卦扇,联动风扇、蜂鸣器、灯带完成情景交互。

  功能一

周瑜:江上寒风凛冽,何来东南大风?

诸葛亮:且看我这八卦神扇!

系统上电后,行空板 K10 屏幕实时显示时间、天气信息;
  功能二

诸葛亮:东风已至!火攻时机已到!

周瑜:妙哉!东南风起,火势可直扑曹营!

八卦神扇左右摇扇几 次,时序识别成功,风扇启动,模拟东风起;
  功能三

周瑜:曹营战船起火了!大火绵延,曹军大乱!

诸葛亮:连环战船无处可逃,曹军大势已去!

八卦神扇上下摇扇 几次,时序识别成功,外接红色rgb依次点亮模拟火焰,

模拟战船起火,蜂鸣器播放火焰燃烧音效;

  功能四        

诸葛亮:火势已熄,赤壁一战大功告成!

周瑜:先生神机妙算,真乃神人也!

八卦扇子保持静止,画面回到平静江面,风扇停止,

红色灯带和蜂鸣器熄灭,赤壁之战落幕;

制作过程

一、时序模型训练

       使用时序大模型识别八卦扇的摇动姿态,区分上下摇动、左右摇动、静止三种状态;

第一步:刷入行空板K10加速度传感器测试程序

做中学·探未来|基于时序模型的大话三国之 K10 借东风_image_2.webp

说明:采集多个传感器数值在串口字符串输出,英文逗号隔开,换行显示。

做中学·探未来|基于时序模型的大话三国之 K10 借东风_image_3.webp

串口测试行空板k10加速度数值

第二步:Mind+2.0进入模型训练

做中学·探未来|基于时序模型的大话三国之 K10 借东风_image_4.webp

1.打开Mind2.0的时序模型识别训练

做中学·探未来|基于时序模型的大话三国之 K10 借东风_image_5.webp

1.设置时序标签,连接行空板k10串口,采集上下、左右、静止时序数据

做中学·探未来|基于时序模型的大话三国之 K10 借东风_image_6.webp

模型训练后,测试上下时序

做中学·探未来|基于时序模型的大话三国之 K10 借东风_image_7.webp

模型训练后,测试左右时序,导出模型备用

二、搭建SIOT2.0物联网平台

做中学·探未来|基于时序模型的大话三国之 K10 借东风_image_8.webp

1.双击start SIoT.bat开始运行

做中学·探未来|基于时序模型的大话三国之 K10 借东风_image_9.webp

2.打开浏览器输入:http://192.168.0.107:8080/#/login

做中学·探未来|基于时序模型的大话三国之 K10 借东风_image_10.webp

3.新建主题siot/ai

说明:topic:siot/ai,siot服务器ip地址,为编程准备。

做中学·探未来|基于时序模型的大话三国之 K10 借东风_image_11.webp

 

三、行空板K10编程

1.测试行空板K10金手指模拟值

做中学·探未来|基于时序模型的大话三国之 K10 借东风_image_12.webp

(1)查阅相关参数

做中学·探未来|基于时序模型的大话三国之 K10 借东风_image_13.webp

(2)串口显示行空板K10的金手指p0和p1的模拟引脚数值

手指触摸金手指时候,p0和p1大于2000,反正大于2000。

2.行空板K10编写程序

(1)打开Mind+2.0,选择上传模式

做中学·探未来|基于时序模型的大话三国之 K10 借东风_image_14.webp

(2)添加行空板K10主控 

做中学·探未来|基于时序模型的大话三国之 K10 借东风_image_15.webp

(3)添加MQTT, WiFi ,网络时间NTP,时序模型识别,天气

/*!
 * MindPlus
 * DFRobot, 行空板 K10
 */
#include <DFRobot_Iot.h>
#include "unihiker_k10.h"
#include "ModelProcessor.h"
#include <mPython_Weather.h>
#include <MPython_NtpTime.h>

// 动态变量
volatile float mind_n_zhuangtai, mind_n_my_variable;

// 静态常量
const String topics[] = {"siot/ai","","","",""};

// 创建对象
DFRobot_Iot myIot;
mPython_Weather myWeather;
MPython_NtpTime ntptime;
UNIHIKER_K10 k10;
ModelProcessor modelProcessor;
uint8_t screen_dir=2;



// 主程序开始
void setup() {
	k10.begin();
	if (!modelProcessor.initModel()) {while (1);}
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	myIot.wifiConnect("TP-LINK_kang", "Rzeg@126.com");
	while (!myIot.wifiStatus()) {}
	myWeather.init("server.mindplus.top", "31982666", "E6MtBcxQ");
	ntptime.setNtpTime(ntptime.UTCEast8_t, "edu.ntp.org.cn");
	k10.rgb->write(-1, 0xCC0000);
	myIot.init("192.168.0.105","siot","4023805909384235","siot", topics, 1883);
	myIot.connect();
	while (!myIot.connected()) {}
	k10.rgb->write(-1, 0x00FF00);
	myIot.subscribeTopic("siot/ai");
	myIot.publish("siot/ai", "hello");
	k10.canvas->canvasClear();
	k10.setScreenBackground(0xFFFFFF);
	k10.canvas->canvasText("基于时序大模型", 1, 0x000000);
	k10.canvas->canvasText("—大话三国之借东风", 3, 0x000000);
	k10.canvas->canvasText((String("天气:") + String(myWeather.getWeather("weather", "101180501"))), 5, 0x000000);
	k10.canvas->canvasText((String("最高温度:") + String(myWeather.getWeather("temperaturHigh", "101180501"))), 7, 0x000000);
	k10.canvas->canvasText((String("最低温度:") + String(myWeather.getWeather("temperaturLow", "101180501"))), 9, 0x000000);
	k10.canvas->canvasText((String((String((String(ntptime.localTime(ntptime.Month)).toInt())) + String("月"))) + String((String((String(ntptime.localTime(ntptime.Date)).toInt())) + String("日")))), 11, 0x000000);
	k10.canvas->updateCanvas();
	k10.rgb->write(-1, 0x000000);
	mind_n_zhuangtai = 3;
}
void loop() {
	if (((analogRead(P1))>2000)) {
		while (!((analogRead(P1))<=2000)) {
			modelProcessor.addInputValue((String((k10.getAccelerometerX())) + String((String(",") + String((String((k10.getAccelerometerY())) + String((String(",") + String((k10.getAccelerometerZ()))))))))));
			delay(100);
		}
	}
	bool isInferenceSuccessful = modelProcessor.runInference();

	if (isInferenceSuccessful) {
		if (((modelProcessor.getResult().predicted_class==0) && (!(mind_n_zhuangtai==0)))) {
			mind_n_zhuangtai = 0;
			k10.rgb->write(-1, 0x0000FF);
			myIot.publish("siot/ai", "0");
		}
		else if (((modelProcessor.getResult().predicted_class==1) && (!(mind_n_zhuangtai==1)))) {
			mind_n_zhuangtai = 1;
			k10.rgb->write(-1, 0x00FF00);
			myIot.publish("siot/ai", "1");
		}
		else if (((modelProcessor.getResult().predicted_class==2) && (!(mind_n_zhuangtai==2)))) {
			mind_n_my_variable = 2;
			k10.rgb->write(-1, 0x000000);
			myIot.publish("siot/ai", "2");
		}
		modelProcessor.resetInputBuffer();
	}
}

(4)行空板k10采集端程序

做中学·探未来|基于时序模型的大话三国之 K10 借东风_image_16.webp

(5)行空板k10串口时序采集数据

四、掌控板编程

(1)打开Mind+2.0,选择上传模式

做中学·探未来|基于时序模型的大话三国之 K10 借东风_image_17.webp

(2)添加掌控板主控 

做中学·探未来|基于时序模型的大话三国之 K10 借东风_image_18.webp

  • (3)添加rgb灯带,MQTT,掌控宝,WiFi

/*!
 * MindPlus
 * DFRobot, 掌控板
 */
#include <Wire.h>
#include <MPython.h>
#include <DFRobot_Iot.h>
#include <DFRobot_NeoPixel.h>
// 静态常量
const String topics[] = {"siot/ai","","","",""};

// 创建对象
DFRobot_NeoPixel neoPixel_P0;
DFRobot_Iot myIot;

void obloqMqttEventTsiot47ai(String& message);

// 主程序开始
void setup() {
	mPython.begin();
	Serial.begin(9600);
	myIot.setCustomMqttCallback(obloqMqttEventTsiot47ai, "siot/ai");
	neoPixel_P0.begin(P0, 12);
	rgb.write(-1, 0xFF0000);
	myIot.wifiConnect("TP-LINK_kang", "Rzeg@126.com");
	while (!myIot.wifiStatus()) {yield();}
	myIot.init("192.168.0.105","siot","01885207656372434","siot", topics, 1883);
	myIot.connect();
	while (!myIot.connected()) {yield();}
	rgb.write(-1, 0x00FF00);
	delay(3000);
	rgb.write(-1, 0x000000);
	myIot.subscribeTopic("siot/ai");
	neoPixel_P0.clear();
	display.fillScreen(0);
	display.setCursorLine(1);
	display.printLine("Mind+");
	display.setCursor(16, 24);
	display.print("大话三国之借东风");
}
void loop() {

}

// 事件回调函数
void obloqMqttEventTsiot47ai(String& message) {
	Serial.println(message);
	// 上下
	if ((message==(String(0)))) {
		neoPixel_P0.setRangeColor(0, 11, 0xFF0000);
		buzz.play(BLUES, Once);
		rgb.write(-1, 0xFF0000);
	}
	// 左右
	if ((message==(String(1)))) {
		Wire.begin();
		Wire.beginTransmission(0x10);
		Wire.write(1);
		Wire.write((int)(100));
		Wire.endTransmission();
	}
	if ((message==(String(2)))) {
		rgb.write(-1, 0x000000);
		Wire.begin();
		Wire.beginTransmission(0x10);
		Wire.write(1);
		Wire.write(0);
		Wire.endTransmission();
		Wire.beginTransmission(0x10);
		Wire.write(2);
		Wire.write(0);
		Wire.endTransmission();
		neoPixel_P0.clear();
	}
}

(4)掌控板接受端程序

 

五、组 装

做中学·探未来|基于时序模型的大话三国之 K10 借东风_image_19.webp

(1)风扇接入掌控宝M1灯带接入P0口

做中学·探未来|基于时序模型的大话三国之 K10 借东风_image_20.webp

(2)使用热熔枪将掌控板和风扇固定在纸盒上面

做中学·探未来|基于时序模型的大话三国之 K10 借东风_image_21.webp
做中学·探未来|基于时序模型的大话三国之 K10 借东风_image_22.webp

(3)使用热熔枪将行空板和电池固定在八卦扇的骨架上.

创新点

      本项目把《三国演义》“借东风” 的经典故事和行空板 K10、时序模型姿态识别结合,打造沉浸式情景互动作品。

1.传统文化 + AI 融合创新:将三国经典故事与时序姿态识别 AI 结合,把古老的 “借东风” 神话想象,变成可以亲手操控的互动装置,用现代科技演绎古典名著。

2.姿态交互新颖有趣:不用按键、触摸,依靠摇动八卦扇子来控制设备,手势自然。

3.时序模型识别手势:利用时序大模型识别连续摇动动作,不是简单单次检测,能识别连续 5 次摇动,识别更稳定,体现时序 AI 的特点。

4.情景化沉浸式展示:屏幕信息、风扇、灯带同步配合,形成完整小故事场景,演示的时候生动好玩,更容易看懂、吸引人。

做中学·探未来|基于时序模型的大话三国之 K10 借东风_image_23.webp

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(0)
- 没有更多了 -