1
本帖最后由 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;
}
|
|