迪文科技论坛

 找回密码
 立即注册
搜索
查看: 756|回复: 0

【开源】多功能称重器

[复制链接]

17

主题

114

回帖

1287

积分

金牌会员

Rank: 6Rank: 6

积分
1287
QQ
发表于 2024-3-21 15:54:46 | 显示全部楼层 |阅读模式
本帖最后由 二哲科技 于 2024-3-21 15:57 编辑

1、介绍
正常的称重设备都只能计算物体的重量,输入价格计算出总价,这种设备比较单一,可能不太适合目前的多数应用场景,今天设计的一款多功能称重器他具有计价、计数和曲线功能,话不多说,我们来看一下怎么设计的。


2、硬件准备
4英寸迪文科技COF超薄智能串口屏一体化触摸液晶 DMG48480F040_01W【https://www.dwin.com.cn/product_detail_4840449.html




HX711模块+5kg压力传感器套装




3、设计
首先是设计素材,我采用Adobe Illustrator软件进行设计,本次设计没有其余控件,都是采用页面形式,素材如下。



第一个是首页,有产品标题和进入按钮,首页右上角会显示传感器的数值。



之后是菜单页面,菜单页面有四个选项,计价,计数,曲线和矫正,矫正功能主要是为了矫正传感器的基数。



来看看计价功能的界面,会显示重量、单价和总价,右边是对价格的一个输入,同时还有去皮按钮,进入计价界面时,会默认去皮一次。



再来看看计数功能的界面,这个功能主要是用于计算物品的个数,根据单个物品的重量来计算整个物品的个数,可以用于串串香的数签,或者计算硬币数量等。



最后就是曲线功能的界面,曲线功能主要是为了直观查看到物品挥发过程中的重量变化,比数字更加直观,可以用于一些科学研究的场景。



矫正功能就是矫正称重器的准度,因为不同的传感器会有些许的区别,所以需要进行矫正。



计价功能主要是重量的显示,价格输入的显示和总价的显示,主要代码如下:
  1. //计价页面===================
  2. #define VALUATION_UNIT_PRICE_ADDR 0x1010
  3. #define VALUATION_GRAM_ADDR 0x1000
  4. #define VALUATION_TOTAL_PRICES_ADDR 0x1020

  5. uint32_t valuation_decorticate = 0;   //计价去皮重量
  6. uint32_t valuation_unit_price = 0;    //单价

  7. //单价刷新
  8. void page_valuation_unit_price_refresh()
  9. {
  10.     uint8_t test_display[10] = {0};
  11.     if(valuation_unit_price < 1000)
  12.     {
  13.         test_display[0] = valuation_unit_price / 100 % 10 + 0x30;
  14.         test_display[1] = '.';
  15.         test_display[2] = valuation_unit_price / 10 % 10 + 0x30;
  16.         test_display[3] = valuation_unit_price / 1 % 10 + 0x30;
  17.         dgus_show_text_value_set(VALUATION_UNIT_PRICE_ADDR, test_display, 4);
  18.     }
  19.     else if(valuation_unit_price < 10000)
  20.     {
  21.         test_display[0] = valuation_unit_price / 1000 % 10 + 0x30;
  22.         test_display[1] = valuation_unit_price / 100 % 10 + 0x30;
  23.         test_display[2] = '.';
  24.         test_display[3] = valuation_unit_price / 10 % 10 + 0x30;
  25.         test_display[4] = valuation_unit_price / 1 % 10 + 0x30;
  26.         dgus_show_text_value_set(VALUATION_UNIT_PRICE_ADDR, test_display, 4);
  27.     }
  28.     else if(valuation_unit_price < 100000)
  29.     {
  30.         test_display[0] = valuation_unit_price / 10000 % 10 + 0x30;
  31.         test_display[1] = valuation_unit_price / 1000 % 10 + 0x30;
  32.         test_display[2] = valuation_unit_price / 100 % 10 + 0x30;
  33.         test_display[3] = '.';
  34.         test_display[4] = valuation_unit_price / 10 % 10 + 0x30;
  35.         test_display[5] = valuation_unit_price / 1 % 10 + 0x30;
  36.         dgus_show_text_value_set(VALUATION_UNIT_PRICE_ADDR, test_display, 4);
  37.     }
  38.     else if(valuation_unit_price < 1000000)
  39.     {
  40.         test_display[0] = valuation_unit_price / 100000 % 10 + 0x30;
  41.         test_display[1] = valuation_unit_price / 10000 % 10 + 0x30;
  42.         test_display[2] = valuation_unit_price / 1000 % 10 + 0x30;
  43.         test_display[3] = valuation_unit_price / 100 % 10 + 0x30;
  44.         test_display[4] = '.';
  45.         test_display[5] = valuation_unit_price / 10 % 10 + 0x30;
  46.         test_display[6] = valuation_unit_price / 1 % 10 + 0x30;
  47.         dgus_show_text_value_set(VALUATION_UNIT_PRICE_ADDR, test_display, 4);
  48.     }
  49. }

  50. //重量刷新
  51. void page_valuation_weight_refresh()
  52. {
  53.     uint8_t test_display[10] = {0x30};
  54.     uint32_t gram_display = 0;

  55.     if(gram_value >= valuation_decorticate)
  56.     {
  57.         gram_display = gram_value - valuation_decorticate;
  58.         if(gram_display < 10)
  59.         {
  60.             test_display[0] = gram_display / 1 % 10 + 0x30;
  61.             dgus_show_text_value_set(VALUATION_GRAM_ADDR, test_display, 3);
  62.         }
  63.         else if(gram_display < 100)
  64.         {
  65.             test_display[0] = gram_display / 10 % 10 + 0x30;
  66.             test_display[1] = gram_display / 1 % 10 + 0x30;
  67.             dgus_show_text_value_set(VALUATION_GRAM_ADDR, test_display, 3);
  68.         }
  69.         else if(gram_display < 1000)
  70.         {
  71.             test_display[0] = gram_display / 100 % 10 + 0x30;
  72.             test_display[1] = gram_display / 10 % 10 + 0x30;
  73.             test_display[2] = gram_display / 1 % 10 + 0x30;
  74.             dgus_show_text_value_set(VALUATION_GRAM_ADDR, test_display, 3);
  75.         }
  76.         else if(gram_display < 10000)
  77.         {
  78.             test_display[0] = gram_display / 1000 % 10 + 0x30;
  79.             test_display[1] = gram_display / 100 % 10 + 0x30;
  80.             test_display[2] = gram_display / 10 % 10 + 0x30;
  81.             test_display[3] = gram_display / 1 % 10 + 0x30;
  82.             dgus_show_text_value_set(VALUATION_GRAM_ADDR, test_display, 3);
  83.         }
  84.         else if(gram_display < 100000)
  85.         {
  86.             test_display[0] = gram_display / 10000 % 10 + 0x30;
  87.             test_display[1] = gram_display / 1000 % 10 + 0x30;
  88.             test_display[2] = gram_display / 100 % 10 + 0x30;
  89.             test_display[3] = gram_display / 10 % 10 + 0x30;
  90.             test_display[4] = gram_display / 1 % 10 + 0x30;
  91.             dgus_show_text_value_set(VALUATION_GRAM_ADDR, test_display, 3);
  92.         }
  93.     }
  94.     else
  95.     {
  96.         dgus_show_text_value_set(VALUATION_GRAM_ADDR, test_display, 3);
  97.     }
  98. }

  99. //总价刷新
  100. void page_valuation_price_refresh()
  101. {
  102.     uint32_t price_value = 0;
  103.     uint8_t test_display[10] = {0x30, '.', 0x30, 0x30};

  104.     if(gram_value >= valuation_decorticate)
  105.     {
  106.         price_value = (gram_value - valuation_decorticate) * valuation_unit_price * 2 / 1000;
  107.         if(price_value < 1000)
  108.         {
  109.             test_display[0] = price_value / 100 % 10 + 0x30;
  110.             test_display[1] = '.';
  111.             test_display[2] = price_value / 10 % 10 + 0x30;
  112.             test_display[3] = price_value / 1 % 10 + 0x30;
  113.             dgus_show_text_value_set(VALUATION_TOTAL_PRICES_ADDR, test_display, 4);
  114.         }
  115.         else if(price_value < 10000)
  116.         {
  117.             test_display[0] = price_value / 1000 % 10 + 0x30;
  118.             test_display[1] = price_value / 100 % 10 + 0x30;
  119.             test_display[2] = '.';
  120.             test_display[3] = price_value / 10 % 10 + 0x30;
  121.             test_display[4] = price_value / 1 % 10 + 0x30;
  122.             dgus_show_text_value_set(VALUATION_TOTAL_PRICES_ADDR, test_display, 4);
  123.         }
  124.         else if(price_value < 100000)
  125.         {
  126.             test_display[0] = price_value / 10000 % 10 + 0x30;
  127.             test_display[1] = price_value / 1000 % 10 + 0x30;
  128.             test_display[2] = price_value / 100 % 10 + 0x30;
  129.             test_display[3] = '.';
  130.             test_display[4] = price_value / 10 % 10 + 0x30;
  131.             test_display[5] = price_value / 1 % 10 + 0x30;
  132.             dgus_show_text_value_set(VALUATION_TOTAL_PRICES_ADDR, test_display, 4);
  133.         }
  134.         else if(price_value < 1000000)
  135.         {
  136.             test_display[0] = price_value / 100000 % 10 + 0x30;
  137.             test_display[1] = price_value / 10000 % 10 + 0x30;
  138.             test_display[2] = price_value / 1000 % 10 + 0x30;
  139.             test_display[3] = price_value / 100 % 10 + 0x30;
  140.             test_display[4] = '.';
  141.             test_display[5] = price_value / 10 % 10 + 0x30;
  142.             test_display[6] = price_value / 1 % 10 + 0x30;
  143.             dgus_show_text_value_set(VALUATION_TOTAL_PRICES_ADDR, test_display, 4);
  144.         }
  145.     }
  146.     else
  147.     {
  148.         dgus_show_text_value_set(VALUATION_TOTAL_PRICES_ADDR, test_display, 4);
  149.     }

  150. }

  151. void page_valuation_decorticate()
  152. {
  153.     valuation_decorticate = gram_value;
  154.     page_valuation_weight_refresh();
  155. }

  156. void page_valuation_1()
  157. {
  158.     if(valuation_unit_price < 100000)
  159.     {
  160.         valuation_unit_price = valuation_unit_price * 10 + 1;
  161.         page_valuation_unit_price_refresh();
  162.     }
  163. }
  164. void page_valuation_2()
  165. {
  166.     if(valuation_unit_price < 100000)
  167.     {
  168.         valuation_unit_price = valuation_unit_price * 10 + 2;
  169.         page_valuation_unit_price_refresh();
  170.     }
  171. }
  172. void page_valuation_3()
  173. {
  174.     if(valuation_unit_price < 100000)
  175.     {
  176.         valuation_unit_price = valuation_unit_price * 10 + 3;
  177.         page_valuation_unit_price_refresh();
  178.     }
  179. }
  180. void page_valuation_4()
  181. {
  182.     if(valuation_unit_price < 100000)
  183.     {
  184.         valuation_unit_price = valuation_unit_price * 10 + 4;
  185.         page_valuation_unit_price_refresh();
  186.     }
  187. }
  188. void page_valuation_5()
  189. {
  190.     if(valuation_unit_price < 100000)
  191.     {
  192.         valuation_unit_price = valuation_unit_price * 10 + 5;
  193.         page_valuation_unit_price_refresh();
  194.     }
  195. }
  196. void page_valuation_6()
  197. {
  198.     if(valuation_unit_price < 100000)
  199.     {
  200.         valuation_unit_price = valuation_unit_price * 10 + 6;
  201.         page_valuation_unit_price_refresh();
  202.     }
  203. }
  204. void page_valuation_7()
  205. {
  206.     if(valuation_unit_price < 100000)
  207.     {
  208.         valuation_unit_price = valuation_unit_price * 10 + 7;
  209.         page_valuation_unit_price_refresh();
  210.     }
  211. }
  212. void page_valuation_8()
  213. {
  214.     if(valuation_unit_price < 100000)
  215.     {
  216.         valuation_unit_price = valuation_unit_price * 10 + 8;
  217.         page_valuation_unit_price_refresh();
  218.     }
  219. }
  220. void page_valuation_9()
  221. {
  222.     if(valuation_unit_price < 100000)
  223.     {
  224.         valuation_unit_price = valuation_unit_price * 10 + 9;
  225.         page_valuation_unit_price_refresh();
  226.     }
  227. }
  228. void page_valuation_0()
  229. {
  230.     if(valuation_unit_price < 100000)
  231.     {
  232.         valuation_unit_price = valuation_unit_price * 10 + 0;
  233.         page_valuation_unit_price_refresh();
  234.     }
  235. }
  236. void page_valuation_back()
  237. {
  238.     valuation_unit_price = valuation_unit_price / 10;
  239.     page_valuation_unit_price_refresh();
  240. }
  241. void page_valuation_clear()
  242. {
  243.     valuation_unit_price = 0;
  244.     page_valuation_unit_price_refresh();
  245. }
复制代码



计数功能和计价功能类似,都需要进行数值的显示,不过不同的是需要计算物品的数量,计算物品数量的代码如下:
  1. //计数页面================================
  2. #define COUNTER_GRAM_ADDR 0x1100
  3. #define COUNTER_CNT_ADDR 0x1110
  4. #define COUNTER_SINGLE_GRAM_ADDR 0x1120

  5. uint32_t counter_decorticate = 0;   //计价去皮重量
  6. uint32_t counter_unit_gram = 10;    //单个重量

  7. //重量刷新
  8. void page_counter_weight_refresh()
  9. {
  10.     uint8_t test_display[10] = {0x30};
  11.     uint32_t gram_display = 0;

  12.     if(gram_value >= counter_decorticate)
  13.     {
  14.         gram_display = gram_value - counter_decorticate;
  15.         if(gram_display < 10)
  16.         {
  17.             test_display[0] = gram_display / 1 % 10 + 0x30;
  18.             dgus_show_text_value_set(COUNTER_GRAM_ADDR, test_display, 3);
  19.         }
  20.         else if(gram_display < 100)
  21.         {
  22.             test_display[0] = gram_display / 10 % 10 + 0x30;
  23.             test_display[1] = gram_display / 1 % 10 + 0x30;
  24.             dgus_show_text_value_set(COUNTER_GRAM_ADDR, test_display, 3);
  25.         }
  26.         else if(gram_display < 1000)
  27.         {
  28.             test_display[0] = gram_display / 100 % 10 + 0x30;
  29.             test_display[1] = gram_display / 10 % 10 + 0x30;
  30.             test_display[2] = gram_display / 1 % 10 + 0x30;
  31.             dgus_show_text_value_set(COUNTER_GRAM_ADDR, test_display, 3);
  32.         }
  33.         else if(gram_display < 10000)
  34.         {
  35.             test_display[0] = gram_display / 1000 % 10 + 0x30;
  36.             test_display[1] = gram_display / 100 % 10 + 0x30;
  37.             test_display[2] = gram_display / 10 % 10 + 0x30;
  38.             test_display[3] = gram_display / 1 % 10 + 0x30;
  39.             dgus_show_text_value_set(COUNTER_GRAM_ADDR, test_display, 3);
  40.         }
  41.         else if(gram_display < 100000)
  42.         {
  43.             test_display[0] = gram_display / 10000 % 10 + 0x30;
  44.             test_display[1] = gram_display / 1000 % 10 + 0x30;
  45.             test_display[2] = gram_display / 100 % 10 + 0x30;
  46.             test_display[3] = gram_display / 10 % 10 + 0x30;
  47.             test_display[4] = gram_display / 1 % 10 + 0x30;
  48.             dgus_show_text_value_set(COUNTER_GRAM_ADDR, test_display, 3);
  49.         }
  50.     }
  51.     else
  52.     {
  53.         dgus_show_text_value_set(COUNTER_GRAM_ADDR, test_display, 3);
  54.     }
  55. }

  56. //个数刷新
  57. void page_counter_cnt_refresh()
  58. {
  59.     uint32_t cnt_value = 0;
  60.     uint8_t test_display[10] = {0x30, '.', 0x30, 0x30};

  61.     if(gram_value >= counter_decorticate)
  62.     {
  63.         cnt_value = (gram_value - counter_decorticate) * 100 / counter_unit_gram;
  64.         if(cnt_value < 1000)
  65.         {
  66.             test_display[0] = cnt_value / 100 % 10 + 0x30;
  67.             test_display[1] = '.';
  68.             test_display[2] = cnt_value / 10 % 10 + 0x30;
  69.             test_display[3] = cnt_value / 1 % 10 + 0x30;
  70.             dgus_show_text_value_set(COUNTER_CNT_ADDR, test_display, 4);
  71.         }
  72.         else if(cnt_value < 10000)
  73.         {
  74.             test_display[0] = cnt_value / 1000 % 10 + 0x30;
  75.             test_display[1] = cnt_value / 100 % 10 + 0x30;
  76.             test_display[2] = '.';
  77.             test_display[3] = cnt_value / 10 % 10 + 0x30;
  78.             test_display[4] = cnt_value / 1 % 10 + 0x30;
  79.             dgus_show_text_value_set(COUNTER_CNT_ADDR, test_display, 4);
  80.         }
  81.         else if(cnt_value < 100000)
  82.         {
  83.             test_display[0] = cnt_value / 10000 % 10 + 0x30;
  84.             test_display[1] = cnt_value / 1000 % 10 + 0x30;
  85.             test_display[2] = cnt_value / 100 % 10 + 0x30;
  86.             test_display[3] = '.';
  87.             test_display[4] = cnt_value / 10 % 10 + 0x30;
  88.             test_display[5] = cnt_value / 1 % 10 + 0x30;
  89.             dgus_show_text_value_set(COUNTER_CNT_ADDR, test_display, 4);
  90.         }
  91.         else if(cnt_value < 1000000)
  92.         {
  93.             test_display[0] = cnt_value / 100000 % 10 + 0x30;
  94.             test_display[1] = cnt_value / 10000 % 10 + 0x30;
  95.             test_display[2] = cnt_value / 1000 % 10 + 0x30;
  96.             test_display[3] = cnt_value / 100 % 10 + 0x30;
  97.             test_display[4] = '.';
  98.             test_display[5] = cnt_value / 10 % 10 + 0x30;
  99.             test_display[6] = cnt_value / 1 % 10 + 0x30;
  100.             dgus_show_text_value_set(COUNTER_CNT_ADDR, test_display, 4);
  101.         }
  102.     }
  103.     else
  104.     {
  105.         dgus_show_text_value_set(COUNTER_CNT_ADDR, test_display, 4);
  106.     }

  107. }

  108. //单个克数刷新
  109. void page_counter_single_gram_refresh()
  110. {
  111.     uint8_t test_display[10] = {0x30};

  112.     if(counter_unit_gram < 10)
  113.     {
  114.         test_display[0] = counter_unit_gram / 1 % 10 + 0x30;
  115.         dgus_show_text_value_set(COUNTER_SINGLE_GRAM_ADDR, test_display, 2);
  116.     }
  117.     else if(counter_unit_gram < 100)
  118.     {
  119.         test_display[0] = counter_unit_gram / 10 % 10 + 0x30;
  120.         test_display[1] = counter_unit_gram / 1 % 10 + 0x30;
  121.         dgus_show_text_value_set(COUNTER_SINGLE_GRAM_ADDR, test_display, 2);
  122.     }
  123.     else if(counter_unit_gram < 1000)
  124.     {
  125.         test_display[0] = counter_unit_gram / 100 % 10 + 0x30;
  126.         test_display[1] = counter_unit_gram / 10 % 10 + 0x30;
  127.         test_display[2] = counter_unit_gram / 1 % 10 + 0x30;
  128.         dgus_show_text_value_set(COUNTER_SINGLE_GRAM_ADDR, test_display, 2);
  129.     }
  130.     else if(counter_unit_gram < 10000)
  131.     {
  132.         test_display[0] = counter_unit_gram / 1000 % 10 + 0x30;
  133.         test_display[1] = counter_unit_gram / 100 % 10 + 0x30;
  134.         test_display[2] = counter_unit_gram / 10 % 10 + 0x30;
  135.         test_display[3] = counter_unit_gram / 1 % 10 + 0x30;
  136.         dgus_show_text_value_set(COUNTER_SINGLE_GRAM_ADDR, test_display, 2);
  137.     }
  138. }

  139. //去皮
  140. void page_counter_decorticate()
  141. {
  142.     counter_decorticate = gram_value;
  143.     page_counter_weight_refresh();
  144. }

  145. void page_counter_gram_dec()
  146. {
  147.     if(counter_unit_gram > 1)
  148.     {
  149.         counter_unit_gram--;
  150.         page_counter_single_gram_refresh();
  151.     }
  152. }
  153. void page_counter_gram_add()
  154. {
  155.     if(counter_unit_gram < 10000)
  156.     {
  157.         counter_unit_gram++;
  158.         page_counter_single_gram_refresh();
  159.     }
  160. }
复制代码




4、总结
这个项目让称重器的功能不再单一,可以根据使用场景进行功能切换,如果配合上国标的称重仪器,可以让产品更加正规完善。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
二哲科技,欢迎联系,帮你解决问题,为你提供方案~
VX:erzhekeji
QQ:1002866443
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-11-22 04:03 , Processed in 0.095207 second(s), 24 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表