目录
- 引言
- 项目背景
- 环境准备
- 硬件准备
- 软件安装与配置
- 系统设计
- 系统架构
- 关键技术
- 代码示例
- 光照传感器数据采集
- 照明控制实现
- 自动亮度调节与手动控制
- 应用场景
- 结论
1. 引言
智能照明系统通过传感器实时监测环境光照度,并根据光线强度自动调整灯光亮度,达到节能和提高舒适度的效果。基于STM32的智能照明系统可以结合光照传感器和LED灯实现自动化控制,系统还可以扩展手动调节功能,以满足用户的个性化需求。
2. 项目背景
传统的照明系统能耗较高,尤其是在光照充足时,照明设备仍然工作,造成浪费。智能照明系统通过实时监测环境光线,根据当前光照度智能控制灯光亮度,能够大幅节约电能,尤其适用于办公室、家庭和公共区域。此外,该系统还可以通过用户输入实现手动控制,进一步提高照明的灵活性。
3. 环境准备
硬件准备
- STM32开发板:STM32F103或类似微控制器
- 光敏传感器(光照强度传感器):用于检测环境的光照强度
- LED灯:用于显示照明效果,可以使用PWM调节亮度
- 按钮(开关):用于手动控制LED灯的开关
- OLED显示屏:用于显示当前的光照强度和系统状态
- 蜂鸣器(可选):用于系统状态提醒
- 面包板及连接线:用于硬件连接
- 电源或电池:为系统供电
软件安装与配置
- Keil uVision:用于编写和编译代码。
- STM32CubeMX:用于配置STM32的引脚和外设。
- ST-Link Utility:用于将代码下载到STM32开发板中。
步骤:
- 下载并安装Keil uVision。
- 下载并安装STM32CubeMX。
- 使用ST-Link Utility将代码烧录到STM32。
4. 系统设计
系统架构
智能照明系统的设计包括以下模块:
- 光照检测模块:通过光敏传感器检测当前的环境光照强度,并将数据传输给STM32进行处理。
- 照明控制模块:根据光照传感器数据控制LED灯的亮度,当环境光线较暗时,自动提高LED灯的亮度,光线较强时,降低亮度。
- 手动控制模块:通过按钮进行手动控制灯光的开关操作,优先级高于自动控制。
- 显示与反馈模块:通过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亮度,能够实现自动化的智能照明控制。该系统还集成了手动控制功能,进一步提高了用户操作的灵活性和便利性。该设计简单实用,适用于家庭、办公以及公共场所的智能照明应用。