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

主控芯片: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) C=A/(DB)

实际重量初始ad值称重系数校准ad值
weight( A )mZeroAdj( B )mWeightCoe( C )count( D )
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);
		}	
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值