8266 PA1那个不用接,加上配套代码,配上阿里云平台就先完成一下功能
/*************************************************************************************
**************************************************************************************/
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "max30102.h"
#include "myiic.h"
#include "oled.h"
#include "algorithm_by_RF.h"
#include "ds18b20.h"
//×Ô¼º¶¨Òå
#define BUFFER_SIZE (FS*ST)
#define ESP8266_ALIYUN_INFO "AT+MQTTCONN=0,\"k157mvw3MJZ.iot-as-mqtt.cn-shanghai.aliyuncs.com\",1883,0\r\n"
#define AUTH_INFO "AT+MQTTUSERCFG=0,1,\"mqtt_stm32|securemode=2\\,signmethod=hmacsha1\\,timestamp=1714025343898|\",\"mqtt_stm32&k157mvw3MJZ\",\"355B8FE5105348F2EE4D869D0DC3EBF8A63C00AF\",0,0,\"\"\r\n" //¼øȨÐÅÏ¢
#define SUBSCRIBE "AT+MQTTSUB=0,\"/sys/k157mvw3MJZ/mqtt_stm32/thing/service/property/set\",0\r\n"
char json[]="AT+MQTTPUB=0,\"/sys/k157mvw3MJZ/mqtt_stm32/thing/event/property/post\",\"{\\\"params\\\":{\\\"HeartRate\\\":%d\\\,\\\"blood\\\":%d\\\,\\\"temp\\\":%f\\\,\\\"LED\\\":%d}\\\,\\\"version\\\":\\\"1.0.0\\\"}\",0,0\r\n"; //¸ü»»ÁËJSONÊý¾ÝÐÎʽ£¬·ûºÏOneNETÐèÇó
char t_json[300];
u8 USART_RX2_BUF[30];
char rx2_flag=0;
char led_flag1=0,ledup=0;
uint8_t max_id;
//Continuously taking samples from MAX30102. Heart rate and SpO2 are calculated every ST seconds
float n_spo2,ratio,correl; //SPO2 value
int8_t ch_spo2_valid; //indicator to show if the SPO2 calculation is valid
int32_t n_heart_rate; //heart rate value
int8_t ch_hr_valid; //indicator to show if the heart rate calculation is valid
int32_t i;
char hr_str[10];
uint8_t temp[6];
int b=0;
int a;
uint8_t data[3]={0,0,0};//ÓÃÓÚÀúÊ·ÖµÂ˲¨
int a_xins=100,a_xinx=60,a_xue=90,a_tis=37,a_tix=20;
int main()
{
short temperature;
int count=0;
int mode=1;
uint32_t aun_ir_buffer[BUFFER_SIZE]; //infrared LED sensor data
uint32_t aun_red_buffer[BUFFER_SIZE]; //red LED sensor data
uint8_t uch_dummy;
u8 str1[20];
u8 str2[20];
u8 strwd[20];
//END
NVIC_Configuration();
delay_init(); //ÑÓʱº¯Êý³õʼ»¯
uart_init(115200); //´®¿Ú³õʼ»¯Îª115200
//OLED
OLED_Init();
LED_Init();
BEEP=1;
OLED_ShowString(0,0," initializing ");
LED=1;
while(DS18B20_Init()); //DS18B20³õʼ»¯
printf("AT+RST\r\n");delay_ms(1500);delay_ms(1500); //
printf(AUTH_INFO);delay_ms(1500);delay_ms(1500); //
printf(ESP8266_ALIYUN_INFO);delay_ms(1500);delay_ms(1500); //wifi
printf(SUBSCRIBE);delay_ms(1500);delay_ms(1500); //?
//max30102³õʼ»¯²Ù×÷
max30102_reset(); //resets the MAX30102
delay_ms(1000);
maxim_max30102_read_reg(REG_INTR_STATUS_1,&uch_dummy); //Reads/clears the interrupt status register
max30102_init(); //initialize the MAX30102
//¶ÁID
max_id= max30102_Bus_Read(REG_PART_ID);
//³õʼ»¯½áÊø
OLED_ShowString(0,0," ");
OLED_ShowCHinese(0,0,0);//ÖÐ
OLED_ShowCHinese(18,0,1);//ÖÐ
OLED_ShowCHinese(0,2,2);//ÖÐ
OLED_ShowCHinese(18,2,3);//ÖÐ
OLED_ShowCHinese(0,4,5);//ÖÐ
OLED_ShowCHinese(18,4,11);//ÖÐ
//OLED_ShowCHinese(0,6,6);//ÖÐ
//OLED_ShowCHinese(18,6,7);//ÖÐ
OLED_ShowString(36,0,":");
OLED_ShowString(36,2,":");
OLED_ShowString(36,4,":");
//OLED_ShowString(36,6,":");
OLED_ShowString(72,4,".");
while(1)
{
//buffer length of BUFFER_SIZE stores ST seconds of samples running at FS sps
//read BUFFER_SIZE samples, and determine the signal range
for(i=0;i<BUFFER_SIZE;i++)
{
while(MAX30102_INT==1); //wait until the interrupt pin asserts;
max30102_FIFO_ReadBytes(REG_FIFO_DATA,temp);//´ÓMAX30102¶ÁÊý¾Ý
//ºìÉ«Èý×Ö½ÚÊý×Ö£¬ºìÍâÈý×Ö½ÚÊý¾Ý
aun_ir_buffer[i] = (long)((long)((long)temp[0]&0x03)<<16) | (long)temp[1]<<8 | (long)temp[2]; // Combine values to get the actual number
aun_red_buffer[i] = (long)((long)((long)temp[3] & 0x03)<<16) |(long)temp[4]<<8 | (long)temp[5];
if(b>50)
//printf("%d ", aun_ir_buffer[i]);
OLED_ShowChar(118,0,'X');
if(aun_ir_buffer[i]>20000)//Ò»°ã°
{
b++;
if(b>80)//·ÀÖ¹bÒç³ö
b=51;//´óÓÚ51¾ÍÐÐ
}
else//ËÉÊÖʱb±ä»Ø0£¬ÎªÏÂÒ»´Î°´ÏÂÈÓÇ°ÃæÑù±¾×ö×¼±¸
{
b=0;
i=BUFFER_SIZE;//ËÉÊÖÖ¸»ù±¾²»Ö´ÐиÃÑ»·
aun_ir_buffer[0]=0;//·ÀÖ¹ÏÂÃæµÄË㷨ͨ¹ý
aun_ir_buffer[80]=0;//ÓÃforÀË·Ñ£¬·ÀÖ¹ÏÂÃæË㷨ͨ¹ý
aun_ir_buffer[35]=0;
aun_ir_buffer[20]=0;
aun_ir_buffer[50]=0;
aun_ir_buffer[149]=0;
aun_ir_buffer[100]=0;
}
if(b==50)//ÿ´Î°´ÏÂʱÈÓµôÇ°ÃæµÄ50×éÑù±¾£¬ºóÃæ¾Í²»ÈÓÁË
{
i=-1;
b=51;
}
}
//calculate heart rate and SpO2 after BUFFER_SIZE samples (ST seconds of samples) using Robert's method
//Èç¹ûÓÐЧ¿ªÊ¼¼ÆËãÐÄÂÊѪÑõ
//calculate heart rate and SpO2 after BUFFER_SIZE samples (ST seconds of samples) using Robert's method
rf_heart_rate_and_oxygen_saturation(aun_ir_buffer, BUFFER_SIZE, aun_red_buffer, &n_spo2, &ch_spo2_valid, &n_heart_rate, &ch_hr_valid, &ratio, &correl);
//ÓÐʱºò²»ÖªµÀΪɶ»áµ¯³öÒ»¸öËÉÊÖºóһ˲¼ähr=40¶àµÄÊý¾Ý£¬ËùÒÔ¼ÓÏÂÃæµÄÅжÏ
//ÊÇÒòΪforÄÇÀïËÉÊÖ²»Ö´ÐÐÁË£¬µ¼ÖÂÔÀ´µÄÖµ²ÐÁô£¬È»ºóËã·¨Ö´ÐÐͨ¹ýÁË£¬ËùÒÔ×îºÃ¼ÓÏÂÃæ»òÕßÉÏÃæ¶à¸³Öµ¼¸¸ö0
if(aun_ir_buffer[0]<70000||aun_ir_buffer[80]<70000||aun_ir_buffer[110]<70000||aun_ir_buffer[149]<70000)
ch_hr_valid=0;
// printf("HR:%3d SpO2:%3d ",n_heart_rate,(uint16_t)n_spo2);//**HR:%3d SpO2:%3d
if((ch_hr_valid == 1)&&(ch_spo2_valid == 1))
{
//ÀúÊ·ÖµÂ˲¨
data[0]=data[1];
data[1]=data[2];
data[2]=n_heart_rate;
if(data[1]>20&&data[0]>20)//´óÓÚ0¼´¿É
n_heart_rate=(data[0]+data[1]+data[2])/3;
sprintf((char *)str1,"%3d",n_heart_rate);//**HR:%3d SpO2:%3d
sprintf((char *)str2,"%3d",(uint16_t)n_spo2);//**HR:%3d SpO2:%3d
OLED_ShowString(54,0,str1);
OLED_ShowString(54,2,str2);
}
else
{
data[0]=0;
data[1]=0;
data[2]=0;
n_heart_rate=0;
n_spo2=0;
//sprintf((char *)str,"HR:--- SpO2:---");//**HR:%3d SpO2:%3d
OLED_ShowString(54,0,"---");
OLED_ShowString(54,2,"---");
OLED_ShowChar(118,0,' ');
}
if((ch_hr_valid == 1)&&(ch_spo2_valid == 1))
{
sprintf(t_json, json, n_heart_rate ,(uint16_t)n_spo2 ,temperature/10.0,ledup);
printf(t_json);
}
temperature=DS18B20_Get_Temp();
if(temperature<0)
{
// LCD_ShowChar(60+40,150,'-',16,0); //ÏÔʾ¸ººÅ
temperature=-temperature; //תΪÕýÊý
}
sprintf((char *)strwd,"%3d",temperature/10);//**HR:%3d SpO2:%3d
OLED_ShowString(46,4,strwd);
OLED_ShowChar(80,4,temperature%10+0x30);
OLED_ShowChar(0,6,a_xins%1000/100+0x30);
OLED_ShowChar(8,6,a_xins%100/10+0x30);
OLED_ShowChar(16,6,a_xins%10+0x30);
OLED_ShowChar(32,6,a_xinx%1000/100+0x30);
OLED_ShowChar(40,6,a_xinx%100/10+0x30);
OLED_ShowChar(48,6,a_xinx%10+0x30);
OLED_ShowChar(64,6,a_xue/10+0x30);
OLED_ShowChar(72,6,a_xue%10+0x30);
OLED_ShowChar(88,6,a_tis/10+0x30);
OLED_ShowChar(96,6,a_tis%10+0x30);
OLED_ShowChar(112,6,a_tix/10+0x30);
OLED_ShowChar(120,6,a_tix%10+0x30);
if((ch_hr_valid != 1)||(ch_spo2_valid != 1))
{
count++;
if(count>50)
{count=1;
sprintf(t_json, json, n_heart_rate ,(uint16_t)n_spo2 ,temperature/10.0,ledup);
printf(t_json);
}
}
if(USART_RX2_BUF[11] == '1')
{
LED = 0;led_flag1=1;ledup=1;
}
else if(USART_RX2_BUF[11] == '0')
{
LED = 1;led_flag1=0;
}
if(led_flag1==0)
{
if((n_heart_rate>a_xins)||((n_heart_rate<a_xinx)&&(n_heart_rate!=0))||(((uint16_t)n_spo2<a_xue)&&((uint16_t)n_spo2!=0))||(temperature>(a_tis*10))||((temperature<(a_tix*10)&&(temperature!=0))))
{LED=0;ledup=1;}
else
{LED=1;ledup=0;}
}
// OLED_ShowChar(100,4,USART_RX2_BUF[11]);
// OLED_ShowChar(108,4,USART_RX2_BUF[12]);
// OLED_ShowChar(116,4,USART_RX2_BUF[13]);
// printf(USART_RX2_BUF);
/* if((n_heart_rate>a_xins)||((n_heart_rate<a_xinx)&&(n_heart_rate!=0))||(((uint16_t)n_spo2<a_xue)&&((uint16_t)n_spo2!=0))||(temperature>(a_tis*10))||((temperature<(a_tix*10)&&(temperature!=0))))
{BEEP=0;}
else
{BEEP=1;} */
}
}
AT //测试指令
AT+RST //复位指令
1.AT+CWMODE=1
AT+CWDHCP=1,1 //启动DHCP
2.AT+CWJAP="ESP8266","88888888"
3.AT+MQTTUSERCFG=0,1,"mqtt_stm32|securemode=2\,signmethod=hmacsha1\,timestamp=1714025343898|","mqtt_stm32&k157mvw3MJZ","355B8FE5105348F2EE4F8A63C00AF",0,0,""
4.AT+MQTTCONN=0,"k157mvw3MJZ.iot-as-mqtt.cn-shanghai.aliyuncs.com",1883,0
5.AT+MQTTSUB=0,"/sys/k157mvw3MJZ/mqtt_stm32/thing/service/property/set",0
6.AT+MQTTPUB=0,"/sys/k157mvw3MJZ/mqtt_stm32/thing/event/property/post","{\"params\":{\"HeartRate\":120\,\"blood\":96\,\"temp\":25\,\"LED\":1}\,\"version\":\"1.0.0\"}",0,0
效果展示: