版本协议

GPL 3.0

标签
标准版
#第六届立创电赛#天气时钟语音助手

创建时间:3年前

描述

<p>注:* 为必填项 请在报名阶段填写 ↓</p> <h1>* 1、项目功能介绍</h1> <h3>这是一款网络天气时钟(离线语音控制版),可以根据使用者发出的特定命令词回复当前“时间”,“月份”,“星期”,“温度”等等一系列信息。</h3> <h3>项目设计需求、功能:</h3> <ol> <li>可以显示实时时间在OLED屏幕上</li> <li>支持web配网以及重新配网</li> <li>显示天气</li> <li>调节屏幕亮度功能</li> <li>按键旋转屏幕0度 / 180度</li> <li>调节屏幕亮度</li> <li>根据语音命令词回复当前“时间”,“月份”,“星期”,“温度”等等一系列信息。</li> <li>根据语音可以设置音量大小,以及打开、关闭语音</li> <li>上电时设置使用提示音</li> <li>唤醒和退出时,有特定的语音播报词来提示用户</li> <li>设计采用Mini风格</li> </ol> <h2>WEB配网界面</h2> <h2><img src="//image.lceda.cn/pullimage/PiRF8KAZfkdxCnzEkkQzVDsWBq8AvsbL3LN3GGb2.png" alt="image.png"> 实物展示</h2> <p><img src="//image.lceda.cn/pullimage/eB00qp20Uj0ajn0XejP8WRj17v5p0tFFHLcjdxOV.png" alt="image.png"> <img src="//image.lceda.cn/pullimage/SB5jxUVqNe40S8rgsu0Pewvyp9EcYLnel6YFycSA.png" alt="image.png"> <img src="//image.lceda.cn/pullimage/DXNzlDFtwd6LFk2Y6GMNtRDjeMaTj2JTogibd7uf.png" alt="image.png"></p> <h1>*2、项目属性</h1> <p>首次公开,为原创</p> <p>注:请说明项目是否首次公开;项目是否为原创;项目是否曾经在其他比赛中获奖,若有获奖则叙述获奖详情;项目是否在学校参加过答辩。</p> <h1>* 3、开源协议</h1> <p>GPL3.0</p> <p>注:利他即利己,请认真阅读下述内容。</p> <ol> <li>拥抱开源,赋予项目无限价值。建议项目核心功能开源80%以上;</li> <li>若某一部分功能不可替代且删掉之后项目无法解决对应的问题,则这一部分实现的功能就是项目的核心功能;比如设计了一台电子负载且设计了一款上位机软件监控功率变化,则电子负载为核心功能,上位机软件为辅助功能;比如电子负载中使用了一款隔离485模块与上位机通信,则此485模块实现的通讯功能为辅助功能;</li> <li>项目应选择适合自己的开源协议,若项目引用其他开源项目,应注明来源并遵循原作者的开源协议规定;原创项目推荐使用GPL3.0开源协议;</li> <li>直接引用开源项目的原电路或原代码实现的功能不可作为自己项目的核心功能、使用市场上通用模块直接实现的功能不可作为自己项目的核心功能。</li> </ol> <p>请在竞赛阶段填写 ↓</p> <h1>*4、硬件部分</h1> <ol> <li>主控制器采用ESP8266-12F,模块核心处理器 ESP8266 在较小尺寸封装中集成了业界领先的 Tensilica L106 超低功耗 32 位微型 MCU,带有 16 位精简模式,主频支持 80 MHz 和 160 MHz,支持 RTOS,集成 Wi-Fi MAC/ BB/RF/PA/LNA,板载天线。支持标准的 IEEE802.11 b/g/n 协议,完整的 TCP/IP 协议栈。用户可以使用该模块为现有的设备添加联网功能,也可以构建独立的网络控制器。另外,他仅需极少的外部电路并且能将 PCB 的尺⼨降到最⼩,很适合制作Mini类产品,并且ESP8266生态很好,支持多种编程方式,安信可给出了ESP8266 IDE2.0开发环境,他还支持Arduino IDE 进行开发(本项目就是基于Arduino IDE环境下开发的),此外还可以用Lua语言、Python语言等等来开发ESP8266控制程序。 <img src="//image.lceda.cn/pullimage/rcRD0EHVYjJbohiufdonm3uC4n2fEQgYfMxWuY1D.png" alt="image.png"></li> <li>离线语音部分采用了启英泰伦的CI-C22GS02S模块,其模块上的控制芯片为CI-1122,具有丰富的引脚资源,支持自定义唤醒词和命令词,同时还支持降噪处理,价格便宜,因此本项目离线语音采用此方案。</li> </ol> <p><img src="//image.lceda.cn/pullimage/r1OKfoApPNLoEE5genJkMwvjtZchM7R0wwV3c0Qo.png" alt="image.png"></p> <ul> <li> <p>设计一个独立按键,使用GPIO0引脚,既可以通过此引脚启动下载模式,也可以作为普通按键使用,进一步节省PCB空间,用户可以使用此按键控制屏幕亮度,翻转等其他功能</p> </li> <li> <p>预留ESP8266串口下载接口和离线语音模块串口下载接口</p> </li> <li> <p>使用OLED0.96寸屏幕,共有128*64个像素点,长宽比用来显示天气,时间等元素刚好合适,还可以添加一些UI,通信接口采用IIC通信,只需要2个引脚(不包含电源和GND)</p> </li> <li> <p>使用5V USB-Type-C供电,不需考虑正反插的问题,另外现在市面上大多安卓手机均采用此接口,用户不需额外再找电源线适配。</p> </li> <li> <p>使用了AMS1117-3.3LDO降压芯片,此芯片是5V转3.3V供电,主要是给ESP8266-12F进行供电</p> </li> <li> <p>离线语音模组上自带了5V-3.3V的DC-DC芯片,因此只需供给离线语音模组5V电源即可</p> </li> <li> <p>根据离线语音模组手册,外围电路需要加入电容和二极管。 <img src="//image.lceda.cn/pullimage/a48UzLSgnAN8OityHIA6HbAaegzIAmYD7sMkpKtq.png" alt="image.png"></p> </li> <li> <p>喇叭与麦克风采用了差分走线</p> </li> </ul> <p><img src="//image.lceda.cn/pullimage/qjddpqh9nC1kghPe1o2M4OdDhG5ljFtBaoqIEPj9.png" alt="image.png"></p> <p>注:推荐使用立创EDA。若选择其他EDA工具,请在附件上传PDF格式的原理图,PDF格式的PCB图纸,Gerber格式的PCB文件。这里可以详细说明您的项目实现原理和机制、注意事项、调试方法、测试方法等。推荐图文并茂的形式向别人介绍您的想法。</p> <h1>*5、软件部分</h1> <h2>整体程序设计思路</h2> <p><img src="//image.lceda.cn/pullimage/GRxA6wjyGCrtOHmeDHN8ubgNXfiykGHL3IMz2oDs.png" alt="image.png"></p> <h3>采用模块化设计思路。该项目为两个微控制器独立运行,之间通过串口来进行通信,可以认为ESP8266-12F为主控制器,离线语音模组为副控制器。</h3> <ul> <li>获取时间模块</li> <li>获取天气状态模块</li> <li>按键状态检测模块(未按下、单击、双击、三击、长按)</li> <li>OLED屏幕显示驱动模块</li> <li>串口接收数据,解包模块</li> <li>串口发送数据,组包模块</li> </ul> <h3>OLED相关功能实现思路:</h3> <ul> <li>显示时间到OLED上:调用获取时间模块,将时间保存到变量中,调用OLED显示模块</li> <li>显示天气到OLED上:调用获取天气状态模块,将天气代码保存到对应变量中,将温湿度数据保存到相应变量里,最后调用OLED显示模块,根据天气代码显示对应的天气图标。</li> <li>调节屏幕亮度功能:将调节屏幕亮度设为单击执行事件,循环调用按键状态检测模块,当返回单击标志时,执行调节屏幕亮度函数,再调用OLED显示模块刷新</li> <li>旋转屏幕功能:将旋转屏幕设为双击的执行事件,循环调用按键状态检测模块,当返回双击标志时,执行旋转屏幕函数,再调用OLED显示模块刷新</li> <li>显示动画功能:将旋转屏幕设为三击的执行事件,循环调用按键状态检测模块,当返回三击标志时,执行旋转屏幕函数,再调用OLED显示模块刷新</li> <li>重新配网功能:将重新配网设为长按的执行事件,循环调用按键状态检测模块,当返回长按标志时,执行重新配网函数,再调用OLED显示模块刷新</li> </ul> <h3>语音播报“时间”“星期”“温度”等信息设计思路:</h3> <p>当说出正确命令词时,离线语音模块的UART1会发送一串16进制数据包,通过对数据解包,便知道说出的是什么命令词,如说出“现在几点啦”,解包会得到有效数据为【0x14 0x00 0x00 0x3F】(这个数据可以自己设置),从而将这串数据与“现在几点啦”这句话<strong>形成一个对应关系</strong>,当ESP8266-12F收到语音模块发送的这串数据,则知道用户现在想问“几点了”,然后ESP8266-12F将当前时间获取一下,通过特定的串口协议发送回给离线语音模块使其播报,离线语音模块接收到这串数据后,解包后,播报对应0-9数字音,如果是“二十三点四十一分”,则在ESP8266侧处理数据将其拆分,先发送“二”再发送“十”。。。一个一个发送过去,注意加一点延时,离线语音一个一个播报,组合起来就会得到我们想要的效果,这里仅提供一个思路,有了这个思路,理论上可以播报很多信息,如晴天,雨天,雷阵雨,雪天等等,注意可以将语音词进行复用,如<strong>晴天</strong>,<strong>雨天</strong>,<strong>雪天</strong>,都有一个<strong>“天”</strong>字,那么语音包只制作“晴”、“雨”、“雪”即可,剩下和“天”组合,时间的一至九也是如此,“十”单独拿出来复用,如连续发送“二”“十”“三”语音包,而不是制作发送“二十三”。</p> <h3>这是离线语音的串口命令格式</h3> <p><img src="//image.lceda.cn/pullimage/l7OdOcMr6U9Abmw5DPrVGRfP557gy03SpsfMOHh0.png" alt="image.png"> 下面这是人为对数据进行的一次解包<em>-</em>,这些在理解了原理后,应该使用程序进行解包,通过帧头帧尾判断数据始末,再<strong>通过第5位数据判断消息类型,屏蔽掉通知类型(A3)和回复类型(A2),只看命令类型(A1或者A0)</strong> <img src="//image.lceda.cn/pullimage/pprzf8TN7jiZrQqODMsg1QPPecX3YWptOOZ2G7fN.png" alt="image.png"></p> <ul> <li>在发送音频时,由于不支持播放音频ID号,所以这里使用命令词ID作为音频使用,但不给命令词具体功能,仅用于播报音使用,这是我能想到的不动离线语音内部的程序,只通过改变ESP8266程序就能实现播报功能的一种方法,大家如果有什么更好的方法可以一起交流。 <img src="//image.lceda.cn/pullimage/rzJzyV00ItCbKJeV9UT1DbgoDlom2S5J1Pk2Nywu.png" alt="image.png"></li> </ul> <p><strong>这是根据上边串口协议,手动写、算出来的一包数据,注意发送时,要勾选HEX十六进制格式,不是ASCII格式。</strong></p> <p><code>【0xA5,0xFC,0x06,0x00,0xA1,0x92,0x02,0x80,0x92,0x02,0x00,0x00,0x00,0x49,0x02,0xFB】</code></p> <p><code>【A5 FC 06 00 A1 92 02 80 92 02 00 00 00 49 02 FB】 无0x前缀版</code></p> <p>可以播放命令词ID号为2对应的音频,需要注意的是消息序列号可以随意填写,但对应校验位也需要修改。在明白了串口协议原理后,应该使用程序来自动完成组包过程,咱们只需要在接口传入ID号即可。 <img src="//image.lceda.cn/pullimage/MoykCH4jv3ARcxXItpr22IkixyixLut3Opc4rYkI.png" alt="image.png"> 这是发送离线语音核心代码(个人程序写的很粗糙,仅实现了功能,可能会有BUG尚未优化,欢迎互相交流)</p> <pre><code>/* * 函数功能:发送离线语音声音数据包 * 形参:命令词 ID号 * 返回值:无 */ void send_voice(uint8_t cmd_id) { int i = 0; sendBuf[i++] = 0xA5; //帧头1 sendBuf[i++] = 0xFC; //帧头2 sendBuf[i++] = 0x06; //有效长度为 6 sendBuf[i++] = 0x00; // uint8_t temp = i; sendBuf[i++] = 0xA1; //A1命令 A2回复 A3通知 sendBuf[i++] = 0x92; //命令词ID sendBuf[i++] = 0x02; //消息序列号 /* Data begin */ sendBuf[i++] = 0x80; //0x80:开始。仅开始后续ID才有意义。0x81:暂停 0x82:继续。0x83:停止。 sendBuf[i++] = 0x92; //播放方式 /* 这里4位数据也应该低位在前,高位在后,本程序未使用语义id,所以未做处理 */ // uint8_t high_1 = (sum >> 8) &amp; 0xff; //高8位 // uint8_t low_1 = sum &amp; 0xff; //低8位 sendBuf[i++] = cmd_id; //data sendBuf[i++] = 0x00; sendBuf[i++] = 0x00; sendBuf[i++] = 0x00; /* Data end */ int sum = 0; for (; temp &lt; i; temp++) { sum = sum + sendBuf[temp]; } uint8_t high_check = (sum >> 8) &amp; 0xff; //高8位 uint8_t low_check = sum &amp; 0xff; //低8位 sendBuf[i++] = low_check; //校验位 低位在前 sendBuf[i++] = high_check; //校验位,高位在后 sendBuf[i++] = 0xFB; //帧尾 for (int m = 0; m &lt; i; m++) { softSerial1.write(sendBuf[m]); } memset(sendBuf, 0, BUFF_SIZE); delay(300); }</code></pre> <p>至于离线语音模块程序烧录方法,2021立创暑期训练营离线语音课李工讲的比较详细了,这里不再赘述,ESP8266 Arduino开发环境搭建篇幅较长,且百度有很多博文,这里也不再叙述。</p> <p>下面分享下定制自己的个性化Web配网页面,和天气怎么查询 主程序搜索,userkey 中的私钥 大家可以自行去和风天气注册 <img src="//image.lceda.cn/pullimage/dnP8S5WbwlkgZljxYR9QelT9ySB586uL39C1qfbM.png" alt="image.png"> 主程序的 location 城市代码,同样可以网上查询</p> <p>配置WiFi界面的第三行参数在334行,可以进行修改</p> <pre><code>/**********************************/ page += String(F("<h1 style=' "color:#CCFF99 "'>网络天气时钟</h1>")); page += String(F("<h1 style=' "color:rgb(0,'>离线语音版</h1>")); page += String(F("<span style=' "text-align:right; "'>")); page += String(F("<h3 style=' "text-align:right;color:rgb(0,'>--Elec0</h3>")); page += String(F("<h4>XXX</h4>")); page += String(F("<h2 style=' "color:#36ee3f "'>立创暑期训练营2021</h2>")); page += String(F("<h4>2021.XX.XX-2021.XX.XX</h4> ")); /****************************************/ /*上边这些语句可以自定义修改主界面文字,在WiFiManager.cpp中,460行左右,*/</code></pre> <p>如果想更改按键颜色,可以在WiFiManager.h中,26行左右 <code>const char HTTP_STYLE[] PROGMEM</code>这条语句中,找到button后边的<code>background-color:#8a0bdf;color:#e8f806;</code> 更改#号后边的数值即可,具体什么数字对应什么颜色,大家可以百度一下</p> <p>注:若您的项目涉及软件开发,请在附件上传对应的工程源码。这里可以详细说明您的软件流程图、功能模块框图、相关算法的解释或科普、源码结构、编置、源码编译方法、程序烧录方法等。推荐图文并茂的形式向别人介绍您的想法。</p> <h1>*6、BOM清单</h1> <p><img src="//image.lceda.cn/pullimage/n2JqPrjzwivbhCIjfZQyDCPPTHh8SBtrkkJXetCS.png" alt="image.png"></p> <p>注:项目涉及的BOM清单。这个位置请上传BOM的截图。清单详情请以PDF的格式上传到附件中。建议包 装、采购渠道、用途等内容。具体内容和形式应以表达清楚项目构成为准。</p> <h1>*7、大赛LOGO验证</h1> <p>不参加</p> <h1>* 8、演示您的项目并录制成视频上传</h1> <p>视频要求:请横屏拍摄,分辨率不低于1280×720,格式Mp4/Mov,单个视频大小限100M内; 视频标题:立创电赛:{项目名称}-{视频模块名称};如立创电赛:《自动驾驶》-团队介绍。</p> <p>更多详情:<a href="https://diy.szlcsc.com/posts/06c94d90c2c447dfbd9ed7339ff4a5b1" target="_blank">https://diy.szlcsc.com/posts/06c94d90c2c447dfbd9ed7339ff4a5b1</a></p> <p>来自 </p>
  • 功能演示.mp4

  • 外观介绍.mp4

文档

天气时钟语音助手.pcb

天气时钟语音助手.sch

BOM

ID Name Designator Footprint Quantity Manufacturer Part Manufacturer Supplier Supplier Part
1 1TS003B-2500-3500A BOOT1,RST1 KEY-SMD_1TS003B-2500-3500A-CT 2
2 22uF C1,C3,C10 C0603 3
3 100nF C2,C4,C9 C0603 3
4 100nF C5 C0603 1
5 10uF C6 C0805 1
6 100uF C7 CAP-SMD_BD5.0-L5.3-W5.3-RD 1
7 100nF C8 C0805 1
8 DSK14 D1 SOD-123_L2.8-W1.8-LS3.7-RD 1
9 ESD5Z7.0T1G_C406243 D2,D3 SOD-523_L1.2-W0.8-LS1.6-RD 2
10 ESD5Z3.3C D4,D5 SOD-523_L1.2-W0.8-LS1.6-BI 2
11 SMAJ6.0CA D6 SMA_L4.4-W2.6-LS5.0-BI 1
12 串口下载 J2 HDR-M-2.54_2X2 1
13 离线语音串口下载 J3 HDR-M-2.54_2X3 1
14 LED-0603_R LED-PWR1 LED0603_RED 1
15 1.25T-2P-DP MIC+1,SPK+1 CONN-TH_2P-P1.25_1.25T-2P-DP 2
16 10K R1,R2,R5,R6,R7,R8 R0603 6
17 300 R3,R4 R0603 2
18 4.7K R9 R0805 1
19 SK12D07VG5 SW1 SW-TH_SK12D07VG5 1
20 AMS1117-3.3 U1 SOT-223_L6.7-W3.5-P2.30-BR 1
21 0.96OLED24.7*27 U2 0.96OLED24.7*27 无丝印 1
22 ESP-12F(ESP8266MOD) U3 WIFIM-SMD_ESP-12F-ESP8266MOD 1
23 CI-C22GS02S U4 SMD-17_L20.0-W1.80-CI-C22GS02S 1
24 TYPE-C 6P USB1 TYPE-C-SMD_TYPE-C-6P 1

附件

附件名 下载
ESP8266代码.zip
离线语音模块代码.zip
CI-C22GS02S模块数据手册.pdf
功能演示.mp4
外观介绍.mp4
外壳(未验证).zip

成员

评论(1)

  • 表情
    emoji
    小嘉工作篇
    小嘉日常篇
  • 图片
成功
工程所有者当前已关闭评论
gecc 回复
<p>怎么都是语音模块</p>
goToTop
svg-battery svg-battery-wifi svg-books svg-more svg-paste svg-pencil svg-plant svg-ruler svg-share svg-user svg-logo-cn svg-double-arrow