最近因為我在弄一個 60W 的 PD 充電器,然後想弄一個迷你的螢幕來顯示電池的資訊,所以我便選用了一個 2.2寸的 UART HMI 了。
選 UART HMI 的原因有很多,網上也有很多文章教你怎樣選合適的螢幕,所以我就不細說了。簡單來說, UART HMI 是一種可以透過 Serial 來控制螢幕載入預先設計好的界面的一種人機界面。
發送指令到螢幕
HMISerial 是 Software Serial。以下 function 把 cmd 內的內容發到螢幕,如果 debugMode 被啟用,側會同步輸出到 hardware serial 上。
SoftwareSerial HMISerial(2, 3); // RX, TX
//...
void sendCommand(String cmd){
if (debugMode){
//Mirror output to serial
Serial.print(cmd);
Serial.write(0XFF);
Serial.write(0XFF);
Serial.write(0XFF);
}
HMISerial.print(cmd);
HMISerial.write(0XFF);
HMISerial.write(0XFF);
HMISerial.write(0XFF);
delay(50);
}
使用例子:
sendCommand("t0.txt=\"[info] MCU Connected\"");
取得現在 HMI 屏幕正在顯示的 Page ID
如果你把 sendme 指令發到屏幕,屏幕會回傳現在的 page ID 給你,它的回傳信號大約長這樣
66 01 FF FF FF
66 是這個指令的回傳碼,01 是現在的 page ID (即是 page 1),FF FF FF 側是傳送完成的意思,所以我們只需要在 Serial.read() 的時候抓到 0x66 就知道下一個一定是 page ID 了。
int getPageNumber(){
sendCommand("sendme");
bool nextReadIsPageNumber = false;
while (HMISerial.available() > 0) {
// read the incoming byte:
incomingByte = HMISerial.read();
if (nextReadIsPageNumber){
//這是 page ID
nextReadIsPageNumber = false;
return incomingByte;
}
if (incomingByte == 0x66){
//下一個出現的 byte 就是 page ID 了
nextReadIsPageNumber = true;
}
}
}
使用例子(檢查現在是否在 page 0(hex: 0x00))
currentPageNumber = getPageNumber();
if (currentPageNumber == 0x00){
//Do something
}