■ 相关文献链接:

  • Arduino基本人机接口:点阵LED、汉字库、键盘
  • Grove Beginner Kits基础实验
  • ESP8266访问网站-urequest get方法
  • Arduio软件开发环境搭建

§01 基于Arduino UNO门禁接口


1、前期的准备工作

  • Arduino基本人机接口:点阵LED、汉字库、键盘 初步对于基于Arduino的门禁系统中重要部件,进行了测试,包括键盘、点阵LED、汉字库(在一开始没有测试出结果)
  • Grove Beginner Kits基础实验 对于基于ESP8266的WiFi模块以及由它控制语音模块进行测测试。并给出了系统设计框图。
  • ESP8266访问网站-urequest get方法 进行了通过ESP8266访问网站的基本方法测试。
  • Arduio软件开发环境搭建 中给出了搭建Arduino的开发环境的过程。

▲ 门禁系统的系统框图

下面将基于前面的初步测试

2、系统硬件设计1

(1)原理图设计

▲ 系统详细原理图

下面给出自制电路板功能说明:

Ⅰ.ESP8266 WiFI模块接口:
串口接口:软件UART,IO2-RX,IO3-TX
TTS接口:ESP8266中的TXD1。
舵机接口:ESP8266中的GPIO4
Ⅱ.4×4按键接口:
Arduino数字接口:IO4,5,6,7,8,9,18,19
Ⅲ.LED模块接口:
Arduino数字接口:IO14,15,16,17
Ⅳ.汉字库模块接口:
Arduino数字接口:MOSI,MISO,SCK,SS
Ⅴ.人脸识别接口:
Arduino数字接口:UART:RX,TX

为了参考方便,将 Grove Beginner Kits基础实验 中关于Arduino的数字口的配置显示如下:

▲ Arduino UNO的端口定义

(2)PCB设计

为了使用快速制版,设计了适合单面制版的PCB图,通过快速制版形成测试的电路。

▲ 设计版图以及快速制版电路图

3、焊接与调试

(1)焊接之后的电路板

将焊接之后的电路板放置在Grove Beginner Kit上进行调试。

▲ 焊接之后的电路板

§02 电路调试


1、4×4按键矩阵

(1)测试代码

下面的代码是从 Arduino基本人机接口:点阵LED、汉字库、键盘 拷贝过来的。对于其中KEYLIN_n, KEYCODE_n重新进行了定义。

▲ 原理图中,4×4键盘对应的接口

代码中,在 #define KEYLINE_n, KEY_CODE_n 分别定义了4×4键盘矩阵连接到Arduino数字接口的端口。

/*
**==============================================================================
** TESTKEY.C:             -- by Dr. ZhuoQing, 2021-05-25
**
**==============================================================================
*///------------------------------------------------------------------------------#define KEYLINE_1       4
#define KEYLINE_2       5
#define KEYLINE_3       6
#define KEYLINE_4       7
#define KEYCODE_1       8
#define KEYCODE_2       9
#define KEYCODE_3       18
#define KEYCODE_4       19#define KEY_NULL        0xff
#define KEY_1           0x47
#define KEY_2           0x4B
#define KEY_3           0x4D
#define KEY_4           0x37
#define KEY_5           0x3B
#define KEY_6           0x3D
#define KEY_7           0x27
#define KEY_8           0x2B
#define KEY_9           0x2D
#define KEY_0           0x17
#define KEY_A           0x4E
#define KEY_B           0x3E
#define KEY_C           0x2E
#define KEY_D           0x1E
#define KEY_E           0x1D
#define KEY_F           0x1Bvoid keyLineSet(unsigned char ucLine) {if(ucLine & 0x1)    digitalWrite(KEYLINE_1, HIGH);else digitalWrite(KEYLINE_1, LOW);if(ucLine & 0x2)    digitalWrite(KEYLINE_2, HIGH);else digitalWrite(KEYLINE_2, LOW);if(ucLine & 0x4)    digitalWrite(KEYLINE_3, HIGH);else digitalWrite(KEYLINE_3, LOW);if(ucLine & 0x8)    digitalWrite(KEYLINE_4, HIGH);else digitalWrite(KEYLINE_4, LOW);
}void keySetup(void) {pinMode(KEYLINE_1, OUTPUT);pinMode(KEYLINE_2, OUTPUT);pinMode(KEYLINE_3, OUTPUT);pinMode(KEYLINE_4, OUTPUT);pinMode(KEYCODE_1, INPUT_PULLUP);pinMode(KEYCODE_2, INPUT_PULLUP);pinMode(KEYCODE_3, INPUT_PULLUP);pinMode(KEYCODE_4, INPUT_PULLUP);        keyLineSet(0x0);
}unsigned char keyReadCode(void) {keyLineSet(0xe);if(keyCode() != 0xf) return 0x10 | keyCode();keyLineSet(0xd);if(keyCode() != 0xf) return 0x20 | keyCode();keyLineSet(0xb);if(keyCode() != 0xf) return 0x30 | keyCode();keyLineSet(0x7);if(keyCode() != 0xf) return 0x40 | keyCode();return 0xff;
}unsigned char keyCode(void) {unsigned char ucCode;ucCode = 0x0;if(digitalRead(KEYCODE_1) == HIGH) ucCode |= 0x1;if(digitalRead(KEYCODE_2) == HIGH) ucCode |= 0x2;if(digitalRead(KEYCODE_3) == HIGH) ucCode |= 0x4;if(digitalRead(KEYCODE_4) == HIGH) ucCode |= 0x8;return ucCode;
}//------------------------------------------------------------------------------
unsigned char Hex2Text(unsigned char ucCode) {if(ucCode < 10) {return '0' + ucCode;}return 'A' + ucCode - 10;}void SendHEX8(unsigned char ucCode) {Serial.write(Hex2Text(ucCode >> 4));Serial.write(Hex2Text(ucCode & 0xf));
}//------------------------------------------------------------------------------
void setup(void) {Serial.begin(115200);keySetup();}//------------------------------------------------------------------------------
void loop(void) {delay(250);SendHEX8(keyReadCode());Serial.write("\r\n");
}//==============================================================================
//                END OF THE FILE : TESTKEY.C
//------------------------------------------------------------------------------

(2)串口监视器

使用“工具栏”中的“串口监视器”,可以看到程序发送的读到的按键的二进制编码。 在没有按键的时候,读出的编码为0xff。其它的按键编码在上面的代码中前面进行了宏定义。

▲ 使用串口监视器获得Arduino发送的按键编码值

2、测试点阵LED

测试点阵LED的代码来自于 Arduino基本人机接口:点阵LED、汉字库、键盘 。根据原理图中的设计,对应LED_DATA1,LED_DATA2,LED_CLK1,LED_CLK2定义与前面实验相同,所以所使用的代码可以直接使用。

▲ 原理图中关于点阵LED以及汉字库接口

(1)测试代码

/*
**==============================================================================
** TESTLED.C:             -- by Dr. ZhuoQing, 2021-05-25
**
**==============================================================================
*/#define LED_DATA1       14
#define LED_DATA2       15
#define LED_CLK1        16
#define LED_CLK2        17//------------------------------------------------------------------------------
unsigned char g_ucLEDBuffer[4][16];void ledSetup(void) {int i, j;for(i = 0; i < 4; i ++) {for(j = 0; j < 16; j ++) {g_ucLEDBuffer[i][j] = 0x0;}}pinMode(LED_DATA1, OUTPUT);pinMode(LED_DATA2, OUTPUT);pinMode(LED_CLK1, OUTPUT);pinMode(LED_CLK2, OUTPUT);        digitalWrite(LED_CLK1, HIGH);digitalWrite(LED_CLK2, HIGH);digitalWrite(LED_DATA1, HIGH);digitalWrite(LED_DATA2, HIGH);}void ledSetData12(unsigned char ucData12) {if(ucData12 & 0x1) digitalWrite(LED_DATA1, HIGH);else digitalWrite(LED_DATA1, LOW);if(ucData12 & 0x2) digitalWrite(LED_DATA2, HIGH);else digitalWrite(LED_DATA2, LOW);
}void ledClock1(void) {digitalWrite(LED_CLK1, HIGH);       // clock up 7usdigitalWrite(LED_CLK1, LOW);
}void ledClock2(void) {digitalWrite(LED_CLK2, HIGH);digitalWrite(LED_CLK2, LOW);
}void ledStart(void) {digitalWrite(LED_DATA1, LOW);digitalWrite(LED_DATA2, LOW);digitalWrite(LED_CLK1, LOW);digitalWrite(LED_CLK2, LOW);}void ledStop(void) {digitalWrite(LED_DATA1, LOW);digitalWrite(LED_DATA2, LOW);digitalWrite(LED_CLK1, HIGH);digitalWrite(LED_CLK2, HIGH);digitalWrite(LED_DATA1, HIGH);digitalWrite(LED_DATA2, HIGH);}void ledWriteData(unsigned char ucChar1, unsigned char ucChar2,unsigned char ucChar3, unsigned char ucChar4) {unsigned char i;unsigned char ucMask;ucMask = 0x1;for(i = 0; i < 8; i++) {if(ucChar1 & ucMask) digitalWrite(LED_DATA1, HIGH);else digitalWrite(LED_DATA1, LOW);            if(ucChar2 & ucMask) digitalWrite(LED_DATA2, HIGH);else digitalWrite(LED_DATA2, LOW);            digitalWrite(LED_CLK1, HIGH);       // clock up 7usdigitalWrite(LED_CLK1, LOW);if(ucChar3 & ucMask) digitalWrite(LED_DATA1, HIGH);else digitalWrite(LED_DATA1, LOW);            if(ucChar4 & ucMask) digitalWrite(LED_DATA2, HIGH);else digitalWrite(LED_DATA2, LOW); digitalWrite(LED_CLK2, HIGH);       // clock up 7usdigitalWrite(LED_CLK2, LOW);ucMask = ucMask << 1;}}//------------------------------------------------------------------------------
#define LEDCMD_ADD_INC          0x40
#define LEDCMD_ADD_SET          0x44
#define LEDCMD_MODE_CLOSE       0x80
#define LEDCMD_MODE_OPEN        0x8a//------------------------------------------------------------
void ledWriteByteAll(unsigned char ucChar) {ledWriteData(ucChar, ucChar, ucChar, ucChar);
}void ledWriteData16All(unsigned char ucData) {unsigned char i;ledStart();ledWriteByteAll(LEDCMD_ADD_INC);ledStop();ledStart();ledWriteByteAll(0xc0);for(i = 0; i < 16; i ++) {ledWriteByteAll(ucData);}ledStop();ledStart();    ledWriteByteAll(LEDCMD_MODE_OPEN);ledStop();
}//------------------------------------------------------------------------------
void ledWriteBuffer(void) {unsigned char i;ledStart();ledWriteByteAll(LEDCMD_ADD_INC);ledStop();ledStart();ledWriteByteAll(0xc0);for(i = 0; i < 16; i ++) {ledWriteData(g_ucLEDBuffer[0][i],g_ucLEDBuffer[1][i],g_ucLEDBuffer[2][i],g_ucLEDBuffer[3][i]);}ledStop();    ledStart();    ledWriteByteAll(LEDCMD_MODE_OPEN);ledStop();
}//------------------------------------------------------------------------------
#define LED_PIN         13
void setup(void) {ledSetup();pinMode(LED_PIN, OUTPUT);}//------------------------------------------------------------------------------
unsigned char ucCount = 0;
void loop(void) {int i, j;ucCount ++;if(ucCount & 0x1) digitalWrite(LED_PIN, HIGH);else digitalWrite(LED_PIN, LOW);for(i = 0; i < 4; i ++) {for(j = 0; j < 16; j ++) {g_ucLEDBuffer[i][j] = ucCount;}}ledWriteBuffer();delay(500);
}//==============================================================================
//                END OF THE FILE : TESTLED.C
//------------------------------------------------------------------------------

(2)运行效果

根据前面程序的逻辑,点阵LED显示的内容如下图所示。

▲ 程序运行结果

(3)显示字符

▲ 显示FONT字符

(4)显示按键数值

▲ 显示按键编码数值

▲ 显示按键字符

/*
**==============================================================================
** TESTLED.C:             -- by Dr. ZhuoQing, 2021-05-25
**
**==============================================================================
*///------------------------------------------------------------------------------#define KEYLINE_1       4
#define KEYLINE_2       5
#define KEYLINE_3       6
#define KEYLINE_4       7
#define KEYCODE_1       8
#define KEYCODE_2       9
#define KEYCODE_3       18
#define KEYCODE_4       19#define KEY_NULL        0xff
#define KEY_1           0x47
#define KEY_2           0x4B
#define KEY_3           0x4D
#define KEY_4           0x37
#define KEY_5           0x3B
#define KEY_6           0x3D
#define KEY_7           0x27
#define KEY_8           0x2B
#define KEY_9           0x2D
#define KEY_0           0x17
#define KEY_A           0x4E
#define KEY_B           0x3E
#define KEY_C           0x2E
#define KEY_D           0x1E
#define KEY_E           0x1D
#define KEY_F           0x1Bvoid keyLineSet(unsigned char ucLine) {if(ucLine & 0x1)    digitalWrite(KEYLINE_1, HIGH);else digitalWrite(KEYLINE_1, LOW);if(ucLine & 0x2)    digitalWrite(KEYLINE_2, HIGH);else digitalWrite(KEYLINE_2, LOW);if(ucLine & 0x4)    digitalWrite(KEYLINE_3, HIGH);else digitalWrite(KEYLINE_3, LOW);if(ucLine & 0x8)    digitalWrite(KEYLINE_4, HIGH);else digitalWrite(KEYLINE_4, LOW);
}void keySetup(void) {pinMode(KEYLINE_1, OUTPUT);pinMode(KEYLINE_2, OUTPUT);pinMode(KEYLINE_3, OUTPUT);pinMode(KEYLINE_4, OUTPUT);pinMode(KEYCODE_1, INPUT_PULLUP);pinMode(KEYCODE_2, INPUT_PULLUP);pinMode(KEYCODE_3, INPUT_PULLUP);pinMode(KEYCODE_4, INPUT_PULLUP);        keyLineSet(0x0);
}unsigned char keyReadCode(void) {keyLineSet(0xe);if(keyCode() != 0xf) return 0x10 | keyCode();keyLineSet(0xd);if(keyCode() != 0xf) return 0x20 | keyCode();keyLineSet(0xb);if(keyCode() != 0xf) return 0x30 | keyCode();keyLineSet(0x7);if(keyCode() != 0xf) return 0x40 | keyCode();return 0xff;
}unsigned char keyCode(void) {unsigned char ucCode;ucCode = 0x0;if(digitalRead(KEYCODE_1) == HIGH) ucCode |= 0x1;if(digitalRead(KEYCODE_2) == HIGH) ucCode |= 0x2;if(digitalRead(KEYCODE_3) == HIGH) ucCode |= 0x4;if(digitalRead(KEYCODE_4) == HIGH) ucCode |= 0x8;return ucCode;
}//------------------------------------------------------------------------------
const unsigned char F6x8[][6] =
{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },   // sp{ 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 },   // !{ 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 },   // "{ 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 },   // #{ 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 },   // ${ 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 },   // %{ 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 },   // &{ 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 },   // '{ 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 },   // ({ 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 },   // ){ 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14 },   // *{ 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08 },   // +{ 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00 },   // ,{ 0x00, 0x08, 0x08, 0x08, 0x08, 0x08 },   // -{ 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 },   // .{ 0x00, 0x20, 0x10, 0x08, 0x04, 0x02 },   // /{ 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E },   // 0{ 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00 },   // 1{ 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 },   // 2{ 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31 },   // 3{ 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10 },   // 4{ 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 },   // 5{ 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30 },   // 6{ 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 },   // 7{ 0x00, 0x36, 0x49, 0x49, 0x49, 0x36 },   // 8{ 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E },   // 9{ 0x00, 0x00, 0x36, 0x36, 0x00, 0x00 },   // :{ 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 },   // ;{ 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 },   // <{ 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 },   // ={ 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 },   // >{ 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 },   // ?{ 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E },   // @{ 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C },   // A{ 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 },   // B{ 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 },   // C{ 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C },   // D{ 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 },   // E{ 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 },   // F{ 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A },   // G{ 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F },   // H{ 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 },   // I{ 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 },   // J{ 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 },   // K{ 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 },   // L{ 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F },   // M{ 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F },   // N{ 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E },   // O{ 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 },   // P{ 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E },   // Q{ 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 },   // R{ 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 },   // S{ 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 },   // T{ 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F },   // U{ 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F },   // V{ 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F },   // W{ 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 },   // X{ 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 },   // Y{ 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 },   // Z{ 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 },   // [{ 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55 },   // 55{ 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 },   // ]{ 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 },   // ^{ 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 },   // _{ 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 },   // '{ 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 },   // a{ 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 },   // b{ 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 },   // c{ 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F },   // d{ 0x00, 0x38, 0x54, 0x54, 0x54, 0x18 },   // e{ 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 },   // f{ 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C },   // g{ 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 },   // h{ 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 },   // i{ 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 },   // j{ 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 },   // k{ 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 },   // l{ 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 },   // m{ 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 },   // n{ 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 },   // o{ 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18 },   // p{ 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC },   // q{ 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 },   // r{ 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 },   // s{ 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 },   // t{ 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C },   // u{ 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C },   // v{ 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C },   // w{ 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 },   // x{ 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C },   // y{ 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 },   // z{ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 }    // horiz lines
};//------------------------------------------------------------------------------#define LED_DATA1       14
#define LED_DATA2       15
#define LED_CLK1        16
#define LED_CLK2        17//------------------------------------------------------------------------------
unsigned char g_ucLEDBuffer[4][16];void ledClearBuffer(void) {int i, j;for(i = 0; i < 4; i ++) {for(j = 0; j < 16; j ++) {g_ucLEDBuffer[i][j] = 0x0;}}}void ledSetup(void) {ledClearBuffer();pinMode(LED_DATA1, OUTPUT);pinMode(LED_DATA2, OUTPUT);pinMode(LED_CLK1, OUTPUT);pinMode(LED_CLK2, OUTPUT);        digitalWrite(LED_CLK1, HIGH);digitalWrite(LED_CLK2, HIGH);digitalWrite(LED_DATA1, HIGH);digitalWrite(LED_DATA2, HIGH);}void ledSetData12(unsigned char ucData12) {if(ucData12 & 0x1) digitalWrite(LED_DATA1, HIGH);else digitalWrite(LED_DATA1, LOW);if(ucData12 & 0x2) digitalWrite(LED_DATA2, HIGH);else digitalWrite(LED_DATA2, LOW);
}void ledClock1(void) {digitalWrite(LED_CLK1, HIGH);       // clock up 7usdigitalWrite(LED_CLK1, LOW);
}void ledClock2(void) {digitalWrite(LED_CLK2, HIGH);digitalWrite(LED_CLK2, LOW);
}void ledStart(void) {digitalWrite(LED_DATA1, LOW);digitalWrite(LED_DATA2, LOW);digitalWrite(LED_CLK1, LOW);digitalWrite(LED_CLK2, LOW);}void ledStop(void) {digitalWrite(LED_DATA1, LOW);digitalWrite(LED_DATA2, LOW);digitalWrite(LED_CLK1, HIGH);digitalWrite(LED_CLK2, HIGH);digitalWrite(LED_DATA1, HIGH);digitalWrite(LED_DATA2, HIGH);}void ledWriteData(unsigned char ucChar1, unsigned char ucChar2,unsigned char ucChar3, unsigned char ucChar4) {unsigned char i;unsigned char ucMask;ucMask = 0x1;for(i = 0; i < 8; i++) {if(ucChar1 & ucMask) digitalWrite(LED_DATA1, HIGH);else digitalWrite(LED_DATA1, LOW);            if(ucChar2 & ucMask) digitalWrite(LED_DATA2, HIGH);else digitalWrite(LED_DATA2, LOW);            digitalWrite(LED_CLK1, HIGH);       // clock up 7usdigitalWrite(LED_CLK1, LOW);if(ucChar3 & ucMask) digitalWrite(LED_DATA1, HIGH);else digitalWrite(LED_DATA1, LOW);            if(ucChar4 & ucMask) digitalWrite(LED_DATA2, HIGH);else digitalWrite(LED_DATA2, LOW); digitalWrite(LED_CLK2, HIGH);       // clock up 7usdigitalWrite(LED_CLK2, LOW);ucMask = ucMask << 1;}}//------------------------------------------------------------------------------
#define LEDCMD_ADD_INC          0x40
#define LEDCMD_ADD_SET          0x44
#define LEDCMD_MODE_CLOSE       0x80
#define LEDCMD_MODE_OPEN        0x8a//------------------------------------------------------------
void ledWriteByteAll(unsigned char ucChar) {ledWriteData(ucChar, ucChar, ucChar, ucChar);
}void ledWriteData16All(unsigned char ucData) {unsigned char i;ledStart();ledWriteByteAll(LEDCMD_ADD_INC);ledStop();ledStart();ledWriteByteAll(0xc0);for(i = 0; i < 16; i ++) {ledWriteByteAll(ucData);}ledStop();ledStart();    ledWriteByteAll(LEDCMD_MODE_OPEN);ledStop();
}//------------------------------------------------------------------------------
void ledWriteBuffer(void) {unsigned char i;ledStart();ledWriteByteAll(LEDCMD_ADD_INC);ledStop();ledStart();ledWriteByteAll(0xc0);for(i = 0; i < 16; i ++) {ledWriteData(g_ucLEDBuffer[0][i],g_ucLEDBuffer[1][i],g_ucLEDBuffer[2][i],g_ucLEDBuffer[3][i]);}ledStop();    ledStart();    ledWriteByteAll(LEDCMD_MODE_OPEN);ledStop();
}//------------------------------------------------------------------------------
void ledSetPoint(unsigned char x, unsigned char y, unsigned char ucColor) {unsigned char ucLED, ucMask;ucLED = x/8;x = x - ucLED * 8;if(ucLED >= 4)  return;if(y >= 8)      return;y = 7 - y;ucMask = 1 << x;g_ucLEDBuffer[ucLED][y*2] &= ucMask^0xff;g_ucLEDBuffer[ucLED][y*2+1] &= ucMask^0xff;if(ucColor & 0x1) g_ucLEDBuffer[ucLED][y*2] |= ucMask;if(ucColor & 0x2) g_ucLEDBuffer[ucLED][y*2+1] |= ucMask;}//------------------------------------------------------------------------------
void ledSetASCII(unsigned char x, unsigned char ucColor, unsigned char ucASCII) {unsigned char i, j, ucMask, ucFont, p;if(ucASCII < ' ')   return;ucASCII -= ' ';if(ucASCII >= 80)   return;for(i = 0; i < 6; i ++) {ucMask = 0x1;ucFont = F6x8[ucASCII][i];for(j = 0; j < 8; j ++) {if(ucFont & ucMask) p = ucColor;else p = 0x0;ledSetPoint(x+i, j, p);ucMask <<= 1;}}
}//------------------------------------------------------------------------------
void ledSetString4(char * p, unsigned char ucColor) {int i;char c;for(i = 0; i < 4; i ++) {c = *(p + i);if(c == 0) break;ledSetASCII(i*8, ucColor, c);}}unsigned char Hex2Text(unsigned char ucCode) {if(ucCode < 10) {return '0' + ucCode;}return 'A' + ucCode - 10;}//------------------------------------------------------------------------------
#define LED_PIN         13
void setup(void) {ledSetup();    keySetup();pinMode(LED_PIN, OUTPUT);}//------------------------------------------------------------------------------
unsigned char ucCount = 0;
void loop(void) {char szShowBuffer[5];unsigned char ucKey;ucCount ++;if(ucCount & 0x1) digitalWrite(LED_PIN, HIGH);else digitalWrite(LED_PIN, LOW);ucKey = keyReadCode();
//    if(ucKey != KEY_NULL) {szShowBuffer[0] = Hex2Text(ucCount >> 4);szShowBuffer[1] = Hex2Text(ucCount & 0xf);szShowBuffer[2] = Hex2Text(ucKey >> 4);szShowBuffer[3] = Hex2Text(ucKey & 0xf);ledClearBuffer();ledSetString4(szShowBuffer, 0x3);ledWriteBuffer();}delay(150);
}//==============================================================================
//                END OF THE FILE : TESTLED.C
//------------------------------------------------------------------------------

  1. Arduino门禁系统AD设计工程文件:AD\Test\2021\ZYK\FaceLockVer1.PcbDoc ↩︎

Arduino门禁人机接口调试 Version 1.0相关推荐

  1. Arduino门禁控制

    #include <ESP8266WiFi.h> //引入ESP8266Wifi库 #include <SPI.h> #include <MFRC522.h> #d ...

  2. 大华门禁SDK二次开发(二)-SignalR应用

    经过与大华技术支持的沟通,门禁服务程序已经开发好了,可以正常接收门禁开关事件,可以发送开门命令.基于项目实时性要求,这里使用SignalR实现门禁状态.控制命令的实时传送. 几种场景需求 根据Sign ...

  3. Arduino宿舍门禁,实现刷卡(NFC)开门

    起因 最近在学习智能车程序,突然对开发产生了极大的兴趣,一个合格的懒人就要自己做一个刷手机开门.再也不用带沉重的钥匙了,也不需要为忘记带钥匙的室友开门了.选择Arduino是因为它简单,不需要配置寄存 ...

  4. RC522读卡、修改UID、复制门禁卡(arduino板子)

    [读卡器就淘一个最便宜的就行了,我淘的7.5包邮.买卡一定要注意不要买M1 S50卡] RFID卡分类: 图片来源:使用proxmark3修改UID卡的0号扇区_fjh1997的博客-CSDN博客_i ...

  5. 【物联网树莓派毕设04】Arduino实现电梯及人脸识别门禁

    一.前言 这次是利用Arduino实现毕设中的电梯联动及门禁的部分,因为之前大二的时候用过Arduino做过课设,比较熟悉,其中一个项目就是实现模拟电梯运行.毕设的电梯部分,功能不用很复杂,只需要实现 ...

  6. 【基于Arduino RFID门禁系统】

    基于Arduino RFID门禁系统 介绍 射频识别或RFID(Radio-Frequency Identification)是一种通过无线电信号进行自动识别,通过RFID标签检索和存储数据的方法. ...

  7. RFID模块+WIFI模块+振动传感器+有源蜂鸣器+舵机+Arduino UNO R3所构成的门禁系统模块

    该系统模块主要由RFID模块+WIFI模块+振动传感器+有源蜂鸣器+舵机+Arduino UNO R3组成的门禁系统模块.这里使用舵机充当门锁,用户可以刷卡开门,也可以通过APP控制舵机状态达到开门的 ...

  8. Arduino简易RFID门禁

    Arduino简易RFID门禁 最近闲着无聊用Arduino以及RC522做了个简单的刷卡门禁,由于不在家无法装到门上,所以就用舵机转动来代替开门的过程. 1. 准备材料 Arduino uno板一块 ...

  9. 基于Arduino Uno的RFID门禁

    前言 这个门禁已经用了一年多啦~实测很稳定 接线也比较简单,而且实用性拉满,适合用来入门 因为我宿舍靠阳台下雨会泼水所以就没做指纹和密码,有兴趣的也可以拓展多种解锁方式 背景 本人没有带钥匙出门的习惯 ...

最新文章

  1. 禅修笔记——硅谷最受欢迎的情商课
  2. 深入理解浏览器解析和执行过程
  3. 深度学习人体姿态估计算法综述
  4. HTML DOM知识点补充:
  5. 编制网站首页的基本原则
  6. 测试电梯的测试用例_测试用例设计经典面试题
  7. Activiti工作流6.0表结构介绍
  8. 3dmax如何显示参考图_3dmax怎么在视图中放入参照
  9. 20190818 On Java8 第八章 复用
  10. linux备份没有vmlinuz,解决file /isolinux/vmlinuz0 not found
  11. C语言教材市场的分析
  12. 多合一音乐搜索器项目源码分享,支持播放,下载
  13. e4a和php教程,2019开源影视APP优化运营版+对接苹果cms10+全套类库E4A资源+开发文档+搭建教程源码...
  14. read: unexpected EOF!
  15. 数字图像处理笔记(一)空间分辨率与灰度分辨率
  16. 电脑上的准考证怎样保存电子版
  17. 【数据结构期末例题】
  18. [JQuery]关于使用jsp:include标签及%@ include标签时要注意的事项
  19. 3种侧链压缩方法让音乐鼓点更有力—FL Studio教程
  20. css实现文字大小自适应

热门文章

  1. 九款让WordPress成为赚钱利器的广告插件
  2. 通过sql语句对MySql数据库的基本操作
  3. Meson:支持Netflix的机器学习工作流
  4. 洛谷 P1330 封锁阳光大学 Label:染色问题
  5. split()的使用
  6. 无刷新提交表单(非Ajax实现)
  7. linux grep 基本正则表达式与扩展正则表达式使用解析
  8. 神技能!研究人员利用扫描仪成功从物理隔离设备中偷出数据
  9. Android多线程断点下载
  10. 机器学习——深度学习(Deep Learning)