42浏览
查看: 42|回复: 4

[项目] 【Arduino 动手做】M5Stack 智能超市

[复制链接]
【Arduino 动手做】M5Stack 智能超市图5

【Arduino 动手做】M5Stack 智能超市图3

【Arduino 动手做】M5Stack 智能超市图2


【Arduino 动手做】M5Stack 智能超市图4

【Arduino 动手做】M5Stack 智能超市图1

驴友花雕  中级技神
 楼主|

发表于 昨天 11:36

【Arduino 动手做】M5Stack 智能超市

M5Stack 基本代码 Python

首先,UI的设计模拟了超市。它由标题栏、内容栏和控制按钮三部分组成。
标题栏:显示M5 SIM超市
内容栏:商品名称、重量、单价和总价
控制栏:苹果按钮、核桃按钮和打印按钮

因为是模拟超市,所以可以使用m5stack basic的三个按钮来提供苹果和核桃的选择。您还可以使用 M5 面部套件或新生产的卡片键盘套件来扩展您的选择。
除了UI之外,控制台编程主要包括几个部分:
首先是电子秤的编程。这部分需要实现主控与电子秤的连接和调试。布线已在一楼展示。请注意,VCC I 选择 3.3V。软件部分主要依靠一个hx711库,以及详细的调用模式。玩家可以参考我的电子秤帖子。在这里,校准系数仍保存在 TXT 文件中并存储在主控件中。因为uiflow可以方便地在主控器中保存多个功能程序,所以我也将电子秤的校准程序上传到主控器。玩家可以使用100g/200g的配重根据温度变化进行校准(例如季节变化对变形传感器有影响)。校准结果存储在txt文件中,方便调用。
其次是UART的编程。我们选择 UART2 作为数据传输端口。因为我们需要传输四组数据,例如货物、单价、重量和总价,因此我们使用 JSON 格式进行传输。
三是按钮陷阱的编程,比较简单。响应三个按钮的触发,其中苹果和核桃会更新产品名称和单价,而打印按钮会通过UART2发送组装好的JSON。

这是控制台的代码。音符很清楚。你可以用一楼来理解它。我们使用的工具是 vscode + m5stack 的插件,调试非常方便。

  1. # date 2019-09-25
  2. ##Uiflow design UI to realize electronic scale
  3. # 0914 ----- Solved UART sending unit price + weighing data + total price + product name
  4. # 0924 ----- The first joint commissioning with Arduino
  5. # 0925 ----- Combined with Arduino Pro Mini 5V / 16m, the price roughly refers to the market price, apple 15 (Walnut 31 yuan) / kg finishing
  6. from m5stack import *
  7. from m5ui import *
  8. from utime import sleep_us
  9. from uiflow import *
  10. from hx711 import HX711
  11. global val_cort  #校正系数
  12. global val,v_up,v_tp
  13. v_up=0
  14. v_tp=0
  15. global s_json,v_comd #JSON string sent to UART
  16. s_json=''
  17. v_comd=''
  18. #UART initialization, using UART2 to pass the data to be printed to arduin Pro Mini
  19. uart = None
  20. uart = machine.UART(2, tx=17, rx=16)
  21. uart.init(9600, bits=8, parity=None, stop=1)
  22. class Scales(HX711):
  23.     def __init__(self, d_out, pd_sck):
  24.         super(Scales, self).__init__(d_out, pd_sck)
  25.         self.offset = 0
  26.     def reset(self):
  27.         self.power_off()
  28.         self.power_on()
  29.     def tare(self):
  30.         self.offset = self.read()
  31.     def raw_value(self):
  32.         return self.read() - self.offset
  33.     def stable_value(self, reads=10, delay_us=500):
  34.         values = []
  35.         for _ in range(reads):
  36.             values.append(self.raw_value())
  37.             sleep_us(delay_us)
  38.         return self._stabilizer(values)
  39.     @staticmethod
  40.     def _stabilizer(values, deviation=10):
  41.         weights = []
  42.         for prev in values:
  43.             weights.append(sum([1 for current in values if abs(prev - current) / (prev / 100) <= deviation]))
  44.         return sorted(zip(values, weights), key=lambda x: x[1]).pop()[0]
  45. #Create an instance
  46. scales = Scales(d_out=5, pd_sck=2)
  47. #Read out the pre stored correction coefficient
  48. with open('cort.txt', 'r') as myfile:
  49.         val_cort=float(myfile.read().replace('\n', ''))  #Read out the pre stored correction coefficient
  50. myfile.close()
  51. scales.tare() #One peeling at initialization
  52. #------------------UI
  53. setScreenColor(0x222222)
  54. M5title = M5Title(title="M5 Sim Supermarket", x=3 , fgcolor=0xFFFFFF, bgcolor=0x0000FF)
  55. label0 = M5TextBox(16, 49, "Commodity", lcd.FONT_Ubuntu,0xFFFFFF, rotate=0)
  56. label1 = M5TextBox(16, 90, "Unit Price", lcd.FONT_Ubuntu,0xFFFFFF, rotate=0)
  57. label2 = M5TextBox(16, 127, "Weight", lcd.FONT_Ubuntu,0xFFFFFF, rotate=0)
  58. label3 = M5TextBox(17, 164, "Total Price", lcd.FONT_Ubuntu,0xFFFFFF, rotate=0)
  59. rectangle0 = M5Rect(34, 203, 60, 20, 0xf80d0d, 0xfcfbfb)
  60. rectangle1 = M5Rect(127, 203, 60, 20, 0x55e10c, 0xf8f4f4)
  61. rectangle2 = M5Rect(222, 203, 60, 20, 0x528be5, 0xFFFFFF)
  62. label4 = M5TextBox(42, 205, "Apple", lcd.FONT_Default,0xFFFFFF, rotate=0)
  63. label5 = M5TextBox(134, 207, "Walnut", lcd.FONT_Default,0xfaf9fa, rotate=0)
  64. label6 = M5TextBox(237, 207, "Print", lcd.FONT_Default,0xFFFFFF, rotate=0)
  65. text_comd = M5TextBox(135, 47, "Text", lcd.FONT_Default,0xFFFFFF, rotate=0)
  66. text_up = M5TextBox(134, 93, "Text", lcd.FONT_Default,0xFFFFFF, rotate=0)
  67. text_weig = M5TextBox(134, 130, "Text", lcd.FONT_Default,0xFFFFFF, rotate=0)
  68. text_tp = M5TextBox(134, 164, "Text_tp", lcd.FONT_Default,0xFFFFFF, rotate=0)
  69. while True:
  70.     val = val_cort*scales.stable_value() #Calculation with conversion compensation coefficient, such as -0.00051235
  71.     val1=("%.2f" % val) #Format the weighing data with 2 decimal places
  72.     text_weig.setText(str(val1)) #Display update weighing data
  73.     v_tp=val*v_up/1000 #Price converted to kilogram due to weighing
  74.    
  75.     v_tp=("%.2f" % v_tp)
  76.     text_tp.setText(str(v_tp)) #Update total price data
  77.     sleep_us(200000)
  78.     if btnA.wasPressed():
  79.         # global params
  80.         v_comd='Apple'
  81.         text_comd.setText(v_comd)
  82.         text_up.setText('15.0')
  83.         v_up=15
  84.         pass
  85.     if btnB.wasPressed():
  86.         # global params
  87.         v_comd='Walnut'
  88.         text_comd.setText(v_comd)
  89.         text_up.setText('31.0')
  90.         v_up=31
  91.         pass
  92.     if btnC.wasPressed():
  93.         s_json="{"up":""+str(v_up)+"","tp":""+str(v_tp)+"","commodity":""+v_comd+"","weigh":""+str(val1)+""}"
  94.         uart.write(s_json+"\r\n")
  95.         pass
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 11:38

【Arduino 动手做】M5Stack 智能超市

Arduino pro mini 代码
Arduino

控制器的代码由两部分组成:
一是定义两个软串口,一个用于从 m5stack 接收 JSON 格式的产品信息。第二个用于向热敏打印机发出打印指令。需要在两个软串口之间切换监听。我还在一楼使用了特别的注释。否则,它将无法正常工作。
其次,我们需要分析来自 m5stack 的 JSON 格式数据。我们使用著名的 arduinojson 库。当前版本为 6.12。详情请到 arduinojson.org。因为这次我们只需要解析四个数据,所以我们使用了一层 JSON 格式。Arduinojson.org 提供了JSON助手,非常方便你设计JSON字符串和相关代码、内存分配等辅助工作。

  1. //-------date:2019-09-24
  2. //-------Simulation supermarket printer control terminal program
  3. //-------Main functions: 1. Analyze data from (m5stack) softserial
  4. //                       2. Test the output of thermal printer
  5. //                       3. Docking with m5stack basic
  6. //                          
  7. /*
  8. Data format sent by m5stack: up --- unit price; TP --- total price, commodity --- product name, weight --- weight
  9. {
  10.   "up": "7",
  11.   "tp": "840",
  12.   "commodity": "apple",
  13.   "weigh": "120"
  14. }
  15. */
  16. //------------ArduinoJson
  17. #include <ArduinoJson.h>
  18. #include <SoftwareSerial.h>
  19. SoftwareSerial swSer1(10,11); //UNO-10-RX;UNO-11-TX
  20. //------------Thermal printer
  21. #include "Adafruit_Thermal.h"
  22. SoftwareSerial mySerial(5, 6); // UNO-5-RX;UNO-6-TX
  23. Adafruit_Thermal printer(&mySerial);     // Pass addr to printer constructor
  24. void setup() {
  25.   // Initialize serial port
  26. Serial.begin(9600);
  27. swSer1.begin(9600);
  28. mySerial.begin(9600);
  29. printer.begin();        // Init printer
  30. }
  31. void loop() {
  32. //DynamicJsonDocument doc(152);
  33. //Monitor the soft serial port from m5stack
  34.   swSer1.listen();
  35. while (!swSer1.available())
  36. delay(100);
  37.   // Deserialize the JSON document
  38. const size_t capacity = JSON_OBJECT_SIZE(4) + 50;//Define helper generation from arduinojson.org
  39. DynamicJsonDocument doc(capacity);
  40.   DeserializationError error = deserializeJson(doc, swSer1); //Reading data without soft serial port
  41.   // Test if parsing succeeds.
  42.   if (error) {
  43.     Serial.print(F("deserializeJson() failed: "));
  44.     Serial.println(error.c_str());
  45.     return;
  46.   }
  47. //仅供调试
  48. String s_commodity=doc["commodity"];
  49. String s_weigh=doc["weigh"];
  50. String s_up=doc["up"];
  51. String s_tp=doc["tp"];
  52. Serial.print(s_commodity);
  53. Serial.print("-----");
  54. Serial.print(s_weigh);
  55. Serial.print("-----");
  56. Serial.print(s_up);
  57. Serial.print("-----");
  58. Serial.println(s_tp);
  59. ToPrint(s_commodity,s_weigh,s_up,s_tp); //Call print module
  60. }
  61. void ToPrint( String t_comm , String t_weig  , String t_up , String t_tp){
  62.         //Monitor No.2 soft serial port
  63.         mySerial.listen();
  64.         printer.begin();        // Init printer
  65.         // caption
  66.         printer.inverseOn();
  67.         printer.println(F(" M5 Sim SuperMarket "));
  68.         printer.inverseOff();
  69.         //print
  70.         printer.println("--------------------------");
  71.         printer.boldOn();
  72.         printer.print(F("Commodity:"));
  73.         printer.boldOff();
  74.         printer.println(t_comm);
  75.         printer.boldOn();
  76.         printer.print(F("Weigh(g):"));
  77.         printer.boldOff();
  78.         printer.println(t_weig);
  79.         printer.boldOn();
  80.         printer.print(F("Unit Price:"));
  81.         printer.boldOff();
  82.         printer.println( t_up);
  83.         printer.boldOn();
  84.         printer.print(F("Total Price:"));
  85.         printer.boldOff();
  86.         printer.println(t_tp);
  87.         printer.println("--------------------------");
  88.         printer.feed(2);
  89.         printer.setDefault(); // Restore printer to defaults
  90. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 11:41

【Arduino 动手做】M5Stack 智能超市

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 11:43

【Arduino 动手做】M5Stack 智能超市

【Arduino 动手做】M5Stack 智能超市图2

【Arduino 动手做】M5Stack 智能超市图1
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail