【沁恒 CH32V208 开发板免费试用】基于CH32和改进数据融合技术的实验室温湿度检测系统设计与实现 - RISC-V MCU技术社区 - 电子技术论坛 - 广受欢迎的专业电子论坛
分享 收藏 返回

sda12138 关注 私信

【沁恒 CH32V208 开发板免费试用】基于CH32和改进数据融合技术的实验室温湿度检测系统设计与实现

本帖最后由 sda12138 于 2023-5-11 11:40 编辑

1.通信设计:
波特率:无
校验位:无
数据位:8
停止位:1
2.程序设计
数据采集见上一篇帖子。1.通信设计:
波特率:无
校验位:无
数据位:8
停止位:1
2.程序设计
数据采集见上一篇帖子。


#include \"dht11.h\"
#include \"sht35.h\"
#include
#include
DHT11_Data_TypeDef DHT11_Data;
void DHT11_GPIO_Config(){
    DHT11_GPIO_Config_1();
    DHT11_GPIO_Config_2();
    DHT11_GPIO_Config_3();
    DHT11_GPIO_Config_4();
    DHT11_GPIO_Config_5();
    DHT11_GPIO_Config_6();
    DHT11_GPIO_Config_7();
    DHT11_GPIO_Config_8();
}
int main(void)
{
    u_int8_t temp_int[8];
    u_int8_t temp_deci[8];
    u_int8_t humi_int[8];
    u_int8_t humi_deci[8];
    u_int8_t index=0;
    double temp[8];
    double humi[8];
    double sumAvg1=0.0;
    double sumAvg2=0.0;
    double jqrh_jg_temp=0;
    double jqrh_jg_humi=0;
    double jqyz[8]={0};
    double jqyz_temp[8]={0};
    double jqyz_humi[8]={0};
    double jqyz_2[8]={0};
    double gaijin_jqrh_jg_temp=0;
    double gaijin_jqrh_jg_humi=0;
    double wcyz_temp[8]={0};
    double wcyz_humi[8]={0};
    double temperatureC;
    double humidityRH;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    Delay_Init();
    USART_Printf_Init(115200);
    printf(\"SystemClk:%d\\r\\n\", SystemCoreClock);
    DHT11_GPIO_Config();
    IIC_GPIO_Init();
    SHT3X_Init();
    printf(\"DHT11初始误差温度=2度,湿度误差=5%\\r\\n\");
    printf(\"SHT35初始误差温度=0.1度,湿度误差=1.5%\\r\\n\");
    while(1)
    {


        sumAvg1=0;
        sumAvg2=0;
        jqrh_jg_temp=0;
        jqrh_jg_humi=0;
        gaijin_jqrh_jg_temp=0;
        gaijin_jqrh_jg_humi=0;
        if(Read_DHT11_1(&DHT11_Data)==SUCCESS_1){
            temp_int[index]=DHT11_Data.temp_int;
            humi_int[index]=DHT11_Data.humi_int;
            temp_deci[index]=DHT11_Data.temp_deci;
            humi_deci[index]=DHT11_Data.humi_deci;
            index++;
        }else {


            printf(\"系统繁忙!\\r\\n\");
        }


        if(Read_DHT11_2(&DHT11_Data)==SUCCESS_2){
            temp_int[index]=DHT11_Data.temp_int;
            humi_int[index]=DHT11_Data.humi_int;
            temp_deci[index]=DHT11_Data.temp_deci;
            humi_deci[index]=DHT11_Data.humi_deci;
            index++;
        }else {


            printf(\"系统繁忙!\\r\\n\");
        }
        if(Read_DHT11_3(&DHT11_Data)==SUCCESS_3){
            temp_int[index]=DHT11_Data.temp_int;
            humi_int[index]=DHT11_Data.humi_int;
            temp_deci[index]=DHT11_Data.temp_deci;
            humi_deci[index]=DHT11_Data.humi_deci;
            index++;
        }else {


            printf(\"系统繁忙!\\r\\n\");
        }
        if(Read_DHT11_4(&DHT11_Data)==SUCCESS_4){
            temp_int[index]=DHT11_Data.temp_int;
            humi_int[index]=DHT11_Data.humi_int;
            temp_deci[index]=DHT11_Data.temp_deci;
            humi_deci[index]=DHT11_Data.humi_deci;
            index++;
        }else {


            printf(\"系统繁忙!\\r\\n\");
        }
        if(Read_DHT11_5(&DHT11_Data)==SUCCESS_5){
            temp_int[index]=DHT11_Data.temp_int;
            humi_int[index]=DHT11_Data.humi_int;
            temp_deci[index]=DHT11_Data.temp_deci;
            humi_deci[index]=DHT11_Data.humi_deci;
            index++;
        }else {


            printf(\"系统繁忙!\\r\\n\");
        }


        if(Read_DHT11_6(&DHT11_Data)==SUCCESS_6){
            temp_int[index]=DHT11_Data.temp_int;
            humi_int[index]=DHT11_Data.humi_int;
            temp_deci[index]=DHT11_Data.temp_deci;
            humi_deci[index]=DHT11_Data.humi_deci;
            index++;
           }else {


             printf(\"系统繁忙!\\r\\n\");
           }


        if(Read_DHT11_7(&DHT11_Data)==SUCCESS_7){
            temp_int[index]=DHT11_Data.temp_int;
            humi_int[index]=DHT11_Data.humi_int;
            temp_deci[index]=DHT11_Data.temp_deci;
            humi_deci[index]=DHT11_Data.humi_deci;
            index++;
           }else {


               printf(\"系统繁忙!\\r\\n\");
           }
         if(Read_DHT11_8(&DHT11_Data)==SUCCESS_8){
             temp_int[index]=DHT11_Data.temp_int;
             humi_int[index]=DHT11_Data.humi_int;
             temp_deci[index]=DHT11_Data.temp_deci;
             humi_deci[index]=DHT11_Data.humi_deci;
             index++;
           }else {
             printf(\"系统繁忙!\\r\\n\");
        }
         for (int i = 0; i < 8; i++)
         {
             temp = temp_int + temp_deci/10.0;
         }
         for (int i = 0; i < 8; i++)
         {
              humi =humi_int + humi_deci/10.0;
         }
         printf(\"传感器温度检测值1-8号\\r\\n\");
         for(int i=0;i<8;i++){
             printf(\"%d号传感器温度是===%.1lf\\r\\n\",i+1,temp);


         }
         printf(\"传感器湿度检测值1-8号\\r\\n\");
         for(int i=0;i<8;i++)
         {
            printf(\"%d号传感器湿度是===%.1lf\\r\\n\",i+1,humi);


         }
         index=0;
        //参考温度,湿度
         SHT3X_DATA(&temperatureC,&humidityRH);
         printf(\"高精度传感器------>传感器温度是=%lf\\r\\n\", temperatureC);
         printf(\"高精度传感器------>传感器湿度是=%lf\\r\\n\", humidityRH);
         for (int i = 0; i < 8; i++) {
            sumAvg1+=temp;
            sumAvg2+=humi;
         }
         double jqyz_sum_temp=0;
         double jqyz_sum_humi=0;
         sumAvg1=sumAvg1/8;
         sumAvg2=sumAvg2/8;


         for(int i=0;i<8;i++){
             if (sumAvg1==temp) {
                sumAvg1=sumAvg1+0.000001;
                printf(\"温度补偿平均值------>均值是=%lf\\r\\n\", sumAvg1);
            }
             if (sumAvg2==humi) {
                 sumAvg2=sumAvg2+0.000001;
                 printf(\"湿度补偿平均值------>均值是=%lf\\r\\n\", sumAvg2);
            }
         }


         //传统加权融合算法
        for(int i=0; i<8; i++)
        {
            jqyz_temp=1.0/((sumAvg1-temp)*(sumAvg1-temp)
                            );
            jqyz_humi=1.0/((sumAvg2-humi)*(sumAvg2-humi));
        }
        for(int i=0;i<8;i++){
            jqyz_sum_temp+=jqyz_temp;
            jqyz_sum_humi+=jqyz_humi;
        }
        for(int i=0; i<8; i++)
        {
            jqyz=1.0/((sumAvg1-temp)*(sumAvg1-temp)
                       *(jqyz_sum_temp));
            jqyz_2=1.0/((sumAvg2-humi)*(sumAvg2-humi)
                              *(jqyz_sum_humi));
        }
        //输出结果
        for(int i=0; i<8; i++)
        {
            jqrh_jg_temp+=(temp*jqyz);
            jqrh_jg_humi+=(humi*jqyz_2);


        }
        printf(\"传统加权融合算法------>传感器温度是=%lf\\r\\n\", jqrh_jg_temp);
        printf(\"传统加权融合算法------>传感器湿度是=%lf\\r\\n\", jqrh_jg_humi);




        //固定权值
        jqyz_sum_temp=0;
        jqyz_sum_humi=0;
        for(int i=0; i<8; i++)
          {
              jqyz_temp=1.0/((temp-temperatureC)*(temp-temperatureC));
              jqyz_humi=1.0/((humi-humidityRH)*(humi-humidityRH));
          }
        for(int i=0;i<8;i++)
        {
           jqyz_sum_temp+=jqyz_temp;
           jqyz_sum_humi+=jqyz_humi;
       }
        for(int i=0;i<8;i++){
            wcyz_temp=1.0/((temp-temperatureC)*(temp-temperatureC)*jqyz_sum_temp);
            wcyz_humi=1.0/((humi-humidityRH)*(humi-humidityRH)*jqyz_sum_humi);
        }


        //改进算法
        for(int i=0; i<8; i++)
       {
           gaijin_jqrh_jg_temp+=(temp*(jqyz*0.92+0.08*wcyz_temp));
           gaijin_jqrh_jg_humi+=(humi*(jqyz_2*0.95+0.05*wcyz_humi));


       }
        printf(\"改进加权融合算法------>传感器温度是=%lf\\r\\n\", gaijin_jqrh_jg_temp);
        printf(\"改进加权融合算法------>传感器湿度是=%lf\\r\\n\", gaijin_jqrh_jg_humi);


        printf(\"改进加权融合算法------>传感器温度绝对误差是=%lf\\r\\n\", fabs(gaijin_jqrh_jg_temp-temperatureC));
        printf(\"改进加权融合算法------>传感器湿度绝对误差是=%lf\\r\\n\", fabs(gaijin_jqrh_jg_humi-humidityRH));
        printf(\"传统加权融合算法------>传感器温度绝对误差是=%lf\\r\\n\", fabs(jqrh_jg_temp-temperatureC));
        printf(\"传统加权融合算法------>传感器湿度绝对误差是=%lf\\r\\n\", fabs(jqrh_jg_humi-humidityRH));
        for(int i=0;i<8;i++)
        {
            printf(\"单传感器系统------>%d号传感器温度相对误差是=%lf%%\\r\\n\",i+1,(fabs(temp-temperatureC)/temperatureC)*100);
        }
        for(int i=0;i<8;i++)
        {
            printf(\"单传感器系统------>%d号传感器湿度度相对误差是=%lf%%\\r\\n\",i+1,(fabs(humi-humidityRH)/humidityRH)*100);
        }
        printf(\"改进加权融合算法温度------>传感器温度相对误差是=%lf%%\\r\\n\",(fabs(gaijin_jqrh_jg_temp-temperatureC)/temperatureC)*100);
        printf(\"改进加权融合算法湿度------>传感器湿度相对误差是=%lf%%\\r\\n\", (fabs(gaijin_jqrh_jg_humi-humidityRH)/humidityRH)*100);
        printf(\"传统加权融合算法温度------>传感器温度相对误差是=%lf%%\\r\\n\", (fabs(jqrh_jg_temp-temperatureC)/temperatureC)*100);
        printf(\"传统加权融合算法湿度------>传感器湿度相对误差是=%lf%%\\r\\n\", (fabs(jqrh_jg_humi-humidityRH)/humidityRH)*100);
        printf(\"\\r\\n\");
        Delay_Ms(1500);
    }
    return 0;
}

  • 屏幕截图 2023-05-09 091112.png

更多回帖

×