如何通过NodeMCU esp8266微控制器上的单个SPI总线与RFID阅读器rc522和LCD st7920 128x64通信?

问题描述

我试图通过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上。 我已经发布了原理图和我可以检查的实际设置。

Here is the Schematic

Here is my actual setup

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)