基于Arduino的电子秤设计

设计背景

电子秤是一种较为方便,简单,称量精确的仪器。与日常生活中各个行业息息相关,广泛应用于各种商业,市场及零售业等公共场所。本设计是结合了传感器,基于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系列稍微贵一点。

A/D转换方案选择

方案一:采用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)
55.010.01
1010.020.02
5050.010.01
100100.030.03
500500.10.1
  • 5
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
隨著資通技術(ICT)的進步與普及,資料變得不僅取得方便也傳播快速。然 而,在網路搜尋到的資料越來越巨量,您或許正煩惱如何將資料篩選出正確的資 訊,進而萃取出您要的知識?如何獲得同時具廣度與深度的知識?如何一次就獲 得最正確的知識? 為了解決這些困惱大家的問題,曹博士、許博士與敝人計畫製作一系列「知 識速成」書籍來傳遞具廣度與深度的專業知識,由具專業背景的作者來撰寫,希 望讀者能利用這些書籍迅速掌握正確知識。首先規劃介紹 ICT 的「知識速成」書 籍,內容將包含技術應用面及運作原理面。 這是我們製作的第一本書,主要介紹以 Arduino 製作電子秤的實作與原理。 Arduino 是近來相當受到重視的單晶片控制裝置,除了可用來控制電子設備外, 許多玩家也利用 Arduino 成功玩出一些具創意的互動設計與數位藝術。由於 Arduino 的使用簡單,許多專業系所及學校社團都推出課程與工作坊來學習與推 廣。 以往介紹 ICT 技術的書籍大都只介紹實作的結果,列出程式碼,但並沒有多 解釋運作的原理與理由,看完後仍無法輕易地轉移經驗至其他實作上。本書是能 完全自修的書,讀完後不僅能依據書本的實作說明準備材料來製作,盡情享受 DIY(Do It Yourself)的樂趣,還能了解其原理並推展至其他應用。有興趣的讀者可 再利用書後的參考文獻繼續研讀相關資料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值