基于STM32设计的智能台灯

2023年 8月 16日 26.9k 0

一、项目背景

智能家居设备在现代生活中起着越来越重要的作用。智能台灯作为其中的一种,具有调节光照亮度、色温等功能,更加符合人们对于光照环境的个性化需求。当前设计一款基于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  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 
#include 
​
// 定义引脚和设备地址
#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与蓝牙模块的连接,用户可以远程控制台灯的开关、亮度和模式等,提供了更加方便和智能化的使用体验。

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论