毕设上找的资料,买板子自己连线,代码通过磕磕绊绊的修改终于运行成功了,但是上传后相关元件无法使用比如:RFID,LCD1602A,密码键盘等。
#include <DS3231.h>
#include <SD.h>
#include <Keypad.h>
#include <MFRC522.h>
#include <Servo.h>
#include <SoftwareSerial.h>
#include <LiquidCrystal.h>
SoftwareSerial mySerial(10,11); //软件初始化
DS3231 rtc(SDA,SCL);
#define SSRFID_PIN 53
#define RSTRFID_PIN 47
MFRC522 mfrc522(SSRFID_PIN,RSTRFID_PIN);
#define SSSD_PIN 54
File myFile;
//键盘
const byte ROWS = 4; //键盘行
const byte COLS = 4; //键盘列
//键盘布局
char hexaKeys[ROWS][COLS] = {
{'1' ,'2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {31, 33, 35, 37}; //输出行
byte colPins[COLS] = {39, 41, 43, 45}; //输出列
Keypad keyPad=Keypad(makeKeymap(hexaKeys),rowPins,colPins, ROWS,COLS);
//LCD
LiquidCrystal lcd(22,23,24,25,26,27); //LCD引脚
int redPin=2; //红色引脚(无法访问)
int greenPin=3; //绿色引脚(允许访问)
int doorPin=5; //门锁 (高电平关闭)
int steps=0; //计数器
int state=0; //蓝牙状态
//舵机
Servo servo_Motor;
String password = "1234"; //键盘默认密码
int position=0; // LCD和密码变量
int wrong=0; // 密码错误次数
//RFID
//1A 83 57 D3 = 蓝色标签
//B3 13 C6 AD = 白色标签
void setup()
{
Serial.begin(9600);
rtc.begin(); //启动实时时钟
mySerial.begin(9600); //蓝牙串行
pinMode(doorPin, INPUT_PULLUP);
//SD卡
pinMode(46, OUTPUT); //将引脚46更改为输出模式(SS引脚)
digitalWrite(46, HIGH); //RFID一开始需要高电平
//RFID
pinMode(53, OUTPUT); //将引脚53更改为输出模式(SS引脚)
digitalWrite(53, LOW); //必须从启动时开始降低,以便使用RFID。
SPI.begin(); //启动串行外围接口
mfrc522.PCD_Init(); //启动RFID
if (!SD.begin(46)) //启动SD库和卡
{
while (1);
}
Serial.println("initialization done."); //串行故障排除
lcd.begin(16,2); //LCD尺寸
lcd.clear();
servo_Motor.attach(6); //将舵机接到6号引脚(PWM)
setLocked(true); //安装过程中第一次锁定
}
void loop()
{
lcd.clear(); //清屏
lcd.print("Enter Password: "); //LCD显示
delay(100);
//键盘
char pressed = keyPad.getKey(); //用于按键的变量
String key[4]; //变量
if (pressed) //如果通过键盘输入密码
{
lcd.clear(); //清屏
lcd.print("Enter Password:"); //LCD显示
lcd.setCursor(position, 1); //
lcd.print(pressed); //LCD显示按下的键
delay(200);
if (pressed == '*' || pressed == '#') //I如果按下*或#
{
position = 0; //复位
setLocked(true); //锁定
lcd.clear(); //LCD清屏
}
else if (pressed == password[position]) //如果按下的密码正确
{
key[position] = pressed; //将按下的剑添加到变量
position++; //
}
else if (pressed != password[position] ) //如果按下的密码不正确
{
wrong++; //错误+1
position ++;
}
if (position == 4) //如果=4
{
if (wrong>0) //如果错误计数器大于0
{
wrong=0; //重置错误计数器
position=0; //重置计数器
lcd.clear(); //LCD清屏
lcd.print("WRONG");
lcd.setCursor(5,1);
lcd.print("PASSWORD");
delay(1000);
setLocked(true); //锁定
}
else if (position==4&&wrong==0) //如果计数器等于4且错误等于0
{
position = 0; //复位
wrong = 0; //复位
lcd.clear();
lcd.print("PASSWORD");
lcd.setCursor(6, 1);
lcd.print("ACCEPTED");
delay(1000);
lcd.clear();
lcd.print("Door Open");
setLocked(false); //解除锁定
steps=1;
}
}
}
//蓝牙
else if (mySerial.available()>0) // 检测是否有数据传入
{
state=mySerial.read(); // 读取数据
if (state == '1')
{
lcd.clear();
lcd.print("Bluetooth Open");
setLocked(false);
steps=1;
mySerial.println("Unlocked"); // 发回字符串"Unlocked"
}
}
//RFID //等待标签
else
{
if (!mfrc522.PICC_IsNewCardPresent())
{
return;
}
//读取卡信息
if (!mfrc522.PICC_ReadCardSerial())
{
return;
}
String content = ""; //标签ID
for (byte i=0;i<mfrc522.uid.size;i++)
{
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
//匹配标签信息
content.toUpperCase();
content = content.substring(1);
if ((content=="1A 83 57 D3")||(content == "B3 13 C6 AD")) //如果标签匹配成功
{
digitalWrite(53, HIGH);
digitalWrite(46, LOW);
myFile = SD.open("log.txt", FILE_WRITE); //打开SD卡上的文件
if (content == "1A 83 57 D3") //如果匹配
{
lcd.clear();
lcd.setCursor(3,0);
lcd.print("Velkommen");
lcd.setCursor(4, 1);
lcd.print("Flemming");
//SD卡
myFile.print(rtc.getDateStr()); //将日期打印到SD卡
myFile.print(" ");
myFile.print(rtc.getTimeStr());
myFile.print(" ");
myFile.println("Flemming");
myFile.close(); //关闭SD打开的文件
digitalWrite(46, HIGH);
digitalWrite(53, LOW);
}
if (content == "B3 13 C6 AD")
{
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("Velkommen");
lcd.setCursor(4, 1);
lcd.print("Mikkel");
myFile.print(rtc.getDateStr());
myFile.print(" ");
myFile.print(rtc.getTimeStr());
myFile.print(" ");
myFile.println("Mikkel");
myFile.close();
digitalWrite(46, HIGH);
digitalWrite(53, LOW);
}
setLocked(false);
steps = 1;
}
else //如果标签不匹配
{
lcd.clear();
lcd.print("Not Authorized");
delay(2000);
}
}
//检测开关状态
while (steps>0)
{
if ((steps == 1)&&(digitalRead(doorPin)==HIGH)) //如果等于1,则读取状态然后继续
{
steps = 2;
}
if ((steps==2)&&(digitalRead(doorPin)==LOW))
{
steps = 3; //set step 3
}
if ((steps==3)&&(digitalRead(doorPin)==HIGH))
{
setLocked(true);
lcd.clear();
lcd.print("Enter Password:");
mySerial.println("locked");
steps=0;
}
}
}
void setLocked(int locked)
{
if (locked)
{
digitalWrite(redPin, HIGH); //红灯亮
digitalWrite(greenPin, LOW); //绿灯灭
servo_Motor.attach(6); //将舵机链接到6号引脚
servo_Motor.write(150); //舵机旋转150度
delay(1000);
servo_Motor.detach();
}
else
{
digitalWrite(redPin, LOW);
digitalWrite(greenPin, HIGH);
servo_Motor.attach(6);
servo_Motor.write(0);
delay(1000);
servo_Motor.detach();
}
}
如果把LCD的初始化放到set up最前面就可以实现LCD的初始化,但如果像上面代码按arduino mega的引脚顺序初始化就不行了