基于STM32的智能照明系统

目录

  1. 引言
  2. 项目背景
  3. 环境准备
    • 硬件准备
    • 软件安装与配置
  4. 系统设计
    • 系统架构
    • 关键技术
  5. 代码示例
    • 光照传感器数据采集
    • 照明控制实现
    • 自动亮度调节与手动控制
  6. 应用场景
  7. 结论

1. 引言

智能照明系统通过传感器实时监测环境光照度,并根据光线强度自动调整灯光亮度,达到节能和提高舒适度的效果。基于STM32的智能照明系统可以结合光照传感器和LED灯实现自动化控制,系统还可以扩展手动调节功能,以满足用户的个性化需求。

2. 项目背景

传统的照明系统能耗较高,尤其是在光照充足时,照明设备仍然工作,造成浪费。智能照明系统通过实时监测环境光线,根据当前光照度智能控制灯光亮度,能够大幅节约电能,尤其适用于办公室、家庭和公共区域。此外,该系统还可以通过用户输入实现手动控制,进一步提高照明的灵活性。

3. 环境准备

硬件准备

  • STM32开发板:STM32F103或类似微控制器
  • 光敏传感器(光照强度传感器):用于检测环境的光照强度
  • LED灯:用于显示照明效果,可以使用PWM调节亮度
  • 按钮(开关):用于手动控制LED灯的开关
  • OLED显示屏:用于显示当前的光照强度和系统状态
  • 蜂鸣器(可选):用于系统状态提醒
  • 面包板及连接线:用于硬件连接
  • 电源或电池:为系统供电

软件安装与配置

  1. Keil uVision:用于编写和编译代码。
  2. STM32CubeMX:用于配置STM32的引脚和外设。
  3. ST-Link Utility:用于将代码下载到STM32开发板中。

步骤:

  1. 下载并安装Keil uVision。
  2. 下载并安装STM32CubeMX。
  3. 使用ST-Link Utility将代码烧录到STM32。

4. 系统设计

系统架构

智能照明系统的设计包括以下模块:

  1. 光照检测模块:通过光敏传感器检测当前的环境光照强度,并将数据传输给STM32进行处理。
  2. 照明控制模块:根据光照传感器数据控制LED灯的亮度,当环境光线较暗时,自动提高LED灯的亮度,光线较强时,降低亮度。
  3. 手动控制模块:通过按钮进行手动控制灯光的开关操作,优先级高于自动控制。
  4. 显示与反馈模块:通过OLED显示当前的光照强度、灯光亮度,并反馈系统状态。

关键技术

  • PWM调节LED亮度:通过STM32的PWM功能控制LED的亮度,依据光照强度自动调节灯光亮度,达到节能效果。
  • 传感器数据采集:通过ADC采集光敏传感器的光照强度数据,并根据光线情况自动调节灯光亮度。
  • 手动控制优先级:当手动控制按钮被按下时,系统将优先执行手动控制,用户可以关闭或打开LED灯。

5. 代码示例

光照传感器数据采集

#include "stm32f1xx_hal.h"

// 初始化ADC用于光敏传感器
void Light_Sensor_Init(void) {
    ADC_ChannelConfTypeDef sConfig = {0};
    __HAL_RCC_ADC1_CLK_ENABLE();  // 开启ADC时钟
    
    ADC_HandleTypeDef hadc1;
    hadc1.Instance = ADC1;
    hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
    hadc1.Init.ContinuousConvMode = DISABLE;
    hadc1.Init.DiscontinuousConvMode = DISABLE;
    hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
    hadc1.Init.NbrOfConversion = 1;
    HAL_ADC_Init(&hadc1);
    
    // 配置光敏传感器引脚
    sConfig.Channel = ADC_CHANNEL_0;
    sConfig.Rank = ADC_REGULAR_RANK_1;
    sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;
    HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}

// 读取光照强度
uint32_t Read_Light_Sensor(void) {
    HAL_ADC_Start(&hadc1);
    HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
    uint32_t light_value = HAL_ADC_GetValue(&hadc1);
    HAL_ADC_Stop(&hadc1);
    return light_value;  // 返回光照强度
}

照明控制实现

// 初始化PWM用于LED亮度调节
void LED_PWM_Init(void) {
    // 配置PWM引脚
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    __HAL_RCC_GPIOA_CLK_ENABLE();
    GPIO_InitStruct.Pin = GPIO_PIN_1;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    // 初始化TIM2用于PWM
    TIM_HandleTypeDef htim2;
    htim2.Instance = TIM2;
    htim2.Init.Prescaler = 72 - 1;
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = 1000 - 1;
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_PWM_Init(&htim2);

    // 配置PWM通道
    TIM_OC_InitTypeDef sConfigOC = {0};
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 0;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);

    HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
}

// 根据光照强度调节LED亮度
void Adjust_LED_Brightness(uint32_t light_value) {
    uint32_t pwm_value;
    
    if (light_value < 200) {
        pwm_value = 900;  // 光线弱,亮度调高
    } else if (light_value < 500) {
        pwm_value = 600;  // 中等光线
    } else {
        pwm_value = 300;  // 光线强,亮度调低
    }
    
    __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pwm_value);  // 调整PWM占空比
}

自动亮度调节与手动控制

// 初始化按钮用于手动控制
void Button_Init(void) {
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    __HAL_RCC_GPIOB_CLK_ENABLE();

    // 配置按钮引脚
    GPIO_InitStruct.Pin = GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLUP;  // 上拉模式
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

// 手动控制LED灯开关
uint8_t Button_Pressed(void) {
    if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET) {
        HAL_Delay(50);  // 防抖延迟
        if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET) {
            return 1;  // 按钮按下
        }
    }
    return 0;
}

// 主程序
int main(void) {
    HAL_Init();
    Light_Sensor_Init();
    LED_PWM_Init();
    Button_Init();

    uint8_t led_state = 0;  // 手动控制状态

    while (1) {
        uint32_t light_value = Read_Light_Sensor();  // 读取光照强度

        // 手动控制优先级高于自动调节
        if (Button_Pressed()) {
            led_state = !led_state;  // 切换LED开关状态
            if (led_state) {
                __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 1000);  // 手动打开LED
            } else {
                __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 0);  // 手动关闭LED
            }
            HAL_Delay(500);  // 防止多次触发
        } else {
            // 如果未手动控制,自动调节亮度
            if (!led_state) {
                Adjust_LED_Brightness(light_value);  // 自动调节亮度
            }
        }

        HAL_Delay(200);  // 延迟200ms更新一次
    }
}

⬇帮大家整理了单片机的资料

包括stm32的项目合集【源码+开发文档】

点击下方蓝字即可领取,感谢支持!⬇

点击领取更多嵌入式详细资料

问题讨论,stm32的资料领取可以私信!

 

6. 应用场景

  • 家庭智能照明:在家庭中,智能照明系统可以根据环境光线自动调节灯光亮度,达到节能和舒适的效果。
  • 办公室智能照明:在办公室中,根据自然光强度调整室内照明,有效减少能源浪费。
  • 公共场所照明:如商场、停车场等场所,通过自动化调节照明亮度,优化电力使用。

7. 结论

基于STM32的智能照明系统通过光敏传感器实时检测环境光照度,结合PWM调节LED亮度,能够实现自动化的智能照明控制。该系统还集成了手动控制功能,进一步提高了用户操作的灵活性和便利性。该设计简单实用,适用于家庭、办公以及公共场所的智能照明应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值