24小时联系电话:18217114652、13661815404

中文

您当前的位置:
首页>
电子资讯>
技术专题>
在猫砂项目中称重模块...

技术专题

在猫砂项目中称重模块的调试过程


主控芯片:STM32F103RCT6
编程软件:keil5;sourseinsight4
串口调试工具:XCOM V2.5

称重传感器:HX711

1.称重模块的校准模式

使用标准10kg砝码进行校准,每隔30ms采集一次ad值,一共采集20个数据,利用冒泡排序取数值大小中间的4个数据,取其平均值,带入计算公式(1) ,得到其称重比例系数mWeightCoe,将其写入空闲的flash当中,多次使用砝码验证过后保存最佳值,最佳值会根据称重模块各有不同。

1)计算公式:
C=A/(D-B)C=A/(D−B)

实际重量

初始ad

称重系数

校准ad

weight( A )

mZeroAdj( B )

mWeightCoe( C )

countD

void adjust_weight(u16 weight){

int i=0;

u32 count=0,sum=0;

float w = weight*1000;

u32 countArray[20]={0};

for(i=0; i<20;i++)

{

delay_ms(30);

countArray[i] =HX711_Read_AD();

}

arrsort(countArray,20);//冒泡排序

//去掉8个最大的和8个最小的

for(i=8;i<12;i++){

sum+=countArray[i];

}

myfree(countArray);

count = sum/4;

printf("count:%d\n",count);

mWeightCoe = w/(count-mZeroAdj);

printf("mWeightCoe:%f Read_Weight:%d\n",mWeightCoe,HX711_Read_Weight()); 

STMFLASH_Write(INFO_FLASH_ADDR, (u16*)&mWeightCoe, 2);}

2.称重模块的工作模式

由于本项目要求使用红外传感器HC_SR501来感应猫的进入作为安全机制,而此模块需要有1分钟左右的初始化时间,因此在代码中有一个屏蔽红外的标志量以及一个800毫秒的延时。
而称重部分考虑到猫作为一个活物所以判断条件是以3称重都大于500g(不含猫砂)判断猫的进入,3称重小于500g(不含猫砂)判断猫的离开,同时能称出猫的体重以及猫屎的重量。猫的体重由于考虑到猫的活动,所以利用方差选取相对平稳的体重作为猫的真实体重。

void weight_task(void * p_arg){

////////重量(g///////

int a_weight=0;

int b_weight=0;

int c_weight=0;

int fangcha;

OS_ERR err;

//////int类型重量///////

u32 time_num= 0;

 

while(1)

{

///计时60s左右屏蔽人体红外热释电初始化///

if(time_num<=80)

{

time_num++;

}

if(time_num>80)

{

mDeviceStatus.infrareCatWork=1;

}

 

if(mDeviceStatus.workingStatus==WORKING_IDLE){

c_weight = b_weight;

b_weight = a_weight;

a_weight = HX711_Read_Weight_2();

if(a_weight<-800)

{

mDeviceStatus.potStatus=1;//盆在

}else{

mDeviceStatus.potStatus=0;//盆不在

}

if(mDeviceStatus.catWeightStatus ==WEIGHT_OUT &&

 (a_weight > mDeviceStatus.litterWeight + 500 && 

 b_weight > mDeviceStatus.litterWeight + 500&&

 c_weight > mDeviceStatus.litterWeight + 500))

{

mDeviceStatus.catWeightStatus=WEIGHT_IN;

printf("猫进入\n");

mDeviceStatus.poopTime=0;

OSTmrStart(&poop_time, &err);

}

if(mDeviceStatus.catWeightStatus==WEIGHT_IN){

fangcha = pow(a_weight-b_weight,2)+pow(a_weight-c_weight,2)+pow(b_weight-c_weight,2);

if(fangcha<50){

Cat_In_Weight= b_weight - mDeviceStatus.litterWeight;

printf("猫重:%d\n",Cat_In_Weight);

}

}

if(mDeviceStatus.catWeightStatus==WEIGHT_IN &&

(a_weight < mDeviceStatus.litterWeight + 500 &&

b_weight < mDeviceStatus.litterWeight + 500&&

c_weight < mDeviceStatus.litterWeight + 500)){

mDeviceStatus.catWeightStatus = WEIGHT_OUT;

if(a_weight>mDeviceStatus.litterWeight)

mDeviceStatus.poopWeight = a_weight - mDeviceStatus.litterWeight;

else

mDeviceStatus.poopWeight=0;


OSTmrStart(&cat_out_wait,&err);//去铲屎

OSTmrStop(&poop_time,OS_OPT_TMR_NONE,0,&err);

printf("猫离开,如厕时长%.1f 屎重:%d\n",mDeviceStatus.poopTime,mDeviceStatus.poopWeight);

}

}else{

delay_ms(800);

}

}}

 




请输入搜索关键字

确定