【花雕动手做】K10 实验之带提示音的全功能数码照相机

2026-06-16817
AI 快速预览详细 收起
行空板K10是一款专为快速体验物联网和学习人工智能而设计的开发学习板,集成摄像头、麦克风、扬声器和2.8寸彩色屏幕。通过本项目,孩子可以轻松实现带提示音的全功能数码照相机,提升编程和AI技能。该板支持离线图像检测和语音识别,无需额外连接其他设备,非常适合STEM教育和少儿编程入门。
【花雕动手做】K10 实验之带提示音的全功能数码照相机图2

行空板K10是一款专为快速体验物联网和学习人工智能而设计的开发学习板,100%采用国产芯片,知识产权自主可控,符合信息科技课程中编程学习、物联网及人工智能等教学需求。该板集成2.8寸LCD彩屏、WiFi蓝牙、摄像头、麦克风、扬声器、RGB指示灯、多种传感器及丰富的扩展接口。凭借高度集成的板载资源,教学过程中无需额外连接其他设备,便可轻松实现传感器控制、物联网应用以及人脸识别、语音识别、语音合成等AI人工智能项目。

主要特点
集成摄像头&内置算法,可进行离线图像检测
集成麦克风&内置算法,可进行离线语音识别
集成扬声器&内置算法,可进行离线语音合成
2.8寸彩色屏幕,数据展示更清晰
集成度高,利于教学
接口丰富,兼容软件多,扩展性好


【花雕动手做】K10 实验之带提示音的全功能数码照相机图1

创作许可协议

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

评论(7)
驴友花雕
驴友花雕
作者

【【花雕动手做】行空板 K10 系列实验之带提示音的全功能数码】
https://www.bilibili.com/video/BV19njG6NEpr/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987
[media=x,500,375]https://www.bilibili.com/video/BV19njG6NEpr/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987[/media]
驴友花雕
驴友花雕
作者
实验场景图与视频记录




驴友花雕
驴友花雕
作者
Mind+图形编程

驴友花雕
驴友花雕
作者
代码解读
一、头文件、全局变量与对象
[code]#include "unihiker_k10.h"[/code]
引入行空板 K10 集成驱动库,内置屏幕、按键、板载摄像头、TF 卡文件系统、音频、RGB 彩灯全套硬件驱动。
[code]volatile float mind_n_ABC;[/code]
作用:三段模式状态计数器,每按一次 A 键数值 + 1;
volatile关键字:变量在按键回调函数中修改,阻止编译器缓存优化,保证数值实时更新;
通过对 3 取余实现循环切换三种相机功能。
[code]void onButtonAPressed();[/code]
按键回调函数前置声明,用于给 A 按键绑定触发事件,编译器提前识别该函数。
[code]UNIHIKER_K10 k10;[/code]
行空板核心硬件对象,摄像头、屏幕、SD 卡、灯光、按键全部依靠该对象操作。
[code]Music music;[/code]
音频对象,取景、拍照、预览三个阶段分别播放不同音调做状态提示音。
[code]uint8_t screen_dir=2;[/code]
屏幕旋转参数,可选 0/1/2/3,2 为当前屏幕显示朝向。
二、setup () 上电初始化(仅执行 1 次)
k10.begin():初始化主板底层所有硬件总线;
setPressedCallback(onButtonAPressed):给 A 按键绑定按下回调,按下 A 自动执行回调函数,不受 delay 阻塞;
initScreen(screen_dir):按指定方向初始化显示屏;
initBgCamerImage():初始化摄像头背景预览底层驱动;
setBgCamerImage(false):开机默认关闭摄像头实时画面;
creatCanvas():创建屏幕绘图缓存,绘图先存入缓存再统一刷新,消除闪屏;
initSDFile() 关键函数:初始化 TF 卡系统,不调用无法保存、读取照片;
setScreenBackground(0x000000):屏幕底色设黑色;
canvasText():在固定行打印彩色开机提示文字,介绍实验功能与操作方式;
updateCanvas():把缓存文字刷新到实体屏幕;
rgb->brightness(9):设置 RGB 彩灯全局亮度。
三、loop () 主循环
函数内部为空,所有拍摄、预览、存储逻辑全部放在按键回调里,不需要轮询检测按键。
四、按键回调核心逻辑 onButtonAPressed()
每按下一次 A 键,计数mind_n_ABC += 1,通过 数值 % 3 循环切换 3 种模式,循环顺序:取景 → 拍照保存 → 图片预览。
余数 = 1 取景模式(第一次按 A)
播放 247Hz 长提示音;
开启摄像头实时画面投屏到屏幕;
第 1 颗 RGB 绿灯亮起,代表实时取景状态。
余数 = 2 拍照存储(第二次按 A)
播放 330Hz 快门提示音;
截取当前摄像头画面,保存为S:/photo.bmp覆盖 TF 卡旧照片;
屏幕打印文字提示 “已保存照片”;
RGB 红灯亮起,关闭摄像头实时画面。
余数 = 0 图片预览(第三次按 A)
清空屏幕所有文字与画面;
播放 523Hz 预览提示音;
在屏幕左上角全屏读取 TF 卡内photo.bmp显示;
RGB 蓝灯亮起;
delay(3000) 阻塞停留 3 秒,之后清空画布回到开机文字界面。
第四次按下 A,计数取余再次等于 1,重新进入取景模式,无限循环。
四、整体运行流程
硬件必备:行空板 K10、板载摄像头、插入 TF 内存卡
开机黑屏,显示相机实验介绍文字;
第 1 次按 A:屏幕实时显示摄像头画面,绿灯;
第 2 次按 A:抓拍画面存入 TF 卡,屏幕提示保存,红灯;
第 3 次按 A:全屏展示刚拍摄的照片,蓝灯,停留 3 秒自动清屏;
重复按压 A,循环切换三个功能。
案例特点
采用按键回调触发,非轮询检测,响应灵敏;
三段式状态机设计,单按键完成取景、拍照、预览全部功能;
灯光 + 提示音 + 文字三重状态提示,交互直观。
驴友花雕
驴友花雕
作者
【花雕动手做】行空板 K10 系列实验之带提示音的全功能数码照相机
实验开源代码
[code]// 引入行空板K10全套硬件驱动库,集成屏幕、按键、摄像头、SD卡、音频、RGB彩灯功能
#include "unihiker_k10.h"
// 状态计数全局变量,volatile修饰:回调函数修改,防止编译器缓存优化,主逻辑实时读取数值
volatile float mind_n_ABC;
// A按键按下回调函数前置声明,setup中绑定按键事件需要提前告知编译器
void onButtonAPressed();
// 实例化行空板主硬件对象,所有硬件操作统一通过k10调用
UNIHIKER_K10 k10;
// 音频播放对象,用于拍摄、保存、预览时播放提示音调
Music music;
// 屏幕显示方向参数2,可修改0/1/2/3切换屏幕翻转角度
uint8_t screen_dir=2;
// 上电/复位仅执行一次初始化函数
void setup() {
// 初始化行空板底层总线、摄像头、屏幕、I2C等硬件
k10.begin();
// 为A按键绑定按下触发回调函数,按下A自动执行onButtonAPressed
k10.buttonA->setPressedCallback(onButtonAPressed);
// 按照设定方向初始化显示屏
k10.initScreen(screen_dir);
// 初始化摄像头画面背景渲染功能,开启摄像头底层驱动
k10.initBgCamerImage();
// 默认关闭摄像头实时预览画面
k10.setBgCamerImage(false);
// 创建屏幕绘图缓存画布,绘图先写入缓存再统一刷新,避免屏幕闪烁
k10.creatCanvas();
// 初始化TF卡文件系统,照片存储、读取图片必须依赖此函数
k10.initSDFile();
// 设置屏幕底色为纯黑色
k10.setScreenBackground(0x000000);
// 画布第3行浅粉色打印实验标题
k10.canvas->canvasText("行空板K10系列实验", 3, 0xFFCCCC);
// 画布第5行浅黄色打印功能副标题
k10.canvas->canvasText(" 带提示音的照相机", 5, 0xFFFF99);
// 画布第7行浅紫色打印操作提示文字
k10.canvas->canvasText(" 按A键打开相机", 7, 0xCCCCFF);
// 将缓存中所有文字刷新到实体屏幕完成显示
k10.canvas->updateCanvas();
// 设置RGB彩灯全局亮度为9,亮度区间0~255,数值越小灯光越柔和
k10.rgb->brightness(round(9));
}
// 主循环,本实验全部拍摄逻辑放在按键回调内,loop无额外执行代码
void loop() {
}
// A按键按下触发回调函数,每按一次自动执行一次,实现三段式相机功能切换
void onButtonAPressed() {
// 每按一次A,计数变量自增1,用来区分三种相机状态
mind_n_ABC += 1;
// 计数对3取余=1:第一阶段——开启摄像头实时取景
if ((((int32_t(mind_n_ABC)) % (int32_t(3)))==1)) {
// 播放247Hz音调,持续4000ms,取景提示音
music.playTone(247, 4000);
// 开启摄像头背景实时画面,屏幕显示摄像头取景画面
k10.setBgCamerImage(true);
// 刷新画布同步画面
k10.canvas->updateCanvas();
// 第1颗RGB灯亮绿色,代表取景模式
k10.rgb->write(1, 0x00FF00);
}
// 计数对3取余=2:第二阶段——拍摄照片并保存到TF卡
else {
if ((((int32_t(mind_n_ABC)) % (int32_t(3)))==2)) {
// 播放330Hz拍照快门提示音
music.playTone(330, 4000);
// 截取当前摄像头画面,保存为bmp图片至TF卡根目录photo.bmp
k10.photoSaveToTFCard("S:/photo.bmp");
// 画布第9行白色文字提示照片保存成功
k10.canvas->canvasText(" 已保存照片", 9, 0xFFFFFF);
k10.canvas->updateCanvas();
// 第1颗RGB灯亮红色,代表已完成拍摄保存
k10.rgb->write(1, 0xFF0000);
// 关闭摄像头实时取景画面
k10.setBgCamerImage(false);
}
// 计数对3取余=0:第三阶段——全屏读取并预览保存好的照片
else {
if ((((int32_t(mind_n_ABC)) % (int32_t(3)))==0)) {
// 清空画布所有原有文字、画面
k10.canvas->canvasClear();
// 播放523Hz预览提示音
music.playTone(523, 4000);
// 在画布坐标(0,0)全屏绘制TF卡内photo.bmp照片
k10.canvas->canvasDrawImage(0, 0, "S:/photo.bmp");
k10.canvas->updateCanvas();
// 第1颗RGB灯亮蓝色,代表图片预览模式
k10.rgb->write(1, 0x0000FF);
// 阻塞延时3秒,保持图片预览界面
delay(3000);
// 3秒后清空画布,回到初始黑屏文字界面
k10.canvas->canvasClear();
}
}
}
}[/code]
驴友花雕
驴友花雕
作者
辅助:屏幕显示相关积木

LED控制模块

驴友花雕
驴友花雕
作者
主打:音频录放模块

相关说明

- 没有更多了 -