目录
一、项目功能介绍
二、实物功能演示
三、开题报告详解



四、原理图详解

五、代码详解
cpp
#include "stm32f10x.h"
#include "led.h"
#include "beep.h"
#include "usart.h"
#include "usart2.h"
#include "usart3.h"
#include "delay.h"
#include "dht11.h"
#include "oled.h"
#include "key.h"
#include "Modules.h"
#include "TIM2.h"
#include "adcx.h"
#include "flash.h"
#include "HW.h"
/****************异方辰电子工作室******************
STM32
*文件 : STM32智能药盒
*版本 : V2.0
*日期 : 2025.10.18
*MCU : STM32F103C8T6
*接口 : 见代码
*BILIBILI : 异方辰电子
*小红书 : 异方辰电子
*CSDN : 异方辰电子
*授权IP : 辰哥单片机设计、异方辰、YFC电子、北海单片机设计
**********************BEGIN***********************/
#define KEY_Long1 11
#define KEY_1 1
#define KEY_2 2
#define KEY_3 3
#define KEY_4 4
#define FLASH_START_ADDR 0x0801f000 //写入的起始地址
SensorModules sensorData; //声明传感器数据结构体变量
SensorThresholdValue Sensorthreshold; //声明传感器阈值结构体变量
DriveModules driveData; //声明驱动器状态结构体变量
_calendar_obj set_time;
uint8_t location = 1; // 时间位置
uint8_t ss_flag = 1; // 闪烁
uint8_t mode = 1; //系统模式 1自动 2手动 3设置
uint8_t set_flag = 1;
uint32_t time_num = 0;
uint32_t time_count = 0;
uint8_t TESTING1 = 0;
uint8_t TESTING2 = 0;
uint8_t TESTING3 = 0;
uint8_t TESTING4 = 0;
uint8_t TESTING5 = 0;
int32_t reset;
uint8_t date;
uint8_t bobao_flag = 0;
extern uint8_t Res;
//系统静态变量
static uint8_t count_a = 1; //自动模式按键数
static uint8_t count_m = 1; //手动模式按键数
static uint8_t count_s = 1; //设置模式按键数
static uint8_t count_w = 1; //设置阈值位置按键数
//static uint8_t LED_Flag = 0;
//static uint8_t Curtain_Flag = 0;
//static uint8_t Window_Flag = 0;
//static uint8_t Fan_Flag = 0;
//static uint8_t Humidifier_Flag = 0;
//static uint8_t Bump_Flag = 0;
//static uint8_t NOW_Curtain_Flag = 0;
//static uint8_t NOW_Window_Flag = 0;
void ThresholdSettings(uint8_t num);
void Public(void);
/**
* @brief 显示菜单内容
* @param 无
* @retval 无
*/
enum
{
AUTO_MODE = 1,
MANUAL_MODE,
SETTINGS_MODE
}MODE_PAGES;
int main(void)
{
SystemInit();//配置系统时钟为72M
delay_init(72);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
ADCX_Init();
LED_Init();
LED_On();
Key_Init();
RTC_Init();
HX711_Init();
BEEP_Init();
HW_Init();
OLED_Init();
DHT11_Init();
OLED_Clear();
Flash_Time_Init();
TIM2_Init(72-1,1000-1);
USART1_Config();//串口初始化
USART2_Config();//串口初始化
USART3_Config();//串口初始化
printf("Start \n");
OLED_ShowChinese(16,0,54,16,1);
OLED_ShowChinese(32,0,55,16,1);
OLED_ShowChinese(48,0,56,16,1);
OLED_ShowChinese(64,0,57,16,1);
OLED_ShowChinese(80,0,58,16,1);
OLED_ShowChinese(96,0,59,16,1);
OLED_Refresh();
Usart3_SendString((uint8_t*)"AF:30", 7);
delay_ms(1000);
Usart3_SendString((uint8_t*)"A7:00001", 9);
delay_ms(1000);
delay_ms(1000);
OLED_Clear();
reset = HX711_GetData();
date = sensorData.calendarData.w_date;
while (1)
{
SensorScan(); //获取传感器数据
switch(mode)
{
case AUTO_MODE:
OLED_autoPage1(); //显示主页面1固定信息
SensorDataDisplay1(); //显示传感器1数据
AutoControl();
/*按键1按下时切换模式*/
if (KeyNum == KEY_1) //系统模式mode 1自动 2手动 3设置
{
KeyNum = 0;
mode = MANUAL_MODE;
count_m = 1;
OLED_Clear();
}
if (KeyNum == KEY_Long1)
{
KeyNum = 0;
mode = SETTINGS_MODE;
count_s = 1;
location = 1;
OLED_Clear();
}
Control_Manager();
break;
case MANUAL_MODE:
driveData.Beep_Flag = 0;
OLED_manualOption(SetManual());
ManualControl(SetManual());
if (SetManual() <= 4)
{
OLED_manualPage1();
ManualSettingsDisplay1();
}
else
{
OLED_manualPage2();
ManualSettingsDisplay2();
}
if (KeyNum == KEY_1) //系统模式mode 0手动 1自动(默认)
{
KeyNum = 0;
mode = AUTO_MODE;
count_a = 1;
OLED_Clear();
}
Control_Manager();
break;
case SETTINGS_MODE:
driveData.Beep_Flag = 0;
if (set_flag)
{
set_time = sensorData.calendarData;
set_flag = 0;
location = 1;
}
ThresholdSettings(count_w); //实现阈值调节功能
//判断是否退出阈值设置界面
if (KeyNum == KEY_1)
{
KeyNum = 0;
mode = AUTO_MODE; //跳转到主界面
count_a = 1;
OLED_Clear(); //清屏
set_flag = 1;
count_w = 1;
driveData.GoFlag1 = 0;
driveData.GoFlag2 = 0;
driveData.GoFlag3 = 0;
driveData.GoFlag4 = 0;
driveData.GoFlag5 = 0;
//存储修改的传感器阈值至flash内
FLASH_W(FLASH_START_ADDR,Sensorthreshold.time_Value_1.hour,
Sensorthreshold.time_Value_1.min,Sensorthreshold.time_Value_2.hour,
Sensorthreshold.time_Value_2.min,Sensorthreshold.time_Value_3.hour,
Sensorthreshold.time_Value_3.min,Sensorthreshold.time_Value_4.hour,
Sensorthreshold.time_Value_4.min,Sensorthreshold.time_Value_5.hour,
Sensorthreshold.time_Value_5.min);
RTC_Set(sensorData.calendarData.w_year, sensorData.calendarData.w_month, sensorData.calendarData.w_date, set_time.hour, set_time.min, set_time.sec);
}
break;
default: break;
}
if(time_num % 2 == 0) //发送数据
{
Public();
printf("Res=%c\r\n", (char)Res);
}
time_num++; //计时变量+1
time_count++;
delay_ms(10);
if(time_num >= 5000)
{
time_num = 0;
}
if (time_count == 5)
{
bobao_flag = 1;
time_count = 0;
}
}
}
六、硬件框图详解

七、软件流程图详解

八、元器件清单详解

