系列文章目录
-
[免费一对一设计题目、帮助选择低投入高产出的题目,请私信博主]
文章目录
0 前言
🔥近几年随着人工智能等新技术的不断火热,带动了嵌入式等的传统行业的进一步发展。最近带过的几届同学反馈:以往的毕设题目缺乏创新性和亮点,不能满足学校的答辩要求。为了方便毕业生们顺利、省心、高效的通过毕设,这里分享一些优质的低投入高产出毕业设计。
今天给大家分享一个比较实用且有一定创新力的题目
🚩智能路灯控制及监测系统
🥇首先对这道题目给出一个量化的评价(每项满分5⭐):
- 难度:⭐⭐⭐
- 工作量:⭐⭐⭐⭐
- 创新性:⭐⭐⭐
1 题目
2 方案设计
2.1 方案框图
分析题目功能点,结合开发经验,构思整体方案,形成整体方案框图
2.2 器件选型
主控:采用 STM32F103 系列嵌入式芯片,具体型号/规格暂定 STM32F103C8T6 最小系统板,系统主频 72 MHz;
光照传感器:采用光敏电阻采集环境光照度,主控通过AD模数转换数字量;
光电传感器:用于检测路灯旁的行人或车辆,通过光电传感器实现;
蓝牙模块:与主控通过 UART 协议通信,将数据发送至APP端,同时接受APP端的控制;
时钟模块:为系统提供时钟基准,用于统计每日开启的时长,使用厂商特定协议与主控通信,型号 DS1302;
OLED屏幕:使用 OLED 屏幕显示系统相关信息,便于数据展示,使用 I2C 协议与主控通信;
照明灯:使用白色LED灯,主控通过驱动电路控制灯光,生成 PWM 波调节亮度;
系统采用5V供电。
2.3 小结-设计要点、难点解析
1、各类传感器的原理、使用方法与通信协议;
2、AD转换芯片的原理、使用方法和通信协议;
3、传感器数据的解析、去噪和拟合;
4、液晶显示屏的驱动原理、通信协议;
5、系统软件应具备高效的传感器数据采集顺序和逻辑,提升传感器采集速度;
6、灯光控制自学习算法的实现与应用;
7、系统软件总体流程设计,能够准确快速的响应数据变化;
8、系统需具备高鲁棒性,提升设备可靠性
3 硬件设计——原理图及PCB
使用 Altium Designer 软件进行硬件原理图和PCB绘制
4 软件设计——软件模块划分及主程序源码
使用 Keil-MDK ARM建立工程
工程文件树
主程序部分源码展示:
/************************************************************
* @file main.c
* Description:
* $Revision: #1 $
* $Date: 2021/1101 $
* $Author:
* $Change: $
* 主控MCU STM32F103C8T6 外部晶振8MHz RCC函数设置主频72MHz
*
*
***********************************************************/
#include "sys.h"
#include <stdio.h>
#include "basic_type_redef.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "oled0561.h"
#include "digital_io_device.h"
#include "adc.h"
#include "ds1302.h"
#if 0
#define MSG_MSG(fmt, ...) USART1_printf("[MSG] -I-:" fmt, ##__VA_ARGS__)
#define MSG_INF(fmt, ...) USART1_printf("[MSG] -I-:" fmt, ##__VA_ARGS__)
#define MSG_DBG(fmt, ...) USART1_printf("[MSG] -D-:" fmt, ##__VA_ARGS__)
#define MSG_WRN(fmt, ...) USART1_printf("[MSG] -W-:" fmt, ##__VA_ARGS__)
#define UART_LOG(_level, _mod, _fmt, ...) USART1_printf(_fmt, ##__VA_ARGS__)
#define LOG_MSG(fmt, ...) UART_LOG(INFO, mod, fmt, ##__VA_ARGS__)
#endif
/* 全局变量声明 */
/* 系统状态 */
uint8_t SYS_STATE; // 系统主状态标志位,不可直接修改,修改务必调用接口
uint8_t LAMP_LIGHT_TIME; // 路灯点亮的时长
uint8_t LAMP_LIGHT_CNT; // 路灯点亮的次数
uint8_t TIME_STAMP[2]; // 时间戳数组 时、分
//uint8_t uart_rx_data; // 串口接收到的数据
extern vu16 ADC_DMA_IN[2]; //声明外部变量
/* 系统工作状态 */
typedef enum
{
SYS_STATE_NONE = 0,
SYS_STATE_READY,
SYS_STATE_OPEN,
SYS_STATE_MANUL,
SYS_STATE_CNT
}SYSTEM_STATE_E;
typedef struct
{
uint16_t enum_idx;
uint8_t* str;
}enum_str_t;
enum_str_t const sys_state_str[SYS_STATE_CNT] =
{
{SYS_STATE_NONE, (uint8_t *)"NONE"},
{SYS_STATE_READY, (uint8_t *)"REDY"},
{SYS_STATE_OPEN, (uint8_t *)"OPEN"},
{SYS_STATE_MANUL, (uint8_t *)"MNUL"},
};
int main(void)
{
/* 变量定义 */
uint16_t light_adc_value; // 光照强度 ADC 值,光照越强 ADC 越低,反之越高
uint16_t bt_output_cnt;
uint16_t i;
/* 初始化 */
SYS_STATE = SYS_STATE_NONE; // 系统状态标志位——无
uart_rx_data = 0;
bt_output_cnt = 0;
light_adc_value = 0;
LAMP_LIGHT_TIME = 0;
LAMP_LIGHT_CNT = 0;
delay_init(); //延时函数初始化
delay_ms(500);
//LED_Init(); //初始化与LED连接的硬件接口
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
USART1_Init(9600); //串口初始化为9600
USART3_Init(9600);
digital_io_device_init(); // 数字IO外设接口初始化
I2C_Configuration(); // I2C初始化
ADC_Configuration(); //ADC初始化设置(光照传感器的ADC初始化)
ds1302_gpio_init();//CE,SCLK端口初始化
ds1302_init();
OLED0561_Init(); // OLED初始化
OLED_DISPLAY_8x16_BUFFER(0, "---INITING--"); // 显示字符串
USART3_printf("--------------\r\n");
MSG_INF("____SYSTEM LINK START_____\r");
state_update(SYS_STATE_READY);
lighting_control(LIGHT_CLOSE);
/* 主循环 */
while(1)
{
/* 根据状态标志位切换循环体 */
/* 就绪状态 */
while (SYS_STATE_READY == SYS_STATE)
{
//MSG_DBG("light adc: %4u \n\r", ADC_DMA_IN[0]);
//delay_ms(100);
lighting_control(LIGHT_CLOSE);
/* 光照亮度处理及显示 */
light_adc_value = mean_filter(ADC_DMA_IN[0]);
if (U16_MAX != light_adc_value)
{
//MSG_DBG("light filter adc: %4u \n\r", light_adc_value);
//USART3_printf("light filter adc: %4u \n\r", light_adc_value);
OLED_DISPLAY_8x16(2, 5*8, light_adc_value/1000+0x30);
OLED_DISPLAY_8x16(2, 6*8, light_adc_value%1000/100+0x30);
OLED_DISPLAY_8x16(2, 7*8, light_adc_value%100/10+0x30);
OLED_DISPLAY_8x16(2, 8*8, light_adc_value%10+0x30);
}
/* 显示有无行人车辆 */
OLED_DISPLAY_8x16(2, 15*8, human_car_detect()+0x30);
/* 显示路灯点亮得时长和次数 */
OLED_DISPLAY_8x16(4, 5*8, LAMP_LIGHT_TIME/100+0x30);
OLED_DISPLAY_8x16(4, 6*8, LAMP_LIGHT_TIME%100/10+0x30);
OLED_DISPLAY_8x16(4, 7*8, LAMP_LIGHT_TIME%10+0x30);
OLED_DISPLAY_8x16(4, 13*8, LAMP_LIGHT_CNT/100+0x30);
OLED_DISPLAY_8x16(4, 14*8, LAMP_LIGHT_CNT%100/10+0x30);
OLED_DISPLAY_8x16(4, 15*8, LAMP_LIGHT_CNT%10+0x30);
if (mTRUE == human_car_detect() && CRITICAL_LIGHT_ADC_LOW < light_adc_value && U16_MAX != light_adc_value)
{
delay_ms(50);
if (mTRUE == human_car_detect())
{
/* 记录下开灯时刻 */
ds1302_read_realTime();
TIME_STAMP[0] = DS1302_data_2[0]*10 + DS1302_data_2[1];
TIME_STAMP[1] = DS1302_data_2[3]*10 + DS1302_data_2[4];
state_update(SYS_STATE_OPEN);
}
}
/* 处理串口输入 */
#if 0
if (0x01 == uart_rx_data)
{
state_update(SYS_STATE_MANUL);
uart_rx_data = 0;
}
#else
/* 处理串口输入 */
switch (uart_rx_data)
{
case 0x01: state_update(SYS_STATE_MANUL); uart_rx_data = 0; break;
case 0x0F: uart_rx_data = 0; break;
default: break;
}
#endif
#if 0
ds1302_read_realTime();
MSG_DBG("date: %u%u%u%u-%u%u-%u%u \r\n ", \
DS1302_data_1[0], DS1302_data_1[1], DS1302_data_1[2], DS1302_data_1[3],
DS1302_data_1[5], DS1302_data_1[6], DS1302_data_1[8], DS1302_data_1[9]);
MSG_DBG("time: %u%u:%u%u:%u%u \r\n ", \
DS1302_data_2[0], DS1302_data_2[1], DS1302_data_2[3], DS1302_data_2[4],
DS1302_data_2[6], DS1302_data_2[7]);
#endif
bt_output_cnt++;
if (150 == bt_output_cnt)
{
bt_output_cnt = 0;
if (U16_MAX != light_adc_value)
USART3_printf("light adc: %u \n\r", light_adc_value);
USART3_printf("time:%u mins cnt:%u \n\r", LAMP_LIGHT_TIME, LAMP_LIGHT_CNT);
}
}
/* 点亮状态 */
while (SYS_STATE_OPEN == SYS_STATE)
{
/* 根据ADC数据点灯 */
for (i = 0; i < 10000; i++)
{
lighting_control_by_adc(light_adc_value, CRITICAL_LIGHT_ADC_LOW);
}
if (mFALSE == human_car_detect())
{
delay_ms(50);
if (mFALSE == human_car_detect())
{
/* 计算开灯时长 */
ds1302_read_realTime();
LAMP_LIGHT_TIME += time_calculate(TIME_STAMP[0], TIME_STAMP[1]);
LAMP_LIGHT_CNT++;
state_update(SYS_STATE_READY);
}
}
}
/* 手动控制状态 */
while (SYS_STATE_MANUL == SYS_STATE)
{
/* 处理串口输入 */
switch (uart_rx_data)
{
case 0x00: break;
case 0x02: state_update(SYS_STATE_READY); uart_rx_data = 0; break;
default:
MSG_DBG("process uart input 0x%02x %u \r", uart_rx_data, uart_rx_data);
light_adc_value = uart_rx_data << 4;
uart_rx_data = 0;
break;
}
// 蓝牙输出 >68D >45H 大于最小亮度时才会点亮灯光,否则关闭
if (light_adc_value >= CRITICAL_LIGHT_ADC_LOW)
lighting_control_by_adc(light_adc_value, CRITICAL_LIGHT_ADC_LOW);
else
lighting_control(LIGHT_CLOSE);
}
}
}
5 成果——实现效果展示
6 最后总结——项目资料获取
想获取设计方案、器件资料、原理图、PCB、程序源码获取、其他毕设题目解答,欢迎私信。
或搜索微信公众号“电子设计万事屋”,敬请关注