【花雕动手做】K10 实验之后台播放与播放音符音调1155661
2026-06-16511
AI 快速预览详细
行空板K10是一款专为快速体验物联网和学习人工智能而设计的开发学习板。它集成了摄像头、麦克风和扬声器,支持离线图像检测、语音识别和语音合成。通过后台播放和音符音调实验,学生可以轻松实现传感器控制和物联网应用,提升编程技能。该板还具有2.8寸彩色屏幕,数据展示更清晰,接口丰富,兼容软件多,扩展性好。
![]() 行空板K10是一款专为快速体验物联网和学习人工智能而设计的开发学习板,100%采用国产芯片,知识产权自主可控,符合信息科技课程中编程学习、物联网及人工智能等教学需求。该板集成2.8寸LCD彩屏、WiFi蓝牙、摄像头、麦克风、扬声器、RGB指示灯、多种传感器及丰富的扩展接口。凭借高度集成的板载资源,教学过程中无需额外连接其他设备,便可轻松实现传感器控制、物联网应用以及人脸识别、语音识别、语音合成等AI人工智能项目。 主要特点 集成摄像头&内置算法,可进行离线图像检测 集成麦克风&内置算法,可进行离线语音识别 集成扬声器&内置算法,可进行离线语音合成 2.8寸彩色屏幕,数据展示更清晰 集成度高,利于教学 接口丰富,兼容软件多,扩展性好 ![]() |






实验场景图与视频记录
一、头部:库引入、全局变量、函数声明
[code]#include "unihiker_k10.h"[/code]
导入行空板 K10 官方集成库,内置屏幕、按键、RGB 彩灯、扬声器音频全套驱动,无需手动配置硬件引脚。
[code]volatile float mind_n_okk;[/code]
变量作用:状态标记,用来区分用户按下 A 键还是 B 键;
volatile关键字:该变量会在按键回调函数中修改,告诉编译器不要优化缓存,保证主循环能实时读到最新数值,防止按键失效、状态不刷新。
[code]void onButtonAPressed();
void onButtonBPressed();[/code]
函数前置声明。后面要给按键绑定这两个按下触发函数,编译器需要提前识别函数名,否则会报未定义错误。
[code]UNIHIKER_K10 k10;[/code]
行空板硬件总实例,屏幕、灯光、按键、喇叭全部通过k10调用。
[code]uint8_t screen_dir=3;[/code]
屏幕旋转参数,0/1/2/3 对应四种显示方向,3 为当前设置的屏幕朝向。
[code]Music music;[/code]
音频播放对象,两种播放能力:内置完整旋律、自定义单音符播放。
二、setup () 初始化函数(上电只执行 1 次)
k10.begin():初始化主板底层硬件总线;
k10.initScreen(screen_dir):按指定方向初始化显示屏;
k10.creatCanvas():创建屏幕画布缓存,绘图先存缓存,统一刷新,消除屏幕闪烁;
setPressedCallback():绑定按键回调,按下 A/B 会自动执行对应函数,属于中断式响应,不会被delay卡住;
setScreenBackground(0x000000):屏幕底色设纯黑;
canvasText(文字,行数,颜色):在画布指定行打印彩色文字,展示实验标题与功能说明;
updateCanvas():把缓存里的文字刷新到实体屏幕;
mind_n_okk = 0:开机初始化状态标记,0 = 无播放任务。
三、loop () 无限主循环
程序初始化完成后,该函数不停循环运行,负责执行音频播放逻辑。
判断 mind_n_okk == 1(A 键按下标记)
延时 500ms;
调用内置旋律播放生日快乐歌;
标记清零,避免重复循环播放。
判断 mind_n_okk == 2(B 键按下标记)
延时 500ms;
playTone(频率,持续毫秒) 逐个播放音符,实现《一闪一闪亮晶晶》片段;
标记清零。
末尾 k10.rgb->write(-1, 0x000000)
-1代表所有板载 RGB 灯,0x000000 为黑色,每次循环末尾熄灭彩灯;
效果:按键点亮彩灯,循环走到末尾自动关灯。
四、按键回调事件函数(触发式,不阻塞程序)
A 键回调 onButtonAPressed ()
mind_n_okk = 1:修改状态标记,通知主循环播放生日歌;
RGB 全部绿灯亮起,作为按键按下视觉提示。
B 键回调 onButtonBPressed ()
mind_n_okk = 2:修改状态标记,通知主循环播放自定义音符;
RGB 全部蓝灯亮起,作为按键按下视觉提示。
五、整体运行逻辑与设计优点
完整运行流程
开机黑屏显示文字,无灯光、无声音;
按下 A:绿灯亮 → 等待 0.5s 播放生日快乐歌 → 播放结束灯光自动熄灭;
按下 B:蓝灯亮 → 等待 0.5s 播放一段单音旋律 → 播放结束灯光自动熄灭。
代码设计优势
回调分离思想
按键回调只改标记,播放、延时等耗时操作全部放在主循环,不在回调里写长延时,不会造成主板卡顿、按键失灵;
状态机控制
依靠单一变量区分两种功能,逻辑清晰,方便后续拓展更多按键功能;
硬件可视化反馈
按键对应不同颜色灯光,用户直观区分按下了哪个按键。
实验开源代码
[code]// 引入行空板K10官方核心驱动库,集成屏幕、按键、RGB彩灯、音频播放全套硬件驱动
#include "unihiker_k10.h"
// 动态标记变量,volatile修饰:防止编译器优化,保证中断/回调修改后主循环能实时读取最新值
volatile float mind_n_okk;
// 按键按下回调函数前置声明,setup中绑定按键事件需要提前告知编译器函数存在
void onButtonAPressed();
void onButtonBPressed();
// 实例化行空板全局硬件主对象,所有屏幕、灯光、按键、音频操作都通过该对象调用
UNIHIKER_K10 k10;
// 屏幕显示方向参数3,用于旋转屏幕画面,可选0/1/2/3四个方向
uint8_t screen_dir=3;
// 实例化音频播放对象,支持内置旋律播放、自定义单音播放
Music music;
// 上电/复位仅执行一次的硬件初始化入口
void setup() {
// 初始化行空板底层所有硬件通信总线
k10.begin();
// 根据设定方向初始化显示屏驱动
k10.initScreen(screen_dir);
// 创建屏幕绘图缓冲区,绘图操作先写入缓存,统一刷新避免屏幕闪烁
k10.creatCanvas();
// 给A按键绑定按下触发回调函数,按下A自动执行onButtonAPressed
k10.buttonA->setPressedCallback(onButtonAPressed);
// 给B按键绑定按下触发回调函数,按下B自动执行onButtonBPressed
k10.buttonB->setPressedCallback(onButtonBPressed);
// 设置屏幕整体背景颜色为纯黑色 0x000000
k10.setScreenBackground(0x000000);
// 在画布第3行绘制红色标题文字
k10.canvas->canvasText(" 行空板K10系列实验", 3, 0xFF0000);
// 在画布第5行绘制白色说明文字
k10.canvas->canvasText("后台播放音乐与播放音符音调", 5, 0xFFFFFF);
// 在画布第7行绘制浅绿色乐谱提示文字
k10.canvas->canvasText(" 一闪一闪亮晶晶1155661", 7, 0x99FF99);
// 将画布缓存的全部文字画面刷新到实体屏幕,文字才会显示
k10.canvas->updateCanvas();
// 初始化状态标记变量,0代表无播放任务
mind_n_okk = 0;
}
// 主循环函数,setup初始化完成后无限循环执行
void loop() {
// 判断标记为1:触发A键对应的生日歌播放任务
if ((mind_n_okk==1)) {
delay(500); // 阻塞延时0.5秒
music.playMusic(BIRTHDAY); // 播放库内置生日快乐旋律
mind_n_okk = 0; // 播放完成,重置标记,避免重复播放
}
// 判断标记为2:触发B键对应的自定义音符(一闪一闪亮晶晶片段)
if ((mind_n_okk==2)) {
delay(500); // 阻塞延时0.5秒
// playTone(音调频率, 持续时长ms) 逐段播放音符
music.playTone(131, 8000);
music.playTone(131, 8000);
music.playTone(196, 8000);
music.playTone(196, 8000);
music.playTone(220, 8000);
music.playTone(220, 8000);
music.playTone(196, 8000);
mind_n_okk = 0; // 音符播放完毕,重置状态标记
}
// 循环末尾默认关闭全部RGB灯,-1代表控制所有板载彩灯,0x000000黑色熄灭
k10.rgb->write(-1, 0x000000);
}
// A按键按下事件回调函数,按键触发时自动运行,不阻塞loop循环
void onButtonAPressed() {
mind_n_okk = 1; // 将状态标记置1,主循环识别后播放生日歌
k10.rgb->write(-1, 0x00FF00); // 按下A,全部RGB绿灯常亮
}
// B按键按下事件回调函数,按键触发时自动运行,不阻塞loop循环
void onButtonBPressed() {
mind_n_okk = 2; // 将状态标记置2,主循环识别后播放自定义音符
k10.rgb->write(-1, 0x0000FF); // 按下B,全部RGB蓝灯常亮
}[/code]
LED控制模块
相关说明