当前位置:   article > 正文

[手把手教学]实现STM32控制的语音识别的智能家居控制系统_智能语音助手stm32

智能语音助手stm32

目录

简介

硬件


简介

该项目主要是用语音模块通过串口USART去控制stm32单片机,然后再用STM32去控制其余的一些传感器和一些执行器

硬件

  • 1.8TFT屏幕
  • DHT11温湿度模块
  • L293D
  • Mini_MP3模块
  • SU-03T模块
  • STM32
  • 舵机
  • 继电器

软件

  • LED初始化
  • TFT初始化
  • 舵机初始化
  • L293D初始化
  • 设置PWM
  • LCD初始化
  • Mini_MP3初始化

模块介绍

STM32

使用的是stm32f103c8t6

1.8TFT屏幕

该模块主要的工作是显示各个功能的状态

  1. lcd.c文件
  2. ----------------------------------------------
  3. //首先是初始化
  4. void LCD_GPIO_Init(void)
  5. {
  6. GPIO_InitTypeDef GPIO_InitStructure;
  7. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  8. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  9. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  10. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  11. GPIO_Init(GPIOB, &GPIO_InitStructure);
  12. GPIO_SetBits(GPIOB, GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
  13. }
  14. //其次就是各种各样的函数,看资料给的例程
  15. -----------------------------------------------
  16. lcd.h文件
  17. #define LCD_SCLK_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_10)//SCL=SCLK
  18. #define LCD_SCLK_Set() GPIO_SetBits(GPIOB,GPIO_Pin_10)
  19. #define LCD_MOSI_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_11)//SDA=MOSI
  20. #define LCD_MOSI_Set() GPIO_SetBits(GPIOB,GPIO_Pin_11)
  21. #define LCD_RES_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_15)//RES
  22. #define LCD_RES_Set() GPIO_SetBits(GPIOB,GPIO_Pin_15)
  23. #define LCD_DC_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_14)//DC
  24. #define LCD_DC_Set() GPIO_SetBits(GPIOB,GPIO_Pin_14)
  25. #define LCD_CS_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_13)//CS1
  26. #define LCD_CS_Set() GPIO_SetBits(GPIOB,GPIO_Pin_13)
  27. #define LCD_BLK_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_12)//BLK
  28. #define LCD_BLK_Set() GPIO_SetBits(GPIOB,GPIO_Pin_12)
  29. void LCD_GPIO_Init(void);
  30. void LCD_Writ_Bus(u8 dat);
  31. void LCD_WR_DATA8(u8 dat);
  32. void LCD_WR_DATA(u16 dat);
  33. void LCD_WR_REG(u8 dat);
  34. void LCD_Address_Set(u16 x1, u16 y1, u16 x2, u16 y2);
  35. void LCD_Init(void);
  36. -----------------------------------------------------------------------
  37. 介绍硬件的连线,根据.h文件的定义:
  38. GND---G
  39. VCC---5V (这里最好是5v,3.3v可能驱动不了)
  40. SCL---PB10
  41. SDA---PB11
  42. RES---PB15
  43. DC---PB14
  44. CS---PB13
  45. BLK---PB12

DHT11温湿度模块 

该模块主要是读取温湿度的数据,然后传递给STM32单片机显示

  1. dht11.c
  2. ---------------------------------------------------------
  3. //DHT11初始化
  4. u8 DHT11_Init(void)
  5. {
  6. GPIO_InitTypeDef GPIO_InitStructure;
  7. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  8. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  9. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  10. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  11. GPIO_Init(GPIOA, &GPIO_InitStructure);
  12. GPIO_SetBits(GPIOA, GPIO_Pin_1);
  13. DHT11_Rst();
  14. return DHT11_Check();
  15. }
  16. //DHT11复位
  17. void DHT11_Rst(void)
  18. {
  19. DHT11_IO_OUT();
  20. DHT11_DQ_OUT = 0;
  21. delay_ms(20);
  22. DHT11_DQ_OUT = 1;
  23. delay_us(30);
  24. }
  25. //DHT11检测
  26. u8 DHT11_Check(void)
  27. {
  28. u8 retry = 0;
  29. DHT11_IO_IN();
  30. while (DHT11_DQ_IN && retry < 100)
  31. {
  32. retry++;
  33. delay_us(1);
  34. };
  35. if(retry >= 100)return 1;
  36. else retry = 0;
  37. while (!DHT11_DQ_IN && retry < 100)
  38. {
  39. retry++;
  40. delay_us(1);
  41. };
  42. if(retry >= 100)return 1;
  43. return 0;
  44. }
  45. //DHT11读bit
  46. u8 DHT11_Read_Bit(void)
  47. {
  48. u8 retry = 0;
  49. while(DHT11_DQ_IN && retry < 100) 、
  50. {
  51. retry++;
  52. delay_us(1);
  53. }
  54. retry = 0;
  55. while(!DHT11_DQ_IN && retry < 100) 、
  56. {
  57. retry++;
  58. delay_us(1);
  59. }
  60. delay_us(40);
  61. if(DHT11_DQ_IN)return 1;
  62. else return 0;
  63. }
  64. //DHT11读Byte
  65. u8 DHT11_Read_Byte(void)
  66. {
  67. u8 i, dat;
  68. dat = 0;
  69. for (i = 0; i < 8; i++)
  70. {
  71. dat <<= 1;
  72. dat |= DHT11_Read_Bit();
  73. }
  74. return dat;
  75. }
  76. //DHT11读数据
  77. u8 DHT11_Read_Data(u8 *temp, u8 *humi)
  78. {
  79. u8 buf[5];
  80. u8 i;
  81. DHT11_Rst();
  82. if(DHT11_Check() == 0)
  83. {
  84. for(i = 0; i < 5; i++)
  85. {
  86. buf[i] = DHT11_Read_Byte();
  87. }
  88. if((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4])
  89. {
  90. *humi = buf[0];
  91. *(humi + 1) = buf[1];
  92. *temp = buf[2];
  93. *(temp + 1) = buf[3];
  94. }
  95. }
  96. else return 1;
  97. return 0;
  98. }
  99. ----------------------------------------------------------------
  100. dht11.h
  101. ----------------------------------------------------------------
  102. #ifndef __DHT11_H
  103. #define __DHT11_H
  104. #include "sys.h"
  105. #include "delay.h"
  106. #include "led.h"
  107. #include "usart2.h"
  108. #include "lcd.h"
  109. #include "lcd_init.h"
  110. #define DHT11_IO_IN() {GPIOA->CRL&=0XFFFFFF0F;GPIOA->CRL|=8<<4;}
  111. #define DHT11_IO_OUT() {GPIOA->CRL&=0XFFFFFF0F;GPIOA->CRL|=3<<4;}
  112. #define DHT11_DQ_OUT PAout(1)
  113. #define DHT11_DQ_IN PAin(1)
  114. u8 DHT11_Init(void);
  115. u8 DHT11_Read_Data(u8 *temp, u8 *humi);
  116. u8 DHT11_Read_Byte(void);
  117. u8 DHT11_Read_Bit(void);
  118. u8 DHT11_Check(void);
  119. void DHT11_Rst(void);
  120. void SU03T_DHT11_Play(void);
  121. void MP3_DHT11_Play(void);
  122. #endif
  123. -----------------------------------------------------------------
  124. 根据GPIO的定义开始连线:
  125. DATA---PA1

Mini_MP3模块

该模块的工作主要是存储语音文件,当语音模块给STM32发送指令时,STM32再把指令传递给该模块,然后该模块开始工作,发出声音。

  1. 该模块主要是通过串口来和STM32通讯,所以没有特定的.c和.h的文件,下面介绍该模块会用到的一些函数。
  2. -----------------------------------------------------------------
  3. 该函数主要是STM32给MP3模块发送数据
  4. void Uart2_MP3_SendData(int len)
  5. {
  6. int i = 0 ;
  7. USART2_SendByte(0x7E);
  8. for(i = 0; i < len; i++)
  9. {
  10. USART2_SendByte(Send_buf[i]);
  11. }
  12. USART2_SendByte(0xEF);
  13. }
  14. 该函数主要是MP3播放文件里面的内容
  15. void Uart2_MP3_SendCMD(int CMD, int feedback, int dat)
  16. {
  17. Send_buf[0] = 0xff;
  18. Send_buf[1] = 0x06;
  19. Send_buf[2] = CMD;
  20. Send_buf[3] = feedback;
  21. Send_buf[4] = (int)(dat >> 8);
  22. Send_buf[5] = (int)(dat);
  23. Uart2_MP3_DoSum(&Send_buf[0], 6);
  24. Uart2_MP3_SendData(8);
  25. }
  26. void Uart2_MP3_SendCMD2(int CMD, int dat1, int dat2, int dat3)
  27. {
  28. Send_buf[0] = 0xff;
  29. Send_buf[1] = 0x06;
  30. Send_buf[2] = CMD;
  31. Send_buf[3] = (int)(dat1);
  32. Send_buf[4] = (int)(dat2);
  33. Send_buf[5] = (int)(dat3);
  34. Uart2_MP3_SendData(6);
  35. }
  36. -------------------------------------------------------------------
  37. 引脚的接线:
  38. MP3的RX---STM32的TX
  39. VCC--3.3v
  40. GND--GND

SU-03T模块

这是本项目的语音模块,主要是通过麦克风来接受语音,然后通过串口把数据传递给SMT32

  1. 串口2向SU-03T发送命令
  2. -----------------------------------------------------------
  3. void Uart2_SU03T_SendCmd(int len)
  4. {
  5. int i = 0 ;
  6. USART2_SendByte(0xAA);
  7. USART2_SendByte(0x55);
  8. for(i = 0; i < len; i++)
  9. {
  10. USART2_SendByte(Send_buf[i]);
  11. }
  12. USART2_SendByte(0x55);
  13. USART2_SendByte(0xAA);
  14. }
  15. ------------------------------------------------------------
  16. 串口2向SU-03T发送命令(3位数据)
  17. ------------------------------------------------------------
  18. void Uart2_SU03T_SendCMD1(int dat1, int dat2, int dat3)
  19. {
  20. Send_buf[0] = (int)(dat1); //datal
  21. Send_buf[1] = (int)(dat2); //data2
  22. Send_buf[2] = (int)(dat3); //data3
  23. Uart2_SU03T_SendCmd(3);
  24. }
  25. ------------------------------------------------------------

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/860144
推荐阅读
相关标签
  

闽ICP备14008679号