之前介绍了如何准备K10编程环境,这次来实践一下,用Mind+做一个二维码标签。
一、功能设计
作为一个展品电子标签,首先应当显示一些展品的说明。其次,标签面积较小,展示内容很有限,为了能够让参观者能够方便地查阅到更加丰富的资料,可以同时显示二维码,供参观者用手机扫描后从网页上看到详细介绍。还有,就是可以通过语音播报,介绍这个展品的编号ID,这样视障群体也可以使用编号ID去查询展品介绍等信息。由于编号很简短,即使同一个区域有多个电子标签在同时播放编号,也不会把环境搞的很嘈杂。
二、所需资源
(一)硬件
根据功能定义,需要用到以下板载资源(用黄色标出):
| 板载功能 | 功能介绍 |
|---|---|
| 扬声器 | 播放合成的语音。 |
| 2.8寸高清彩色显示屏 | 显示彩色文字、二维码。 |
(二)软件
根据设计的功能,需要用到多个Mind+组件。
1、初始化设置屏幕方向:用于设置屏幕显示方向,显示方向有4种,旋转角度等于设置的数字乘以4。
2、显示纯色背景:如果不设置,屏幕的背景颜色则默认为白色。
3、将缓存内容显示/显示更新:将缓存的内容在屏幕上显示出来。当使用到显示相关指令更新了显示内容后,需要使用这个功能后,才会将内容显示出来。
4、立即显示二维码:可以将文字、网址转化为二维码,显示在K10屏幕上。
5、清除二维码显示:因为“清除全屏”指令,对二维码无效,所以有此专用指令。
6、语音合成:指定中文文字合成语音,可使用逗号实现语气间隔。
7、设置语音播放的语速:值在1-5之间,默认为2,越大语速越快。
三、代码逻辑
初始化后,轮流显示二维码或简短介绍,同时将ID和介绍生成语音播放出来。以下是Mind+程序,可以看出来运行流程。
在烧写时,Mind+先将图形化代码转成arduino的c代码,再编译烧写。
/*!
* MindPlus
* esp32s3bit
*
*/
#include "asr.h"
#include "unihiker_k10.h"
// 动态变量
String mind_s_ZhanPinID, mind_s_JieShao;
// 函数声明
void DF_QingChuPingMu();
void DF_XianShiErWeiMa();
void DF_XianShiJieShao();
void DF_BoFangTiShiYin();
// 创建对象
uint8_t screen_dir=3;
UNIHIKER_K10 k10;
ASR asr;
// 主程序开始
void setup() {
k10.begin();
k10.initScreen(screen_dir);
k10.creatCanvas();
asr.setAsrSpeed(2);
mind_s_ZhanPinID = "6610";
mind_s_JieShao = "这是K10开发板,功能很多";
DF_QingChuPingMu();
}
void loop() {
DF_BoFangTiShiYin();
DF_QingChuPingMu();
DF_XianShiErWeiMa();
delay(5000);
DF_BoFangTiShiYin();
DF_QingChuPingMu();
DF_XianShiJieShao();
delay(5000);
}
// 自定义函数
void DF_QingChuPingMu() {
k10.setScreenBackground(0xCCFFFF);
k10.clearCode();
k10.canvas->canvasClear();
}
void DF_XianShiErWeiMa() {
k10.canvasDrawCode((String("https://www.digikey.cn/zh/forum/t/topic/") + String(mind_s_ZhanPinID)));
k10.canvas->updateCanvas();
}
void DF_XianShiJieShao() {
k10.canvas->canvasText(mind_s_JieShao, 1, 0x000000);
k10.canvas->updateCanvas();
}
void DF_BoFangTiShiYin() {
asr.speak((String("展品编号是,") + String(mind_s_ZhanPinID)));
asr.speak(mind_s_JieShao);
}
四、成品效果图
开机后,屏幕轮流显示二维码和简介的文字,同时语音提示展品的ID、播放展品简介。明眼人可以用手机扫码,获取更详细的信息。盲人可以听到展品编号ID后另行查询。
五、开发经验
Mind+中有K10的专用库,可以使用类似scratch的图形化编程,因而十分方便,但是这也带来2个问题。一个问题是Mind+中只能自定义过程,导致函数返回值都要用全局变量实现,当然这个可以用“手动编辑”模式绕开。另一个问题是库中显示二维码必须占用全屏,导致只能轮流显示,绕开的方法是设计好整屏显示的内容,做成一张图片显示,但是官方资料显示图片尺寸超过240x320像素会造成异常不稳定,所以其实也没有太好的解决办法。


