24小(xiǎo)时联系電(diàn)话:18217114652、13661815404
中文(wén)
- 您当前的位置:
- 首页>
- 電(diàn)子资讯>
- 技术专题>
- 在猫砂项目中称重模块...
技术专题
在猫砂项目中称重模块的调试过程
主控芯片:STM32F103RCT6
编程软件:keil5;sourseinsight4
串口调试工具:XCOM V2.5
称重传感器:HX711
1.称重模块的校准模式
使用(yòng)标准10kg砝码进行校准,每隔30ms采集一次ad值,一共采集20个数据,利用(yòng)冒泡排序取数值大小(xiǎo)中间的4个数据,取其平均值,带入计算公式(1) ,得到其称重比例系数mWeightCoe,将其写入空闲的flash当中,多(duō)次使用(yòng)砝码验证过后保存最佳值,最佳值会根据称重模块各有(yǒu)不同。
(1)计算公式:
C=A/(D-B)C=A/(D−B)
实际重量 |
初始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个最小(xiǎo)的
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.称重模块的工作模式
由于本项目要求使用(yòng)红外传感器HC_SR501来感应猫的进入作為(wèi)安全机制,而此模块需要有(yǒu)1分(fēn)钟左右的初始化时间,因此在代码中有(yǒu)一个屏蔽红外的标志(zhì)量以及一个800毫秒(miǎo)的延时。
而称重部分(fēn)考虑到猫作為(wèi)一个活物(wù)所以判断条件是以3次称重都大于500g(不含猫砂)判断猫的进入,3次称重小(xiǎo)于500g(不含猫砂)判断猫的离开,同时能(néng)称出猫的體(tǐ)重以及猫屎的重量。猫的體(tǐ)重由于考虑到猫的活动,所以利用(yòng)方差选取相对平稳的體(tǐ)重作為(wèi)猫的真实體(tǐ)重。
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左右屏蔽人體(tǐ)红外热释電(diàn)初始化///
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("猫离开,如厕时長(cháng)%.1f 屎重:%d\n",mDeviceStatus.poopTime,mDeviceStatus.poopWeight);
}
}else{
delay_ms(800);
}
}}