本帖最后由 忆天 于 2025-2-20 23:58 编辑  
 
【意义】关心视力健康,定期测试视力。 
【原理】在一定距离查看一定大小的E字,并回答对其相应的方向。 
【环节】 
1.生成大小不同的E字形图 
2.判断方向,方向正确,缩小后再生成;方向错误,原大小生成。 
3.根据判断的结果得出视力 
【设计想法】 
E字的设计,参照汉字编码,设计成5*5共25个色块,然后填充。  
【效果图】 
 【演示视频】 
 
【代码图】 
  
【代码】 
			
			
			- /*!
 -  * MindPlus
 -  * esp32s3bit
 -  *
 -  */
 - #include "asr.h"
 - #include <SimpleList.h>
 - #include "unihiker_k10.h"
 - 
 - // 动态变量
 - volatile float     mind_n_h, mind_n_n, mind_n_HuiDaFangXiang, mind_n_SuiJiFangXiang,
 -                    mind_n_m5, mind_n_m3, mind_n_m_1, mind_n_n5, mind_n_n4;
 - SimpleList<String> mind_l_EZiFangXiangLieBiao;
 - // 函数声明
 - void DF_HuaDaXieEZi();
 - void DF_PanDuanEZiFangXiang();
 - // 创建对象
 - UNIHIKER_K10 k10;
 - uint8_t      screen_dir=2;
 - ASR          asr;
 - 
 - 
 - // 主程序开始
 - void setup() {
 -         k10.begin();
 -         k10.initScreen(screen_dir);
 -         k10.creatCanvas();
 -         asr.setAsrSpeed(2);
 -         asr.asrInit(CONTINUOUS, CN_MODE, 12000);
 -         while(asr._asrState == 0){delay(100);}
 -         k10.canvas->canvasText("K10视力仪版语音版", 1, 0xFF0000);
 -         k10.canvas->updateCanvas();
 -         asr.speak("  欢迎使用"K10视力仪语音版"");
 -         asr.addASRCommand(0+1, "kai shi ce shi");
 -         asr.addASRCommand(1+1, "shang");
 -         asr.addASRCommand(2+1, "xia");
 -         asr.addASRCommand(3+1, "zuo");
 -         asr.addASRCommand(4+1, "you");
 -         asr.addASRCommand(5+1, "chong xin ce shi");
 -         mind_l_EZiFangXiangLieBiao.push_back("上");
 -         mind_l_EZiFangXiangLieBiao.push_back("下");
 -         mind_l_EZiFangXiangLieBiao.push_back("左");
 -         mind_l_EZiFangXiangLieBiao.push_back("右");
 -         mind_n_h = 80;
 -         mind_n_n = 40;
 - }
 - void loop() {
 -         if (asr.isWakeUp()) {
 -                 k10.canvas->canvasText("请说开始测试", 2, 0x0000FF);
 -                 k10.canvas->updateCanvas();
 -         }
 -         else {
 -                 k10.canvas->canvasText("请说您好小鑫唤醒", 2, 0x0000FF);
 -                 k10.canvas->updateCanvas();
 -         }
 -         if (asr.isDetectCmdID(0+1)) {
 -                 DF_HuaDaXieEZi();
 -         }
 -         if (asr.isDetectCmdID(1+1)) {
 -                 mind_n_HuiDaFangXiang = 1;
 -                 DF_PanDuanEZiFangXiang();
 -         }
 -         if (asr.isDetectCmdID(2+1)) {
 -                 mind_n_HuiDaFangXiang = 2;
 -                 DF_PanDuanEZiFangXiang();
 -         }
 -         if (asr.isDetectCmdID(3+1)) {
 -                 mind_n_HuiDaFangXiang = 3;
 -                 DF_PanDuanEZiFangXiang();
 -         }
 -         if (asr.isDetectCmdID(4+1)) {
 -                 mind_n_HuiDaFangXiang = 4;
 -                 DF_PanDuanEZiFangXiang();
 -         }
 -         if (asr.isDetectCmdID(5+1)) {
 -                 mind_n_n = 40;
 -                 DF_HuaDaXieEZi();
 -         }
 - }
 - 
 - 
 - // 自定义函数
 - void DF_HuaDaXieEZi() {
 -         mind_n_SuiJiFangXiang = (random(1, 4+1));
 -         mind_n_m5 = ((240 - (mind_n_n * 5)) / 2);
 -         mind_n_m3 = ((240 - (mind_n_n * 3)) / 2);
 -         mind_n_m_1 = ((240 - (mind_n_n * -1)) / 2);
 -         mind_n_n5 = (mind_n_n * 5);
 -         mind_n_n4 = (mind_n_n * 4);
 -         k10.canvas->canvasRectangle(0, mind_n_h, 240, 240, 0xFFFFFF, 0xFFFFFF, true);
 -         k10.canvas->canvasRectangle(mind_n_m5, (mind_n_h + mind_n_m5), mind_n_n5, mind_n_n5, 0xFF6666, 0xFF6666, true);
 -         if ((mind_n_SuiJiFangXiang==1)) {
 -                 k10.canvas->canvasRectangle(mind_n_m3, (mind_n_h + mind_n_m5), mind_n_n, mind_n_n4, 0xFFFFFF, 0xFFFFFF, true);
 -                 k10.canvas->canvasRectangle(mind_n_m_1, (mind_n_h + mind_n_m5), mind_n_n, mind_n_n4, 0xFFFFFF, 0xFFFFFF, true);
 -         }
 -         if ((mind_n_SuiJiFangXiang==2)) {
 -                 k10.canvas->canvasRectangle(mind_n_m3, (mind_n_h + mind_n_m3), mind_n_n, mind_n_n4, 0xFFFFFF, 0xFFFFFF, true);
 -                 k10.canvas->canvasRectangle(mind_n_m_1, (mind_n_h + mind_n_m3), mind_n_n, mind_n_n4, 0xFFFFFF, 0xFFFFFF, true);
 -         }
 -         if ((mind_n_SuiJiFangXiang==4)) {
 -                 k10.canvas->canvasRectangle(mind_n_m3, (mind_n_h + mind_n_m3), mind_n_n4, mind_n_n, 0xFFFFFF, 0xFFFFFF, true);
 -                 k10.canvas->canvasRectangle(mind_n_m3, (mind_n_h + mind_n_m_1), mind_n_n4, mind_n_n, 0xFFFFFF, 0xFFFFFF, true);
 -         }
 -         if ((mind_n_SuiJiFangXiang==3)) {
 -                 k10.canvas->canvasRectangle(mind_n_m5, (mind_n_h + mind_n_m3), mind_n_n4, mind_n_n, 0xFFFFFF, 0xFFFFFF, true);
 -                 k10.canvas->canvasRectangle(mind_n_m5, (mind_n_h + mind_n_m_1), mind_n_n4, mind_n_n, 0xFFFFFF, 0xFFFFFF, true);
 -         }
 -         k10.canvas->updateCanvas();
 - }
 - void DF_PanDuanEZiFangXiang() {
 -         if ((mind_n_HuiDaFangXiang==mind_n_SuiJiFangXiang)) {
 -                 k10.canvas->canvasText("方向正确", 3, 0x0000FF);
 -                 asr.speak("方向正确");
 -                 mind_n_n -= 5;
 -                 if ((mind_n_n<=5)) {
 -                         k10.canvas->canvasText("视力非常好", 3, 0x0000FF);
 -                         asr.speak("视力非常好");
 -                         mind_n_n = 5;
 -                 }
 -                 mind_n_SuiJiFangXiang = (random(1, 4+1));
 -                 DF_HuaDaXieEZi();
 -         }
 -         else {
 -                 k10.canvas->canvasText("方向错误", 3, 0x0000FF);
 -                 asr.speak("方向错误");
 -                 DF_HuaDaXieEZi();
 -         }
 - }
 
  复制代码
  
【相关知识】 
1.行空板K10—文字图形显示 
缓存显示文字“行空板”在第1行,颜色红。 
将缓存内容显示或更新。 
2.行空板K10—语音合成 
语音合成“你好”。 
3.语音识别 
设置语音识别,连续时间12000,语言中文。 
添加语言识别命令词ID:0,命令“kai shi ce shi” 
 
 |