使用STM32制作智能门锁

智能门锁是一种利用现代科技来增强家居安全性的设备。它可以实现通过密码、指纹、RFID卡等多种方式对门锁进行解锁,并且可以通过无线通信与手机或电脑进行连接,实现远程开门和监控等功能。在本文中,我们将使用STM32微控制器来制作一个基于密码和RFID卡的智能门锁。

硬件准备:

  1. STM32F103C8T6微控制器
  2. RFID RC522模块
  3. 16x2 LCD显示屏
  4. 数码键盘模块
  5. 小型无源蜂鸣器
  6. 12V电磁锁
  7. 杜邦线和杜邦头

软件准备:

  1. STM32CubeIDE集成开发环境
  2. 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微控制器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值