基于STM32的智能照明系统

news2024/12/26 11:13:21

目录

  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亮度,能够实现自动化的智能照明控制。该系统还集成了手动控制功能,进一步提高了用户操作的灵活性和便利性。该设计简单实用,适用于家庭、办公以及公共场所的智能照明应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2183199.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Xcode Command Line Tools】安装指南

安装指令 xcode-select --install安装 完成安装 验证 $ xcode-select -p /Library/Developer/CommandLineTools

【C++】透过STL源代码深度剖析vector的底层

✨ Blog’s 主页: 白乐天_ξ( ✿&#xff1e;◡❛) &#x1f308; 个人Motto&#xff1a;他强任他强&#xff0c;清风拂山冈&#xff01; &#x1f525; 所属专栏&#xff1a;C深入学习笔记 &#x1f4ab; 欢迎来到我的学习笔记&#xff01; 参考博客&#xff1a;【C】透过STL源…

Python画笔案例-071 绘制闪闪的红星

1、绘制通闪闪的红星 通过 python 的turtle 库绘制 闪闪的红星,如下图: 2、实现代码 绘制闪闪的红星,以下为实现代码: """闪闪的红星.py """ import time import turtledef xsleep(n):"""防

Elasticsearch 使用误区之六——富文本内容写入前不清洗

0、引言 在很多应用场景中&#xff0c;我们会将富文本内容&#xff08;如 HTML 格式的网页内容&#xff09;存储到 Elasticsearch 中&#xff0c;以实现全文检索。 然而&#xff0c;在实际使用过程中&#xff0c;我们可能会遇到一些问题&#xff0c;比如在检索时&#xff0c;HT…

通信工程学习:什么是FTP文件传输协议

FTP&#xff1a;文件传输协议 FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#xff09;是一种用于在网络上交换文件的协议&#xff0c;它定义了文件传输时使用的命令和响应。作为最古老的互联网协议之一&#xff0c;FTP至今仍被广泛使用&#xff0c;并在网…

Elasticsearch:使用 LLM 实现传统搜索自动化

作者&#xff1a;来自 Elastic Han Xiang Choong 这篇简短的文章是关于将结构化数据上传到 Elastic 索引&#xff0c;然后将纯英语查询转换为查询 DSL 语句&#xff0c;以使用特定过滤器和范围搜索特定条件。完整代码位于此 Github repo 中。 首先&#xff0c;运行以下命令安装…

8639 折半插入排序

### 思路 折半插入排序是一种改进的插入排序算法&#xff0c;通过二分查找来确定插入位置&#xff0c;从而减少比较次数。每次插入时&#xff0c;先用二分查找找到插入位置&#xff0c;然后将元素插入到正确的位置。 ### 伪代码 1. 读取输入的待排序关键字个数n。 2. 读取n个待…

8. Bug 与 Error

计算机程序中的缺陷通常被称为 bug。把它们想象成偶然爬进我们工作中的小东西&#xff0c;会让程序员感觉良好。当然&#xff0c;实际上是我们自己把它们放进去的。 如果程序是思想的结晶&#xff0c;我们可以将错误大致分为思想混乱造成的错误和将思想转化为代码时引入错误造成…

帝都程序猿十二时辰

前言 2019年度国产剧《长安十二时辰》火了&#xff0c;其口碑榜首、节奏紧凑、贴合原著、电影质感&#xff0c;都是这部剧的亮点。而最令人震撼的还是剧中对大唐盛世的还原&#xff0c;长安街坊的市容市貌、长安百姓的生活日常、长安风情的美轮美奂……而关于十二时辰的话题也接…

基础算法--双指针【概念+图解+题解+解释】

更多精彩内容..... &#x1f389;❤️播主の主页✨&#x1f618; Stark、-CSDN博客 本文所在专栏&#xff1a; 数据结构与算法_Stark、的博客-CSDN博客 其它专栏&#xff1a; 学习专栏C语言_Stark、的博客-CSDN博客 项目实战C系列_Stark、的博客-CSDN博客​​​​​​ 座右铭&a…

【算法竞赛】堆

堆是一种树形结构,树的根是堆顶,堆顶始终保持为所有元素的最优值。 有最大堆和最小堆,最大堆的根节点是最大值,最小堆的根节点是最小值。 本节都以最小堆为例进行讲解。 堆一般用二叉树实现,称为二叉堆。 二叉堆的典型应用有堆排序和优先队列。 二叉堆的概念 二叉堆是一棵…

Mybatis-Plus新花样(二)

多种插件 Mybatis-plus给我们提供了各种各样的插件&#xff0c;方便我们快捷开发。 一. 插件配置 Configuration public class MybatisPlusConfig {Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor new MybatisPlusInter…

CMIS5.2_光模块切应用(Application Selection and Instantiation)

目录 重要概念 DP配置、应用声明、应用码的区别 Control Set Provision 和 Commission ApplyDPInit 和 ApplyImmediate 判断应用是否切换成功 以800G光模块的3个应用对应的DP配置举例 1*800G应用&#xff1a; 2*400G应用&#xff1a; 8*100G应用&#xff1a; 应用声明…

ControlGAN:Controllable Text-to-Image Generation

1 研究目的 当前的生成网络通常是不可控的&#xff0c;这意味着如果用户更改句子的某些单词&#xff0c;合成图像将与原始文本生成的合成图像显着不同&#xff1b;当给定的文本描述&#xff08;例如颜色&#xff09;发生变化时&#xff0c;鸟类的相应视觉属性被修改&#xff0c…

我博客网站又遭受CC攻击了,记录一下

2024.9.29凌晨4点攻击开始&#xff0c;攻击目标是我的图床tc.zeruns.tech和博客blog.zeruns.tech&#xff0c;图床用的cdn是多吉云融合CDN&#xff0c;流量被刷了20GB左右就触发峰值关闭CDN了&#xff0c;HTTPS请求次数被刷了1.1亿次&#xff0c;因为设置了QPS&#xff0c;实际…

Oracle bbed编译安装及配置

1. 什么是bbed &#xff1f; Oracle Block Brower and EDitor Tool,是一个可以对oracle data block进行查看&#xff0c;编辑修改的内置工具。对于bbed&#xff0c;oracle本身是不提供支持的。 2. 如何编译bbed环境&#xff1f; 10g版本&#xff1a; 1) 编译bbed cd $ORACL…

【网络基础】网络常识快速入门知识清单,看这篇文章就够了

&#x1f490;个人主页&#xff1a;初晴~ 在现在这个高度智能化的时代&#xff0c;网络几乎已经成为了空气一般无处不在。移动支付、网上购物、网络游戏、视频网站都离不开网络。你能想象如果没有网络的生活将会变成什么样吗&#x1f914; 然而如此对于如此重要的网络&#xf…

深度学习500问——Chapter17:模型压缩及移动端部署(2)

文章目录 17.4.6 低秩分解 17.4.7 总体压缩效果评价指标有哪些 17.4.8 几种轻量化网络结构对比 17.4.9 网络压缩未来研究方向有哪些 17.5 目前有哪些深度学习模型优化加速方法 17.5.1 模型优化加速方法 17.5.2 TensorRT加速原理 17.5.3 TensorRT如何优化重构模型 17.5.4 Tensor…

Unity中Mesh多种网格绘制模式使用方法参考

Unity中MeshFilter中的Mesh默认情况下使用MeshTopology.Trigangles类型绘制网格&#xff0c;就是通常的绘制三角形网格&#xff0c;实际上Mesh有五种绘制模式&#xff0c;对应MeshTopology的枚举&#xff0c;分别是 Triangles网格由三角形构成。Quads网格由四边形构成。Lines网…

多线程——认识线程(Thread)

目录 前言 一、第一个多线程程序 1.程序编写 2.介绍jconsole 二、创建线程 1.继承Thread类 ①重写run方法 ②重写run方法&#xff0c;使用匿名内部类 2.实现Runnable接口 ①重写run方法 ②重写run方法&#xff0c;使用匿名内部类 ③使用 lambda 表达式 三、多线程…