当前位置: 代码网 > 服务器>服务器>Linux > [手把手教学]实现STM32控制的语音识别的智能家居控制系统

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

2024年08月01日 Linux 我要评论
该项目主要是用语音模块通过串口USART去控制stm32单片机,然后再用STM32去控制其余的一些传感器和一些执行器使用的是stm32f103c8t6。

目录

简介

硬件


简介

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

硬件

  • 1.8tft屏幕
  • dht11温湿度模块
  • l293d
  • mini_mp3模块
  • su-03t模块
  • stm32
  • 舵机
  • 继电器

软件

  • led初始化
  • tft初始化
  • 舵机初始化
  • l293d初始化
  • 设置pwm
  • lcd初始化
  • mini_mp3初始化

模块介绍

stm32

使用的是stm32f103c8t6

1.8tft屏幕

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

lcd.c文件
----------------------------------------------
//首先是初始化
void lcd_gpio_init(void)
{
    gpio_inittypedef  gpio_initstructure;
    rcc_apb2periphclockcmd(rcc_apb2periph_gpiob, enable);	      

    gpio_initstructure.gpio_pin = gpio_pin_10 | gpio_pin_11 | gpio_pin_12 | gpio_pin_13 | gpio_pin_14 | gpio_pin_15;
    gpio_initstructure.gpio_mode = gpio_mode_out_pp; 		         
    gpio_initstructure.gpio_speed = gpio_speed_50mhz;            
    gpio_init(gpiob, &gpio_initstructure);

    gpio_setbits(gpiob, gpio_pin_10 | gpio_pin_11 | gpio_pin_12 | gpio_pin_13 | gpio_pin_14 | gpio_pin_15);
}

//其次就是各种各样的函数,看资料给的例程

-----------------------------------------------
lcd.h文件
#define lcd_sclk_clr() gpio_resetbits(gpiob,gpio_pin_10)//scl=sclk
#define lcd_sclk_set() gpio_setbits(gpiob,gpio_pin_10)

#define lcd_mosi_clr() gpio_resetbits(gpiob,gpio_pin_11)//sda=mosi
#define lcd_mosi_set() gpio_setbits(gpiob,gpio_pin_11)

#define lcd_res_clr()  gpio_resetbits(gpiob,gpio_pin_15)//res
#define lcd_res_set()  gpio_setbits(gpiob,gpio_pin_15)

#define lcd_dc_clr()   gpio_resetbits(gpiob,gpio_pin_14)//dc
#define lcd_dc_set()   gpio_setbits(gpiob,gpio_pin_14)

#define lcd_cs_clr()   gpio_resetbits(gpiob,gpio_pin_13)//cs1
#define lcd_cs_set()   gpio_setbits(gpiob,gpio_pin_13)

#define lcd_blk_clr()  gpio_resetbits(gpiob,gpio_pin_12)//blk
#define lcd_blk_set()  gpio_setbits(gpiob,gpio_pin_12)
void lcd_gpio_init(void);    
void lcd_writ_bus(u8 dat);   
void lcd_wr_data8(u8 dat);   
void lcd_wr_data(u16 dat);  
void lcd_wr_reg(u8 dat);     
void lcd_address_set(u16 x1, u16 y1, u16 x2, u16 y2); 
void lcd_init(void);        
-----------------------------------------------------------------------
介绍硬件的连线,根据.h文件的定义:
gnd---g
vcc---5v (这里最好是5v,3.3v可能驱动不了)
scl---pb10
sda---pb11
res---pb15
dc---pb14
cs---pb13
blk---pb12

dht11温湿度模块 

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

dht11.c
---------------------------------------------------------
//dht11初始化
u8 dht11_init(void)
{
    gpio_inittypedef  gpio_initstructure;
    rcc_apb2periphclockcmd(rcc_apb2periph_gpioa, enable);	 
    gpio_initstructure.gpio_pin = gpio_pin_1;			
    gpio_initstructure.gpio_mode = gpio_mode_out_pp; 		
    gpio_initstructure.gpio_speed = gpio_speed_50mhz;		
    gpio_init(gpioa, &gpio_initstructure);				 	 
    gpio_setbits(gpioa, gpio_pin_1);						 	 

    dht11_rst();
    return dht11_check();
}
//dht11复位
void dht11_rst(void)
{
    dht11_io_out(); 
    dht11_dq_out = 0; 	
    delay_ms(20);    	
    dht11_dq_out = 1; 	
    delay_us(30);     	
}
//dht11检测
u8 dht11_check(void)
{
    u8 retry = 0; 
    dht11_io_in();

  
    while (dht11_dq_in && retry < 100) 
    {
        retry++;
        delay_us(1);
    };

    if(retry >= 100)return 1;
    else retry = 0;

   
    while (!dht11_dq_in && retry < 100) 
    {
        retry++;
        delay_us(1);
    };

    if(retry >= 100)return 1;

    return 0;
}
//dht11读bit
u8 dht11_read_bit(void)
{
    u8 retry = 0;

    while(dht11_dq_in && retry < 100) 、
    {
        retry++;
        delay_us(1);
    }

    retry = 0;

    while(!dht11_dq_in && retry < 100) 、
    {
        retry++;
        delay_us(1);
    }

    delay_us(40);

   、 if(dht11_dq_in)return 1;
    else return 0;
}
//dht11读byte
u8 dht11_read_byte(void)
{
    u8 i, dat;
    dat = 0;

    for (i = 0; i < 8; i++)
    {
        dat <<= 1;
        dat |= dht11_read_bit(); 
    }

    return dat;
}
//dht11读数据
u8 dht11_read_data(u8 *temp, u8 *humi)
{
    u8 buf[5];
    u8 i;
    dht11_rst();

    if(dht11_check() == 0)
    {
        for(i = 0; i < 5; i++) 
        {
            buf[i] = dht11_read_byte();
        }

        if((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4]) 
        {
            *humi = buf[0];
            *(humi + 1) = buf[1]; 
            *temp = buf[2]; 
            *(temp + 1) = buf[3];
        }
    }
    else return 1;

    return 0;
}
----------------------------------------------------------------

dht11.h
----------------------------------------------------------------
#ifndef __dht11_h
#define __dht11_h

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "usart2.h"
#include "lcd.h"
#include "lcd_init.h"

#define dht11_io_in()  {gpioa->crl&=0xffffff0f;gpioa->crl|=8<<4;}
#define dht11_io_out() {gpioa->crl&=0xffffff0f;gpioa->crl|=3<<4;}
#define	dht11_dq_out paout(1)
#define	dht11_dq_in  pain(1)  

u8 dht11_init(void);
u8 dht11_read_data(u8 *temp, u8 *humi);    
u8 dht11_read_byte(void);
u8 dht11_read_bit(void);
u8 dht11_check(void);
void dht11_rst(void);


void su03t_dht11_play(void);
void mp3_dht11_play(void);

#endif
-----------------------------------------------------------------
根据gpio的定义开始连线:
data---pa1

mini_mp3模块

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

该模块主要是通过串口来和stm32通讯,所以没有特定的.c和.h的文件,下面介绍该模块会用到的一些函数。
-----------------------------------------------------------------
该函数主要是stm32给mp3模块发送数据
void uart2_mp3_senddata(int len)
{
    int i = 0 ;

    usart2_sendbyte(0x7e);       

    for(i = 0; i < len; i++)     
    {
        usart2_sendbyte(send_buf[i]);
    }

    usart2_sendbyte(0xef);       
}

该函数主要是mp3播放文件里面的内容
void uart2_mp3_sendcmd(int cmd, int feedback, int dat)
{
    send_buf[0] = 0xff;                
    send_buf[1] = 0x06;              
    send_buf[2] = cmd;                
    send_buf[3] = feedback;            
    send_buf[4] = (int)(dat >> 8);     
    send_buf[5] = (int)(dat);          
    uart2_mp3_dosum(&send_buf[0], 6);   
    uart2_mp3_senddata(8);             
}
void uart2_mp3_sendcmd2(int cmd, int dat1, int dat2, int dat3)
{
    send_buf[0] = 0xff;             
    send_buf[1] = 0x06;              
    send_buf[2] = cmd;               
    send_buf[3] = (int)(dat1);      
    send_buf[4] = (int)(dat2);       
    send_buf[5] = (int)(dat3);      

    uart2_mp3_senddata(6);          
}
-------------------------------------------------------------------
引脚的接线:
mp3的rx---stm32的tx
vcc--3.3v
gnd--gnd

su-03t模块

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

串口2向su-03t发送命令
-----------------------------------------------------------
void uart2_su03t_sendcmd(int len)
{
    int i = 0 ;

    usart2_sendbyte(0xaa);      
    usart2_sendbyte(0x55);

    for(i = 0; i < len; i++) 
    {
        usart2_sendbyte(send_buf[i]);  
    }

    usart2_sendbyte(0x55);
    usart2_sendbyte(0xaa);      
}
------------------------------------------------------------

串口2向su-03t发送命令(3位数据)
------------------------------------------------------------
void uart2_su03t_sendcmd1(int dat1, int dat2, int dat3)
{
    send_buf[0] = (int)(dat1);         //datal
    send_buf[1] = (int)(dat2);         //data2
    send_buf[2] = (int)(dat3);         //data3

    uart2_su03t_sendcmd(3);           
}
------------------------------------------------------------

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com