回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

【Arduino 动手做】M5Stack 智能超市 简单

头像 驴友花雕 2025.07.24 32 0

小超市基本功能:使用m5stack basic作为主控界面,为玩家提供超市购物界面:提供两种商品(苹果和核桃),玩家将商品(苹果或核桃)放在电子秤上,然后选择商品按钮,主控界面会显示商品名称, 单价、重量(g)和总价。选择“打印”按钮后,主控会将这些商品信息发送到热敏打印机控制器(使用Arduino minipro),控制器会分析数据并将其发送到热敏打印机打印出超市票据。

 

00.jpg
01.jpg
02.jpg
03.jpg

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

Arduino pro mini 代码
Arduino

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

 

代码
//-------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 <ArduinoJson.h>
#include <SoftwareSerial.h>
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
}

【Arduino 动手做】M5Stack 智能超市
项目链接:https://www.hackster.io/canghai/m5stack-smart-supermarket-745af0
项目作者:vany5921

项目代码:
https://www.hackster.io/code_files/434700/download
https://www.hackster.io/code_files/434702/download

 

05.jpg

评论

user-avatar
icon 他的勋章
    展开更多