多功能智能家居室内灯光控制系统设计与实现
目录:
目录:
前言:
一、项目背景与目标
二、国内外研究现状:
2.1 国内研究现状:
2.2 国外研究现状:
2.3 发展趋势
三、硬件电路设计
3.1 总体概述
3.2 硬件连接总结
3.3 主控单元
3.3.1 STM32单片机
3.3.2 DS18B20 温度传感器
3.3.3 光传感器
3.3.4 蓝牙模块
3.3.4 LED 灯模块
3.3.5 电机模块
3.3.6 OLED 显示模块
3.4 远程灯控单元
3.4.1 ESP8266 主控板
3.4.2 Adafruit NeoPixel LED 带
3.4.3 DFRobot DFPlayer Mini MP3 播放器
3.5 语音模块单元
3.5.1 DHT11 温湿度传感器
3.5.2 LU-ASR01鹿小班智能语音识别模块
3.6 实物展示:
四、软件设计
4.1 STM32_Bluetooth 控制端
4.2 ESP8266 部分-WiFi 控制端
4.3 语音控制端
4.4 软件设计概要
4.5 STM32核心源码
4.6 esp8266核心源码:
五、开发环境:
5.1 Keil uVision5
5.2 Arduino IDE
详细资料源码:毕设&课设&项目&竞赛-多功能智能家居室内灯光控制系统设计与实现(完整工程资料源码).zip资源-CSDN文库
详细资料:
esp8266部分-wifi端源码
stm32部分-控温控光系列(C语言)源码
蓝牙端APP-STM32_Bluetooth
使用手册
前言:
随着现代科技的迅猛发展,智能家居系统在我们的日常生活中扮演着越来越重要的角色。通过智能化技术提升家居环境的舒适度和安全性,已经成为当前技术创新的重要方向之一。在大数据、物联网(IoT)和人工智能(AI)技术的推动下,智能家居系统的功能越来越丰富,操作越来越简便,兼容性和扩展性也显著提升。灯光控制作为智能家居系统中的重要组成部分,对于营造家居氛围、提高能源利用效率和提升生活质量具有重要意义。
本项目旨在设计并实现一个多功能智能家居室内灯光控制系统,通过整合多种先进的传感器和控制模块,实现对室内灯光的智能控制。系统主要由三个控制端组成:STM32_Bluetooth控制端、ESP8266 WiFi控制端和语音控制端。通过这三个控制端,用户可以实现对灯光的远程控制、语音控制以及基于环境数据的自动控制。
本项目集成了光敏电阻传感器、HC-05蓝牙模块、DS18B20数字温度传感器、LED灯、风扇叶、130直流电机、TB6612直流电机驱动模块、STM32最小系统板(STM32F103C8T6芯片)、OLED显示板、智能语音识别模块、扬声器、ESP8266模块、DC-DC可调电源模块和继电器模块等多种硬件元件。通过这些元件的协同工作,系统能够高效、稳定地实现对室内灯光的智能控制。
一、项目背景与目标
随着科技的不断进步和生活水平的提高,智能家居技术逐渐成为现代家庭生活的重要组成部分。智能家居系统通过物联网技术将家庭中的各种设备联结在一起,实现相互通信与协作,提升家居环境的舒适性、安全性和便利性。其中,智能灯光控制系统作为智能家居系统中的核心模块之一,具有广泛的应用前景。
在传统的家居环境中,灯光控制主要依赖于手动开关,操作繁琐且缺乏灵活性。随着人们对生活质量要求的不断提升,如何实现更加便捷、高效和智能的灯光控制,成为了智能家居技术研究的重要方向。此外,通过智能控制技术优化灯光的使用,可以有效减少能源浪费,提升能源利用效率,符合现代社会提倡的绿色环保理念。
本项目旨在设计和实现一个多功能智能家居室内灯光控制系统,通过整合多种传感器和控制模块,实现对室内灯光的智能化控制。系统不仅支持传统的手动控制,还能通过蓝牙、WiFi和语音等多种方式进行远程和自动控制,极大地提升了灯光控制的便捷性和灵活性。
图1-1 智能家居设计
本项目的主要目标是设计并实现一个多功能智能家居室内灯光控制系统,通过先进的传感器和控制技术,实现对灯光的智能化控制,提升家居生活的质量和舒适度。具体目标包括:
1. 蓝牙控制:
- 通过蓝牙APP实现对LED灯的开关控制和亮度调节。
- 通过蓝牙APP实现对风扇的开关控制、转速调节和方向调节。
- 系统能够根据实时光照强度自动调节灯光亮度。
- 系统能够根据实时温度自动控制风扇进行降温。
2. WiFi控制:
- 通过WiFi实现对彩灯灯带颜色和亮度的远程控制。
- 提供当前位置定位功能。
- 提供相关调试界面,方便用户进行系统配置和监测。
3. 语音控制:
- 通过语音命令实现对灯光、彩灯和风扇的控制。
- 提供故事模式和诗歌模式,通过语音命令启动相应模式并播放预先录入的故事和诗歌。
- 通过语音命令获取当前环境的温湿度数据。
4. 硬件集成:
- 设计并实现包含光敏电阻传感器、HC-05蓝牙模块、DS18B20数字温度传感器、LED灯、风扇叶、130直流电机、TB6612直流电机驱动模块、STM32最小系统板(STM32F103C8T6芯片)、OLED显示板、智能语音识别模块、扬声器、ESP8266模块、DC-DC可调电源模块和继电器模块等多种硬件元件的集成系统。
- 通过硬件元件的协同工作,实现系统的高效、稳定运行。
5. 用户体验提升:
- 提供多种灯光控制方式,提升用户的操作便捷性和系统灵活性。
- 通过智能化控制技术,提升家居环境的舒适性和能源利用效率。
通过实现上述目标,本项目不仅展示了智能家居技术的实际应用,还为智能灯光控制系统的发展提供了有益的参考和实践经验。希望通过本项目的研究与实现,能够为人们的日常生活带来更多的便利和舒适,推动智能家居技术的进一步发展。
二、国内外研究现状:
2.1 国内研究现状:
随着智能家居技术的不断发展,国内的智能家居市场也在迅速扩大。近年来,许多高校和研究机构在智能家居系统的研究与应用方面取得了显著的进展。其中,智能灯光控制系统作为智能家居的重要组成部分,得到了广泛关注和研究。
1. 高校和研究机构:
- 清华大学等高校的研究团队在物联网和智能控制技术方面拥有丰富的研究经验,开发了基于物联网的智能家居控制系统,能够实现对家居环境的智能监测和控制。
- 浙江大学的研究人员开发了基于嵌入式系统的智能灯光控制系统,通过传感器集成,实现了自动调节灯光亮度和颜色的功能。
2. 企业应用:
- 华为、小米等知名企业也纷纷进入智能家居市场,推出了自己的智能灯光控制产品。这些产品通常集成了WiFi、蓝牙等通信模块,支持远程控制和语音控制,并且能够与其他智能设备实现联动控制。
- 涂鸦智能是一家专注于智能家居解决方案的公司,通过其平台,开发者可以快速开发和部署智能灯光控制系统,实现远程控制、定时控制和场景联动等功能。
3. 标准化与互联互通:
- 国内智能家居领域逐渐重视标准化建设,如国家标准《智能家居系统通用技术要求》为智能家居系统的设计和实施提供了指导。
- 阿里巴巴和京东等互联网巨头也在推动智能家居生态系统的建设,通过开放平台,促进不同品牌和设备之间的互联互通。
2.2 国外研究现状:
国外在智能家居技术的研究和应用方面起步较早,技术相对成熟,市场也较为广泛。智能灯光控制系统作为智能家居的重要组成部分,得到了广泛的研究和应用。
1. 学术研究:
- 麻省理工学院(MIT)等世界知名高校在物联网、人工智能和智能控制技术方面拥有丰富的研究经验,开发了许多创新的智能家居控制系统。这些系统通常集成了机器学习算法,能够根据用户的行为习惯和环境变化,自动调节灯光和其他家居设备。
- 斯坦福大学的研究人员开发了一种基于深度学习的智能灯光控制系统,通过对环境光照和用户行为的实时监测,实现了高度智能化的灯光控制。
2. 企业应用:
- Google的Nest智能家居产品在全球范围内广受欢迎,其智能灯光控制系统能够与Google Assistant无缝集成,实现语音控制和场景联动。
- Amazon的Echo系列产品通过集成Alexa语音助手,实现了对灯光、温度和其他家居设备的智能控制,用户可以通过简单的语音命令实现对家居环境的调节。
- Philips的Hue智能灯光系统在市场上享有很高的声誉,其产品支持丰富的灯光调节功能,通过手机APP、语音助手和自动化规则实现个性化的灯光控制。
3. 标准化与互联互通:
- 国外智能家居领域的标准化建设较为成熟,如Zigbee、Z-Wave等协议在全球范围内得到广泛应用,促进了不同品牌和设备之间的互联互通。
- 苹果的HomeKit平台通过严格的认证和标准,确保了智能家居设备的兼容性和安全性,用户可以通过iOS设备实现对家居设备的统一管理和控制。
国内外在智能灯光控制系统的研究与应用方面均取得了显著的进展。国内研究更加注重系统的集成和应用创新,国外则在技术创新和标准化建设方面具有优势。本项目希望通过借鉴国内外的研究成果,设计并实现一个多功能智能家居室内灯光控制系统,为用户提供更加便捷、高效和智能的家居体验。
2.3 发展趋势
随着科技的不断进步和消费者对高品质生活需求的提升,智能家居室内灯光控制系统正朝着更加智能化、个性化和集成化的方向发展。
- 人工智能(AI)技术的融合:通过引入机器学习和深度学习算法,系统能够更好地理解用户的行为习惯和偏好,实现更加精准和个性化的灯光控制。例如,系统可以根据用户的作息时间自动调节灯光亮度和色温,或者根据用户的情绪状态调整灯光颜色。
- 环境感知能力的增强:集成更多的传感器(如人体红外传感器、温湿度传感器等),系统能够实时监测环境变化,并自动调整灯光设置,以适应不同的使用场景和需求。
- 场景模式的多样化:系统支持更多的预设场景模式,如阅读模式、聚会模式、睡眠模式等,用户可以根据不同的活动需求快速切换灯光设置。
- 用户交互体验的优化:通过改进用户界面和交互设计,提供更加直观和便捷的操作体验。例如,通过手势控制、语音控制或移动设备APP实现更加自然的交互方式。
- 设备间的协同工作:系统能够与其他智能家居设备(如智能窗帘、智能空调等)实现联动控制,提供更加综合和一体化的家居环境管理。
- 开放平台和标准化的推广:通过采用开放的通信协议和标准化的接口,促进不同品牌和设备之间的互联互通,构建更加开放和兼容的智能家居生态系统。
三、硬件电路设计
3.1 总体概述
本项目是一个集成了多种先进传感器和控制模块的智能家居控制系统,旨在提供便捷的灯光、风扇、环境温湿度等设备的智能控制功能。系统分为三个主要控制端:STM32_Bluetooth控制端、ESP8266 WiFi控制端和语音控制端。STM32_Bluetooth控制端通过蓝牙APP实现对LED灯的开关和亮度调节、风扇的开关、转速和方向调节,同时根据实时亮度自动触发LED灯照亮,并根据实时温度自动触发风扇降温。ESP8266 WiFi控制端可以远程控制彩灯灯带的颜色和亮度,提供当前位置定位功能以及相关调试界面。语音控制端通过“智能管家”命令启动语音模块,提供“打开灯光”和“关闭灯光”命令控制灯光,“打开彩灯”和“关闭彩灯”命令控制灯带,以及“故事模式”和“诗歌模式”命令分别启动故事和诗歌模式,目前录入的故事有“画蛇添足”、“狐狸和乌鸦”、“掩耳盗铃”、“拔苗助长”、“刻舟求剑”,录入的诗歌有“静夜思”、“春晓”、“春望”、“望庐山瀑布”、“清明”、“夜雨寄北”。此外,通过“房间温湿度”命令可以得到当前环境的温湿度数据。系统应用的元件包括光敏电阻传感器、HC-05蓝牙模块、DS18B20数字温度传感器、LED灯、风扇叶、130直流电机、TB6612直流电机驱动模块、STM32最小系统板(STM32F103C8T6芯片)、OLED显示板(0.96寸,白色像素)、路小班智能语音识别模块、腔体喇叭扬声器(8欧2W)、D1迷你版Modemcu WiFi基于ESP8266模块、LM2596S DC-DC可调大功率5A电源模块、LM2596S(4-36V输入输出可调带显示)、12V LED灯泡超亮12伏直流电瓶灯24V以及5V2路继电器模块。通过这些元件和控制端的综合运用,本智能家居系统实现了便捷、高效的家居设备控制和环境监测,极大地提升了用户的生活体验。
3-1 电路设计图
3.2 硬件连接总结
光敏电阻传感器连接到STM32的ADC引脚,用于环境光照检测。
HC-05蓝牙模块通过USART接口连接STM32,用于蓝牙通信。
DS18B20温度传感器连接到STM32的GPIO引脚,并使用1-Wire协议通信。
LED灯通过PWM控制,连接到STM32的PWM引脚。
130直流电机通过TB6612驱动模块控制,TB6612连接到STM32的PWM和GPIO引脚。
OLED显示板通过I2C接口连接到STM32的SCL和SDA引脚。
路小班智能语音识别模块通过USART接口连接STM32,用于语音识别。
扬声器连接到语音识别模块的音频输出端,用于语音播报。
ESP8266模块通过USART接口连接STM32,用于WiFi通信和远程控制。
LM2596S电源模块提供稳定的电压给各个模块。
12V LED灯泡通过继电器模块控制,继电器的控制端连接到STM32的GPIO口。
3.3 主控单元
3.3.1 STM32单片机
STM32单片机在智能宠物喂养设备中担任核心控制器的角色。它负责实时处理来自各类传感器的数据,执行相应的控制逻辑,并与用户界面进行交互。STM32的多种接口(如GPIO、ADC、I2C、SPI等)使其能够灵活地连接温湿度传感器、红外测温传感器、水位传感器等外设,确保系统能够准确获取环境信息。此外,STM32还能够根据传感器的数据做出及时反应,如控制水泵的开关、发出警报信号以及更新OLED显示屏的信息。这种高效的处理能力和灵活的接口设计,使得STM32单片机成为智能宠物喂养设备的理想选择。
图3-2 STM32F103C8T6 实物图
- PA0:DS18B20温度传感器的数据引脚
- PA1:光传感器的模拟输入引脚
- PA2:蓝牙模块的TX引脚连接到STM32的RX引脚
- PA3:蓝牙模块的RX引脚连接到STM32的TX引脚
- PA5:LED PWM控制引脚
- PA6:电机PWM控制引脚
- PA7:电机方向控制引脚
3.3.2 DS18B20 温度传感器
将DS18B20温度传感器的数据引脚连接到STM32的PA0引脚,电源和地分别连接到3.3V和GND。如果使用的是单总线模式,需要一个上拉电阻(通常为4.7kΩ)连接在数据引脚和电源之间。
图3-3 DS18B20 温度传感器实物图
3.3.3 光传感器
光传感器的模拟输出引脚连接到STM32的PA1引脚,电源和地分别连接到3.3V和GND。
图3-4 光传感器实物图
3.3.4 蓝牙模块
蓝牙模块(如HC-05或HC-06)的TX引脚连接到STM32的PA3(RX)引脚,RX引脚连接到PA2(TX)引脚。电源和地分别连接到3.3V和GND。
图3-5 HC-05实物图
3.3.4 LED 灯模块
LED灯的控制通过STM32的PA5引脚(PWM输出),LED的正极连接到电源(3.3V或5V,取决于LED的额定电压),负极通过限流电阻连接到PA5引脚。
3.3.5 电机模块
电机连接到L298N电机驱动模块:
- ENA(使能引脚)连接到STM32的PA6引脚(PWM控制电机转速)
- IN1和IN2连接到STM32的PA7引脚,用于控制电机的转向
图3-6 DRV8833电机驱动板模块实物图
电机驱动模块的VCC和GND分别连接到电源(通常是12V)和地。
3.3.6 OLED 显示模块
OLED模块(如128x64 I2C OLED)的SDA和SCL引脚分别连接到STM32的I2C引脚(通常是PB7和PB6)。电源和地分别连接到3.3V和GND。
图3-7 OLED模块实物图
以上连接方式:
STM32 引脚 | 模块 | 模块引脚 | 连接说明 |
---|---|---|---|
PA0 | DS18B20 | Data | 数据引脚 |
3.3V | DS18B20 | VCC | 电源 |
GND | DS18B20 | GND | 地 |
PA1 | 光传感器 | Analog Out | 模拟输出 |
3.3V | 光传感器 | VCC | 电源 |
GND | 光传感器 | GND | 地 |
PA2 | 蓝牙模块 | RX | 蓝牙模块接收 |
PA3 | 蓝牙模块 | TX | 蓝牙模块发送 |
3.3V | 蓝牙模块 | VCC | 电源 |
GND | 蓝牙模块 | GND | 地 |
PA5 | LED灯 | (-) | 通过限流电阻连接到负极 |
3.3V | LED灯 | (+) | 正极 |
PA6 | 电机驱动模块 | ENA | 电机使能引脚 |
PA7 | 电机驱动模块 | IN1/IN2 | 电机方向控制 |
GND | 电机驱动模块 | GND | 地 |
PB7 | OLED | SDA | I2C 数据线 |
PB6 | OLED | SCL | I2C 时钟线 |
3.3V | OLED | VCC | 电源 |
GND | OLED | GND | 地 |
3.4 远程灯控单元
3.4.1 ESP8266 主控板
ESP8266 是一个集成 WiFi 功能的微控制器,广泛用于物联网项目。
图3-8 ESP8266实物图
3.4.2 Adafruit NeoPixel LED 带
- 引脚: 使用 GPIO13(D7) 连接到 NeoPixel LED 带的输入。
- 数量: NeoPixel LED 带上有 60 个 LED。
- 功率: 所有 LED 满载时可能需要一个外部电源(例如 5V 3A 电源),因为 ESP8266 无法提供足够的电流。
- 连接:
- DIN 连接到 GPIO13(D7)
- VCC 连接到外部 5V 电源
- GND 连接到外部电源的 GND 和 ESP8266 的 GND
图3-9 LED 灯带实物图
3.4.3 DFRobot DFPlayer Mini MP3 播放器
- 引脚: 使用软件串口通过 GPIO4(D2)和 GPIO5(D1) 进行通信。
- 连接:
- RX 连接到 GPIO5(D1)
- TX 连接到 GPIO4(D2)
- VCC 连接到 5V
- GND 连接到 GND
图3-10 Mini MP3 播放器实物图
以上连接方式:
图3-11 esp8266与灯带详细连接
模块 | 引脚 | 连接到 | 说明 |
---|---|---|---|
NeoPixel LED 带 | DIN | GPIO13 (D7) | 数据输入 |
VCC | 外部 5V | 电源 | |
GND | GND | 地 | |
DFPlayer Mini | RX | GPIO5 (D1) | 串口通信 |
TX | GPIO4 (D2) | 串口通信 | |
VCC | 5V | 电源 | |
GND | GND | 地 | |
ESP8266 | GPIO2 | 外部 LED | 控制状态指示 LED |
3.3V | 外部电源 | 电源 | |
GND | GND | 地 |
3.5 语音模块单元
3.5.1 DHT11 温湿度传感器
- 引脚: 使用 GPIO9(D9)读取温湿度数据。
- 功能: 提供当前环境的温度和湿度数据。
图3-12 esp8266与灯带详细连接
3.5.2 LU-ASR01鹿小班智能语音识别模块
LU-ASR01鹿小班是一个智能语音识别模块,具备高度集成的语音识别和处理能力,适用于多种物联网和智能家居应用。该模块支持多种语音命令的识别,可以实现复杂的语音控制功能。LU-ASR01内置先进的语音识别算法,能够在嘈杂的环境下准确识别用户的语音指令。它还支持多种唤醒词和命令词的自定义,用户可以根据实际需求自由设置。模块通过串口与主控板通信,提供简单易用的接口,方便各种开发板和微控制器进行集成。
图3-13 鹿小班语音模块
另外,LU-ASR01还具备实时语音反馈功能,通过内置或外接的扬声器可以及时响应用户的指令。该模块广泛应用于智能音箱、语音助手、语音控制家电等领域,帮助实现更为智能化和人性化的交互体验。LU-ASR01设计紧凑,功耗低,适合各种嵌入式系统和便携设备的应用,是开发语音交互产品的理想选择。
3.6 实物展示:
四、软件设计
4.1 STM32_Bluetooth 控制端
1. STM32_Bluetooth端APP控制LED灯开关和调节亮度:
通过HC-05蓝牙模块接收来自手机APP的指令。
使用PWM控制STM32的GPIO输出,调节LED灯的亮度。
设置GPIO引脚控制LED灯开关。
图4-1 蓝牙APP操作界面
2. STM32_Bluetooth端APP控制风扇开关和调节风扇转速以及方向:
通过HC-05蓝牙模块接收手机APP的指令。
使用PWM信号控制TB6612驱动模块,从而调节130直流电机的转速和方向。
设置GPIO引脚控制风扇开关。
图4-2 蓝牙连接热点
3. 根据实时亮度自动触发LED灯照亮:
使用光敏电阻传感器检测环境光照强度。
通过ADC读取光敏电阻的电压值,并根据设定的阈值自动控制LED灯的开关和亮度。
4. 根据实时温度自动触发风扇降温:
使用DS18B20温度传感器检测环境温度。
通过读取温度值,并根据设定的阈值自动控制风扇的开关和转速。
4.2 ESP8266 部分-WiFi 控制端
1. 远程控制启动彩灯灯带颜色与深度:
使用ESP8266连接到WiFi网络,实现远程控制。
配合合适的灯带(如RGB灯带),通过PWM信号控制灯带的颜色和亮度。
通过HTTP或MQTT协议接收来自远程服务器或应用的控制指令。
图4-3 远程APP控制界面
2. 定位当前所在位置:
使用ESP8266的WiFi定位功能,通过信号强度和WiFi热点信息定位。
发送定位数据到远程服务器进行处理和显示。
3. 有相关调试界面:
提供一个Web界面或移动应用界面进行调试和控制。
Web界面可以通过ESP8266的Web Server功能实现,移动应用可以通过HTTP API与ESP8266通信。
图4-4 web界面设计
4.3 语音控制端
1. 通过“智能管家”命令启动语音模块:
使用路小班智能语音识别模块进行语音命令识别。
通过USART接口将语音识别结果传输到STM32进行处理。
2. 通过“打开灯光”命令打开灯光、通过“关闭灯光”命令关闭灯光:
解析语音命令,识别“打开灯光”或“关闭灯光”。
控制STM32的GPIO引脚实现LED灯的开关。
3. 通过“打开彩灯”命令打开灯带、通过“关闭彩灯”命令关闭灯带:
解析语音命令,识别“打开彩灯”或“关闭彩灯”。
通过ESP8266发送控制指令到灯带,实现灯带的开关。
4. 通过“故事模式”命令启动故事模式:
解析语音命令,识别“故事模式”。
通过STM32控制扬声器播放预录的故事音频。
5. 通过“诗歌模式”命令启动诗歌模式:
解析语音命令,识别“诗歌模式”。
通过STM32控制扬声器播放预录的诗歌音频。
6. 通过“房间温湿度”命令得到当前环境温湿度总体概述:
解析语音命令,识别“房间温湿度”。
读取DS18B20温度传感器的数据,并通过扬声器播报当前温湿度概述。
4.4 软件设计概要
1. STM32固件:
初始化各个外设(ADC、PWM、USART、I2C等)。
通过中断或定时器定期读取传感器数据。
接收并解析蓝牙和语音模块的命令,控制相应的外设。
通过USART与ESP8266通信,实现WiFi控制。
2. ESP8266固件:
初始化WiFi连接,连接到指定的网络。
提供HTTP或MQTT接口,接收远程控制指令。
控制彩灯灯带的颜色和亮度。
实现定位功能并上传定位数据。
3. 移动App或Web界面:
提供用户友好的界面,控制LED灯、风扇和彩灯灯带。
通过蓝牙或WiFi与STM32和ESP8266通信。
显示实时传感器数据和系统状态。
通过以上设计和实现,可以构建一个功能丰富、智能化的多功能智能家居室内灯光控制系统,满足用户的多种需求。
4.5 STM32核心源码
#include "stm32f10x.h" // Device header
#include "Delay.h" //延时
#include "OLED.h" //OLED模块
#include "Key.h" //按键模块
#include "DS18B20.h" //温度获取模块
#include "Motor.h" //电机模块
#include "LightSensor.h" //光亮度获取模块
#include "LED.h" //LED灯模块
#include "Serial.h" //蓝牙通信模块
uint16_t AT; //接收蓝牙发过来的指令
uint8_t LEDNum,FanSpeed; //光度,转速
int8_t FanDirection = 1 ; //转向
char SendString[100]; //向蓝牙发送的显示信息
uint8_t StandardL = 35, StandardT = 26; //标准亮度和温度
unsigned short int NowL; //实时亮度
float NowT; //实时温度
uint8_t LFlag = 0, TFlag = 0; //开启控光,控温模块;0--不开启,1--开启
uint8_t i;
void Control_L(uint8_t StandardL) //光控模块
{
if (NowL < StandardL)
{
LEDNum = 100;
}
else
{
LEDNum = 0;
}
LED_SetCompare2(LEDNum);
};
void Control_T(uint8_t StandardT) //温控模块
{
if (NowT > StandardT)
{
FanSpeed = 100;
}
else
{
FanSpeed = 0;
}
Motor_SetSpeed(FanSpeed);
};
int main(void)
{
OLED_Init();
Serial_Init();
LED_Init();
Motor_Init();
LightSensor_Init();
while (1)
{
NowT = DS18B20_ReadTemp();
NowL=LightSensor_GetData();
memset(SendString,0,sizeof(SendString));
sprintf(SendString,"%d;%s",NowL,Temperature_String());
Serial_SendString(SendString);
OLED_ShowString(1,1,"Temp:");
OLED_ShowNum(1,6,NowT,2);
OLED_ShowString(2,1,"Light:");
OLED_ShowSignedNum(2,7,NowL,4);
if (Serial_GetRxFlag() == 1)
{
AT = Serial_GetRxData();
switch (AT)
{
case 1:
LEDNum = 100;
LED_SetCompare2(LEDNum);
break;
case 2:
LEDNum = 0;
LED_SetCompare2(LEDNum);
break;
case 3:
LEDNum = (LEDNum == 100? 100 : LEDNum + 10);
LED_SetCompare2(LEDNum);
break;
case 4:
LEDNum = (LEDNum == 10? 10 : LEDNum - 10);
LED_SetCompare2(LEDNum);
break;
case 5:
FanSpeed = 100;
Motor_SetSpeed(FanSpeed);
break;
case 6:
FanSpeed = 0;
Motor_SetSpeed(FanSpeed);
break;
case 7:
FanSpeed = (FanSpeed == 100? 100 : FanSpeed + 10);
Motor_SetSpeed(FanDirection * FanSpeed);
break;
case 8:
FanSpeed = (FanSpeed == 10? 10 : FanSpeed - 10);
Motor_SetSpeed(FanDirection * FanSpeed);
break;
case 9:
FanDirection = 1;
Motor_SetSpeed(FanDirection * FanSpeed);
break;
case 10:
FanDirection = -1;
Motor_SetSpeed(FanDirection * FanSpeed);
break;
case 11:
LFlag = 1;
i++;
break;
case 12:
LFlag = 0;
LEDNum = 0;
LED_SetCompare2(LEDNum);
break;
case 13:
TFlag = 1;
break;
case 14:
TFlag = 0;
FanSpeed = 0;
Motor_SetSpeed(FanSpeed);
break;
default:
if (AT >= 15 && AT <= 115)
{
StandardL = AT - 15;
}
else if(AT >= 116 && AT <= 216)
{
StandardT = AT - 116;
}
break;
}
}
if (LFlag)
{
Control_L(StandardL);
}
if (TFlag)
{
Control_T(StandardT);
}
}
}
一个基于STM32F103微控制器的智能家居室内灯光控制系统的主程序。以下是对源码的详细分析:
1. 包含的头文件
stm32f10x.h
:STM32F103系列微控制器的标准库头文件。Delay.h
:延时函数头文件。OLED.h
:OLED显示屏驱动头文件。Key.h
:按键处理头文件。DS18B20.h
:DS18B20温度传感器驱动头文件。Motor.h
:电机控制头文件。LightSensor.h
:光亮度传感器驱动头文件。LED.h
:LED灯控制头文件。Serial.h
:串口通信(蓝牙)头文件。
2. 全局变量
uint16_t AT
:接收蓝牙发过来的指令。uint8_t LEDNum, FanSpeed
:LED灯亮度和风扇转速。int8_t FanDirection
:风扇转向,1为正转,-1为反转。char SendString[100]
:向蓝牙发送的显示信息。uint8_t StandardL, StandardT
:标准亮度和温度。unsigned short int NowL
:实时亮度。float NowT
:实时温度。uint8_t LFlag, TFlag
:光控和温控模块的开关标志。uint8_t i
:计数器。
3. 函数定义
Control_L(uint8_t StandardL)
:光控模块,根据实时亮度调整LED灯亮度。Control_T(uint8_t StandardT)
:温控模块,根据实时温度调整风扇转速。
3. 主函数 main
(1)
初始化:
OLED_Init()
:初始化OLED显示屏。Serial_Init()
:初始化串口通信(蓝牙)。LED_Init()
:初始化LED灯。Motor_Init()
:初始化电机。LightSensor_Init()
:初始化光亮度传感器。
(2)主循环:
- 读取实时温度和亮度:
NowT = DS18B20_ReadTemp()
:读取温度。NowL = LightSensor_GetData()
:读取亮度。
- 构建并发送显示信息到蓝牙:
sprintf(SendString, "%d;%s", NowL, Temperature_String())
:构建字符串。Serial_SendString(SendString)
:发送字符串。
- 在OLED上显示温度和亮度:
OLED_ShowString(1,1,"Temp:")
:显示温度标签。OLED_ShowNum(1,6,NowT,2)
:显示温度值。OLED_ShowString(2,1,"Light:")
:显示亮度标签。OLED_ShowSignedNum(2,7,NowL,4)
:显示亮度值。
- 处理蓝牙接收到的指令:
if (Serial_GetRxFlag() == 1)
:检查是否有新数据。AT = Serial_GetRxData()
:获取接收到的数据。switch (AT)
:根据接收到的指令执行相应操作。- 控制LED灯亮度。
- 控制风扇转速和方向。
- 开启或关闭光控和温控模块。
- 设置标准亮度和温度。
- 根据标志位执行光控和温控:
if (LFlag)
:如果光控标志位为1,执行光控模块。if (TFlag)
:如果温控标志位为1,执行温控模块。
该程序通过蓝牙接收控制指令,根据指令控制LED灯和风扇,并实时显示温度和亮度。同时,程序支持自动光控和温控功能,可以根据设定的标准亮度和温度自动调节LED灯和风扇。
4.6 esp8266核心源码:
#include <Arduino.h>
#include <Adafruit_NeoPixel.h>
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
int pin = 13; // On Trinket or Gemma, suggest changing this to 1 gpio13 D7
int numPixels = 60; // 灯珠 数量
int pixelFormat = NEO_GRB + NEO_KHZ800;
Adafruit_NeoPixel pixels(numPixels, pin, pixelFormat);
/**
* 点灯科技开发文档地址
* https://diandeng.tech/doc/getting-start-8266
*/
#define BLINKER_WIFI
#include <Blinker.h>
SoftwareSerial mySoftwareSerial(4, 5); // RX, TX //实例化软串口设置通讯用的RX和TX引脚 这是8266的引脚
DFRobotDFPlayerMini myDFPlayer; //实例化库
void printDetail(uint8_t type, int value);//定义一个方法用来打印错误信息
char auth[] = "918e677327c9";
char ssid[] = "z";
char pswd[] = "00000000";
uint8_t is_run = 0;//是否按顺序播放 停止或继续播放用
uint8_t playInSequence = 0;//播放循序 记录现在是向上播放还是向下播放 默认下一首
uint8_t i=5;
// 新建组件对象
BlinkerRGB RGB1("col-aab");//这里输入替换你的点灯设备组件颜色拾取的键值
//BlinkerRGB RGB2("btn-cs5");//这里输入替换你的点灯设备组件颜色拾取的键值
//char auth[] = "eac744d3f392";//这里输入你的点灯设备密钥
//char ssid[] = "z";//这里输入你家的wifi账号
//char pswd[] = "00000000";//这里输入你家的wifi密码
int color1 = 120; //红色
int color2 = 0; //绿色
int color3 = 0; //蓝色
// 新建组件对象
BlinkerButton Button1("btn-abc");
BlinkerButton Button2("btn-j8m");
BlinkerButton Button3("btn-23f");
BlinkerButton Button4("btn-h5h");
BlinkerButton Button5("btn-a3o");
BlinkerButton Button6("btn-0k8");
BlinkerButton Button7("btn-o4j");
// 按下button1按键即会执行该函数
void button1_callback(const String & state) {
BLINKER_LOG("get button1 state: ", state);
digitalWrite(2, !digitalRead(LED_BUILTIN));
myDFPlayer.previous();//上一首
playInSequence = 1;//并将顺序改为向上播放
}
// 按下button2按键即会执行该函数
void button2_callback(const String & state) {
BLINKER_LOG("get button2 state: ", state);
digitalWrite(2, !digitalRead(LED_BUILTIN));
myDFPlayer.next();//下一首
playInSequence = 0;//并将顺序改为向下播放
}
// 按下button3按键即会执行该函数
void button3_callback(const String & state) {
is_run = !is_run;
}
void button4_callback(const String & state) {
myDFPlayer.volume(0);
}
void button5_callback(const String & state) {
myDFPlayer.volume(5);
}
void button6_callback(const String & state) {
myDFPlayer.volume(20);
}
void button7_callback(const String & state) {
myDFPlayer.volume(30);
}
//颜色组件回调函数
void rgb1_callback(uint8_t r_value, uint8_t g_value, uint8_t b_value, uint8_t bright_value)
{
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
BLINKER_LOG("R value: ", r_value);
BLINKER_LOG("G value: ", g_value);
BLINKER_LOG("B value: ", b_value);
Serial.println(g_value);
color1 = r_value;
color2 = g_value;
color3 = b_value;
BLINKER_LOG("Rrightness value: ", bright_value);
pixels.setBrightness(bright_value);//调节亮度
}
void setup() {
// put your setup code here, to run once:
mySoftwareSerial.begin(9600);
Serial.begin(115200);
pixels.begin(); // INITIALIZE NeoPixel pixels object (REQUIRED)
pixels.show();
BLINKER_DEBUG.stream(Serial);
Blinker.begin(auth, ssid, pswd);
RGB1.attach(rgb1_callback);//绑定RGB1的回调函数
delay(3000);
Serial.println();
Serial.println(F("DFRobot DFPlayer Mini Demo"));//库demo
Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));// 正在初始化DFPlayer 可能需要3-5秒钟
if (!myDFPlayer.begin(mySoftwareSerial)) { //使用softwareSerial与mp3通信。
Serial.println(F("Unable to begin:")); //无法开始
Serial.println(F("1.Please recheck the connection!"));//请重新检查连接 也就是我们接的线路
Serial.println(F("2.Please insert the SD card!")); //请插入SD卡!
// while(true);
}
Serial.println(F("DFPlayer Mini online."));//走到这里就说明设备在线可以继续操作
myDFPlayer.play(1); //播放第一个MP3 第一首歌曲
//调试输出
BLINKER_DEBUG.stream(Serial);
// 初始化有LED的IO
pinMode(2, OUTPUT);
digitalWrite(2, HIGH);
// 初始化blinker
Blinker.begin(auth, ssid, pswd);
Button1.attach(button1_callback);//绑定button1的回调函数
Button2.attach(button2_callback);//绑定button2的回调函数
Button3.attach(button3_callback);//绑定button2的回调函数
Button4.attach(button4_callback);//绑定button4的回调函数
Button5.attach(button5_callback);//绑定button5的回调函数
Button6.attach(button6_callback);//绑定button6的回调函数
Button7.attach(button7_callback);//绑定button7的回调函数
}
void loop() {
Blinker.run();
delay(1);
middleWATER();
}
//中间流水灯函数
void middleWATER(){
pixels.clear();
for(int j=0; j<numPixels; j++){
if(j>=0 && j<30){ //0-29 执行这个条件 //比如灯珠数量60/2 30对 numPixels表示灯珠数量 执行点亮
//29-0位顺序 灯珠亮 29. 28. 27. 26. 25. ...0 从右至左 29-0
pixels.setPixelColor((numPixels/2-1-j), pixels.Color(color1, color2, color3));
//30-59位顺序灯珠亮 30. 31. 32. 33. 34. ...59 从左至右 30-59
pixels.setPixelColor((numPixels/2+j), pixels.Color(color1, color2, color3));
}else{ //30-59 执行这个条件 执行熄灭
//0-29位灯珠顺序灭 0位 灯珠灭 1位灯珠灭 0. 1 。。。。。29 从左至右 0-29
pixels.setPixelColor((j-(numPixels)/2), pixels.Color(0, 0, 0));
//59-30位灯珠 59灯珠灭. 58灯珠灭. 59. 58 。。。。。30 从右至左 59-30
pixels.setPixelColor((numPixels-1-(j-(numPixels/2))), pixels.Color(0, 0, 0));
}
pixels.show();//执行设置
delay(20);
}
}
//顺序流水灯
void orderWATER(){
pixels.clear();
//点亮所有灯珠
for(int j=0; j<numPixels; j++){
pixels.setPixelColor(j, pixels.Color(color1, color2, color3));
pixels.show();//执行
delay(20);
}
delay(20);
//熄灭
for(int j=numPixels-1; j>=0; j--){
pixels.setPixelColor(j, pixels.Color(0, 0, 0));
pixels.show();//执行
delay(20);
}
}
void printDetail(uint8_t type, int value){
switch (type) {
case TimeOut:
Serial.println(F("Time Out!")); //时间到!
break;
case WrongStack:
Serial.println(F("Stack Wrong!")); //堆栈错误!
break;
case DFPlayerCardInserted:
Serial.println(F("Card Inserted!")); //卡已插入!
break;
case DFPlayerCardRemoved:
Serial.println(F("Card Removed!")); //卡片已删除!
break;
case DFPlayerCardOnline:
Serial.println(F("Card Online!")); //卡在线!
break;
case DFPlayerPlayFinished:
Serial.print(F("Number:"));
Serial.print(value);
Serial.println(F(" Play Finished!")); //播放完毕!
break;
case DFPlayerError:
Serial.print(F("DFPlayerError:"));
switch (value) {
case Busy:
Serial.println(F("Card not found"));
break;
case Sleeping:
Serial.println(F("Sleeping"));
break;
case SerialWrongStack:
Serial.println(F("Get Wrong Stack")); //获取错误堆栈
break;
case CheckSumNotMatch:
Serial.println(F("Check Sum Not Match")); //校验和不匹配
break;
case FileIndexOut:
Serial.println(F("File Index Out of Bound")); //文件索引超出范围
break;
case FileMismatch:
Serial.println(F("Cannot Find File")); //无法找到文件
break;
case Advertise:
Serial.println(F("In Advertise")); //在广告中
break;
default:
break;
}
break;
default:
break;
}
}
通过ESP8266微控制器实现一个智能家居的灯光和音频控制系统。代码结合了一些硬件组件和第三方库,提供了丰富的功能,如远程控制灯带颜色、亮度和播放音频文件。
1. 硬件初始化和配置:
- NeoPixel灯带:使用Adafruit NeoPixel库控制灯带的颜色和亮度。灯带的数据引脚连接到ESP8266的GPIO引脚。初始化时,设置灯带的数量和像素格式。
- DFPlayer Mini MP3播放器:使用DFRobotDFPlayerMini库控制MP3播放器,通过软件串口与ESP8266通信。需要初始化播放器并检查是否正确连接和插入SD卡。
- Blinker平台:使用Blinker库实现远程控制。需要提供Blinker平台的授权码和WiFi网络的SSID和密码。
2. 远程控制接口:
- Blinker组件:定义了一些按钮和RGB颜色拾取器,分别用于控制灯带的颜色和音频播放。每个组件都有对应的回调函数,当用户在Blinker应用中触发这些组件时,会调用相应的回调函数。
- 按钮控制:按钮用于控制音频的播放顺序(上一首、下一首)、播放状态(播放/暂停)、音量调节(不同的音量级别)。
- RGB颜色拾取器:用于远程设置灯带的颜色和亮度。
3. 回调函数:
- 按钮回调函数:每个按钮对应一个回调函数,当按钮被按下时,执行特定的操作,如播放上一首或下一首歌曲、调节音量等。
- RGB颜色回调函数:当用户在Blinker应用中选择颜色时,回调函数会更新灯带的颜色和亮度。
4.主循环:
- Blinker运行:在主循环中调用
Blinker.run()
,保持与Blinker平台的连接和正常通信。 - 灯光效果:在主循环中调用自定义的灯光效果函数,如
middleWATER()
,实现特定的灯光效果。
5. 自定义灯光效果函数:
- 中间流水灯效果:通过控制灯带的像素颜色,创建一个从中间向两侧扩展的流水效果。依次点亮和熄灭灯珠,实现动态效果。
- 顺序流水灯效果:灯带的像素依次点亮和熄灭,创建顺序流水的效果。
6. 错误处理:
- DFPlayer错误处理:定义一个函数处理DFPlayer Mini MP3播放器的错误信息,通过串口打印错误详情,方便调试和排除故障。
通过ESP8266微控制器和Blinker平台,实现了远程控制灯带颜色和亮度,并结合DFPlayer Mini MP3播放器提供了音频播放功能。代码结构清晰,通过回调函数实现了对各种控制命令的响应,并在主循环中保持与远程平台的通信和执行灯光效果。通过组合使用多个第三方库,代码实现了智能家居系统的主要功能,提供了良好的用户体验和可扩展性。
五、开发环境:
5.1 Keil uVision5
Keil uVision5 是一款广泛使用的集成开发环境(IDE),专门用于开发基于 ARM、Cortex-M、8051、C166 和其他微控制器的嵌入式系统。它由 Arm 公司提供,支持多种编程语言,主要是 C 和汇编语言。uVision5 提供了一整套的工具,包括代码编辑器、编译器、调试器以及项目管理工具,使开发者能够高效地进行嵌入式应用的开发。
uVision5 提供了直观易用的用户界面,使得项目创建和管理变得方便。支持语法高亮、代码完成、代码折叠等功能,提高了开发效率。内置 C/C++ 编译器,支持多种优化选项,生成高效的可执行代码。支持多种调试器,包括仿真器和硬件调试器,提供断点设置、变量监视、实时跟踪等功能,帮助开发者快速排查问题。
5.2 Arduino IDE
Arduino Integrated Development Environment(Arduino IDE)是一个专为编写、编译和上传代码到Arduino板子而设计的开发环境。它支持Windows、macOS和Linux操作系统,提供了简洁直观的用户界面,包含代码编辑器、编译器和上传工具,适合初学者和经验丰富的开发者使用。Arduino IDE内置库管理器,提供丰富的内置库,用户可以方便地导入和使用各种功能库,同时支持第三方硬件和库的安装,以扩展Arduino的功能。
它还内置串行监视器,用于调试和监控Arduino板子与计算机之间的串行通信。IDE提供大量示例代码,帮助用户快速上手和理解各种功能的实现。主要组件包括菜单栏、工具栏、代码编辑器、消息区和串行监视器。安装Arduino IDE后,用户可以通过USB线将Arduino板子连接到计算机,选择正确的板子类型和端口,在代码编辑器中编写Arduino程序,通常包含setup()函数和loop()函数。用户可以点击工具栏中的校验按钮进行代码编译,如果没有错误,会生成二进制文件,然后点击上传按钮将编译后的代码上传到Arduino板子。IDE还可以使用串行监视器查看和调试Arduino板子输出的串行数据。Arduino IDE简化了开发、调试和部署Arduino项目的过程,使得从简单的LED控制到复杂的物联网应用都变得非常简单和高效。