如何通过NFC实现Arduino经RFID-RC522向Android手机传输温湿度数据?
实现方案分步指南
1. 硬件确认
- 确保RC522模块与Arduino接线正确:SDA接D10,SCK接D13,MOSI接D11,MISO接D12,RST接D9,电源必须接3.3V(接5V会烧毁模块)。
- DHT11接线:VCC接5V,GND接GND,DATA接D2(可自定义,代码中对应修改引脚号即可)。
2. Arduino端代码实现
需要依赖两个库:MFRC522(RC522驱动)和DHT(DHT11驱动)。核心逻辑是让RC522工作在卡模拟模式,将DHT11采集的温湿度数据写入模拟NFC卡的指定块,供手机读取。
代码示例
#include <SPI.h> #include <MFRC522.h> #include <DHT.h> // RC522引脚定义 #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); // DHT11定义 #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); // 存储温湿度的NFC块地址(选择块4,避开系统保留块) const byte blockAddr = 4; // NFC块数据缓冲区,固定16字节 byte blockData[16]; void setup() { Serial.begin(9600); SPI.begin(); mfrc522.PCD_Init(); dht.begin(); // 配置RC522为卡模拟模式 mfrc522.PCD_SetRegisterBitMask(mfrc522.TxControlReg, 0x03); mfrc522.PCD_SetRegisterBitMask(mfrc522.RxControlReg, 0x03); } void loop() { // 读取温湿度数据 float humidity = dht.readHumidity(); float temperature = dht.readTemperature(); // 检查传感器读取是否正常 if (isnan(humidity) || isnan(temperature)) { Serial.println("DHT11数据读取失败"); delay(2000); return; } // 将温湿度转为固定格式字符串,控制长度不超过16字节 String dataStr = "T:" + String(temperature, 1) + "C H:" + String(humidity, 1) + "%"; dataStr.getBytes(blockData, sizeof(blockData)); // 填充剩余字节为0,避免乱码 for (int i = dataStr.length(); i < 16; i++) { blockData[i] = 0; } // 将数据写入模拟NFC卡的指定块 mfrc522.MIFARE_SetValue(blockAddr, (uint32_t*)blockData); // 每秒更新一次数据 delay(1000); }
3. Android端数据读取
无需开发复杂APP,用系统或第三方工具即可:
- 打开手机NFC功能,将手机靠近RC522模块。
- 手机会识别到模拟NFC卡,读取块4的数据,即可看到
T:XX.XC H:XX.X%格式的温湿度信息。 - 若需自定义APP,可使用Android NFC API,监听
TECH_DISCOVERED意图,读取对应块的数据并解析展示。
关键注意事项
- RC522卡模拟模式兼容性:部分品牌手机可能对RC522的模拟卡识别存在差异,建议多机型测试。
- 数据长度限制:每个NFC块仅16字节,需严格控制温湿度字符串长度(示例中保留1位小数刚好符合要求)。
- 电源稳定性:建议给Arduino接外部电源,避免USB供电不足导致RC522工作异常。
内容的提问来源于stack exchange,提问作者neymar santos
相关产品推荐
相关产品推荐

