stm32和nrf24L01病房呼叫系统的实现
文章目录
第一章 项目背景与意义
第一节 病房呼叫系统的现状
1.技术现状
-
系统分类与构成:
-
系统功能特点:
-
网络结构与技术发展:
2.存在的问题
-
技术问题:
-
设备老化与兼容性:
-
呼叫延迟与信号覆盖:
第二节 STM32F1、nRF24L01、OLED技术介绍
1.STM32F1技术介绍
STM32F1是由意法半导体(STMicroelectronics)推出的一款基于ARM Cortex-M3内核的32位微控制器。以下是关于STM32F1的主要技术特点:
-
主频与内存:
-
供电与电压:
-
片上资源:
-
应用领域:
2.nRF24L01技术介绍
nRF24L01是由NORDIC生产的一款工作在2.4GHz~2.5GHz ISM频段的单片无线收发器芯片。以下是其主要技术特点:
-
无线性能:
-
通信接口:
-
应用领域:
3.OLED技术介绍
OLED(Organic Light-Emitting Diode)又称为有机电激光显示或有机发光半导体,是一种电流型的有机发光器件。以下是其主要技术特点:
-
发光原理:
-
显示性能:
-
分类:
-
应用领域:
第三节 项目目标与预期成果
本设计为病房呼叫系统,具有病房普通呼叫报警、病房紧急呼叫报警、呼叫病房显示、呼叫闪灯和蜂鸣器报警的功能,能够实现对不同呼叫类型的判断和响应的效果。
该设计主要有两大部分组成,第一部分为接收端,接收端主要由NRF24L01、OLED屏幕、蜂鸣器、LED灯、按键、RGB彩灯组成,主要实现的功能为:当系统启动后,接收端会检测NRF24L01是否初始化成功,初始化成功后才会进入系统主界面,主界面主要实现对接收到的信息进行显示,当接收到病房呼叫时,会在OLED显示屏上面显示呼叫病房的信息和呼叫的方式,主要有普通呼叫和紧急呼叫两种,普通呼叫和紧急呼叫时,蜂鸣器都会报警,但普通呼叫LED灯点亮,紧急呼叫时RGB红灯点亮,同时,按键1可以打断任意一个病房的呼叫,即关闭LED灯或RGB彩灯和蜂鸣器,并且使OLED屏幕回到主界面,以此来表示接收到了呼叫。第二部分为发送端,功能比较简单,主要由NRF24L01和按键构成,按键1、2、3代表不同病房,短按按键表示普通呼叫,长按按键表示紧急呼叫,通过NRF24L01将信息传送至接收端。
这个病房呼叫系统的设计非常人性化,它可以根据不同的情况提供相应的报警功能。例如,在普通呼叫时,LED灯会点亮;而在紧急呼叫时,RGB红灯会点亮。这样医护人员就可以根据灯光的颜色来判断病房的情况。此外,该系统还配备了OLED屏幕,可以清晰地显示出不同病房的呼叫方式。这为医护人员提供了极大的便利。
第二章 系统架构设计
第一节 整体架构设计思路
整体架构设计思路:
-
硬件设计:
-
软件设计:
-
功能实现:
-
用户交互:
第二节 STM32F1核心控制器选择及功能
STM32F1核心控制器选择及功能概述如下:
一、STM32F1核心控制器选择
1. 芯片型号命名规范
STM32F1系列微控制器的命名通常遵循一定的规范,如STM32F103ZET6。这个命名包含了多个部分,每部分都有其特定的含义,如系列、功能、引脚数量、封装类型等。更详细的命名规范可以通过查阅官方发布的芯片选型手册或利用在线选型工具来了解。
2. 选型考虑因素
在选择STM32F1核心控制器时,需要综合考虑多个因素,包括主频、外设接口、封装形式、内存、是否需要进行人机交互等。不同的应用场景对控制器的性能和外设接口有不同的要求,因此需要根据实际需求进行选择。
二、STM32F1核心控制器功能
1. 基本性能参数
2. 外设接口
STM32F1系列微控制器拥有丰富的外设接口,包括:
3. 系统功能
4. 物联网应用
STM32F1系列微控制器适用于各种物联网应用场景,通过丰富的外设接口和强大的处理能力,可以实现与各种传感器的连接和数据采集,同时通过通信接口将数据传输到云平台进行处理和存储。在智能家居、智能手环、微型四轴飞行器、平衡车、智能电饭锅等领域都有广泛的应用。
第三节 nRF24L01无线通信模块应用
nRF24L01无线通信模块是一款功能强大的无线收发器件,广泛应用于各种嵌入式系统和物联网设备中。以下是关于nRF24L01无线通信模块的主要应用特点、技术参数及其在实际应用中的优势:
1.主要应用特点
2.技术参数
3.应用领域
nRF24L01无线通信模块以其低功耗、高性能、灵活配置和简单易用等特点,在物联网和嵌入式系统领域具有广泛的应用前景。
第四节 OLED显示模块集成与界面设计
本次设计使用开发板进行整个系统的搭建,OLED模块只需要通过杜邦线连接至开饭啊引脚即可。
第三章 硬件选型与搭建
第一节 STM32F1开发板准备
在本设计中至少需要两块STM32F1系列开发板。
第二节 nRF24L01无线通信模块电路连接
将无线模块连接至开发板预留引脚即可。
第三节 OLED显示屏电路连接
通过杜邦线将四针OLED连接至开发板任意引脚即可。
第四章 软件开发与实现
第一节 STM32F1主程序设计
1.接收端
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "NRF24L01.h"
#include "OLED.h"
#include "LED.h"
#include "Buzzer.h"
#include "bsp_exti.h"
#include "rgb_led.h"
uint8_t Page_Flag = 0;
int main(void)
{
uint8_t Buf[32] = {0};//接收数据存储数组
NRF24L01_Init();//NRF24L01初始化
OLED_Init();//OLED初始化
LED_Init();//LED初始化
RGB_LED_Init();
Buzzer_Init();//蜂鸣器初始化
EXTI_KEY_Config();//按键初始化
EXTI_NVIC_Config();//外部中断初始化
OLED_ShowImage(30 , 0 , 60 , 60 ,P);
OLED_Update();
Delay_ms(1000);
Delay_ms(1000);
Delay_ms(1000);
while(1)
{
if (NRF24L01_Get_Value_Flag() == 0)
{
OLED_Clear();
Page_Flag = 1;
NRF24L01_GetRxBuf(Buf);
}
if(Page_Flag == 1)
{
if(Buf[1] == 0x01)
{
OLED_ShowString(0 , 0 , "1" , OLED_8X16);
OLED_ShowChinese(10 , 0 , "号病房普通呼叫");
OLED_Update();
Buzzer_ON;
LED1_ON;
}
if(Buf[1] == 0x02)
{
OLED_ShowString(0 , 20 , "2" , OLED_8X16);
OLED_ShowChinese(10 , 20 , "号病房普通呼叫");
OLED_Update();
Buzzer_ON;
LED2_ON;
}
if(Buf[1] == 0x03)
{
OLED_ShowString(0 , 40 , "3" , OLED_8X16);
OLED_ShowChinese(10 , 40 , "号病房普通呼叫");
OLED_Update();
Buzzer_ON;
LED3_ON;
}
if(Buf[1] == 0x04)
{
OLED_ShowString(0 , 0 , "1" , OLED_8X16);
OLED_ShowChinese(10 , 0 , "号病房紧急呼叫");
OLED_Update();
Buzzer_ON;
Rgb_LED_Red();
}
if(Buf[1] == 0x05)
{
OLED_ShowString(0 , 20 , "2" , OLED_8X16);
OLED_ShowChinese(10 , 20 , "号病房紧急呼叫");
OLED_Update();
Buzzer_ON;
Rgb_LED_Red();
}
if(Buf[1] == 0x06)
{
OLED_ShowString(0 , 40 , "3" , OLED_8X16);
OLED_ShowChinese(10 , 40 , "号病房紧急呼叫");
OLED_Update();
Buzzer_ON;
Rgb_LED_Red();
}
}
if(Page_Flag == 0)
{
OLED_Clear();
OLED_ShowImage(0 , 0 , 16 , 16 ,Wiff);
OLED_ShowImage(90 , 0 , 16 , 16 ,Butter);
OLED_ShowChinese(10 , 30 , "病房呼叫系统");
OLED_Update();
LED4_ON;
LED1_OFF;
LED2_OFF;
LED3_OFF;
Buzzer_OFF;
Rgb_LED_Clear();
}
}
}
void EXTI4_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line4) == SET)
{
EXTI_ClearITPendingBit(EXTI_Line4);
Page_Flag = 0;
}
}
#include "bsp_exti.h"
#include "KEY.h"
void EXTI_KEY_Config(void)
{
RCC_APB2PeriphClockCmd(KEY_GPIO_CLK, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = KEY1_GPIO_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(KEY_GPIO_PORT, &GPIO_InitStruct);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource4);
EXTI_InitTypeDef EXTI_InitStruct;
EXTI_InitStruct.EXTI_Line = EXTI_Line4;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
}
void EXTI_NVIC_Config(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = EXTI4_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority =1;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
2.发送端
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "Key.h"
#include "NRF24L01.h"
#include "bsp_tim.h"
uint8_t key_Value = 0;
int main(void)
{
uint8_t Buf[32] = {1, 0x01};
uint8_t Buf1[32] = {1 , 0x02};
uint8_t Buf2[32] = {1 , 0x03};
uint8_t Buf3[32] = {1 , 0x04};
uint8_t Buf4[32] = {1 , 0x05};
uint8_t Buf5[32] = {1 , 0x06};
Key_Init();
NRF24L01_Init();
Bsp_Time_Config();
while(1)
{
switch(key_Value)
{
case 2 : NRF24L01_SendBuf(Buf);key_Value = 0;break;
case 3 : NRF24L01_SendBuf(Buf1);key_Value = 0;break;
case 4 : NRF24L01_SendBuf(Buf2);key_Value = 0;break;
case 5 : NRF24L01_SendBuf(Buf3);key_Value = 0;break;
case 6 : NRF24L01_SendBuf(Buf4);key_Value = 0;break;
case 7 : NRF24L01_SendBuf(Buf5);key_Value = 0;break;
}
}
}
#include "stm32f10x.h" // Device header
#include "Delay.h"
extern uint8_t key_Value;
void Key_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
void Key_Scan(void)
{
uint8_t KeyNum1 = 0,KeyNum2 = 0,KeyNum3 = 0;
static uint16_t Count_time = 0,Count_time1 = 0 , Count_time2 = 0;
KeyNum1 = GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4);
KeyNum2 = GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5);
KeyNum3 = GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_6);
/************1号长按和短按检测***********/
if(!KeyNum1)
{
Count_time++;
}
else
{
if(Count_time > 100)
{
key_Value = 5;
}
if(Count_time > 10 && Count_time <100)
{
key_Value = 2;
}
else
{
}
Count_time = 0;
}
/************2号长按和短按检测***********/
if(!KeyNum2)
{
Count_time1++;
}
else
{
if(Count_time1 > 100)
{
key_Value = 6;
}
if(Count_time1 > 10 && Count_time1 <100)
{
key_Value = 3;
}
else
{
}
Count_time1 = 0;
}
/************3号长按和短按检测***********/
if(!KeyNum3)
{
Count_time2++;
}
else
{
if(Count_time2 > 100)
{
key_Value = 7;
}
if(Count_time2 > 10 && Count_time2 <100)
{
key_Value = 4;
}
else
{
}
Count_time2 = 0;
}
}
void TIM6_IRQHandler(void)
{
if(TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)
{
Key_Scan();
TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
}
}
第五章 系统测试与优化
第一节 单元测试与集成测试
系统启动 | B机显示设备logo,并检测无线模块是否正常,正常后进入系统 |
---|---|
A端按键1短按 | B机显示一号病房普通呼叫 |
A端按键1长按 | B机显示一号病房紧急呼叫 蜂鸣器报警 RGB红灯闪烁 |
A端按键2短按 | B机显示二号病房普通呼叫 |
A端按键2长按 | B机显示二号病房紧急呼叫 蜂鸣器报警 RGB红灯闪烁 |
A端按键3短按 | B机显示三号病房普通呼叫 |
A端按键3长按 | B机显示三号病房紧急呼叫 蜂鸣器报警 RGB红灯闪烁 |
B机按下接收键打断上述任意呼叫 |
第二节 后续功能拓展方向探讨
这个病房呼叫系统设计较为基础,仍然存在拓展方向,以提升其功能性、易用性和交互性。
-
多语言支持:
-
双向通信:
-
护士站定位与导航:
-
病人信息集成:
-
移动应用支持:
-
呼叫优先级管理:
-
多接收端支持:
-
数据记录与分析:
-
与其他医疗系统的集成:
-
呼叫声音定制:
-
无线电源供电:
-
故障自检与报警:
这些功能拓展方向可以根据医院的具体需求和预算进行选择和实现,以不断提升病房呼叫系统的性能和用户体验。
第六章 总结
展望未来,病房呼叫系统将在医院管理中发挥越来越重要的作用。通过不断的优化和拓展,我们相信不断的优化和拓展的病房呼叫系统能够为医护人员提供更加便捷、高效的工作支持。