系列文章目录
-
[免费一对一设计题目、帮助选择低投入高产出的题目,请私信博主]
文章目录
0 前言
🔥近几年随着人工智能等新技术的不断火热,带动了嵌入式等的传统行业的进一步发展。最近带过的几届同学反馈:以往的毕设题目缺乏创新性和亮点,不能满足学校的答辩要求。为了方便毕业生们顺利、省心、高效的通过毕设,这里分享一些优质的低投入高产出毕业设计。
今天给大家分享一个比较实用且有一定创新力的题目
🚩基于WiFi技术的远程音乐喷泉控制系统设计
🥇首先对这道题目给出一个量化的评价(每项满分5⭐):
- 难度:⭐⭐⭐⭐
- 工作量:⭐⭐⭐⭐⭐
- 创新性:⭐⭐⭐⭐
1 题目
2 方案设计
2.1 方案框图
分析题目功能点,结合开发经验,构思整体方案,形成整体方案框图
2.2 器件选型
主控:采用 STM32F103 系列嵌入式芯片,具体型号/规格暂定 STM32F103C8T6 最小系统板,系统主频
72 MHz;
彩灯模块:采用可变色的彩灯模块,主控通过 IO 控制,型号为市面常见款;
麦克风模块:采集环境中的声音,主控读取其模拟量输出端口,采用市售通用咪头;
WiFi模块:采用 ESP8266 模块,与主控通过 UART 通信;
MP3模块:读取模组内置存储器中的音频文件,驱动扬声器播放音乐,主控通过IO控制,型号 DY-SV5W;
电机驱动模块:使用高压直流电驱动直流水泵,型号 L298N;
OLED显示屏:显示必要的系统信息,型号 I2C OLED 屏幕;
系统采用AC-DC 12V电源适配器供电,一路直供水泵驱动,另一路经降压后为控制系统供电;
物联网云服务采用机智云成套解决方案.
2.3 小结-设计要点、难点解析
1、系统供电方案的设计,要同时满足水泵电机有足够动能和控制系统正常运行;
2、麦克风模块的驱动与音频信号的识别算法;
3、WiFi模块的驱动;
4、设备端与云服务器的通信流程、业务逻辑设计;
5、MP3模组的驱动;
6、水泵的控制算法设计;
7、APP界面、主控的操作流程设计,需具备良好的人机交互体验;
8、系统需具备高鲁棒性,确保装备稳定性和可靠性。
3 硬件设计——原理图及PCB
使用 Altium Designer 软件进行硬件原理图和PCB绘制
4 软件设计——软件模块划分及主程序源码
使用 Keil-MDK ARM建立工程
工程文件树
主程序部分源码展示:
/**
******************************************************************************
* File Name : main.c
* Description : Main program body
******************************************************************************
** This notice applies to any and all portions of this file
* that are not between comment pairs USER CODE BEGIN and
* USER CODE END. Other portions of this file, whether
* inserted by the user or by software development tools
* are owned by their respective copyright owners.
*
* COPYRIGHT(c) 2017 STMicroelectronics
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of STMicroelectronics nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f1xx_hal.h"
/* USER CODE BEGIN Includes */
#include "hal_key.h"
#include "gizwits_product.h"
#include "common.h"
#include "digital_io_device.h"
#include "i2c.h"
#include "oled0561.h"
#include "adc.h"
/* USER CODE END Includes */
/* Private variables ---------------------------------------------------------*/
TIM_HandleTypeDef htim2;
UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
extern volatile uint16_t ADC_DMA_IN[2]; //声明外部变量
extern uint8_t SYS_STATE; // 系统主状态标志位
extern uint16_t sound_adc_mid;
extern uint16_t sound_adc_min;
extern uint16_t sound_adc_max;
extern uint16_t sound_adc_value; // 声音强度 ADC 值
extern uint16_t adc_offset;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM2_Init(void);
static void MX_USART1_UART_Init(void);
static void MX_USART2_UART_Init(void);
static void MX_NVIC_Init(void);
//uint16_t mean_filter(uint16_t value);
/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
/* USER CODE END PFP */
/* USER CODE BEGIN 0 */
/**
* key1 short press handle
* @param none
* @return none
*/
void key1ShortPress(void)
{
GIZWITS_LOG("KEY1 PRESS ,Production Mode\n");
gizwitsSetMode(WIFI_PRODUCTION_TEST);
}
/**
* key1 long press handle
* @param none
* @return none
*/
void key1LongPress(void)
{
GIZWITS_LOG("KEY1 PRESS LONG ,Wifi Reset\r\n");
gizwitsSetMode(WIFI_RESET_MODE);
}
/**
* key2 short press handle
* @param none
* @return none
*/
void key2ShortPress(void)
{
GIZWITS_LOG("KEY2 PRESS ,Soft AP mode\n");
#if !MODULE_TYPE
gizwitsSetMode(WIFI_SOFTAP_MODE);
#endif
}
/**
* key2 long press handle
* @param none
* @return none
*/
void key2LongPress(void)
{
//AirLink mode
GIZWITS_LOG("KEY2 PRESS LONG ,AirLink mode\n");
#if !MODULE_TYPE
gizwitsSetMode(WIFI_AIRLINK_MODE);
#endif
}
/**
* Key init function
* @param none
* @return none
*/
void keyInit(void)
{
/* Key parameter initialization*/
keyCategory_t keys[KEY_NUM]={
[KEY1] = {
.fsm.keyGpio.keyPort = KEY1_GPIO_Port,
.fsm.keyGpio.keyPin = KEY1_Pin,
//Key1 State Machine Init
.fsm.keyShield = ENABLE,
.fsm.keyDownLevel = Bit_RESET,
//Key1 Callback function init
.func.ShortPressCb = key1ShortPress,
.func.longPressCb = key1LongPress,
},
[KEY2] = {
.fsm.keyGpio.keyPort = KEY2_GPIO_Port,
.fsm.keyGpio.keyPin = KEY2_Pin,
//Key2 State Machine Init
.fsm.keyShield = ENABLE,
.fsm.keyDownLevel = Bit_RESET,
//Key2 Callback function init
.func.ShortPressCb = key2ShortPress,
.func.longPressCb = key2LongPress,
},
};
keyParaInit(keys);
}
/* USER CODE END 0 */
int main(void)
{
/* USER CODE BEGIN 1 */
#if 0
uint16_t sound_adc_mid;
uint16_t sound_adc_min;
uint16_t sound_adc_max;
uint16_t sound_adc_value; // 声音强度 ADC 值
uint16_t adc_offset;
#endif
/* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM2_Init();
MX_USART1_UART_Init();
MX_USART2_UART_Init();
/* Initialize interrupts */
MX_NVIC_Init();
/* USER CODE BEGIN 2 */
timerInit();
uartInit();
userInit();
//
GIZWITS_LOG("MCU Init Success , SoftVersion = %s\r\n",SOFTWARE_VERSION);
/* IoTMusicFountain BEGIN */
sound_adc_mid = ADC_SOUND_MID;
sound_adc_min = sound_adc_mid - ADC_SOUND_RNG;
sound_adc_max = sound_adc_mid + ADC_SOUND_RNG;
adc_offset = 0;
sound_adc_value = U16_MAX;
//digital_io_device_init();
pc13_led_control(mENABLE);
light_relay_control(mENABLE);
HAL_Delay(1000);
pc13_led_control(mDISABLE);
light_relay_control(mDISABLE);
I2C_Configuration(); // I2C初始化
ADC_Configuration(); //ADC初始化设置
OLED0561_Init(); // OLED初始化
OLED_DISPLAY_8x16_BUFFER(0, "-----INITING----"); // 显示字符串
//OLED_DISPLAY_8x16_BUFFER(2, "!!!KEEP QUIET!!!"); // 显示字符串
//OLED_DISPLAY_8x16_BUFFER(4, "CurADC:");
OLED_DISPLAY_8x16_BUFFER(6, "MidADC:");
while(U16_MAX == sound_adc_value)
{
sound_adc_value = mean_filter(ADC_DMA_IN[0]);
}
//OLED_DISPLAY_8x16_BUFFER(2, " "); // 显示字符串
sound_adc_mid = sound_adc_value;
sound_adc_min = sound_adc_mid - ADC_SOUND_RNG;
sound_adc_max = sound_adc_mid + ADC_SOUND_RNG;
OLED_DISPLAY_8x16(6, 7*8, sound_adc_mid/1000+0x30);
OLED_DISPLAY_8x16(6, 8*8, sound_adc_mid%1000/100+0x30);
OLED_DISPLAY_8x16(6, 9*8, sound_adc_mid%100/10+0x30);
OLED_DISPLAY_8x16(6, 10*8, sound_adc_mid%10+0x30);
OLED_DISPLAY_8x16(4, 14*8, SYS_STATE+0x30);
//key2LongPress(); /* set ESP to Airlink mode */
//
gizwitsInit();
keyInit();
/* IoTMusicFountain END */
/* USER CODE END 2 */
#ifdef OTA_ENABLE
Pro_D2W_Ask_Module_Reboot();
#endif
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
//sound_adc_value = mean_filter(ADC_DMA_IN[0]);
userHandle();
gizwitsHandle((dataPoint_t *)¤tDataPoint);
}
/* USER CODE END 3 */
}
5 成果——实现效果展示
6 最后总结——项目资料获取
想获取设计方案、器件资料、原理图、PCB、程序源码获取、其他毕设题目解答,欢迎私信。
或搜索微信公众号“电子设计万事屋”,敬请关注