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 的插件,调试非常方便。
- # date 2019-09-25
- ##Uiflow design UI to realize electronic scale
- # 0914 ----- Solved UART sending unit price + weighing data + total price + product name
-
- # 0924 ----- The first joint commissioning with Arduino
-
- # 0925 ----- Combined with Arduino Pro Mini 5V / 16m, the price roughly refers to the market price, apple 15 (Walnut 31 yuan) / kg finishing
-
- from m5stack import *
- from m5ui import *
- from utime import sleep_us
- from uiflow import *
- from hx711 import HX711
- global val_cort #校正系数
- global val,v_up,v_tp
- v_up=0
- v_tp=0
- global s_json,v_comd #JSON string sent to UART
-
- s_json=''
- v_comd=''
-
- #UART initialization, using UART2 to pass the data to be printed to arduin Pro Mini
-
- uart = None
- uart = machine.UART(2, tx=17, rx=16)
- uart.init(9600, bits=8, parity=None, stop=1)
-
-
- class Scales(HX711):
- def __init__(self, d_out, pd_sck):
- super(Scales, self).__init__(d_out, pd_sck)
- self.offset = 0
-
- def reset(self):
- self.power_off()
- self.power_on()
-
- def tare(self):
- self.offset = self.read()
-
- def raw_value(self):
- return self.read() - self.offset
-
- def stable_value(self, reads=10, delay_us=500):
- values = []
- for _ in range(reads):
- values.append(self.raw_value())
- sleep_us(delay_us)
- return self._stabilizer(values)
-
- @staticmethod
- def _stabilizer(values, deviation=10):
- weights = []
- for prev in values:
- weights.append(sum([1 for current in values if abs(prev - current) / (prev / 100) <= deviation]))
- return sorted(zip(values, weights), key=lambda x: x[1]).pop()[0]
-
- #Create an instance
-
- scales = Scales(d_out=5, pd_sck=2)
- #Read out the pre stored correction coefficient
- with open('cort.txt', 'r') as myfile:
- val_cort=float(myfile.read().replace('\n', '')) #Read out the pre stored correction coefficient
-
- myfile.close()
- scales.tare() #One peeling at initialization
-
-
- #------------------UI
- setScreenColor(0x222222)
- M5title = M5Title(title="M5 Sim Supermarket", x=3 , fgcolor=0xFFFFFF, bgcolor=0x0000FF)
- label0 = M5TextBox(16, 49, "Commodity", lcd.FONT_Ubuntu,0xFFFFFF, rotate=0)
- label1 = M5TextBox(16, 90, "Unit Price", lcd.FONT_Ubuntu,0xFFFFFF, rotate=0)
- label2 = M5TextBox(16, 127, "Weight", lcd.FONT_Ubuntu,0xFFFFFF, rotate=0)
- label3 = M5TextBox(17, 164, "Total Price", lcd.FONT_Ubuntu,0xFFFFFF, rotate=0)
- rectangle0 = M5Rect(34, 203, 60, 20, 0xf80d0d, 0xfcfbfb)
- rectangle1 = M5Rect(127, 203, 60, 20, 0x55e10c, 0xf8f4f4)
- rectangle2 = M5Rect(222, 203, 60, 20, 0x528be5, 0xFFFFFF)
- label4 = M5TextBox(42, 205, "Apple", lcd.FONT_Default,0xFFFFFF, rotate=0)
- label5 = M5TextBox(134, 207, "Walnut", lcd.FONT_Default,0xfaf9fa, rotate=0)
- label6 = M5TextBox(237, 207, "Print", lcd.FONT_Default,0xFFFFFF, rotate=0)
- text_comd = M5TextBox(135, 47, "Text", lcd.FONT_Default,0xFFFFFF, rotate=0)
- text_up = M5TextBox(134, 93, "Text", lcd.FONT_Default,0xFFFFFF, rotate=0)
- text_weig = M5TextBox(134, 130, "Text", lcd.FONT_Default,0xFFFFFF, rotate=0)
- text_tp = M5TextBox(134, 164, "Text_tp", lcd.FONT_Default,0xFFFFFF, rotate=0)
-
-
- while True:
- val = val_cort*scales.stable_value() #Calculation with conversion compensation coefficient, such as -0.00051235
-
- val1=("%.2f" % val) #Format the weighing data with 2 decimal places
- text_weig.setText(str(val1)) #Display update weighing data
- v_tp=val*v_up/1000 #Price converted to kilogram due to weighing
-
- v_tp=("%.2f" % v_tp)
- text_tp.setText(str(v_tp)) #Update total price data
- sleep_us(200000)
- if btnA.wasPressed():
- # global params
- v_comd='Apple'
- text_comd.setText(v_comd)
- text_up.setText('15.0')
- v_up=15
- pass
-
- if btnB.wasPressed():
- # global params
- v_comd='Walnut'
- text_comd.setText(v_comd)
- text_up.setText('31.0')
- v_up=31
- pass
-
- if btnC.wasPressed():
- s_json="{"up":""+str(v_up)+"","tp":""+str(v_tp)+"","commodity":""+v_comd+"","weigh":""+str(val1)+""}"
- uart.write(s_json+"\r\n")
- pass
复制代码
|