用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]