本设计:
3 ~* B% k5 d* A+ E, x. d 基于STM32的智能语音识别的柔光台灯设计(源程序+原理图+PCB+设计说明书+PPT) 原理图:Altium Designer 程序编译器:keil4/keil 5 编程语言:C语言 编号Y001 + _, L! u1 t; x- Q1 L% g/ I2 g
设计说明: 课题主要研究语音识别、按键识别、PWM波调节亮度、OLED屏幕显示四个模块,目前市面上语音识别的台灯大多仅是控制灯的亮灭,采用的是普通LED节能灯进行照明,相比较于市场上已有的产品,本课题所研究设计的台灯采用的主控芯片是性能较高的STM32F103C8T6单片机芯片,采用中断方式对台灯进行按键控制,并通过基于LD332O语音识别模块,利用非特定人语音识别技术对台灯的工作状态进行语音控制,同时实现了语音控制和按键控制台灯的工作状态,采用输出波形比较输出PWM波,利用PWM波来控制光照的亮度及达到柔光照射的目的,并采用OLED屏幕显示台灯的工作状态灯信息,因此使用者可以快速的指导台灯目前的工作状态,根据自身的实际需求通过语音或者按键对台灯的工作状态进行调节,这样就能够更好的帮助这些弱势群体,如老人、儿童、孕妇等行动不便的人,由于采用的是柔光台灯照明,在一定程度上减缓青少年近视发病率持续上升的趋势,并且LED灯能够缓解资源消耗过大、污染物排放量的现状。
+ R4 D9 j# C; e) N$ S; p) O+ T" w2 S( I9 R
实现功能如下: 1.语音识别部分:采用市面上流行的基于LD3320语音识别模块,利用非特定人语音识别(ASR)技术,调试语音模块使其满足台灯所需要的特定词汇。词汇包括:唤醒词、开灯、关灯、亮一点、变暗等。采用主控芯片STM32F103C8T6与LD3320语音识别模块进行串口通信,主控芯片接收数据后处理该消息命令。 2.按键控制部分:利用按键中断机制来控制灯的亮度,以及控制灯的开和关。 3.PWM波控制LED柔光灯亮度部分:采用STM32F103C8T6内部自带定时器输出PWM功能,接上外围电路,控制多个LED灯。 4.显示模块部分:主控芯片通过SPI协议驱动0.96寸OLED屏幕,在128*64个像素点的屏幕上显示灯的亮度级数及其他信息。 - \: o# O4 ?: o+ c
! z# h+ s2 T9 D
. J4 F& \6 G$ h+ E
9 r( V# v& M N4 o
原理图(提供源文件):
5 O+ ~4 n) h4 D& v! d0 G
PCB图(提供源文件): $ r9 ^: x" k- `, s
源程序(提供源文件)
; g9 r2 ]' Y A7 @9 q8 R
以下为部分程序,完整程序可在下载链接获取:
4 [( a) n( b( |3 W8 k' ]- int lighter=0;
$ ?' r# }" Q1 p& |6 S - int main(void)
/ S6 z( f. v# Q - { 4 \) b. q. J2 b9 _$ U* n
- delay_init(); //延时函数初始化
* x2 j: F. b/ G3 _! N$ L! [5 b - NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 LED_Init(); , `" Z! `$ u9 Y/ `; ]
- OLED_Init(); //初始化OLED
- \2 @& {9 }& P( c - OLED_Clear(); //OLED清屏+ J5 b. e. }4 h: A1 L
- TIM1_PWM_Init(); //TIM1 PWM波输出初始化,并使能TIM1 PWM输出 . [* N- u. R7 v* g$ ?* h& U' Y
- usart2_Init(9600); //初始化串口2
& ?# x7 I; _ R9 w - EXTIX_Init(); //外部中断初始化:中断线,IO,设置中断优先级(抢占优先级,响应优先级),触发方式 8 ? H$ |; N9 n$ n+ z
- int j;6 Y$ u7 [# K1 `2 H* L) r! W1 \! X) U
- show_name();6 L/ C1 D* V% i+ h2 j. i2 F& d3 o
- ; q: P$ U6 w# `( ^1 e& T& D1 V
- while(1)
9 F( C! h( ?9 o - { & y7 N# t. c3 }' C: q/ |; [
- j=ld3320_uart_receive(); //得到接受函数的字符串buff
% H9 C9 H5 f# B& w - pwm_led_out_test(lighter); //设置PWM波占空比,以此控制台灯亮度 6 ^( {1 P# Z8 q
- switch(j) F/ D( r0 _+ }3 s9 u7 v9 M( j
- { 6 @# ~3 u/ h# y" c- T, w
- case 1: //一级口令:小陈 $ G) b0 e2 S8 a( | s0 T# |
- show_name();
" s% Y% C5 M, T0 h0 Y1 a! i7 T - break;
9 `% @4 p2 Y6 }) u" R5 ] g3 n4 y - case 2: //亮一点
1 r5 _# k% c$ t7 ` - if(lighter<5) //亮度还不满5
) F# u5 a' W, Y( V0 Z$ d - {. {3 }: q( E/ C5 M! {
- lighter++;6 U \6 t9 W1 k) q. C
- show_light(lighter); //显示亮度
2 v0 g2 Q8 A! W - } & }: E) O( q% R( S" n8 k/ D7 J
- else ' z7 X, Y: l# W' d( a' X
- show_zuida();
# u; C$ X5 j, {( l - break; //显示已达最大亮度 5 A* y& X `9 R3 R/ w$ V
- case 3: //变暗
: g* O% p/ r* m0 x0 T1 Z - if(lighter>0)
8 q# ~; v6 F9 `1 n& A. O/ _ - {/ P' r7 v( Y& n5 g. I
- lighter--;. |2 U4 P# G) Y* i9 G" {
- show_light(lighter); //显示亮度 + p( \, D J6 B
- }
# [' e; _+ a: n U - else . t7 p x4 R" `/ u& \
- show_zuidi(); 1 D. Z7 C! N6 Q& q2 S7 a! l5 v) v
- break; //显示已达最低亮度 # Q6 M. s% n+ m( C1 w9 h
- case 4: //开灯(默认亮度等级3,60)* v, C2 b3 s7 E. {. i
- lighter = 3;
5 R8 c+ F$ @* o/ s: k+ W - show_light(lighter);
7 t3 m: Y- c R9 f& ]0 \ - break; ! N4 a4 U2 U% c6 u; M) o$ _! [
- case 5: //关灯+ @; m0 u; K! ]9 c& {) i$ o
- lighter = 0;- Z1 P" H% `; \' \
- show_ling();
. W ~8 c6 } K9 a9 w - break; 5 S' u' C" d+ U5 E) G0 ~
- case 6: //亮度20, R# _# B0 z+ I- y- @. v+ G
- lighter = 1;$ C5 Q; U; M% o! C
- show_ershi(); 2 x# Q% u, v7 ~& Z- P) Q, [
- break; : W; b1 O* T$ ?9 @: |! N' [+ |
- case 7: //亮度60+ P" W% \6 u: i6 X/ C
- lighter = 3;
, A: o \8 y" R0 z2 } - show_liushi(); - l9 C2 b# z5 c/ y
- break;
9 f8 C, a' \' O. N3 \ - case 8: //亮度100- `& Y; b- ^8 a, f- w v
- lighter = 5;3 l( m% A! a0 H$ k- |
- show_yibai();
7 Q0 Z" r1 p8 v0 S - break; & `" g0 u" G: s% j$ L7 i
- case 9: //显示请重新发口令 ~5 ?4 _0 J; ^; o
- show_chongfa(); . S. U f5 r2 A) s; k t
- break;
+ x3 [8 @2 t* z! } U9 q - case 10: //显示请重新发口令 * T; T& V! N3 c
- show_chongfa();
2 `0 y* M$ R- m/ J7 B' k T Q7 _ - break;
9 K! E8 R* }% h* M - default:break;4 [# b8 q% u( a
- }
2 G! |# d7 I' k+ u o" p - }
& ~ n& c3 G! a5 Q6 D2 ?+ c* g) p - }
复制代码设计说明书:
* S! V# i' X: [- q2 H. W5 } |