驴友花雕 发表于 2025-7-24 11:32:51

【Arduino 动手做】M5Stack 智能超市











驴友花雕 发表于 2025-7-24 11:36:39

【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 的插件,调试非常方便。

# 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())
      return sorted(zip(values, weights), key=lambda x: x).pop()

#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


驴友花雕 发表于 2025-7-24 11:38:39

【Arduino 动手做】M5Stack 智能超市

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
}

驴友花雕 发表于 2025-7-24 11:41:13

【Arduino 动手做】M5Stack 智能超市

【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



驴友花雕 发表于 2025-7-24 11:43:01

【Arduino 动手做】M5Stack 智能超市




页: [1]
查看完整版本: 【Arduino 动手做】M5Stack 智能超市