基于STM32设计的智能台灯

news2024/11/16 3:50:37

一、项目背景

智能家居设备在现代生活中起着越来越重要的作用。智能台灯作为其中的一种,具有调节光照亮度、色温等功能,更加符合人们对于光照环境的个性化需求。当前设计一款基于STM32微控制器设计的智能台灯,该台灯具备可调节亮度和色温的特点,为用户提供了更加舒适的使用体验。

image-20230707095753939

二、设计目标

【1】实现灯光的亮度和色温的可调节功能;

【2】添加人体感应模块,实现自动开关灯;

【3】实现手机远程控制灯光的功能;

【4】设计简洁、稳定的硬件电路和用户友好的操作界面。

三、系统架构

3.1 硬件部分

(1) 主控芯片:选用STM32系列微控制器,具有丰富的外设资源和强大的处理能力;

(2) 电源部分:采用稳压电源模块,提供适宜电压的供电;

(3) 光源部分:选择高亮度LED作为光源,配备透明灯罩,提供均匀柔和的光照;

(4) 人体感应模块:采用红外传感器,检测到人体活动时自动开启灯光;

(5) 无线通信模块:使用WiFi或蓝牙模块,实现手机远程控制。

3.2 软件部分

(1) 嵌入式软件:使用Keil MDK作为开发环境,编写嵌入式C语言程序,实现灯光亮度和色温的调节、人体感应控制等功能;

(2) 手机控制端:设计并开发手机App,通过与智能台灯连接,实现远程控制灯光的功能。

3.3 硬件选型说明

【1】主控芯片:

采用STM32F103RCT6

【2】光源部分:

(1) 高亮度LED:选择高亮度、节能的LED作为光源,推荐选择LED灯珠。

(2) 透明灯罩:选择高透光性的材料制作灯罩,保证光照均匀柔和。

【3】人体感应模块:

(1) 红外传感器:选择灵敏度较高的红外传感器,能够快速、准确地检测到人体活动。

(2) 光敏电阻:用于在光线不足时自动开启台灯,确保人体感应功能的正常工作。

【4】无线通信模块

选择HC05蓝牙模块,以便与手机设备进行通信。

3.4 硬件设计

【1】主控芯片选择:STM32F103RCT6,具有较高的性能和丰富的外设资源,适合作为智能台灯的核心处理器;

【2】人体红外传感器:用于检测周围是否有人靠近;

【3】光敏传感器:用于检测环境光的强度;

【4】LED灯:作为台灯的光源,通过PWM控制其亮度;

【5】HC05蓝牙模块:用于与手机APP通信,接收控制命令并发送状态信息。

3.5 软件设计

【1】GPIO配置:配置主控芯片的GPIO引脚,包括人体红外传感器输入引脚、光敏传感器输入引脚和LED灯控制引脚等;

【2】外部中断配置:通过外部中断来监听人体红外感应引脚的状态变化,在触发时进行相应操作;

【3】PWM配置:使用PWM控制LED灯的亮度,根据光敏传感器检测到的环境光强度动态调整PWM输出占空比;

【4】蓝牙通信:通过UART配置HC05蓝牙模块,与手机APP建立蓝牙连接,接收控制命令并发送台灯状态信息;

【5】主循环逻辑:在主循环中实时检测光敏传感器的数据以及人体红外感应引脚的状态,并根据相应条件进行台灯的开启和关闭操作;同时,检测蓝牙模块接收到的控制命令,并根据命令内容进行相应操作。

四、主要功能实现

【1】光照调节功能: 通过按键或旋钮操作,调节台灯光照的亮度和色温。亮度调节通过PWM控制LED的亮度,色温调节通过调节白光LED和彩光LED的相对亮度来实现。

【2】人体感应控制: 采用红外传感器,检测到人体活动后自动开启灯光,一段时间内没有人活动则自动关闭。

【3】远程控制功能: 手机App与智能台灯通过蓝牙通信,用户可以通过App控制灯光的开关、亮度和色温,实现远程控制功能。

五、代码实现

5.1 PWM波形控制LED灯亮度

include "stm32f10x.h"

void PWM_Configuration(void);
void Delay(__IO uint32_t nCount);

int main(void) {
  PWM_Configuration();

  while (1) {
    // 逐渐增加LED亮度
    for (uint16_t i = 0; i <= 1000; i++) {
      TIM_SetCompare1(TIM2, i);  // 设置PWM占空比,范围:0-1000
      Delay(5000);               // 延时一段时间
    }

    // 逐渐减小LED亮度
    for (uint16_t i = 1000; i > 0; i--) {
      TIM_SetCompare1(TIM2, i);
      Delay(5000);
    }
  }
}

void PWM_Configuration(void) {
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

  // 配置GPIO口
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  // 配置TIM2为PWM模式
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  TIM_OCInitTypeDef TIM_OCInitStructure;

  TIM_TimeBaseStructure.TIM_Period = 1000;                          // 设置周期
  TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1;                     // 设置预分频
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                  // PWM模式1
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 0;                                 // 初始占空比为0
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OC1Init(TIM2, &TIM_OCInitStructure);
  TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);

  TIM_Cmd(TIM2, ENABLE);                                            // 使能TIM2
}

void Delay(__IO uint32_t nCount) {
  for (; nCount != 0; nCount--);
}

代码中使用了STM32的定时器TIM2和GPIOA的第0号引脚(PA0)来控制LED灯的亮度。在主函数中,通过循环逐渐增加和减小PWM的占空比,从而改变LED灯的亮度。

5.2 智能台灯逻辑代码

// 引入所需的库
#include <stdio.h>
#include <stdbool.h>

// 定义引脚和设备地址
#define PIR_SENSOR_PIN 2
#define LIGHT_SENSOR_PIN 3
#define LED_PIN 4
#define HC05_BAUD_RATE 9600

// 声明全局变量
bool isPersonDetected = false;
int lightIntensity = 0;

// 初始化函数
void setup() {
  // 配置引脚模式
  pinMode(PIR_SENSOR_PIN, INPUT);
  pinMode(LIGHT_SENSOR_PIN, INPUT);
  pinMode(LED_PIN, OUTPUT);

  // 初始化串口通信
  Serial.begin(HC05_BAUD_RATE);
}

// 主循环函数
void loop() {
  // 检测人体红外感应
  if (digitalRead(PIR_SENSOR_PIN) == HIGH) {
    isPersonDetected = true;
  } else {
    isPersonDetected = false;
  }

  // 检测光敏传感器
  lightIntensity = analogRead(LIGHT_SENSOR_PIN);

  // 根据条件控制台灯
  if (isPersonDetected && lightIntensity < 500) {
    digitalWrite(LED_PIN, HIGH);
  } else {
    digitalWrite(LED_PIN, LOW);
  }

  // 处理蓝牙通信
  if (Serial.available()) {
    char command = Serial.read();
    handleBluetoothCommand(command);
  }
}

// 处理蓝牙命令函数
void handleBluetoothCommand(char command) {
  // 处理从手机APP发送来的命令,例如控制台灯亮度
 
}

// 主函数
int main() {
  setup();  // 初始化
  while (1) {
    loop();  // 主循环
  }
  return 0;
}

六、总结

当前文章介绍了基于STM32F103RCT6主控芯片的智能台灯的设计过程和实现原理。通过集成人体红外感应、光敏检测和与手机APP连接的功能,实现了台灯的自动开关和亮度调节等智能化操作。通过手机APP与蓝牙模块的连接,用户可以远程控制台灯的开关、亮度和模式等,提供了更加方便和智能化的使用体验。

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

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

相关文章

Hugo·Stack主题·使用及修改

代码折叠 cp themes/hugo折-themt-saick/exampleSlte/config.yamsclass"codefold"><summary class"codefold__title"><span class"codefold__title-text">" {{ with .Get 0}}{{.}}{{else}}click to expand{{ end }} "&…

【C语言】指针详解(2)

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解指针(2)&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 文章目录 一. 字符指针二 . 指针数组2.1 模拟一个二维数组2.2 维护多个字符串 三 . 数组指针3.1 解…

软件工程(八) UML之类图与对象图

1、类图与对象图 1.1、类图与对象图的概念 类图(class diagram)描述一组类、接口、协作和它们之间的关系 对象图(object diagram)描述一组对象及它们之间的关系、对象图描述了在类图中所建立的事物实例的静态快照。 1.2、类图与对象图的区别 类图和对象图基本上是一样…

【Redis从头学-12】Redis主从复制和读写分离的多种部署方式解析(普通方式、Docker搭建方式、Docker-Compose搭建方式)

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;Re…

[MyBatis系列⑤]多表查询 | 一篇万字长文带你上手三种多表查询方式及其对象封装过程

目录 1、简介 2、业务场景及环境准备 2.1、环境 2.2、ER图 2.3、SQL 3、一对一 3.1、POJO 3.2、OrderMapper.xml 3.3、resultMap 3.4、执行结果 4、一对多 4.1、POJO 4.2、UserMapper.xml 4.3、resultMap 4.4、执行结果 5、多对多 5.1、POJO 5.2、UserMapper.…

2048小游戏成品源码

2048小游戏&#xff0c;可以自选背景颜色&#xff0c;方框颜色&#xff0c;音乐播放。 还可以展示当前玩家的排名&#xff0c;动态排名&#xff0c;及历史玩家的排名。 前期需求&#xff1a; 使用pygame加载目录音乐。MP3文件&#xff1a; def music_play():import pygame …

基于Java+SpringBoot+Vue前后端分离工厂车间管理系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

Android实现跟随滑块移动显示的seekBar

概述 详细讲述跟随滑块移动显示的seekBar效果的自定义实现过程 详细 前言 在Android开发过程中&#xff0c;我们有时会使用到自定义Seekbar,如在滑动滑块时&#xff0c;文字随滑块移动之类的效果&#xff0c;今天就来讲讲跟随滑块移动显示的seekBar的实现吧。 今天涉及内容…

IO进程线程、开启进程frok函数,exec函数族

进程是一个独立的可调度的任务 进程是一个抽象实体。当系统在执行某个程序时&#xff0c;分配和释放的各种资源 进程是一个程序的一次执行的过程 主要的进程标识&#xff1a; 进程号(Process Identity Number&#xff0c;PID) 父进程号(Parent Process ID&#xff0c;PPID) …

DML语句的用法(MySQL)

文章目录 前言一、DML介绍二、DML语句操作1、给指定字段添加数据2、给全部字段添加数据3、批量添加数据4、修改数据5、删除数据 总结 前言 本文主要介绍SQL语句中DML语句的用法。 在实验开始之前我们先创建一下所要使用表&#xff0c;如下图所示&#xff1a; 一、DML介绍 DM…

战略在集体学习过程中涌现

战略学习派&#xff1a;战略是涌现的学习过程&#xff0c;中国人的话&#xff0c;要交学习费&#xff01;【安志强趣讲269期】 趣讲大白话&#xff1a;出来混总要交学费 **************************** 中国人有这个意识 新进一个领域&#xff0c;要交学费&#xff0c;有学习过程…

【Flutter】Flutter 使用 infinite_scroll_pagination 实现无限滚动分页

【Flutter】Flutter 使用 infinite_scroll_pagination 实现无限滚动分页 文章目录 一、前言二、安装和基本使用1. 添加依赖2. 基础配置和初始化 三、实际业务中的用法1. 与 API 集成2. 错误处理 四、完整示例1. 创建一个无限滚动列表2. 使用在你的应用中3. 完整代码示例 五、总…

【Qt学习】08:文件读写操作

OVERVIEW 文件读写操作一、文件操作1.QFile2.QFileInfo 二、二进制文件读写三、文本文件读写 文件读写操作 文件操作是应用程序必不可少的部分&#xff0c;Qt 作为一个通用开发库提供了跨平台的文件操作能力。Qt 通过QIODevice提供了对 I/O 设备的抽象&#xff0c;这些设备具有…

Web自动化测试之图文验证码的解决方案

对于web应用程序来讲&#xff0c;处于安全性考虑&#xff0c;在登录的时候&#xff0c;都会设置验证码&#xff0c; 验证码的类型种类繁多&#xff0c;有图片中辨别数字字母的&#xff0c;有点击图片中指定的文字的&#xff0c;也有算术计算结果的&#xff0c;再复杂一点就是滑…

电子封条监控系统 yolov5

电子封条监控系统利用yoloov5python 深度学习训练模型技术&#xff0c;电子封条监控系统实现对画面内外的出入人员、人数变化及非煤矿山生产作业状态等情况的实时监测和分析&#xff0c;及时发现异常动态&#xff0c;减少了人为介入的过程。介绍Yolo算法之前&#xff0c;首先先…

Android开发之性能测试工具Profiler

前言 性能优化问题&#xff0c;在我们开发时都会遇到&#xff0c;但是在小厂和对自己要求不严格的情况下&#xff0c;我都很少去做性能优化&#xff1b; 在性能优化上&#xff0c;基本大家都是通过自己的开发经验和性能分析工具来发现问题&#xff0c;今天给大家分享一下小编最…

性能优化之分库分表

1、什么是分库分表 1.1、分表 将同一个库中的一张表&#xff08;比如SPU表&#xff09;按某种方式&#xff08;垂直拆分、水平拆分&#xff09;拆分成SPU1、SPU2、SPU3、SPU4…等若干张表&#xff0c;如下图所示&#xff1a; 1.2、分库 在表数据不变的情况下&#xff0c;对…

【GeoDa实用技巧100例】025:geoda空间回归分析案例教程

严重声明:本文来自专栏《GeoDa空间计量案例教程100例》,为CSDN博客专家刘一哥GIS原创,原文及专栏地址为:https://blog.csdn.net/lucky51222/category_12373659.html,谢绝转载或爬取!!! 文章目录 一、空间自回归模型二、Geoda空间回归分析普通最小二乘法回归(OLS)空间…

设计模式--建造者模式(Builder Pattern)

一、什么是建造者模式 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它关注如何按照一定的步骤和规则创建复杂对象。建造者模式的主要目的是将一个复杂对象的构建过程与其表示分离&#xff0c;从而使同样的构建过程可以创建不同的表示。…

基于配置类方式管理 Bean

目录 一、完全注解开发理解 二、配置类和扫描注解 三、Bean定义组件 四、Bean注解细节 五、import 扩展 一、完全注解开发理解 Spring 完全注解配置&#xff08;Fully Annotation-based Configuration&#xff09;是指通过 Java配置类 代码来配置 Spring 应用程序&#…