这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【TOPWAY7寸智能屏】POS秤设计

共26条 1/3 1 2 3 跳转至

【TOPWAY7寸智能屏】POS秤设计

菜鸟
2022-03-05 22:13:16   被打赏 10 分(兑奖)     打赏

项目名称:基于TOPWAY7寸智能屏POS秤设计

项目介绍:

拓普微的显示屏作为POS秤的显示终端,与搭配称重模块建立通讯进行物品的称重,再加上扫码支付、异常报警等,构成了一个智能化的POS秤设备。

拓普微POS秤显示终端主要设计四组界面:

1、各类商品切换界面:在该界面主要给用户以图形、滚动、搜索、可切换式的显示POS秤所支持的物品的当前状态。

2、称重、计算价格显示界面:在该界面主要对选定的商品进行物品的称重以及总价的结算。

3、支付界面:在该界面自动生成支付二维码来给用户移动支付。

4、异常报警界面:当有人未支付变拿走了物品将会触发异常的蜂鸣报警。

试用进程如下:

      1.  原厂LCD屏幕界面演示

      2.  POS秤界面的搭建

      3. POS秤界面的完善

      4. POS秤物品称重模块的搭建

     5. POS秤分享与总结




关键词: TOPWAY     LCD    

菜鸟
2022-03-05 22:18:30   被打赏 30 分(兑奖)     打赏
2楼

1.  原厂LCD屏幕界面演示

通电后的第一个界面,你别说界面做的真是一个好看啊,深圳这个时候已经有点热了哈,超喜欢那个Slider哈,日历也很好看。

image.png

拖动Slider进入的主界面,该界面提供了四个Demo给我们展示,哈哈你们没有猜错,点那个锁就是锁屏,回到上一个界面哈!

image.png

迫不及待的打开了仪表界面,好看,好看!

image.png

这个界面在自动化的控制设备工厂用的比较多吧!

image.png

这个柱状图新设计也好好看,同时也可以拖动哈!

image.png

最后再来看看背面,惊不惊讶,还有网口,那个屏蔽罩下的东西等我评测完了再来拆它哈!

image.png


菜鸟
2022-03-05 22:17:35     打赏
3楼

2.  POS秤界面的搭建

01.先来设计一个背景吧,简单纯粹哈!

image.png

这个屏幕是 1024*600的分辨率,屏幕显示出来还是不错的哈!

image.png

02.给背景加上标题和时间吧,目前先这样后面慢慢优化哈!

image.png

日期有啦,但是标题没有出来,看来是差了一步哈

image.png

需要通过串口往VP地址:0x000080 中写入数据即可,终于显示出来啦!这里使用串口助手发送下面的字符串就可以显示啦!

image.png

image.png

03.开始跳转吧!

建立 2 个页面 ,导入 2 张背景图,关联页面与背景图,这张可爱吧!

image.png

建立触摸键,在菜单工具栏点击触摸键,在 PG0000 页面工作区拖出矩
形区,创建触摸键控件,属性中“目标页面”选择:PG0001。

image.png

哈哈,可以切换啦,界面很美哈,切换的动图就不展示啦哈!

image.png


04.来显示一个键盘吧

  菜单工具栏点击触摸键 ,在页面工作区拖出矩形区,新建一个触摸键 ,属性中“呼叫/键盘”选择:“英文键盘”,属性中“VP 地址”选择: 0x080002

image.png

image.png

编译,烧录,点击触摸区域就可以显示英文键盘啦!

image.png

05.玩一下二维码吧!

  建立二维码控件,点击菜单工具栏“二维码”控件图标 ,在页面工作区拖出矩形区,新 建 2 个“二维码”控件,属性中“VP 类型”选择: VP_STR 属性中“VP 地址”选择:0x000080 或者不填也可以,属性中“大小”选择:73*73(456Byte) 属性中“比例”分别:4

image.png

  编译,烧录,使用串口助手发送AA 42 00 00 00 80 49 6E 74 65 6C 6C 69 67 65 6E 20 50 6F 73 20 53 63 61 6C 65 00 CC 33 C3 3C C7 F3 05 40就可以显示标题和二维码啦!

image.png

如果您扫了这个二维码,就可以看到他就是标题哈!

image.png




菜鸟
2022-03-05 22:18:44     打赏
4楼

3. POS秤界面的完善

从这一小节开始,正式进入POS秤界面的完善环节,大家看我是怎么一步一步来完善这个界面的哈!

01. 那就搭建Pos秤主界面

   首先需要一个首页背景界面,在这界面中,我打算设置三个切换按钮,当我们点击对应的按键时会切换到另一个界面中,大致规划内容如下图所示。

image.png

现在PPT大致画一下主界面的背景图哈,大致这样哈,一定不要忘了EEPW和金主哈!

image.png

背景图导入到软件中,为三个子界面(自动、手动、设置)加入触摸,然后再加入时间哈

image.png

编译,烧录,先看一下效果,还行,挺不错的,就这吧。

image.png

02. 开始搭建手动Pos秤界面

  先来搭建第一个界面,我的想法是把称重按照超市的来吧,该界面上一共分为素菜、水果、水产、熟食、糕点和其它六大类,在PPT里大致做了一下。

image.png

接着添加到开发工具里面来,点击手动秤的时候会切换到那个界面中。

image.png

当然,我们还得切回到主界面中哈。

image.png

编译,烧录,先看一下效果,已经可以来回切换啦!

image.png

03. 实现手动Pos秤键盘修改物品单价

先添加9个字符串变量,用于储存九种蔬菜的单价。

image.png

将分配的VP 与新建的字符串进行对应。

image.png

为每一个字符串那里添加触控,然后添加数字键盘,VP要与字符串一致。

image.png

其余的重复一样的设置,一定记着VP要对应起来哈,然后编译,烧录看一下效果。

image.png

已经可以使用键盘来修改每一个产品的价格啦!

image.png

04. 实现手动Pos秤不同商品类别切换

重复蔬菜的操作即可,添加一个新的界面。

image.png

软件中添加对应VP和键盘,还包括切换界面等。

image.png

效果跟蔬菜一样哈,这里就不展示啦!

05. 称重支付界面的实现

   使用PPT设计了Pos秤的手动称重支付界面,当我们选择对应的物品时,会跳转到支付界面中,根据选择的物品、单价、称重物品的质量,进行价格计算,并弹出支付二维码哈。

image.png

在软件中我们来添加支付二维码和支付状态显示

image.png

烧录到串口屏里,发送下面的命令,效果还可以哈。

AA 42 00 00 09 80 CA DF B2 CB 00 CC 33 C3 3C   

AA 42 00 00 0A 00 32 2E 31 36 00 CC 33 C3 3C    

AA 42 00 00 0A 80 31 2E 35 30 00 CC 33 C3 3C   

AA 42 00 00 0B 00 33 2E 32 34 00 CC 33 C3 3C 

AA 42 00 00 0B 80 CE B4 D6 A7 B8 B6 00 CC 33 C3 3C 

image.png


菜鸟
2022-03-05 22:18:51     打赏
5楼

4. POS秤物品称重模块的搭建

Pos秤物品称重模块分为硬件模块和软件模块两部分,硬件如下图所示,主要包括AT32最小系统、称重模块、通讯接口三个部分。 AT32最小系统主要负责采集称重模块的数据,通过通讯接口与软件模块和串口屏进行数据通讯。

image.png

来称重一个芒果吧,哈哈哈!

image.png

使用Qt写了一个与串口屏通讯的界面上位机,建立通讯后,该上位机可以灵活设定Pos秤中的物品单价,同时通过Pos秤发来的当前状态数据进行显示。系统也会显示购买的数量和所有称重的重量,如果有人买东西了,未支付则会触发报警。

image.png


菜鸟
2022-03-05 22:18:03     打赏
6楼

5. POS秤分享与总结

本次通过TOPWAY7寸智能屏设计了一个POS秤,本次试用活动过程还是写了不少的代码,在本帖子里面将其开源,共享。液晶屏仅为数据显示,而数据的控制与采集全部来自AT32单片机,下面是编写的一些驱动

//****************************************************************
//******  SPI GPIO 初始化函数
//******  输入参数: 无
//******  返回值:   无
//****************************************************************
void PhySpiGpioInit()
{
   gpio_init_type gpio_initstructure;
   crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
   // CS  PA4
   gpio_initstructure.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;  
   gpio_initstructure.gpio_pull           = GPIO_PULL_UP;  
   gpio_initstructure.gpio_mode           = GPIO_MODE_OUTPUT;  
   gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
   gpio_initstructure.gpio_pins = GPIO_PINS_4;
   gpio_init(GPIOA, &gpio_initstructure);
   gpio_bits_set(GPIOA, GPIO_PINS_4);   // FLASH_CS_HIGH
   // SCK PA5
   gpio_initstructure.gpio_pull           = GPIO_PULL_UP;  
   gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;  
   gpio_initstructure.gpio_pins = GPIO_PINS_5;
   gpio_init(GPIOA, &gpio_initstructure);
   // MISO  PA6
   gpio_initstructure.gpio_pull           = GPIO_PULL_UP;  
   gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;  
   gpio_initstructure.gpio_pins = GPIO_PINS_6;
   gpio_init(GPIOA, &gpio_initstructure); 
   // MOSI PA7
   gpio_initstructure.gpio_pull           = GPIO_PULL_UP;  
   gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;  
   gpio_initstructure.gpio_pins = GPIO_PINS_7;
   gpio_init(GPIOA, &gpio_initstructure);   
}
//****************************************************************
//******  SPI 参数配置初始化函数
//******  输入参数: 无
//******  返回值:   无
//****************************************************************
void PhySpiCoreInit()
{
   spi_init_type spi_init_struct;
   crm_periph_clock_enable(CRM_DMA1_PERIPH_CLOCK, TRUE);
   crm_periph_clock_enable(CRM_SPI1_PERIPH_CLOCK, TRUE);
   spi_default_para_init(&spi_init_struct);
    
   spi_init_struct.transmission_mode = SPI_TRANSMIT_FULL_DUPLEX;
   spi_init_struct.master_slave_mode = SPI_MODE_MASTER;  //主机
   spi_init_struct.mclk_freq_division = SPI_MCLK_DIV_8;  //
   spi_init_struct.first_bit_transmission = SPI_FIRST_BIT_MSB;
   spi_init_struct.frame_bit_num = SPI_FRAME_8BIT;
   spi_init_struct.clock_polarity = SPI_CLOCK_POLARITY_HIGH;
   spi_init_struct.clock_phase = SPI_CLOCK_PHASE_2EDGE;
   spi_init_struct.cs_mode_selection = SPI_CS_SOFTWARE_MODE;
   spi_init(SPI1, &spi_init_struct);
   spi_enable(SPI1, TRUE);
    
}
//****************************************************************
//******  SPI 初始化函数
//******  输入参数: 无
//******  返回值:   无
//****************************************************************
void PhySpiInit()
{
   PhySpiGpioInit();
   PhySpiCoreInit(); 
}
//****************************************************************
//******  SPI 发送和接收一个字节数据 函数
//******  输入参数: uint32_t erase_addr     块擦除所在的地址
//******  返回值:   uint8_t 接收的数据
//****************************************************************
uint8_t PhySpiByteWrite(uint8_t data)
{
  uint8_t brxbuff;
  spi_i2s_dma_transmitter_enable(SPI1, FALSE);
  spi_i2s_dma_receiver_enable(SPI1, FALSE);
  spi_i2s_data_transmit(SPI1, data);
  while(spi_i2s_flag_get(SPI1, SPI_I2S_RDBF_FLAG) == RESET);
  brxbuff = spi_i2s_data_receive(SPI1);
  while(spi_i2s_flag_get(SPI1, SPI_I2S_BF_FLAG) != RESET);
  return brxbuff;
}

//****************************************************************
//******  串口GPIO初始化函数
//******  输入参数: 无
//******  返回值:   无
//****************************************************************
static void PhyUartGpioInit()
{
  gpio_init_type gpio_init_struct;
  crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  gpio_default_para_init(&gpio_init_struct);
    

  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  gpio_init_struct.gpio_pins = GPIO_PINS_9|GPIO_PINS_10;
  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  gpio_init(GPIOA, &gpio_init_struct);
    
  gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE9, GPIO_MUX_1); 
  gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE10, GPIO_MUX_1); 
    
}

//****************************************************************
//******  串口参数初始化函数
//******  输入参数: uint32_t baudrate 波特率
//******  返回值:   无
//****************************************************************
static void  PhyUartCoreInit(uint32_t baudrate)
{
   crm_periph_clock_enable(CRM_USART1_PERIPH_CLOCK, TRUE);
   usart_init(USART1, baudrate, USART_DATA_8BITS, USART_STOP_1_BIT);
   usart_parity_selection_config(USART1, USART_PARITY_NONE);
   usart_transmitter_enable(USART1, TRUE); 
   usart_receiver_enable(USART1, TRUE); 
   usart_dma_receiver_enable(USART1, TRUE); 
   nvic_irq_enable(USART1_IRQn, 0, 0);
   usart_interrupt_enable(USART1, USART_IDLE_INT, TRUE);    
   usart_enable(USART1, TRUE);        
}

//****************************************************************
//******  串口DMA参数初始化函数
//******  输入参数: 无
//******  返回值:   无
//****************************************************************
void PhyUartDmaInit()
{
  dma_init_type dma_init_struct;  
  crm_periph_clock_enable(CRM_DMA1_PERIPH_CLOCK, TRUE);  
  
  dma_reset(DMA1_CHANNEL3);
  dma_default_para_init(&dma_init_struct);  
  dma_init_struct.buffer_size = USART_RX_BUFFER_SIZE;
  dma_init_struct.direction = DMA_DIR_PERIPHERAL_TO_MEMORY;
  dma_init_struct.memory_base_addr = (uint32_t)UartRxBuffer;
  dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_BYTE;
  dma_init_struct.memory_inc_enable = TRUE;
  dma_init_struct.peripheral_base_addr = (uint32_t)&USART1->dt;
  dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_BYTE;
  dma_init_struct.peripheral_inc_enable = FALSE;
  dma_init_struct.priority = DMA_PRIORITY_MEDIUM;
  dma_init_struct.loop_mode_enable = FALSE; 
  dma_init(DMA1_CHANNEL3, &dma_init_struct);
  dma_channel_enable(DMA1_CHANNEL3, TRUE); 
}


//****************************************************************
//******  串口初始化函数
//******  输入参数: 无
//******  返回值:   无
//****************************************************************
void PhyUartInit()
{
    PhyUartGpioInit();
    PhyUartDmaInit();
    PhyUartCoreInit(115200);
}
//****************************************************************
//******  串口发送双字节函数
//******  输入参数: uint16_t DataByte :发送双字节
//******  返回值:   无
//****************************************************************
void PhyUartSendByte(uint8_t Byte)
{
    USART1->dt_bit.dt = Byte;
    while(USART1->sts_bit.tdc == RESET);   
}


//****************************************************************
//******  串口中断处理函数
//******  输入参数: 无
//******  返回值:   无
//****************************************************************
void USART1_IRQHandler()
{
  uint16_t rc_len;
  if(usart_flag_get(USART1, USART_IDLEF_FLAG) != RESET)
  {
      usart_data_receive(USART1);
      dma_channel_enable(DMA1_CHANNEL3,FALSE); 
      rc_len = USART_RX_BUFFER_SIZE - dma_data_number_get(DMA1_CHANNEL3);
      dma_data_number_set(DMA1_CHANNEL3, USART_RX_BUFFER_SIZE);
      dma_channel_enable(DMA1_CHANNEL3,TRUE); 
      if((UartRxBuffer[1]==0x99) && (rc_len == 8))  //处理升级帧
      {
         JumpToBoot();	          
      }     
  }
}

部分QT 代码
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ForeachPort();
    current_date_time =QDateTime::currentDateTime();
    current_date =current_date_time.toString("yyyy.MM.dd hh:mm:ss ddd");
    connect(timer0, SIGNAL(timeout()), this, SLOT(Time0out()));
    timer0->start(1000);
    this->setWindowTitle("智能Pos秤  " + current_date);
}

MainWindow::~MainWindow()
{
    delete ui;
}
//自动获取有效的串口号
void MainWindow::ForeachPort()
{
    //使用foreach获取有效的串口信息
    ui->comboBox_Port->clear();
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        //这里相当于自动识别串口号之后添加到了cmb,如果要手动选择可以用下面列表的方式添加进去
        Serial.setPort(info);
        ui->comboBox_Port->addItem(info.portName());
    }
}
//刷新走时
void MainWindow::Time0out()
{
    current_date_time =QDateTime::currentDateTime();
    current_date =current_date_time.toString("yyyy.MM.dd hh:mm:ss ddd");
    this->setWindowTitle("智能Pos秤  " + current_date);
}

void MainWindow::on_pushButton_clicked()
{
        if(ui->pushButton->text() == "连接设备")
        {
            Serial.setPortName(ui->comboBox_Port->currentText());
            if(Serial.open(QIODevice::ReadWrite) == false)
            {
               QMessageBox::warning(this,"警告","打开失败,请检查对应的端口号!");
               return;
            }
            ui->pushButton->setText("断开设备");
         }
        else if(ui->pushButton->text() == "断开设备")
        {
           ui->pushButton->setText("连接设备");
           Serial.clear();
           Serial.close();
        }
}



void MainWindow::on_toolButton_clicked()
{

    quint8 sendData[11];
    sendData[0] = 0xAA;            //设备ID
    sendData[1] = 0x42;      //命令码
    sendData[2] = 0x00;            //数据
    sendData[3] = 0x00;
    sendData[4] = 0x00;
    sendData[5] = 0x80;
    sendData[6] = 0x31;
    sendData[7] = 0x00;
    sendData[8] = 0xCC;
    sendData[9] = 0x33;
    sendData[10] = 0xC3;
    sendData[11] = 0x3C;
    Serial.write((char *)sendData,11);
}

专家
2022-03-06 00:02:48     打赏
7楼

感谢楼主的分享,很实用了。


专家
2022-03-06 00:52:18     打赏
8楼

看看


高工
2022-03-06 04:15:31     打赏
9楼

感谢楼主谢谢分享


工程师
2022-03-06 09:29:42     打赏
10楼

谢谢了


共26条 1/3 1 2 3 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]