|
RFID全称Radio Frequency Identification,中文名射频识别,它是一项非常简单且便宜的技术,可用于制造基于RFID的门锁、基于RFID的考勤系统的应用。如果在网上搜索基于RFID的项目,您会发现许多与安全性和标签相关的项目,这些项目可能会使这个有趣的模块显得乏味。
为了改变这种情况,我们考虑制作一个基于RFID的物联网事件管理系统,该系统不仅可以监视条目日志,而且可以借助IoT技术将日志和条目数据直接发送到可以处理所有事件的专用服务器。身份验证、授权和管理,使整个过程变得无缝。因此,让我们开始吧。
所需的组件 ● EM18 RFID读卡器 ● RFID卡 ● NodeMCU开发板 ● 1602字符型LCD ● LCD I2C模块 ● 面包板 ● 连接线
EM18 RFID读卡器模块
上图显示了RFID卡和EM18 RFID读卡器模块。 RFID技术并不是什么新鲜事物,而是一项将数字数据编码在RFID标签中并可以由RFID读卡器使用无线电波解码的技术读取。 RFID与条形码相似,其中标签的数据由设备解码。 RFID技术可用于各种应用,例如安全系统、员工考勤系统、RFID门锁、基于RFID的投票机、收费系统等。
EM18读卡器是一个模块,可以读取存储在RFID标签中的ID信息。 RFID标签存储一个12位的唯一编号,当标签位于读卡器的范围内时,EM18读卡器模块可以将其解码。该模块的工作频率为125 kHz,具有内置天线,并使用5伏直流电源供电。它提供串行数据输出,范围为8-12厘米。串行通信参数为8个数据位、1个停止位和9600波特率。
这是一个非常有用的模块,并具有一些有趣的功能。它具有较宽的工作电压范围,可在+ 4.5V至5.5V DC范围内工作,工作时仅消耗50mA电流,因此可以用电池供电。除此之外,它的工作频率为125Khz,使其与各种类型的RFID卡兼容。借助内置天线,它可以读取8厘米至12厘米的距离。它的工作温度为0-80°C,非常适合在恶劣的环境中使用。
基于RFID的事件管理系统的电路图 基于RFID的物联网事件管理系统的完整电路图如下所示。
从电路图中可以看出,我们通过UART将EM-18模块与NodeMCU连接起来。由于EM-18读卡器模块吸收了50mA峰值电流,因此我们已从Node MCU板上为该板供电,板载电源足以驱动模块。同样,我们已经通过NodeMCU的I2C引脚连接了I2C LCD,并且还通过NodeMCU模块为LCD供电。
为基于RFID的事件管理系统设置ThingSpeak帐户 在按照上述电路图成功完成硬件后,我们必须配置ThingSpeak IoT平台,我们将在其中存储所有数据。在这里,我们使用ThingSpeak来存储用户的信息。然后,我们将数据显示到GUI。要在Thingspeak中创建帐户,请执行以下步骤。
注册一个ThingSpeak帐户: 首先,如果您没有Mathworks帐户,请访问https://thingspeak.com/并创建一个新的免费Mathworks帐户。
登录到ThingSpeak: 使用您的凭据登录ThingSpeak,然后单击“New Channel”。现在,填写项目的详细信息,例如名称、字段名称等。在这里,我们必须创建四个字段名称,例如温度、电压等。此后,单击“Save channel”。
保存凭据: 选择创建的通道并记录以下凭据。 ● 频道ID,位于频道视图的顶部。 ● 写入API密钥,可以在您的频道视图的“ API密钥”选项卡上找到。
完成设置并拥有必要的凭证后,就可以进入代码部分。
基于RFID的事件管理系统的Arduino代码 成功设置ThingSpeak帐户并按照电路图进行硬件设置后,就该对NodeMCU板进行编程了。但是,如果您是第一次将代码上传到NodeMCU板,请按照以下步骤操作。
在Arduino IDE中添加对NodeMCU的支持: 打开Arduino IDE,然后转到“File–>Preferences–>Settings”。 在“Additional Board Manager URL”字段中输入https://arduino.esp8266.com/stable/package_esp8266com_index.json,然后单击“OK”。
现在,转到Tools > Board > Boards Manager。在Boards Manager窗口中,在搜索框中键入ESP8266,选择最新版本,然后单击install。
安装完成后,转到Tools ->Board并选择NodeMCU 1.0(ESP-12E Module)。现在,您可以使用Arduino IDE编程NodeMCU。
在完成用于NodeMCU编程的上述设置后,我们必须将完整的代码上传到ESP8266 NodeMCU。
从RFID标签获取唯一的RFID代码 在对NodeMCU进行编程之前,我们需要找出唯一的12位RFID代码。正如我们之前讨论的那样,RFID标签包含12位唯一代码,可以使用RFID读卡器对其进行解码。当我们在读卡器附近滑动RFID标签时,读卡器将在连接到NodeMCU时通过串行端口为我们提供唯一的代码。为此,我们需要设置一小段代码,一旦获得所有模块的代码,就需要确保它们安全以备后用。
成功上传下面给出的小代码后,打开串口监视器,并将波特率设置为9600。然后在读卡器附近刷卡,您将在串口监视器上看到12位数字的代码。对所有使用过的RFID标签执行此过程,并记下它们以备将来参考。
获取唯一的12位RFID标签代码 - int count = 0;
- char card_no[12];
- void setup()
- {
- Serial.begin(9600);
- }
- void loop()
- {
- if(Serial.available())
- {
- count = 0;
- while(Serial.available() && count < 12)
- {
- card_no[count] = Serial.read();
- count++;
- delay(5);
- }
- Serial.print(card_no);
- }
- }
复制代码
基于Arduino的事件管理项目的最终代码 首先我们包含所有必需的库文件。我们使用ThingSpeak.h库与ThingSpeak平台进行通信。您可以在板管理器中添加该库。当我们使用基于16x2 I2C的LCD时,我们必须包括“ LiquidCrystal_I2C.h”和“ wire”.h”库。我们还需要包括time库,这将有助于我们获取当前的时间戳。 - #include "ThingSpeak.h"
- #include <ESP8266WiFi.h>
- #include<LiquidCrystal_I2C.h>
- #include<Wire.h>
- #include <time.h>
复制代码接下来,我们使用提供的函数初始化LCD。 - LiquidCrystal_I2C lcd(0x3f, 16, 2);
复制代码现在,我们定义所有必要的网络凭据,即SSID和密码。这些是将NodeMCU与Internet连接所必需的。然后,我们定义ThingSpeak帐户的所有凭据(例如通道号)并写入先前记录的API。确保您已编辑凭证代替这些变量。 - unsigned long ch_no = 123456
- const char * write_api = "MCxxxxxxx";
- char ssid[] = "admin";
- char pass[] = "12345678";
复制代码
在setup()函数中,我们首先启用串口监视器。接下来,我们获得当前时间戳。此后,我们使用wire函数初始化LCD。 - Serial.begin(9600);
- configTime(11 * 1800, 0, "pool.ntp.org", "time.nist.gov");
- Wire.begin(D2, D1);
- lcd.begin(16, 2);
- lcd.init();
复制代码为了将nodeMCU连接到Internet,调用了WiFi.begin函数,并传递了网络SSID和密码作为其参数。之后,我们使用WiFi.status()函数检查是否已连接Wi-Fi,并且成功连接后,液晶显示屏上会显示一条消息,指出“WiFi connected”。 - WiFi.begin(ssid, pass);
- while (WiFi.status() != WL_CONNECTED)
- {
- delay(500);
- Serial.print(".");
- }
- Serial.println("WiFi connected");
- Serial.println(WiFi.localIP());
- lcd.setCursor(0, 1);
- lcd.print("WiFi connected");
复制代码在while循环中,我们计算总数。使用lcd.print命令显示在LCD上的访问者数量,如下所示。 - lcd.setCursor(0, 0);
- lcd.print("No. of Vis:" + String(vis_count));
复制代码
为了获得当前时间戳,使用了time()函数并将输出保存在一个字符数组中,如下所示。 - time_t now = time(nullptr);
- str = ctime(&now);
复制代码
在此,RFID标签的唯一12位代码被解码并存储在数组中。然后,数组中的元素将与内存中的“存储的标签”编号匹配,以获取访问者的详细信息。记住我们之前保存的标签详细信息。 - if (Serial.available())
- {
- count = 0;
- while (Serial.available() && count < 12)
- {
- input[count] = Serial.read();
- count++;
- delay(5);
- }
复制代码在这里,我们将接收到的数组与存储的标签代码进行比较。如果代码与任何已保存的卡详细信息匹配,则执行此条件,并在LCD上显示访客信息。 - if (count == 12)
- {
- if ((strncmp(input, "0B00284F9AF6", 12) == 0) && (a == 0))
- {
- lcd.setCursor(0, 1);
- lcd.print("Welcome Debasis ");
- vis_count++;
- a = 1;
- delay(2000);
- lcd.clear();
- senddata("Debasis");
- }
- }
复制代码
Senddata()函数用于将访问者数据发送到ThingSpeak云。从ThingSpeak,我们可以稍后以excel格式下载此数据,以查看记录的详细信息,例如访问者姓名和进入时间等。 - void senddata(String input)
- {
- ThingSpeak.setField(1,input);
- ThingSpeak.setField(2, str);
- ThingSpeak.writeFields(ch_no, write_api);
- }
复制代码
测试基于RFID和NodeMCU的事件管理系统 为了测试项目,我们给NodeMcu上电,并确保WiFi网络可用,NodeMCU将连接到该WiFi网络。
此后,液晶显示屏上将显示一条消息,显示“WiFi connected”。如果未显示,请尝试检查您的网络连接。
之后,我们在RFID读卡器上刷卡,然后在LCD上显示欢迎消息,提示您如下图所示。我们对所有RFID卡重复此过程,直到对结果满意为止。
最后,要从ThingSpeak云下载此数据,请登录ThingSpeak,然后单击“Data Import/Export”选项卡。在“Export”菜单下,选择正确的时区,然后单击“Download”。它将以.csv格式下载Excel工作表,如下所示。
希望您喜欢这篇文章并学到新知识。如果您对本文有任何疑问,请随时在本帖下面进行回复。 |