电子秤是一种较为方便,简单,称量精确的仪器。与日常生活中各个行业息息相关,广泛应用于各种商业,市场及零售业等公共场所。本设计是结合了传感器,基于Ardunio和HX711的多功能电子秤的设计。在Arduino平台,利用ATMEGA328单片机采集电子称模块的数据信息,将信息显示在LCD1602显示屏上,能够通过按键实现去皮计算,价格计算等功能。最后通过在Arduino模块外围搭建电路验证各项功能,达到预期目标。
为了达到电子秤的设计要求,本设计主要采用了Arduino作为控制模块,用单片机ATmega328作为处理核心,物体重量由称重传感器感受后,经由放大器和模数转换器后输入到单片机中进行处理,显示部分选择串口液晶显示重量。本设计外围电路简单,功能齐全,调试便捷。电子秤具体具有以下功能:
(1)能用按键设置单价,同时显示重量和金额。
(2)重量显示:单位为g;最大承重5Kg,重量小于1000g时误差小于0.5g,大于1000g时,误差小于1g。
(3)具有去皮功能。
汽车出入库计时计费系统是以STC89C52单片机为核心,由数据采集、按键输入、液晶显示、蜂鸣器报警以及电机模块组成。数据采集模块包括射频卡FRID-RC522和时钟芯片,用于实时更新当前时间和采集停车入库时间。其中,射频卡的作用是通过刷卡调用当前车辆信息,然后将此信息送入STC89C52单片机中,单片机经过软件编程执行计时计费功能,电机运行,打开门禁。外围电路使用按键来设置相关信息,然后再通过单片机对数据进行处理,在整个过程中通过蜂鸣器报警提示操作是否成功,所涉及到的信息都将在液晶上进行实时显示。
方案一:控制模块采用STC89C51单片机。51系列为八位单片机,入门简单,由于问世较早,所以有着大量的开源资料,而且价格便宜。但是其主频比较低,对于某些数据的处理速度不够快,且没有丰富的外设。
方案二:控制模块采用Arduino单片机。Arduino与51系列同为8位单片机,但比51系列更先进一些,编程变得简单和直观。
方案三:控制模块采用32位的STM32单片机。STM32是基于ARM的32位处理器,具有强大的处理能力和DAC功能。F1系列主频可达72MHz。因此价格也比51系列稍微贵一点。
方案一:采用ADC0832集成芯片外加放大电路。
ADC0832是美国一家公司生产的一种8位分辨率芯片,它不仅与美国双相MOS芯片兼容,而且具有0~8位的高输入输出电压比。但是ADC0832没有内置的集成放大模块,所以需要一个额外的放大电路。放大器电路的稳定性和模数转换器的转换精度将直接决定了电子秤精度、准确度、响应时间等重要的平衡参数。另外,单独设计放大电路及A/D转换电路不仅费事,而且不能保证电路的准确性。
方案二:采用电子秤专用模拟/数字芯片HX711。
称重传感器检测到货物的重量之后,重量信息将被转换成为模拟电压信号,但是单片机只能识别出数字信号,所以要把模拟信号经过模数转换过程,最终转换成为单片机能识别的数字信号;转换成为数字信号之后,由于应变片的形变是微小的形变,导致输出电压信号很微弱,不利于直接使用,所以还要进行放大。在这个过程中,放大器电路的稳定性和转换精度直接影响称重电子设备的称量精度和反应时间。综上所述,高精确的转换芯片——HX711就是实验的最佳选择。
方案一:信号通过惠斯通电桥采样。简称单臂电桥,工作在平衡状态。惠斯通由4个电阻组成的电桥电路,可以精确的出来电阻,利用电阻的变化测量物理量的变化。单片机采集可变电阻两端的电压然后处理,就可以计算出相应的物理量的变化。
方案二:信号通过开尔文电桥采样。简称双臂电桥,工作在不均匀状态,一个或多个桥架往往是转换元件,这些元素的阻力值随一定物理量而变化。可以通过测量换能器电阻的变化来测量相应物理量的变化。它的实际意义不在于为了测量与桥架平衡对应的物理量,并且为了测量物理量的变化,使桥梁偏离平衡状态。
单臂电桥:
Δ u = u 0 4 ( Δ u R ) = u 0 4 K ϵ \Delta u =\frac{u_0}{4}( \frac{\Delta u}{R} )=\frac{u_0}{4}K\epsilon Δu=4u0(RΔu)=4u0Kϵ
双臂电桥:
Δ u = 2 [ u 0 4 ( Δ R R ) ] = 2 [ u 0 4 K ϵ ] \Delta u =2[ \frac{u_0}{4}( \frac{\Delta R}{R} )]=2[\frac{u_0}{4}K\epsilon] Δu=2[4u0(RΔR)]=2[4u0Kϵ]
电桥灵敏度:
S u = n u 0 4 S_u=n \frac{u_0}{4} Su=n4u0
电子秤设计的整体方案:本设计的电子秤由数据采集模块、数据处理模块、按键处理模块、显示模块与主控制器模块等组成[。整体设计方案如图所示。
void setup() { //初始化函数,只执行一次
pinMode(R1, OUTPUT);
pinMode(R2, OUTPUT);
pinMode(R3, OUTPUT);
pinMode(R4, OUTPUT);
pinMode(C1, INPUT_PULLUP);
pinMode(C2, INPUT_PULLUP);
pinMode(C3, INPUT_PULLUP);
pinMode(C4, INPUT_PULLUP);
Serial.begin(9600); // 设置串口波特率
hx.set_offset(17650); // 修改偏移值
lcd.init(); // LCD初始化
lcd.backlight();
lcd.begin(16,2);
}
void loop()
{
i = key_Scan();
if(i ==10) hx.tare(); //清零
/*称重*/
double sum0 = 0;
double sum1 = 0;
for (j = 0; j < 10; j++)
{
sum0 += hx.read();
sum1 += hx.bias_read();
b=sum1/10;
c=abs(b);
}
/*串口显示*/
Serial.println(sum0/10);
Serial.println(c); //采样10次取平均值,放上不同的物体,数据不同,并且保持在一定范围内变化,表示功能正确。
Serial.println(" ");
/*LCD 1602显示*/
lcd.clear();
if(i ==12 )
{
lcd.setCursor(0,5); //光标位置
lcd.print("welcome");
}
/*称重显示*/
lcd.setCursor(0,0);//光标位置
lcd.print("kg:");
lcd.setCursor(3, 0);
lcd.print(c);
lcd.print("g");
/*设置单价*/
lcd.setCursor(0,1);
lcd.print("pri:");
lcd.setCursor(4, 1);
lcd.print(pri);
if(i < 10)
{
pri =pri*10;
pri=pri+i;
if(pri > 99)
{
pri = 0;
}
i = 16;
}
/*计算总价*/
lcd.setCursor(7, 1);
lcd.print("a:");
lcd.setCursor(9, 1);
lcd.print(a);
lcd.print("$");
if(i == 11)
{
m = sum1/10;
n = m/500;
a = n*pri;
}
}
/*按键扫描*/
int key_Scan(){
pinHigh();//扫描第一行
digitalWrite(R1, LOW);
if(digitalRead(C1) == LOW){
while(digitalRead(C1) == LOW);
return 1;
}
if(digitalRead(C2) == LOW){
while(digitalRead(C2) == LOW);
return 2;
}
if(digitalRead(C3) == LOW){
while(digitalRead(C3) == LOW);
return 3;
}
if(digitalRead(C4) == LOW){
while(digitalRead(C4) == LOW);
return 0;
}
pinHigh();//扫描第二行
digitalWrite(R2, LOW);
if(digitalRead(C1) == LOW){
while(digitalRead(C1) == LOW);
return 4;
}
if(digitalRead(C2) == LOW){
while(digitalRead(C2) == LOW);
return 5;
}
if(digitalRead(C3) == LOW){
while(digitalRead(C3) == LOW);
return 6;
}
if(digitalRead(C4) == LOW){
while(digitalRead(C4) == LOW);
return 10;
}
pinHigh();//扫描第三行
digitalWrite(R3, LOW);
if(digitalRead(C1) == LOW){
while(digitalRead(C1) == LOW);
return 7;
}
if(digitalRead(C2) == LOW){
while(digitalRead(C2) == LOW);
return 8;
}
if(digitalRead(C3) == LOW){
while(digitalRead(C3) == LOW);
return 9;
}
if(digitalRead(C4) == LOW){
while(digitalRead(C4) == LOW);
return 11;
}
pinHigh();//扫描第四行
digitalWrite(R4, LOW);
if(digitalRead(C1)== LOW){
while(digitalRead(C1) == LOW);
return 12;
}
if(digitalRead(C2) == LOW){
while(digitalRead(C2) == LOW);
return 13;
}
if(digitalRead(C3) == LOW){
while(digitalRead(C3) == LOW);
return 14;
}
if(digitalRead(C4) == LOW){
while(digitalRead(C4) == LOW);
return 15;
}
return 16;
}
void pinHigh()
{
digitalWrite(R1, HIGH);
digitalWrite(R2, HIGH);
digitalWrite(R3, HIGH);
digitalWrite(R4, HIGH);
}
砝码值(g) | 测量值 (g) | 误差值(g) |
---|---|---|
5 | 5.01 | 0.01 |
10 | 10.02 | 0.02 |
50 | 50.01 | 0.01 |
100 | 100.03 | 0.03 |
500 | 500.1 | 0.1 |