STM32智能药盒丨2027单片机新项目

目录

一、项目功能介绍

二、实物功能演示

三、开题报告详解

四、原理图详解

五、代码详解

六、硬件框图详解

七、软件流程图详解

八、元器件清单详解

九、资料获取


哔哩哔哩视频链接:https://www.bilibili.com/video/BV1Nn436kEn4/?share_source=copy_web&vd_source=097fdeaf6b6ecfed8a9ff7119c32faf2

一、项目功能介绍

二、实物功能演示

视频链接:https://www.bilibili.com/video/BV1EsoRYeEFb/?share_source=copy_web&vd_source=097fdeaf6b6ecfed8a9ff7119c32faf2

三、开题报告详解

四、原理图详解

五、代码详解

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;
        }
  }
}

六、硬件框图详解

七、软件流程图详解

八、元器件清单详解

九、资料获取

相关推荐
LCG米11 小时前
STM32硬件CRC外设实测:多项式固定陷阱、CRC-32校验不匹配根因与软件查表法耗时对比落地
stm32·单片机·嵌入式硬件
La Pulga14 小时前
【FreeRTOS源码学习笔记】任务切换
单片机·mcu·学习·嵌入式·freertos·实时操作系统
女神下凡18 小时前
芯参谋(85):Linux_PPI_NAND_驱动开发指南
linux·运维·arm开发·驱动开发·单片机·嵌入式硬件·设计规范
Zw-awa19 小时前
从 CH340 到 HC-05 和 HC-06:让小车脱离电脑
stm32
硅基手札20 小时前
【Linux 内核专栏 19】20 · 嵌入式子系统 — GPIO·pinctrl·clock·regulator
linux·运维·单片机·linux内核·嵌入式开发·调试定位
何粥学1 天前
Vivado 2024.2 开发记录(AC820 Zynq-7020)——软件使用,点亮led灯
单片机·嵌入式硬件·zynq
Sakura_j_h_1 天前
51 单片机驱动四位数码管:动态扫描、限流电阻与消影的取舍
单片机·嵌入式硬件·51单片机·嵌入式·数码管·动态扫描·限流电阻
HANDY092001 天前
从“不照人”到“剂量达标”:扇叶遮挡式UV-C空气消毒的工程边界与可验证评估框架
开发语言·人工智能·嵌入式硬件·智能家居
飞凌嵌入式1 天前
千次静电放电试炼,守住飞凌嵌入式硬件可靠底线
嵌入式硬件