stm32f103c8t6+max30102+ds18b20+OLED显示+阿里云物联网平台AT指令------心率及血氧检测系统的设计与实现

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

效果展示:

  • 25
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,您需要连接STM32F103C8T6和DS18B20。DS18B20是一种数字温度传感器,它使用单线协议进行通信,因此只需要一个GPIO引脚即可连接到STM32F103C8T6。您可以使用任何可用的GPIO引脚,但是在本例中,我们将使用PA0作为数据线。 接下来,您需要连接OLED显示屏。您可以使用SPI或I2C协议与OLED显示屏通信。在本例中,我们将使用I2C协议。您需要将STM32F103C8T6的I2C引脚连接到OLED显示屏的I2C引脚。 在硬件连接完成后,您需要编写STM32F103C8T6的代码来读取DS18B20的温度数据,并将数据显示OLED屏幕上。以下是一个简单的示例代码: ```c #include "stm32f10x.h" #include "i2c.h" #include "ds18b20.h" #include "ssd1306.h" int main(void) { float temp; char buffer[16]; /* 初始化I2C和OLED显示屏 */ I2C_Init(); SSD1306_Init(); /* 读取DS18B20的温度值 */ temp = DS18B20_ReadTemp(); /* 将温度值转换为字符串 */ sprintf(buffer, "Temp: %.2f C", temp); /* 在OLED屏幕上显示温度值 */ SSD1306_GotoXY(0, 0); SSD1306_Puts(buffer, &Font_7x10, SSD1306_COLOR_WHITE); /* 刷新OLED屏幕 */ SSD1306_UpdateScreen(); while (1) { /* 循环等待 */ } } ``` 在上面的代码中,我们使用了ds18b20.h和ssd1306.h头文件,并且假设您已经实现了I2C_Init、SSD1306_Init和DS18B20_ReadTemp函数。在主函数中,我们读取DS18B20的温度值,并将其转换为字符串格式,然后在OLED屏幕上显示。注意,我们使用了SSD1306_GotoXY、SSD1306_Puts和SSD1306_UpdateScreen函数来控制OLED屏幕。 希望这个简单的示例能够帮助您开始控制DS18B20和OLED屏幕。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值