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

vany5921 发表于 2019-11-12 11:20

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

本帖最后由 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界面设计


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

相关变量进行初始化


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



如果数据库中搜索到目标则开始计算日期间隔天数


刷卡扣费屏幕显示相关信息,从数据库中删除此条记录,生成json数据


串口发送json并改flag标记


如果没有查找到记录则将刷卡相关信息保存至数据库,并进行显示


数据写入卡内并转json发送



切换为数据查看页时打印数据库内容


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



打印机控制端使用两个串口进行通讯(701打印机默认9600波特率,其他速率乱码)利用ArduinoJson进行解码
#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");
}

页: [1]
查看完整版本: 用UIFlow简单实现刷卡计费与查询系统的模拟