血氧检测设备,esp8266改造成nodemcu,lua编程解决连接onenet不稳定情况
1、项目简介
2、实现逻辑
#检测血氧
#超阈值蜂鸣器报警
#通过esp8266串口传输数据给onenet
3、应用场景
#血氧检测
#远程血氧检测
4、核心代码梳理
##stm32代码
//机智云协议初始化
void Gizwits_Init(void)
{
TIM3_Int_Init(9,7199);//1MS系统定时
usart3_init(9600);//WIFI初始化
memset((uint8_t*)¤tDataPoint, 0, sizeof(dataPoint_t));//设备状态结构体初始化
gizwitsInit();//缓冲区初始化
}
//数据采集
void userHandle(void)
{
currentDataPoint.valueheart = heart;
currentDataPoint.valuehpo2 = hpo2;
currentDataPoint.valuepre = pre;
currentDataPoint.valuestart = beep_flag;
}
//WiFi连接控制
void WIFI_Contection(u8 key)
{
if(key==4)
{
printf("WIFI进入AirLink连接模式\r\n");
gizwitsSetMode(WIFI_AIRLINK_MODE);//Air-link模式接入
}
}
int main(void)
{
int i=0,count=0;
USART_CONFIG();
delay_init(); //延时函数初始化
LED_Init();
KEY_Init();
Adc1_Channe_Init(); //ADC初始化
TIM4_Int_Init(2000,7199); //200ms系统定时
printf("这是串口调试助手\r\n");
OLED_Init(); //OLED初始化
OLED_Clear();
IIC_GPIO_INIT(); //MAX30102中断引脚初始化
MAX30102_GPIO(); //MAX30102接口引脚初始化
Max30102_reset(); //MAX30102寄存器复位
MAX30102_Config(); //MAX30102配置
DS18B20_Init(); //DS18B20引脚初始化
Gizwits_Init(); //机智云初始化
for(i = 0;i < 128;i++)
{
while(MAX30102_INTPin_Read()==0)
{
//读取FIFO
max30102_read_fifo();
}
}
GUI_DrawFont16(0,0,"心率检测",0);
GUI_DrawFont16(0,2,"血氧检测",0);
GUI_DrawFont16(0,4,"血压检测",0);
GUI_DrawFont16(0,6,"健康状态",0);
OLED_ShowString(64,0,":",16);
OLED_ShowString(64,2,":",16);
OLED_ShowString(64,4,":",16);
OLED_ShowString(64,6,":",16);GUI_DrawFont16(72,6,"正常",0);
sprintf(buff,"%3d/Min",0);
OLED_ShowString(72,0,buff,16);
sprintf(buff,"%3d%%",0);
OLED_ShowString(72,2,buff,16);
sprintf(buff,"%3dmmHg",0000);
OLED_ShowString(72,4,buff,16);
// STMFLASH_Write(FLASH_SAVE_ADDR+50,&heart_up,2);
// STMFLASH_Write(FLASH_SAVE_ADDR+12,&heart_dw,2);
// STMFLASH_Write(FLASH_SAVE_ADDR+14,&A_preup,2);
// STMFLASH_Write(FLASH_SAVE_ADDR+16,&A_predw,2);
// STMFLASH_Write(FLASH_SAVE_ADDR+18,&A_hpo2,2);
//读取阈值数据
STMFLASH_Read(FLASH_SAVE_ADDR+50,&heart_up,2);
STMFLASH_Read(FLASH_SAVE_ADDR+12,&heart_dw,2);
STMFLASH_Read(FLASH_SAVE_ADDR+14,&A_preup,2);
STMFLASH_Read(FLASH_SAVE_ADDR+16,&A_predw,2);
STMFLASH_Read(FLASH_SAVE_ADDR+18,&A_hpo2,2);
while(1)
{
Key_Value = KEY_Scan(0);//按键键值获取
//强制心率值120控制
if(Key_Value == 3)
{
heart_beep++;
if(heart_beep>=2) heart_beep = 0;
if(heart_beep == 0)
{
device_state = 0;
beep_flag = 0;
heart = 0;
}
}
//心率算法检测
if(heart_beep == 0)
{
blood_Loop();
if(MAX30102_flag == 1 && g_blooddata.heart != 46)
{
MAX30102_flag = 0;
LED0 = 0;
BEEP = 1;
device_state = 1;
heart = AD_CH_LV1(10,g_blooddata.heart);
hpo2 = AD_CH_LV2(10,(u8)g_blooddata.SpO2);//AD_CH_LV2(10,(u8)g_blooddata.SpO2);//(u8)g_blooddata.SpO2;
delay_ms(100);
LED0 = 1;
BEEP = 0;
}else{
}
if(g_blooddata.heart == 46)
{
heart = 0;
hpo2 = 0;
heart_start=0;
device_state = 0;
}
}else{
heart = 120;
hpo2 = 0;
device_state = 1;
}
//系统数据显示
display0(72,0,heart);
display1(72,2,hpo2);
display_pre(72,4,pre);
display_heart_start(72, 6, beep_flag);
//系统蜂鸣器报警控制
if((device_state == 1 && ((heart < heart_dw || heart > heart_up || hpo2 < A_hpo2))) || ((pre > A_preup) || (pre < A_predw)))
{
beep_flag = 1;
}else{
BEEP = 0;
//LED0 = 1;
beep_flag = 0;
}
//机智云数据上传
userHandle();
gizwitsHandle((dataPoint_t *)¤tDataPoint);//协议处理
WIFI_Contection(Key_Value);
count++;
//系统阈值控制
SYS_Set(Key_Value);
}
}
void display0(u8 x,u8 y,u16 value)
{
static u8 last_value;
if(last_value != value)
{
sprintf(buff,"%3d/Min",value);
OLED_ShowString(x,y,buff,16);
last_value = value;
}
}
void display1(u8 x,u8 y,u16 value)
{
static u8 last_value;
if(last_value != value)
{
sprintf(buff,"%3d%%",value);
OLED_ShowString(x,y,buff,16);
last_value = value;
}
}
void display_pre(u8 x,u8 y,u16 value)
{
static u8 last_value;
if(last_value != value)
{
sprintf(buff,"%3dmmHg",value);
OLED_ShowString(x,y,buff,16);
last_value = value;
}
}
void display_start(u8 x,u8 y,u8 start)
{
static u8 last_value;
if(last_value != start)
{
if(start == 0) OLED_ShowString(x,y,"NO",16);
if(start == 1) OLED_ShowString(x,y,"OK",16);
last_value = start;
}
}
void display_heart_start(u8 x,u8 y,u8 start)
{
static u8 last_value;
if(last_value != start)
{
if(start == 0) GUI_DrawFont16(x,y,"正常 ",0);
if(start == 1) GUI_DrawFont16(x,y,"异常 ",0);
last_value = start;
}
}
##lua代码
见资料包
5、部分参考资料
#下载固件是nodemcu-master-9-modules-2016-03-14-02-11-21-integer.bin
#lua编程入门
#esp8266固件及lua烧录过程入门
6、注意事项
#esp8266使用lua编程时要提前烧录支持lua的固件
#固件可以自己去官网根据需求定制生成,也可以使用现成的
#固件烧录的不同,lua也要对应的变化
#integer 不支持 float,但节省了 11 KB
固件含如下模块: cjson, file, gpio, net, node, pwm, tmr, uart, wifi.
#esp8266有至少两个固件下载的工具,其中一个有的版本不支持