目录
前言
网上简易宿舍开门装置吸引了我,于是我试着做了一个,材料也不多,基于arduino的一个蓝牙,nfc开门装置。
一、材料准备
1、首先肯定要有一块arduino的板子(我用的是UNO)
2、蓝牙模块
3、NFC模块
4、各种杜邦线
5、舵机
6、oled显示屏
备注:电源自备,充电宝就行。现在全球缺芯片,单片机的价格水涨船高,不少的店家十分的贵,推荐一个店家:信泰微电子;买的真心的好,虽然客服回复的慢了一点,但会很耐心的。
二、步骤
1.代码部分
废话不多说,上代码
#include <deprecated.h>
#include <MFRC522.h>
#include <MFRC522Extended.h>
#include <require_cpp11.h>
#include <SoftwareSerial.h>
#include <Servo.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h> //加载NFC,蓝牙模块,舵机的库函数
MFRC522 rfid(10, 9); //定义MFRCC522的数据口
Servo DJ; //定义一个舵机
byte nuidPICC[4]; //创建一个卡片,这里的4是指4个16位的数据
SoftwareSerial BT(4, 5); //蓝牙模块数据传输串口
String val = ""; //一个空的字符串,为蓝牙模式准备
Adafruit_SSD1306 display(128, 64, &Wire, 8); //加载SSD1306
static const unsigned char PROGMEM mu[] =
{ 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7F, 0xFC, 0x03, 0x80, 0x05, 0x40, 0x05, 0x40,
0x09, 0x20, 0x11, 0x10, 0x21, 0x08, 0x41, 0x04, 0x81, 0x02, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00
};
static const unsigned char PROGMEM you[] =
{ 0x02, 0x00, 0x02, 0x00, 0xFF, 0xFE, 0x04, 0x00, 0x04, 0x00, 0x0F, 0xF0, 0x08, 0x10, 0x18, 0x10,
0x2F, 0xF0, 0x48, 0x10, 0x88, 0x10, 0x0F, 0xF0, 0x08, 0x10, 0x08, 0x10, 0x08, 0x50, 0x08, 0x20
};
static const unsigned char PROGMEM ka[] =
{ 0x02, 0x00, 0x02, 0x00, 0x03, 0xF8, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xFF, 0xFE, 0x02, 0x00,
0x02, 0x00, 0x02, 0x40, 0x02, 0x20, 0x02, 0x10, 0x02, 0x08, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00
};
static const unsigned char PROGMEM D[] =
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00
};
static const unsigned char PROGMEM qi[] =
{ 0x10, 0x00, 0x10, 0x00, 0x3F, 0xFC, 0x20, 0x00, 0x4F, 0xF0, 0x80, 0x00, 0x3F, 0xF0, 0x00, 0x10,
0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x06, 0x00, 0x02
};
static const unsigned char PROGMEM bu[] =
{ 0x00, 0x00, 0x7F, 0xFC, 0x00, 0x80, 0x00, 0x80, 0x01, 0x00, 0x01, 0x00, 0x03, 0x40, 0x05, 0x20,
0x09, 0x10, 0x11, 0x08, 0x21, 0x04, 0x41, 0x04, 0x81, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00
};
static const unsigned char PROGMEM ai[] =
{ 0x01, 0x10, 0x01, 0x10, 0x7B, 0xFC, 0x49, 0x10, 0x49, 0x10, 0x48, 0x00, 0x4A, 0x08, 0x4A, 0x08,
0x49, 0x10, 0x49, 0x10, 0x78, 0xA0, 0x48, 0x40, 0x00, 0xA0, 0x01, 0x10, 0x02, 0x08, 0x0C, 0x06
};
static const unsigned char PROGMEM You[] =
{ 0x00, 0x00, 0x3F, 0xF0, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x08, 0x20, 0x08, 0x20, 0x04, 0x40,
0x04, 0x40, 0x02, 0x80, 0x01, 0x00, 0x02, 0x80, 0x04, 0x40, 0x08, 0x20, 0x30, 0x18, 0xC0, 0x06
};
static const unsigned char PROGMEM le[] =
{ 0x00, 0x00, 0x7F, 0xF8, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x05, 0x00, 0x02, 0x00
};
//以上为取模软件所生成的
void setup()
{
SPI.begin(); //时钟初始化
rfid.PCD_Init(); //NFC初始化
Serial.begin(9600);//串口波特率定义为9600
BT.begin(9600);
DJ.attach(6); //舵机的信息口定义在6号脚,
DJ.write(0); //初始给舵机写入0°
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //SSD1306的地址
}
void loop()
{
for (int i;; i++)//不断循环,使程序能够不断运行,while(1)也行
{
if ( ! rfid.PICC_IsNewCardPresent())//找卡
{
display.setTextColor(WHITE);
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 8);
display.println("~LALA~");
display.drawBitmap(0, 32, mu, 16, 16, 1);
display.drawBitmap(16, 32, you, 16, 16, 1);
display.drawBitmap(32, 32, ka, 16, 16, 1);
display.display();
display.startscrollleft(0x00, 0x0F);
delay(100); //oled显示
if (BT.available()) {
while (BT.available() > 0)
{
val += char(BT.read());
delay(2);
}
Serial.println(val);
}
if (val == "2")
{ DJ.write(170);
delay(1000);
DJ.write(0);
}
val = "";
} //蓝牙模块开门,注意一定要将val制空,不然无法进行下一次开锁
else
{
display.setTextColor(WHITE);
display.clearDisplay();
display.setTextSize(1);
display.setCursor(35, 8);
display.println("HAHA");
display.drawBitmap(16, 32, ai, 16, 16, 1);
display.drawBitmap(32, 32, D, 16, 16, 1);
display.drawBitmap(48, 32, You, 16, 16, 1);
display.drawBitmap(64, 32, you, 16, 16, 1);
display.drawBitmap(80, 32, le, 16, 16, 1);
display.display();
display.startscrollleft(0x00, 0x0F);
if ( ! rfid.PICC_ReadCardSerial())
MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);//找到卡片,比对卡片类型
for (byte i = 0; i < 4; i++) {
nuidPICC[i] = rfid.uid.uidByte[i];
Serial.println(nuidPICC[i]);
}
if (nuidPICC[0] == 0X43 && nuidPICC[1] == 0X8F && nuidPICC[2] == 0XD2 && nuidPICC[3] == 0X04 || nuidPICC[0] == 0XFC && nuidPICC[1] == 0XC1 && nuidPICC[2] == 0X20 && nuidPICC[3] == 0X4A)//校验是否为本人卡片
{
DJ.write(170);
delay(1000);
DJ.write(0);
}//nfc开锁
}
}
}
2.自己制作一个简易的app
我是学长推荐的appinventor,不过我搜到的是App inventor 2 增强版,也不知道有什么差别。跳转链接:WxBit 图形化编程 - 汉化并增强的 App Inventor 2 服务器 ,很方便,脱离苦海。
这个就不做过多解释了,因为我也是一知半解,就不误导大家了。
3.连线
大家最关心的连线来了。
这个连线太多,我就打出来吧,也方便大家连线(因为现在大部分都是拍照,看起来费眼睛,费脑子)。本人穷逼一个,买的盗版板子,因为接线太多我直接用扩展口了,而且十分方便,之所以没用板子的RX,TX,是因为蓝牙模块,NFC模块都要数据传输,防止万一,自己定一个串口。
舵机红正褐地黄信号,最好接5V,3.3V也可,信号线接6号口
OLED就是正常接,扩展口是正好一排插入
蓝牙模块电源正常接,RX接D5,TX接D4。上电一定要注意,有的蓝牙模块只能上3.3V,我没遇到,但是网上说了。而且单一蓝牙模块是RX接板子上的TX
MFRCC522最麻烦 SDA接D10,SCK接D13,MOSI接D11,MISOI接D12,RST接D9
一定要注意刷新口的定义,不可以与其他模块冲突,不然功能肯定无法实现
4.一些小事情
UNO引脚定义图:
MFRCC522的接线定义:
蓝牙模块的调试还须USB转TTL的线,通过串口助手更改密码,名称等
AT指令集:百度网盘 请输入提取码
NFC模块可以通过手机软件NFCTools读取卡号,因为对其了解不深,不知道如何防冲突,因此只要是同批次卡都能解开,大神们自己修改一下。
另,蓝牙模块程序部分转载自:https://blog.csdn.net/
总结
通过对此的制作,掌握一些模块使用方法,学习如何解决代码中的问题