【Arduino 动手做】M5Stack 智能超市

2025-07-241722
【Arduino 动手做】M5Stack 智能超市图5

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

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


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

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

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(4)
驴友花雕
驴友花雕
作者


驴友花雕
驴友花雕
作者
驴友花雕
驴友花雕
作者
Arduino pro mini 代码
Arduino
控制器的代码由两部分组成:
一是定义两个软串口,一个用于从 m5stack 接收 JSON 格式的产品信息。第二个用于向热敏打印机发出打印指令。需要在两个软串口之间切换监听。我还在一楼使用了特别的注释。否则,它将无法正常工作。
其次,我们需要分析来自 m5stack 的 JSON 格式数据。我们使用著名的 arduinojson 库。当前版本为 6.12。详情请到 arduinojson.org。因为这次我们只需要解析四个数据,所以我们使用了一层 JSON 格式。Arduinojson.org 提供了JSON助手,非常方便你设计JSON字符串和相关代码、内存分配等辅助工作。
[code]//-------date:2019-09-24
//-------Simulation supermarket printer control terminal program
//-------Main functions: 1. Analyze data from (m5stack) softserial
// 2. Test the output of thermal printer
// 3. Docking with m5stack basic
//
/*
Data format sent by m5stack: up --- unit price; TP --- total price, commodity --- product name, weight --- weight
{
"up": "7",
"tp": "840",
"commodity": "apple",
"weigh": "120"
}
*/
//------------ArduinoJson
#include
#include
SoftwareSerial swSer1(10,11); //UNO-10-RX;UNO-11-TX
//------------Thermal printer
#include "Adafruit_Thermal.h"
SoftwareSerial mySerial(5, 6); // UNO-5-RX;UNO-6-TX
Adafruit_Thermal printer(&mySerial); // Pass addr to printer constructor
void setup() {
// Initialize serial port
Serial.begin(9600);
swSer1.begin(9600);
mySerial.begin(9600);
printer.begin(); // Init printer
}
void loop() {
//DynamicJsonDocument doc(152);
//Monitor the soft serial port from m5stack
swSer1.listen();
while (!swSer1.available())
delay(100);
// Deserialize the JSON document
const size_t capacity = JSON_OBJECT_SIZE(4) + 50;//Define helper generation from arduinojson.org
DynamicJsonDocument doc(capacity);
DeserializationError error = deserializeJson(doc, swSer1); //Reading data without soft serial port
// Test if parsing succeeds.
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.c_str());
return;
}
//仅供调试
String s_commodity=doc["commodity"];
String s_weigh=doc["weigh"];
String s_up=doc["up"];
String s_tp=doc["tp"];
Serial.print(s_commodity);
Serial.print("-----");
Serial.print(s_weigh);
Serial.print("-----");
Serial.print(s_up);
Serial.print("-----");
Serial.println(s_tp);
ToPrint(s_commodity,s_weigh,s_up,s_tp); //Call print module
}
void ToPrint( String t_comm , String t_weig , String t_up , String t_tp){
//Monitor No.2 soft serial port
mySerial.listen();
printer.begin(); // Init printer
// caption
printer.inverseOn();
printer.println(F(" M5 Sim SuperMarket "));
printer.inverseOff();
//print
printer.println("--------------------------");
printer.boldOn();
printer.print(F("Commodity:"));
printer.boldOff();
printer.println(t_comm);
printer.boldOn();
printer.print(F("Weigh(g):"));
printer.boldOff();
printer.println(t_weig);
printer.boldOn();
printer.print(F("Unit Price:"));
printer.boldOff();
printer.println( t_up);
printer.boldOn();
printer.print(F("Total Price:"));
printer.boldOff();
printer.println(t_tp);
printer.println("--------------------------");
printer.feed(2);
printer.setDefault(); // Restore printer to defaults
}[/code]
驴友花雕
驴友花雕
作者
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 的插件,调试非常方便。
[code]# 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
[/code]
- 没有更多了 -