基于STM32单片机的智能照明控制系统设计(代码+原理图+APP)

基于STM32单片机的智能照明控制系统设计

摘要

本文设计了一种基于STM32单片机的智能照明控制系统,该系统采用STM32F103C8T6作为主控芯片,结合SR-05红外热释电人体传感器模块、INA226路灯功率检测模块、L298N路灯驱动电路模块、0.96寸OLED12864显示屏模块、独立按键电路模块、ESP8266-01S WiFi模块以及蜂鸣器模块,实现了照明系统的智能化控制。系统具有OLED显示、WiFi远程控制、光敏电阻环境亮度采集、自动人体感应控制、手动按键控制、电压电流监测以及故障报警等功能。本文详细介绍了系统的硬件设计、软件实现以及测试结果,验证了系统的可靠性和实用性。

关键词

STM32单片机;智能照明;红外热释电传感器;OLED显示;WiFi控制

Abstract

This paper designs an intelligent lighting control system based on STM32 microcontroller. The system adopts STM32F103C8T6 as the main control chip, combined with SR-05 pyroelectric infrared human body sensor module, INA226 street light power detection module, L298N street light drive circuit module, 0.96-inch OLED12864 display module, independent button circuit module, ESP8266-01S WiFi module and buzzer module, realizing the intelligent control of the lighting system. The system has functions such as OLED display, WiFi remote control, ambient brightness acquisition by photoresistor, automatic human body induction control, manual button control, voltage and current monitoring, and fault alarm. This paper introduces the hardware design, software implementation, and test results of the system in detail, verifying the reliability and practicality of the system.

Keywords

STM32 microcontroller; intelligent lighting; pyroelectric infrared sensor; OLED display; WiFi control

一、引言

随着物联网技术的不断发展,智能照明系统在城市照明、家居照明等领域得到了广泛应用。智能照明系统能够根据环境亮度、人体活动等因素自动调节照明状态,提高照明效率和能源利用率。本文设计了一种基于STM32单片机的智能照明控制系统,旨在实现照明系统的智能化、自动化控制,提高照明系统的实用性和用户体验。

二、系统总体设计
2.1 系统架构

本系统以STM32F103C8T6单片机为核心,结合SR-05红外热释电人体传感器模块、INA226路灯功率检测模块、L298N路灯驱动电路模块、0.96寸OLED12864显示屏模块、独立按键电路模块、ESP8266-01S WiFi模块以及蜂鸣器模块,构建了完整的智能照明控制系统。系统架构如图1所示。

图1 系统架构图

2.2 功能需求

本系统需实现以下功能:

  1. 使用OLED显示灯的状态(亮灭)、工作模式(自动或手动)、环境亮度值、灯的档位(三个不同亮度)。
  2. 使用WiFi模块连接手机,实现在手机APP端显示并且控制灯的状态、工作模式、工作档位。
  3. 使用光敏电阻模块采集当前环境的亮度值,并且将亮度值上传到手机APP端。
  4. 自动模式下,使用SR-05传感器检测人体,亮度值较低且检测到人体时,灯会自动打开,10秒后没有再次检测到人体自动关灯。
  5. 使用L298N驱动模块驱动路灯,手动模式下,设置三个按键可控制灯的亮灭、工作模式、工作档位。
  6. 电压电流超过安全阈值,路灯自动断电;路灯故障时蜂鸣器报警,同时手机APP端收到路灯故障通知。
三、硬件设计
3.1 STM32F103C8T6主控芯片

STM32F103C8T6是一款基于ARM Cortex-M3内核的32位微控制器,具有高性能、低功耗、易于开发等优点。本系统采用STM32F103C8T6作为主控芯片,负责系统的数据处理和控制逻辑。STM32F103C8T6具有丰富的外设接口,包括USART、I2C、SPI等,方便与其他模块进行通信。

3.2 SR-05红外热释电人体传感器模块

SR-05红外热释电人体传感器模块采用热释电效应原理,能够检测人体发出的红外辐射,实现人体感应功能。本系统使用SR-05传感器模块在自动模式下检测人体活动,当检测到人体且环境亮度较低时,自动打开路灯。

3.3 INA226路灯功率检测模块

INA226是一款高精度电流和功率监测芯片,能够实时监测路灯的电流和功率。本系统采用INA226模块对路灯的功率进行监测,并将监测数据上传到手机APP端,方便用户了解路灯的能耗情况。

3.4 L298N路灯驱动电路模块

L298N是一款高性能的直流电机驱动芯片,能够驱动直流电机、步进电机等负载。本系统使用L298N模块作为路灯的驱动电路,通过PWM信号控制路灯的亮度。L298N模块具有过流保护、短路保护等功能,提高了系统的安全性。

3.5 0.96寸OLED12864显示屏模块

0.96寸OLED12864显示屏模块具有高对比度、快速响应时间和低功耗等优点,适合用于显示系统状态和信息。本系统采用OLED显示屏模块显示灯的状态、工作模式、环境亮度值和灯的档位等信息,方便用户了解系统状态。

3.6 独立按键电路模块

独立按键电路模块用于手动控制路灯的状态、工作模式和工作档位。本系统设置了三个独立按键,分别用于控制灯的亮灭、切换工作模式和调整灯的档位。

3.7 ESP8266-01S WiFi模块

ESP8266-01S是一款低功耗的WiFi模块,支持STA/AP/STA+AP三种工作模式。本系统采用ESP8266-01S模块实现与手机APP的通信,用户可以通过手机APP远程控制路灯的状态、工作模式和工作档位,并实时查看系统状态和能耗情况。

3.8 蜂鸣器模块

蜂鸣器模块用于在系统出现故障时发出报警声,提醒用户及时处理。本系统设置了蜂鸣器模块,在电压电流超过安全阈值或路灯故障时发出报警声,并通过WiFi模块将故障信息发送到手机APP端。

四、软件设计
4.1 主程序设计

本系统主程序采用C语言编写,主要包括初始化、数据采集、数据处理、控制逻辑和通信等功能。主程序流程图如图2所示。

图2 主程序流程图

在主程序中,首先进行系统初始化,包括时钟配置、外设初始化、变量初始化等。然后,系统进入数据采集阶段,通过光敏电阻模块采集环境亮度值,通过SR-05传感器模块检测人体活动,通过INA226模块监测路灯功率。采集到的数据经过处理后,根据控制逻辑判断是否需要调整路灯状态。如果需要调整,则通过L298N模块控制路灯亮度,并通过OLED显示屏模块显示系统状态。同时,系统通过ESP8266-01S模块与手机APP进行通信,实现远程控制和状态显示。在出现故障时,系统通过蜂鸣器模块发出报警声,并通过WiFi模块将故障信息发送到手机APP端。

4.2 数据采集与处理

数据采集与处理是系统的重要功能之一。本系统通过光敏电阻模块采集环境亮度值,通过SR-05传感器模块检测人体活动,通过INA226模块监测路灯功率。采集到的数据经过滤波、去噪等处理后,用于控制逻辑的判断和路灯状态的调整。

在采集环境亮度值时,系统采用ADC模块对光敏电阻的电压值进行采样,并通过计算得到环境亮度值。在检测人体活动时,系统采用数字输入方式读取SR-05传感器模块的输出信号,并根据信号状态判断是否存在人体活动。在监测路灯功率时,系统通过I2C接口与INA226模块通信,读取路灯的电流和功率值。

4.3 控制逻辑设计

控制逻辑是系统的核心部分,负责根据采集到的数据判断是否需要调整路灯状态。本系统采用状态机的方式实现控制逻辑的设计,根据当前状态和环境条件进行状态转移和动作执行。

在自动模式下,系统根据环境亮度值和人体活动状态进行状态转移。当环境亮度值低于设定阈值且检测到人体活动时,系统转移到“开灯”状态,打开路灯。在“开灯”状态下,如果10秒内没有再次检测到人体活动,则系统转移到“关灯”状态,关闭路灯。在手动模式下,系统根据按键输入进行状态转移和动作执行。用户可以通过按键控制灯的亮灭、切换工作模式和调整灯的档位。

4.4 通信协议设计

本系统采用ESP8266-01S模块实现与手机APP的通信。为了确保通信的可靠性和高效性,本系统设计了自定义的通信协议。通信协议包括帧头、帧长度、数据域、校验码和帧尾等部分。帧头和帧尾用于标识数据帧的起始和结束;帧长度表示数据域的长度;数据域包含控制命令、状态信息、能耗数据等内容;校验码用于校验数据的正确性。

在通信过程中,系统首先发送

通信协议设计(续)

数据帧给手机APP,手机APP接收到数据帧后进行解析,并根据解析结果执行相应的操作或显示相应的信息。同时,手机APP也可以发送控制命令给系统,系统接收到控制命令后进行解析,并根据解析结果调整路灯的状态或工作模式。

为了确保通信的实时性和可靠性,本系统采用了TCP协议进行通信。TCP协议具有可靠传输、流量控制和拥塞控制等优点,能够保证数据在传输过程中的完整性和顺序性。在通信过程中,系统作为TCP服务器,手机APP作为TCP客户端,通过建立TCP连接实现数据的双向传输。

五、系统测试与验证
5.1 测试环境搭建

为了验证系统的功能和性能,本系统在实验室环境下进行了测试。测试环境包括一个模拟的照明区域、一个STM32F103C8T6开发板、SR-05红外热释电人体传感器模块、INA226路灯功率检测模块、L298N路灯驱动电路模块、0.96寸OLED12864显示屏模块、独立按键电路模块、ESP8266-01S WiFi模块、蜂鸣器模块以及光敏电阻模块等。同时,还准备了一部安装了定制APP的智能手机作为测试终端。

5.2 功能测试

在功能测试中,主要测试了系统的OLED显示功能、WiFi远程控制功能、光敏电阻环境亮度采集功能、自动人体感应控制功能、手动按键控制功能以及电压电流监测和故障报警功能等。测试结果表明,系统能够正确显示路灯的状态、工作模式、环境亮度值和灯的档位等信息;用户可以通过手机APP远程控制路灯的状态、工作模式和工作档位,并实时查看系统状态和能耗情况;系统能够正确采集环境亮度值,并根据亮度值和人体活动状态自动调整路灯状态;手动模式下,用户可以通过按键控制路灯的亮灭、切换工作模式和调整灯的档位;系统能够实时监测电压和电流值,并在超过安全阈值时自动断电;在路灯故障时,系统能够发出报警声,并通过WiFi模块将故障信息发送到手机APP端。

5.3 性能测试

在性能测试中,主要测试了系统的响应时间、稳定性以及能耗等指标。测试结果表明,系统在接收到控制命令后能够迅速响应并调整路灯状态,响应时间小于1秒;系统在长时间运行过程中保持稳定,没有出现崩溃或异常现象;系统的能耗较低,符合节能要求。

六、结论与展望

本文设计了一种基于STM32单片机的智能照明控制系统,该系统结合了SR-05红外热释电人体传感器模块、INA226路灯功率检测模块、L298N路灯驱动电路模块、0.96寸OLED12864显示屏模块、独立按键电路模块、ESP8266-01S WiFi模块以及蜂鸣器模块等,实现了照明系统的智能化、自动化控制。系统具有OLED显示、WiFi远程控制、光敏电阻环境亮度采集、自动人体感应控制、手动按键控制、电压电流监测以及故障报警等功能。测试结果表明,系统功能和性能均符合预期要求,具有较高的实用性和可靠性。

未来,可以进一步优化系统的控制算法和通信协议,提高系统的响应速度和通信效率。同时,可以考虑增加更多的传感器和执行器,如温湿度传感器、光照强度传感器、智能调光器等,以丰富系统的功能和应用场景。此外,还可以将系统与其他智能家居设备进行联动控制,实现更加智能化的家居照明体验。

参考文献

[此处列出相关参考文献]

/**
  ******************************************************************************
  * @file    misc.c
  * @author  MCD Application Team
  * @version V3.5.0
  * @date    11-March-2011
  * @brief   This file provides all the miscellaneous firmware functions (add-on
  *          to CMSIS functions).
  ******************************************************************************
  * @attention
  *
  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  *
  * <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "misc.h"

/** @addtogroup STM32F10x_StdPeriph_Driver
  * @{
  */

/** @defgroup MISC 
  * @brief MISC driver modules
  * @{
  */

/** @defgroup MISC_Private_TypesDefinitions
  * @{
  */

/**
  * @}
  */ 

/** @defgroup MISC_Private_Defines
  * @{
  */

#define AIRCR_VECTKEY_MASK    ((uint32_t)0x05FA0000)
/**
  * @}
  */

/** @defgroup MISC_Private_Macros
  * @{
  */

/**
  * @}
  */

/** @defgroup MISC_Private_Variables
  * @{
  */

/**
  * @}
  */

/** @defgroup MISC_Private_FunctionPrototypes
  * @{
  */

/**
  * @}
  */

/** @defgroup MISC_Private_Functions
  * @{
  */

/**
  * @brief  Configures the priority grouping: pre-emption priority and subpriority.
  * @param  NVIC_PriorityGroup: specifies the priority grouping bits length. 
  *   This parameter can be one of the following values:
  *     @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority
  *                                4 bits for subpriority
  *     @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority
  *                                3 bits for subpriority
  *     @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority
  *                                2 bits for subpriority
  *     @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority
  *                                1 bits for subpriority
  *     @arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority
  *                                0 bits for subpriority
  * @retval None
  */
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{
  /* Check the parameters */
  assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
  
  /* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */
  SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}

/**
  * @brief  Initializes the NVIC peripheral according to the specified
  *         parameters in the NVIC_InitStruct.
  * @param  NVIC_InitStruct: pointer to a NVIC_InitTypeDef structure that contains
  *         the configuration information for the specified NVIC peripheral.
  * @retval None
  */
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
{
  uint32_t tmppriority = 0x00, tmppre = 0x00, tmpsub = 0x0F;
  
  /* Check the parameters */
  assert_param(IS_FUNCTIONAL_STATE(NVIC_InitStruct->NVIC_IRQChannelCmd));
  assert_param(IS_NVIC_PREEMPTION_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority));  
  assert_param(IS_NVIC_SUB_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelSubPriority));
    
  if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE)
  {
    /* Compute the Corresponding IRQ Priority --------------------------------*/    
    tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08;
    tmppre = (0x4 - tmppriority);
    tmpsub = tmpsub >> tmppriority;

    tmppriority = (uint32_t)NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;
    tmppriority |=  NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub;
    tmppriority = tmppriority << 0x04;
        
    NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority;
    
    /* Enable the Selected IRQ Channels --------------------------------------*/
    NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =
      (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
  }
  else
  {
    /* Disable the Selected IRQ Channels -------------------------------------*/
    NVIC->ICER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =
      (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
  }
}

/**
  * @brief  Sets the vector table location and Offset.
  * @param  NVIC_VectTab: specifies if the vector table is in RAM or FLASH memory.
  *   This parameter can be one of the following values:
  *     @arg NVIC_VectTab_RAM
  *     @arg NVIC_VectTab_FLASH
  * @param  Offset: Vector Table base offset field. This value must be a multiple 
  *         of 0x200.
  * @retval None
  */
void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset)
{ 
  /* Check the parameters */
  assert_param(IS_NVIC_VECTTAB(NVIC_VectTab));
  assert_param(IS_NVIC_OFFSET(Offset));  
   
  SCB->VTOR = NVIC_VectTab | (Offset & (uint32_t)0x1FFFFF80);
}

/**
  * @brief  Selects the condition for the system to enter low power mode.
  * @param  LowPowerMode: Specifies the new mode for the system to enter low power mode.
  *   This parameter can be one of the following values:
  *     @arg NVIC_LP_SEVONPEND
  *     @arg NVIC_LP_SLEEPDEEP
  *     @arg NVIC_LP_SLEEPONEXIT
  * @param  NewState: new state of LP condition. This parameter can be: ENABLE or DISABLE.
  * @retval None
  */
void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState)
{
  /* Check the parameters */
  assert_param(IS_NVIC_LP(LowPowerMode));
  assert_param(IS_FUNCTIONAL_STATE(NewState));  
  
  if (NewState != DISABLE)
  {
    SCB->SCR |= LowPowerMode;
  }
  else
  {
    SCB->SCR &= (uint32_t)(~(uint32_t)LowPowerMode);
  }
}

/**
  * @brief  Configures the SysTick clock source.
  * @param  SysTick_CLKSource: specifies the SysTick clock source.
  *   This parameter can be one of the following values:
  *     @arg SysTick_CLKSource_HCLK_Div8: AHB clock divided by 8 selected as SysTick clock source.
  *     @arg SysTick_CLKSource_HCLK: AHB clock selected as SysTick clock source.
  * @retval None
  */
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
{
  /* Check the parameters */
  assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));
  if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
  {
    SysTick->CTRL |= SysTick_CLKSource_HCLK;
  }
  else
  {
    SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
  }
}

/**
  * @}
  */

/**
  * @}
  */

/**
  * @}
  */

/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

科创工作室li

你的鼓励将是大学生的创作动力

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

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

打赏作者

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

抵扣说明:

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

余额充值