问题描述
我试图通过NodeMCU esp8266上的单个SPI总线控制RC522和LCD st7920(128x64)。我为esp8266使用Arduino核心。现在,在代码的这一部分中,我只想在每次在RC522上扫描卡时在LCD上显示卡的UID。代码如下:
#include <SPI.h>
#include <MFRC522.h>
#include <U8g2lib.h>
#define SPI_SCK_pin 14 // Clock pin of SPI
#define SPI_MOSI_pin 13 // MOSI pin of SPI
#define SPI_RST_pin 0 // RST-PIN for RC522 - RFID - SPI - Modul GPIO5
#define SPI_rfid_SS_pin 15 // SDA-PIN for RC522 - RFID - SPI - Modul GPIO4
MFRC522 mfrc522(SPI_rfid_SS_pin,SPI_RST_pin); // Create MFRC522 instance
#define SPI_lcd_SS_pin 5 // Slave Select pin of SPI for lcd<->RS
U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R2,SPI_SCK_pin,SPI_MOSI_pin,SPI_lcd_SS_pin,U8X8_PIN_NONE);
void setup() {
SPI.begin(); // Init SPI bus
Serial.begin(115200); // Initialize serial communications
u8g2.setFont(u8g2_font_amsTrad_cpc_extended_8f);
}
void loop() {
mfrc522.PCD_Init(); // Init MFRC522
// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent()) {
delay(50);
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial()) {
delay(50);
return;
}
Serial.print(F("Card UID:"));
String uid = dump_byte_array(mfrc522.uid.uidByte,mfrc522.uid.size);
Serial.println();
digitalWrite(SPI_rfid_SS_pin,HIGH); //return rfid slave pin back to normal
u8g2.begin();
u8g2.clearBuffer();
u8g2.setCursor(3,10);
u8g2.print (uid);
u8g2.sendBuffer();
digitalWrite(SPI_lcd_SS_pin,HIGH); //return lcd slave pin back to normal
// delay (10);
}
// Helper routine to dump a byte array as hex values to Serial
String dump_byte_array(byte *buffer,byte bufferSize) {
String userid;
for (byte i = 0; i < bufferSize; i++) {
userid += String(buffer[i]);
}
Serial.print(userid);
return userid;
}
我不熟悉esp8266,这是我第一次在单个SPI总线上使用多个从站,因此我可能不知道使用多个从站的正确方法。我尝试通过SPI仅将rfid rc522与esp8266连接,并且在原理图上可以正常使用。同样,液晶显示器也可以在SPI总线上以相同的原理图完美地独立工作。
仅当我尝试通过SPI连接两者时,该问题才存在。问题在于,只有第一次扫描卡时,它才会显示在LCD上。之后,不再扫描卡,并且在液晶显示屏上仅显示扫描的第一张卡。
我想做的是,每次扫描卡时,其UID都会显示在LCD上。 我已经发布了原理图和我可以检查的实际设置。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)