用UIFlow简单实现刷卡计费与查询系统的模拟-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2213|回复: 0

用UIFlow简单实现刷卡计费与查询系统的模拟

[复制链接]
发表于 2019-11-12 11:20 | 显示全部楼层 |阅读模式
本帖最后由 vany5921 于 2019-11-12 11:22 编辑

      前段时间参加MakeFaire展会,现场出现了不少基于M5Stack的项目案例,其中一个就是使用RFID来模拟图书馆的借阅管理,我们都知道平时去图书馆借书都是在电脑上进行数据的录入和查询。借助FACE-RFID面板,我们可以实现一个图书馆的最小系统模拟。
      在该项目中使用了2台M5StackFire和一台701模组的热敏打印机,其中一台Fire连接了RFID面板,用于刷卡与显示用户信息,另外一台Fire用于转发数据控制打印机,同时屏幕显示账单信息。另外一点,由于热敏打印机在arduino下方便驱动,而UIFlow方便做界面和数据库处理,因此代码结合了UIflow和arduino来进行数据处理,降低整体的复杂度,调试比较方便。
     材料:
       M5StackFire x2
       701热敏打印机模块 x1
       1515铝型材  x8
       3D打印底座  x1
       亚克力背板    x1
       FACES_RFID面板 x1
       RFID标签     x2
       12V 2A电源  x1
       GROVE线缆  x3

       考虑到MakeFaire现场的实际情况,没有使用NTP获取网络时间,由于没有RTC,只能自己写一个功能来计时幸好UIFlow里面有一个定时器模块,直接调用就可以,通过计时器我们可以手动来计算时间,为了方便快速调试和验证,我将时间的单位换算设置为十进制的2,也就是2秒=1分,2分=1小时,2小时=1天。
首先进行简单的UI界面设计
截屏2019-11-1210.55.18.png

程序较为复杂,下面就重点内容简要说明一下,由于具备了数据库查看功能,因此需要一个简单的页面切换,用page进行标记 截屏2019-11-1210.47.22.png 截屏2019-11-1210.48.03.png

相关变量进行初始化
截屏2019-11-1210.49.45.png

先扫描书号并从数据库中查找,为了避免误识别加入flag标记只读取一次

截屏2019-11-1210.57.04.png

如果数据库中搜索到目标则开始计算日期间隔天数
截屏2019-11-1210.59.18.png

刷卡扣费屏幕显示相关信息,从数据库中删除此条记录,生成json数据
截屏2019-11-1211.01.28.png

串口发送json并改flag标记
截屏2019-11-1211.06.24.png

如果没有查找到记录则将刷卡相关信息保存至数据库,并进行显示
截屏2019-11-1211.08.16.png

数据写入卡内并转json发送
截屏2019-11-1211.12.38.png


切换为数据查看页时打印数据库内容
截屏2019-11-1211.13.59.png

按键回调A键对卡进行数据格式化并充值,B和C键分别设置为查询与系统操作
截屏2019-11-1211.15.24.png


打印机控制端使用两个串口进行通讯(701打印机默认9600波特率,其他速率乱码)利用ArduinoJson进行解码
[mw_shl_code=arduino,true]#include <M5Stack.h>
#include "Adafruit_Thermal.h"
#include <ArduinoJson.h>



HardwareSerial Serialn(1);
HardwareSerial mySerial(2); // Declare SoftwareSerial obj first
Adafruit_Thermal printer(&mySerial);     // Pass addr to printer constructor

String com = "";
// -----------------------------------------------------------------------

void setup() {
  M5.begin();
  mySerial.begin(9600); //
  Serialn.begin(115200, SERIAL_8N1, 26, 36);  //
  printer.begin();
  M5.Lcd.setCursor(110, 10, 4);
  M5.Lcd.print("PRINTER");
}

void loop() {

    if(Serialn.available()){
       com = "";
       while(Serialn.available()){
        char ch = Serialn.read();
        if(ch != '\n'){
          com  += ch;
        }
       }
       printer.wake();  
       M5.Lcd.clear(BLACK);
       Serial.println(com);
       StaticJsonDocument<200> doc;
       DeserializationError error = deserializeJson(doc, com);
       if (error) {
         Serial.print(F("deserializeJson() failed: "));
         Serial.println(error.c_str());
         return;
       }
      
       String CardNum = doc["CardNum"];
       String Overage = doc["Overage"];
       String Record = doc["Record"];
       String Book = doc["Book"];
       String Borrowing = doc["Borrowing"];
       String Sendback = doc["Sendback"];
      
       M5.Lcd.setCursor(70, 10, 4);
       printer.inverseOn();
       printer.justify('C');
       mySerial.println(F(" Loan receipt "));
       printer.inverseOff();
       M5.Lcd.println(" Loan receipt ");
       M5.Lcd.println("");

       M5.Lcd.setCursor(0, 35, 2);
       printer.justify('L');
       printer.println("--------------------------");
       printer.boldOn();
       printer.setSize('L');
       printer.print(F("CardNum:"));
       printer.boldOff();
       printer.setSize('M');
       printer.println(CardNum);
       M5.Lcd.println("---------------------------------------------------");
       M5.Lcd.print("CardNum:   ");
       M5.Lcd.println(CardNum);


       printer.boldOn();
       printer.setSize('L');
       printer.print(F("Overage:"));
       printer.boldOff();
       printer.setSize('M');
       printer.println(Overage);
       M5.Lcd.println("----------------------------------------------------");
       M5.Lcd.print("Overage:  ");
       M5.Lcd.println(Overage);

       printer.boldOn();
       printer.setSize('L');
       printer.print(F("Record:"));
       printer.boldOff();
       printer.setSize('M');
       printer.println(Record);
       M5.Lcd.println("-----------------------------------------------------");
       M5.Lcd.print("Record:  ");
       M5.Lcd.println(Record);

       printer.boldOn();
       printer.setSize('L');
       printer.print(F("Book:"));
       printer.boldOff();
       printer.setSize('M');
       printer.println(Book);
       M5.Lcd.println("-----------------------------------------------------");
       M5.Lcd.print("Book:  ");
       M5.Lcd.println(Book);


      
       M5.Lcd.setCursor(250, 220);
       printer.justify('R');
       if(Borrowing == "null"){
        printer.print(Sendback);
        M5.Lcd.println(Sendback);
       }else{
        printer.print(Borrowing);
        M5.Lcd.println(Borrowing);
       }
       printer.feed(5);
       delay(2000);
       printer.sleep();
    }
       delay(3000);
       M5.Lcd.setCursor(110, 10, 4);
       M5.Lcd.print("PRINTER");
}[/mw_shl_code]

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-29 01:48 , Processed in 0.080289 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表