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

项目背景
《三国演义》中,曹操亲率大军南下攻吴,大军驻扎长江北岸。庞统献上连环计,诱使曹操将战船用铁索相连,便于东吴实施火攻,曹操中计。但隆冬时节江面多刮西北风,缺少东南风,火势无法吹向曹军水寨,周瑜为此忧心忡忡、一病不起。
问题提出
周瑜:诸葛兄,曹操大军南下,势不可挡,你可有破敌良策?
诸葛亮:想要大破曹军,唯有火攻一计。公瑾只需备好行空板 K10,助我打造孔明八卦扇,我便可借得东风,火烧曹营!
功能实现
本项目以时序大模型为核心,搭配行空板 K10、八卦扇,联动风扇、蜂鸣器、灯带完成情景交互。
| 功能一 | 周瑜:江上寒风凛冽,何来东南大风? 诸葛亮:且看我这八卦神扇! | 系统上电后,行空板 K10 屏幕实时显示时间、天气信息; |
| 功能二 | 诸葛亮:东风已至!火攻时机已到! 周瑜:妙哉!东南风起,火势可直扑曹营! | 八卦神扇左右摇扇几 次,时序识别成功,风扇启动,模拟东风起; |
| 功能三 | 周瑜:曹营战船起火了!大火绵延,曹军大乱! 诸葛亮:连环战船无处可逃,曹军大势已去! | 八卦神扇上下摇扇 几次,时序识别成功,外接红色rgb依次点亮模拟火焰, 模拟战船起火,蜂鸣器播放火焰燃烧音效; |
| 功能四 | 诸葛亮:火势已熄,赤壁一战大功告成! 周瑜:先生神机妙算,真乃神人也! | 八卦扇子保持静止,画面回到平静江面,风扇停止, 红色灯带和蜂鸣器熄灭,赤壁之战落幕; |
制作过程
一、时序模型训练
使用时序大模型识别八卦扇的摇动姿态,区分上下摇动、左右摇动、静止三种状态;
第一步:刷入行空板K10加速度传感器测试程序

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

串口测试行空板k10加速度数值
第二步:Mind+2.0进入模型训练

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

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

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

模型训练后,测试左右时序,导出模型备用
二、搭建SIOT2.0物联网平台

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

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

3.新建主题siot/ai
说明:topic:siot/ai,siot服务器ip地址,为编程准备。

三、行空板K10编程
1.测试行空板K10金手指模拟值


(2)串口显示行空板K10的金手指p0和p1的模拟引脚数值
手指触摸金手指时候,p0和p1大于2000,反正大于2000。
2.行空板K10编写程序
(1)打开Mind+2.0,选择上传模式

(2)添加行空板K10主控

(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采集端程序

(5)行空板k10串口时序采集数据
四、掌控板编程
(1)打开Mind+2.0,选择上传模式

(2)添加掌控板主控

(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)掌控板接受端程序
五、组 装

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

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


(3)使用热熔枪将行空板和电池固定在八卦扇的骨架上.
创新点
本项目把《三国演义》“借东风” 的经典故事和行空板 K10、时序模型姿态识别结合,打造沉浸式情景互动作品。
1.传统文化 + AI 融合创新:将三国经典故事与时序姿态识别 AI 结合,把古老的 “借东风” 神话想象,变成可以亲手操控的互动装置,用现代科技演绎古典名著。
2.姿态交互新颖有趣:不用按键、触摸,依靠摇动八卦扇子来控制设备,手势自然。
3.时序模型识别手势:利用时序大模型识别连续摇动动作,不是简单单次检测,能识别连续 5 次摇动,识别更稳定,体现时序 AI 的特点。
4.情景化沉浸式展示:屏幕信息、风扇、灯带同步配合,形成完整小故事场景,演示的时候生动好玩,更容易看懂、吸引人。




