完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我试图通过 NodeMCU esp8266 上的单个 SPI 总线控制 RC522 和 lcd st7920 (128x64)。我正在为我的 esp8266 使用 Arduino 内核。现在在这部分代码中,每次在 RC522 上扫描卡时,我只想在 lcd 上显示卡的 UID。代码如下:
代码:全选#include #include #include #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); } Serial.print(userid); return userid; } 我是 esp8266 的新手,这是我第一次在单个 SPI 总线上使用多个从机,所以我可能不知道使用多个从机的正确方法。我尝试通过 SPI 仅将 rfid rc522 与 esp8266 连接起来,它与原理图完美配合。同样,液晶显示器也可以在 SPI 总线上使用相同的原理图完美地单独工作。 仅当我尝试通过 SPI 连接两者时才存在此问题。问题是只有第一次扫描卡片时,它才会显示在液晶显示器上。之后不再扫描卡片,液晶显示屏上只显示扫描的第一张卡片。 我想做的是每次扫描一张卡时,它的 UID 都会显示在液晶显示器上。我已经发布了原理图和我的实际设置,您可以检查一下。 |
|
相关推荐
1个回答
|
|
#define SPI_SS_pin_rfid 12 // Slave select pin for RC522#define SPI_SS_pin_lcd 15 // Slave select pin for LCD#define RST_LCD 5 // RST-PIN for LCDU8GLIB_ST7920_128X64_1X lcd(SPI_SS_pin_lcd, SPI_SCK_pin, SPI_MOSI_pin, RST_LCD);MFRC522 rfid(SPI_SS_pin_rfid, SPI_RST_pin);void setup() { Serial.begin(9600); SPI.begin();// Start the SPI bus lcd.begin(); rfid.PCD_Init(); }void loop() { // Look for new cards if ( ! rfid.PICC_IsNewCardPresent()) return; if ( ! rfid.PICC_ReadCardSerial()) return; //Show UID on serial monitor Serial.print("UID tag :"); String content = ""; for (byte i = 0; i < rfid.uid.size; i++) { Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(rfid.uid.uidByte[i], HEX); content.concat(String(rfid.uid.uidByte[i] < 0x10 ? " 0" : " ")); content.concat(String(rfid.uid.uidByte[i], HEX)); } Serial.println(); //Show UID on LCD lcd.firstPage(); do { lcd.setFontDirection(0); lcd.setFont(u8g_font_6x10); lcd.drawStr(0,10,"UID tag :"); lcd.drawStr(0,20,content.c_str()); } while( lcd.nextPage() ); // Wait a bit delay(500); }在本示例中,我使用了两个不同的从机 SS 引脚 (SPI_SS_pin_rfid 和 SPI_SS_pin_lcd)。这样 RC522 和 LCD 可以在同一个 SPI 总线上进行通信,因此可以使用单个 SPI 总线来轮流控制它们。在代码的主要循环中,我仅在每次扫描到 RFID 卡时在 LCD 上显示 UID。我使用了字符串操作来将 UID 转换为可打印的文本,并在LCD上显示。请注意,在每次lcd显示之前,必须调用firstPage() 和nextPage(),以便在不同的页面中显示LCD内容。
|
|
|
|
只有小组成员才能发言,加入小组>>
343 浏览 0 评论
1192 浏览 1 评论
587浏览 6评论
484浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
468浏览 5评论
467浏览 4评论
443浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-29 03:57 , Processed in 0.829550 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号