智能门锁是一种利用现代科技来增强家居安全性的设备。它可以实现通过密码、指纹、RFID卡等多种方式对门锁进行解锁,并且可以通过无线通信与手机或电脑进行连接,实现远程开门和监控等功能。在本文中,我们将使用STM32微控制器来制作一个基于密码和RFID卡的智能门锁。
硬件准备:
- STM32F103C8T6微控制器
- RFID RC522模块
- 16x2 LCD显示屏
- 数码键盘模块
- 小型无源蜂鸣器
- 12V电磁锁
- 杜邦线和杜邦头
软件准备:
- STM32CubeIDE集成开发环境
- ST-Link V2调试器
步骤1:硬件连线
将STM32F103C8T6与其他模块按照以下方式连接:
STM32F103C8T6 --- RC522模块
3.3V ------------ VCC
GND ------------ GND
PB12 ----------- NSS
PB13 ----------- SCK
PB14 ----------- MISO
PB15 ----------- MOSI
STM32F103C8T6 --- LCD显示屏
5V ------------- VCC
GND ------------ GND
PA0 ------------- RS
PA1 ------------- RW
PA2 ------------- EN
PA3 ------------- D4
PA4 ------------- D5
PA5 ------------- D6
PA6 ------------- D7
STM32F103C8T6 --- 数码键盘模块
PC0 ------------- ROW1
PC1 ------------- ROW2
PC2 ------------- ROW3
PC3 ------------- ROW4
PC4 ------------- COL1
PC5 ------------- COL2
PC6 ------------- COL3
PC7 ------------- COL4
STM32F103C8T6 --- 小型无源蜂鸣器
PC13 ------------ BZ+
GND ------------- BZ-
步骤2:编写程序代码
在STM32CubeIDE中创建一个新的C项目,并将以下代码添加到main.c文件中:
#include "stm32f1xx_hal.h"
#include "rc522.h"
#include "lcd.h"
#include "keypad.h"
#define PASSWORD_SIZE 4
uint8_t password[PASSWORD_SIZE] = {1, 2, 3, 4};
uint8_t input[PASSWORD_SIZE] = {0};
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_SPI1_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_SPI1_Init();
LCD_Init();
LCD_Clear();
RC522_Init();
while (1)
{
// 读取数码键盘输入
uint8_t key = KEYPAD_Read();
// 如果是确认键,则进行密码验证
if (key == '#')
{
// 读取RFID卡片号码
uint32_t cardNumber = RC522_ReadCardSerial();
// 如果RFID卡片号码匹配
if (cardNumber == 0x12345678)
{
LCD_Clear();
LCD_WriteString("Card verified!");
// 控制电磁锁打开
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
HAL_Delay(5000);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
LCD_Clear();
}
else
{
// 密码验证
if (memcmp(input, password, PASSWORD_SIZE) == 0)
{
LCD_Clear();
LCD_WriteString("Password verified!");
// 控制电磁锁打开
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
HAL_Delay(5000);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
LCD_Clear();
}
else
{
LCD_Clear();
LCD_WriteString("Access denied!");
HAL_Delay(2000);
LCD_Clear();
}
}
memset(input, 0, PASSWORD_SIZE);
}
else
{
// 数字键盘输入处理
if (key != 0)
{
// 密码输入
for (int i = 0; i < PASSWORD_SIZE - 1; i++)
{
input[i] = input[i + 1];
}
input[PASSWORD_SIZE - 1] = key;
// 在LCD显示屏上显示输入的数字
LCD_SetCursor(0, 1);
LCD_WriteString("Input: ");
for (int i = 0; i < PASSWORD_SIZE; i++)
{
LCD_WriteChar(input[i] + '0');
}
}
}
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
/** Configure the main internal regulator output voltage
*/
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
/** Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB busses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
Error_Handler();
}
}
static void MX_SPI1_Init(void)
{
/* SPI1 parameter configuration*/
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 7;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
}
步骤3:编译和下载程序
在STM32CubeIDE中点击“Build”按钮进行编译,然后连接STM32F103C8T6和ST-Link V2调试器并下载程序到微控制器。
步骤4:测试门锁
完成上述步骤后,您可以按下数字键盘上的数字键来输入密码,然后按下确认键进行验证。如果密码正确或者使用RFID卡进行验证,门锁将会打开并通过LCD显示屏和无源蜂鸣器进行提示。
总结:
通过本文,我们使用STM32F103C8T6微控制器制作了一个基于密码和RFID卡的智能门锁。您可以根据自己的需要和硬件环境进行相应的修改和扩展。希望这个案例能够帮助您更好地理解和应用STM32微控制器。