arduino实战 1——利用arduino做一个简易开门装置

目录     

前言

二、步骤

1.代码部分

2.自己制作一个简易的app

3.连线

4.一些小事情

总结




前言

网上简易宿舍开门装置吸引了我,于是我试着做了一个,材料也不多,基于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/



总结

   通过对此的制作,掌握一些模块使用方法,学习如何解决代码中的问题

  • 9
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

下一站是上岸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值