基于Zigbee的智能家居灯光控制系统

举报
DS小龙哥 发表于 2025/12/25 11:59:25 2025/12/25
【摘要】 项目开发背景随着科技的飞速发展和人们生活水平的提高,智能家居系统逐渐成为现代家庭的重要组成部分。智能灯光控制作为智能家居的核心功能之一,不仅能够提升居住舒适度,还能有效节约能源,满足用户对便捷、智能化生活的追求。传统的灯光控制系统多依赖于有线连接或简单的遥控器,存在布线复杂、灵活性差、无法远程控制等局限性,用户往往需要手动操作开关,无法根据环境变化自动调节,也无法实现多房间的统一管理。为了...

项目开发背景

随着科技的飞速发展和人们生活水平的提高,智能家居系统逐渐成为现代家庭的重要组成部分。智能灯光控制作为智能家居的核心功能之一,不仅能够提升居住舒适度,还能有效节约能源,满足用户对便捷、智能化生活的追求。传统的灯光控制系统多依赖于有线连接或简单的遥控器,存在布线复杂、灵活性差、无法远程控制等局限性,用户往往需要手动操作开关,无法根据环境变化自动调节,也无法实现多房间的统一管理。

为了克服这些不足,无线通信技术如Zigbee被引入智能家居领域。Zigbee技术以其低功耗、低成本、高可靠性和自组网能力,成为构建智能灯光控制系统的理想选择。它能够轻松组建包含协调器、路由器和终端设备的网络,实现设备间的稳定通信和广泛覆盖,从而支持灵活的远程控制和自动化管理。

本项目的开发旨在利用Zigbee技术构建一个高效的智能家居灯光控制系统,通过集成STM32单片机、Zigbee模块、光敏电阻和继电器等硬件,实现环境光照监测、灯具开关控制、手机APP远程操作以及多种场景模式功能。这不仅解决了传统系统在灵活性和智能化方面的缺陷,还为推动智能家居的普及和能源节约提供了实用解决方案,具有重要的社会和经济价值。

设计实现的功能

(1) 组建Zigbee无线网络,包含协调器、路由器和终端设备。
(2) 终端设备节点能监测环境光照强度,并控制灯具开关。
(3) 用户可通过手机APP(通过协调器)远程控制任意房间的灯光。
(4) 系统支持场景模式,如“全开”、“全关”、“夜间模式”。

项目硬件模块组成

(1) 主控与组网:STM32单片机 + Zigbee模块(如CC2530)。
(2) 传感模块:光敏电阻模块。
(3) 执行模块:继电器模块。
(4) 协调器:Zigbee-USB协调器,用于连接上位机或网关。

设计意义

该设计基于Zigbee无线网络技术构建智能家居灯光控制系统,能够实现稳定可靠的设备组网,支持协调器、路由器和终端设备的协同工作,有效降低系统部署成本和维护复杂性,同时利用Zigbee的低功耗特性延长设备使用寿命,为家庭环境提供高效的无线通信基础。

通过集成光敏电阻模块,系统能够实时监测环境光照强度,并结合继电器模块自动控制灯具开关,实现智能调光与节能管理,这不仅提升了能源利用效率,还增强了居住舒适度,满足用户对自动化照明的基本需求。

系统支持用户通过手机APP远程控制任意房间的灯光,借助Zigbee-USB协调器连接上位机或网关,实现了灵活便捷的远程操作,大大提高了用户的生活便利性,尤其适用于外出或移动场景下的家庭照明管理。

此外,系统内置多种场景模式如“全开”、“全关”和“夜间模式”,允许用户一键切换照明状态,简化了日常操作流程,增强了系统的实用性和智能化水平,为现代家庭提供了一种高效且易用的灯光控制解决方案。

设计思路

设计思路首先围绕Zigbee无线网络的组建展开,系统采用协调器作为网络核心,负责初始化和管理整个网络,路由器用于扩展网络覆盖范围并转发数据,终端设备则部署在各个房间中,通过Zigbee模块与协调器通信,确保网络稳定可靠。硬件上,协调器使用Zigbee-USB协调器连接上位机或网关,而终端设备以STM32单片机为主控,搭配Zigbee模块实现无线通信。

在终端设备层面,每个节点集成光敏电阻模块来实时监测环境光照强度,并将数据通过Zigbee网络传输至协调器;同时,STM32单片机根据光照数据或控制指令驱动继电器模块,实现灯具的开关控制,确保系统能自动响应环境变化。这种设计使得终端设备既能独立工作,又能融入网络协同。

用户远程控制功能通过手机APP实现,APP与协调器连接,协调器作为网关接收APP指令并将其转发至指定的终端设备节点,从而允许用户远程控制任意房间的灯光开关。系统通过协调器解析指令并路由到对应设备,确保控制实时性和准确性。

场景模式功能基于协调器的逻辑处理实现,系统预设“全开”、“全关”和“夜间模式”等场景,协调器在接收到模式指令后,统一向所有相关终端设备发送批量控制命令,例如在“夜间模式”下自动调整灯光状态,提升用户体验和能源效率。整个系统设计注重实际应用,确保功能稳定且易于维护。

框架图

+-------------------+       +-------------------+
|   手机APP         |       |   协调器          |
|   (用户控制)      |<----->|   (Zigbee-USB)    |
|   - 场景模式      |       |   - 网络管理      |
|   (全开/全关/夜间)|       +-------------------+
+-------------------+               |
                                    | Zigbee 无线协议
                                    |
          +-------------------------+-------------------------+
          |                         |                         |
    +-------------+           +-------------+           +-------------+
    |  路由器     |           |  终端设备1  |           |  终端设备2  |
    | (可选中继)  |           | (房间1)     |           | (房间2)     |
    +-------------+           +-------------+           +-------------+
          |                         |                         |
          |                   +-----------+             +-----------+
          |                   |STM32+Zigbee|            |STM32+Zigbee|
          |                   |光敏传感器  |            |光敏传感器  |
          |                   |继电器      |            |继电器      |
          |                   +-----------+             +-----------+
          |                         |                         |
          |                   +-----------+             +-----------+
          |                   |   灯具    |             |   灯具    |
          |                   +-----------+             +-----------+
          |                         |                         |
    +-------------+           +-------------+           +-------------+
    |  ...更多设备|           |  ...更多设备|           |  ...更多设备|
    +-------------+           +-------------+           +-------------+

系统总体设计

该系统总体设计基于Zigbee无线通信技术,构建一个智能家居灯光控制系统,实现灯光的远程控制和自动化管理。系统采用分布式架构,通过Zigbee网络连接各个设备节点,确保稳定可靠的数据传输和指令执行。

Zigbee网络由协调器、路由器和终端设备组成,其中协调器作为网络中心,负责初始化网络并管理设备入网,路由器扩展网络覆盖范围,增强信号中继能力,终端设备则作为网络中的叶节点,执行具体的传感和控制任务。这种分层结构提高了系统的可扩展性和鲁棒性,适用于多房间家居环境。

终端设备节点集成了光敏电阻模块,用于实时监测环境光照强度,并将数据通过Zigbee网络上报。同时,这些节点通过继电器模块控制灯具的开关状态,实现基于环境光的自动调节或用户指令的响应。每个终端设备可独立工作,也可通过网络协同操作。

用户交互通过手机APP实现,APP通过协调器与Zigbee网络通信,协调器通常以Zigbee-USB形式连接至上位机或网关,作为无线网络与外部设备的接口。用户可通过APP远程控制任意房间的灯光,查看当前状态,并发送开关指令,确保便捷的远程管理。

系统支持预设场景模式,如“全开”模式可一次性打开所有灯光,“全关”模式关闭所有灯光,“夜间模式”则根据光照阈值自动调整灯光状态,以优化能源使用和居住舒适度。这些模式通过协调器统一调度,终端设备协同执行,实现智能化的场景切换。

硬件模块以STM32单片机作为主控制器,处理数据逻辑和通信协议,结合Zigbee模块如CC2530实现无线组网。光敏电阻模块负责环境光传感,继电器模块驱动灯具开关,Zigbee-USB协调器确保网络与外部系统的连接,整个硬件设计注重低功耗和实时性,满足家居应用需求。

系统功能总结

功能类别 描述
网络组建 组建Zigbee无线网络,包含协调器、路由器和终端设备。
环境监测与控制 终端设备节点监测环境光照强度,并控制灯具开关。
远程控制 用户可通过手机APP(通过协调器)远程控制任意房间的灯光。
场景模式 系统支持场景模式,如“全开”、“全关”、“夜间模式”。

设计的各个功能模块描述

Zigbee通信模块负责组建无线网络,采用STM32单片机作为主控芯片,搭配Zigbee模块如CC2530实现网络功能。该模块包括协调器、路由器和终端设备,协调器负责网络初始化和数据转发,路由器扩展网络覆盖范围,终端设备连接传感器和执行器,确保网络稳定通信。

环境监测模块集成光敏电阻模块于终端设备节点,用于实时检测环境光照强度。该模块将采集的光照数据通过Zigbee网络传输至协调器或相关控制单元,为自动灯光控制提供依据。

灯光控制模块通过继电器模块实现对灯具的开关操作,继电器由STM32单片机驱动,根据接收到的控制指令或传感器数据执行相应动作,确保灯光状态可精确调整。

远程控制模块允许用户通过手机APP发送指令,指令经由互联网传输至Zigbee-USB协调器,协调器将命令解析后通过Zigbee网络转发至目标终端设备,实现任意房间灯光的远程监控和管理。

场景模式模块支持预设场景如“全开”、“全关”和“夜间模式”,用户可通过手机APP触发场景命令,系统自动协调所有终端设备执行相应操作,例如在夜间模式下根据光照强度自动调节灯光状态。

上位机代码设计

#include <QApplication>
#include <QMainWindow>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QPushButton>
#include <QLabel>
#include <QComboBox>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QMessageBox>
#include <QTimer>
#include <QGroupBox>
#include <QTextEdit>
#include <QSpinBox>
#include <QCheckBox>
#include <QProgressBar>

class ZigbeeController : public QMainWindow
{
    Q_OBJECT

public:
    ZigbeeController(QWidget *parent = nullptr) : QMainWindow(parent)
    {
        setupUI();
        setupSerialPort();
        setupConnections();
    }

    ~ZigbeeController()
    {
        if (serialPort && serialPort->isOpen()) {
            serialPort->close();
        }
    }

private slots:
    void connectToCoordinator()
    {
        if (serialPort) {
            serialPort->setPortName(portComboBox->currentText());
            serialPort->setBaudRate(QSerialPort::Baud9600);
            serialPort->setDataBits(QSerialPort::Data8);
            serialPort->setParity(QSerialPort::NoParity);
            serialPort->setStopBits(QSerialPort::OneStop);
            serialPort->setFlowControl(QSerialPort::NoFlowControl);

            if (serialPort->open(QIODevice::ReadWrite)) {
                statusLabel->setText("已连接到协调器");
                connectionStatus->setValue(100);
                refreshPorts();
            } else {
                QMessageBox::critical(this, "连接错误", "无法连接到协调器");
            }
        }
    }

    void refreshPorts()
    {
        portComboBox->clear();
        QList<QSerialPortInfo> ports = QSerialPortInfo::availablePorts();
        for (const QSerialPortInfo &port : ports) {
            portComboBox->addItem(port.portName());
        }
    }

    void readData()
    {
        if (serialPort && serialPort->isOpen()) {
            QByteArray data = serialPort->readAll();
            if (!data.isEmpty()) {
                QString message = QString::fromUtf8(data);
                logTextEdit->append("接收: " + message);
                processReceivedData(message);
            }
        }
    }

    void sendControlCommand(const QString &command)
    {
        if (serialPort && serialPort->isOpen()) {
            QByteArray data = command.toUtf8() + "\n";
            serialPort->write(data);
            logTextEdit->append("发送: " + command);
        } else {
            QMessageBox::warning(this, "警告", "未连接到协调器");
        }
    }

    void controlRoomLight()
    {
        QString room = roomComboBox->currentText();
        QString command = room + "_" + (lightOnCheckBox->isChecked() ? "ON" : "OFF");
        sendControlCommand(command);
    }

    void setBrightness()
    {
        QString room = roomComboBox->currentText();
        int brightness = brightnessSpinBox->value();
        QString command = room + "_BRIGHTNESS_" + QString::number(brightness);
        sendControlCommand(command);
    }

    void activateScene()
    {
        QString scene = sceneComboBox->currentText();
        QString command = "SCENE_" + scene;
        sendControlCommand(command);
    }

    void queryNodeStatus()
    {
        sendControlCommand("QUERY_ALL_STATUS");
    }

private:
    void setupUI()
    {
        setWindowTitle("基于Zigbee的智能家居灯光控制系统");
        setMinimumSize(800, 600);

        QWidget *centralWidget = new QWidget(this);
        setCentralWidget(centralWidget);

        QVBoxLayout *mainLayout = new QVBoxLayout(centralWidget);

        // 连接设置
        QGroupBox *connectionGroup = new QGroupBox("协调器连接设置");
        QHBoxLayout *connectionLayout = new QHBoxLayout(connectionGroup);
        
        portComboBox = new QComboBox();
        refreshButton = new QPushButton("刷新端口");
        connectButton = new QPushButton("连接协调器");
        statusLabel = new QLabel("未连接");
        connectionStatus = new QProgressBar();
        connectionStatus->setRange(0, 100);
        connectionStatus->setValue(0);

        connectionLayout->addWidget(new QLabel("串口:"));
        connectionLayout->addWidget(portComboBox);
        connectionLayout->addWidget(refreshButton);
        connectionLayout->addWidget(connectButton);
        connectionLayout->addWidget(statusLabel);
        connectionLayout->addWidget(connectionStatus);

        // 房间灯光控制
        QGroupBox *lightControlGroup = new QGroupBox("房间灯光控制");
        QGridLayout *lightLayout = new QGridLayout(lightControlGroup);
        
        roomComboBox = new QComboBox();
        roomComboBox->addItems({"客厅", "卧室", "厨房", "书房", "卫生间"});
        
        lightOnCheckBox = new QCheckBox("开灯");
        brightnessSpinBox = new QSpinBox();
        brightnessSpinBox->setRange(0, 100);
        brightnessSpinBox->setValue(50);
        
        QPushButton *applyLightBtn = new QPushButton("应用设置");
        QPushButton *queryStatusBtn = new QPushButton("查询状态");

        lightLayout->addWidget(new QLabel("房间:"), 0, 0);
        lightLayout->addWidget(roomComboBox, 0, 1);
        lightLayout->addWidget(lightOnCheckBox, 1, 0);
        lightLayout->addWidget(new QLabel("亮度:"), 1, 1);
        lightLayout->addWidget(brightnessSpinBox, 1, 2);
        lightLayout->addWidget(applyLightBtn, 2, 0);
        lightLayout->addWidget(queryStatusBtn, 2, 1);

        // 场景模式
        QGroupBox *sceneGroup = new QGroupBox("场景模式");
        QHBoxLayout *sceneLayout = new QHBoxLayout(sceneGroup);
        
        sceneComboBox = new QComboBox();
        sceneComboBox->addItems({"全开", "全关", "夜间模式", "会客模式", "影院模式"});
        
        QPushButton *activateSceneBtn = new QPushButton("激活场景");

        sceneLayout->addWidget(new QLabel("场景:"));
        sceneLayout->addWidget(sceneComboBox);
        sceneLayout->addWidget(activateSceneBtn);

        // 系统日志
        QGroupBox *logGroup = new QGroupBox("系统日志");
        QVBoxLayout *logLayout = new QVBoxLayout(logGroup);
        
        logTextEdit = new QTextEdit();
        logTextEdit->setReadOnly(true);
        
        QPushButton *clearLogBtn = new QPushButton("清空日志");

        logLayout->addWidget(logTextEdit);
        logLayout->addWidget(clearLogBtn);

        // 添加到主布局
        mainLayout->addWidget(connectionGroup);
        mainLayout->addWidget(lightControlGroup);
        mainLayout->addWidget(sceneGroup);
        mainLayout->addWidget(logGroup);

        // 连接信号槽
        connect(refreshButton, &QPushButton::clicked, this, &ZigbeeController::refreshPorts);
        connect(connectButton, &QPushButton::clicked, this, &ZigbeeController::connectToCoordinator);
        connect(applyLightBtn, &QPushButton::clicked, this, &ZigbeeController::controlRoomLight);
        connect(applyLightBtn, &QPushButton::clicked, this, &ZigbeeController::setBrightness);
        connect(queryStatusBtn, &QPushButton::clicked, this, &ZigbeeController::queryNodeStatus);
        connect(activateSceneBtn, &QPushButton::clicked, this, &ZigbeeController::activateScene);
        connect(clearLogBtn, &QPushButton::clicked, logTextEdit, &QTextEdit::clear);

        refreshPorts();
    }

    void setupSerialPort()
    {
        serialPort = new QSerialPort(this);
        connect(serialPort, &QSerialPort::readyRead, this, &ZigbeeController::readData);
    }

    void setupConnections()
    {
        // 定时查询节点状态
        QTimer *statusTimer = new QTimer(this);
        connect(statusTimer, &QTimer::timeout, this, &ZigbeeController::queryNodeStatus);
        statusTimer->start(10000); // 每10秒查询一次
    }

    void processReceivedData(const QString &data)
    {
        // 解析接收到的数据
        if (data.contains("LIGHT_INTENSITY")) {
            // 处理光照强度数据
            QStringList parts = data.split(":");
            if (parts.size() >= 2) {
                QString room = parts[0];
                QString intensity = parts[1];
                logTextEdit->append(room + " 光照强度: " + intensity);
            }
        } else if (data.contains("STATUS")) {
            // 处理设备状态
            logTextEdit->append("设备状态更新: " + data);
        }
    }

    // UI组件
    QComboBox *portComboBox;
    QComboBox *roomComboBox;
    QComboBox *sceneComboBox;
    QPushButton *refreshButton;
    QPushButton *connectButton;
    QCheckBox *lightOnCheckBox;
    QSpinBox *brightnessSpinBox;
    QLabel *statusLabel;
    QProgressBar *connectionStatus;
    QTextEdit *logTextEdit;

    // 串口通信
    QSerialPort *serialPort;
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    
    ZigbeeController controller;
    controller.show();
    
    return app.exec();
}

#include "main.moc"
# CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(ZigbeeLightControl)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt6 REQUIRED COMPONENTS Core Widgets SerialPort)

qt_standard_project_setup()

qt_add_executable(ZigbeeLightControl
    main.cpp
)

qt_add_resources(ZigbeeLightControl "resources"
    PREFIX "/"
    FILES
        icons/connect.png
        icons/disconnect.png
        icons/light_on.png
        icons/light_off.png
)

target_link_libraries(ZigbeeLightControl Qt6::Core Qt6::Widgets Qt6::SerialPort)
<!-- ZigbeeLightControl.pro -->
QT += core widgets serialport

CONFIG += c++17

SOURCES += \
    main.cpp

HEADERS +=

RESOURCES += \
    resources.qrc

这个完整的Zigbee智能家居灯光控制系统上位机代码包含以下主要功能:

  1. 协调器连接管理

    • 自动检测可用串口
    • 连接/断开Zigbee协调器
    • 连接状态显示
  2. 房间灯光控制

    • 选择不同房间
    • 控制灯光开关
    • 调节亮度等级
    • 实时状态查询
  3. 场景模式控制

    • 全开模式
    • 全关模式
    • 夜间模式
    • 会客模式
    • 影院模式
  4. 系统监控

    • 实时通信日志
    • 节点状态监控
    • 光照强度显示
  5. 通信协议

    • 基于串口的命令通信
    • 支持节点状态查询
    • 场景模式控制命令

代码采用模块化设计,易于扩展和维护,支持跨平台运行。

模块代码设计

#include "stm32f10x.h"

// 引脚定义
#define LIGHT_SENSOR_PIN GPIO_Pin_0  // PA0 - 光敏电阻
#define RELAY_PIN GPIO_Pin_13        // PC13 - 继电器控制
#define ZIGBEE_TX_PIN GPIO_Pin_9     // PA9 - Zigbee TX
#define ZIGBEE_RX_PIN GPIO_Pin_10    // PA10 - Zigbee RX

// ADC通道
#define LIGHT_SENSOR_ADC_CHANNEL ADC_Channel_0

// 系统变量
volatile uint16_t light_level = 0;
volatile uint8_t light_status = 0;
volatile uint8_t auto_mode = 1;

// 函数声明
void RCC_Configuration(void);
void GPIO_Configuration(void);
void ADC_Configuration(void);
void USART_Configuration(void);
void NVIC_Configuration(void);
uint16_t Read_ADC(uint8_t channel);
void Delay_ms(uint32_t nTime);
void Send_To_Zigbee(uint8_t* data, uint8_t len);
void Process_Zigbee_Command(uint8_t* cmd);

// 系统时钟配置
void RCC_Configuration(void)
{
    // 开启外设时钟
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPCEN | 
                    RCC_APB2ENR_AFIOEN | RCC_APB2ENR_ADC1EN | 
                    RCC_APB2ENR_USART1EN;
    
    // ADC时钟配置
    RCC->CFGR &= ~RCC_CFGR_ADCPRE;
    RCC->CFGR |= RCC_CFGR_ADCPRE_DIV6;
}

// GPIO配置
void GPIO_Configuration(void)
{
    // PA0 - 光敏电阻(模拟输入)
    GPIOA->CRL &= ~(GPIO_CRL_MODE0 | GPIO_CRL_CNF0);
    GPIOA->CRL |= GPIO_CRL_CNF0_1;  // 模拟输入模式
    
    // PC13 - 继电器控制(推挽输出)
    GPIOC->CRH &= ~(GPIO_CRH_MODE13 | GPIO_CRH_CNF13);
    GPIOC->CRH |= GPIO_CRH_MODE13_1; // 输出模式,最大速度2MHz
    
    // PA9 - USART1 TX (推挽复用输出)
    GPIOA->CRH &= ~(GPIO_CRH_MODE9 | GPIO_CRH_CNF9);
    GPIOA->CRH |= GPIO_CRH_MODE9_1 | GPIO_CRH_CNF9_1;
    
    // PA10 - USART1 RX (浮空输入)
    GPIOA->CRH &= ~(GPIO_CRH_MODE10 | GPIO_CRH_CNF10);
    GPIOA->CRH |= GPIO_CRH_CNF10_0;
}

// ADC配置
void ADC_Configuration(void)
{
    // 复位ADC1
    ADC1->CR2 = 0;
    
    // 配置ADC1
    ADC1->CR1 = 0;
    ADC1->CR2 = ADC_CR2_ADON | ADC_CR2_EXTSEL | ADC_CR2_EXTTRIG;
    
    // 采样时间配置
    ADC1->SMPR2 &= ~ADC_SMPR2_SMP0;
    ADC1->SMPR2 |= ADC_SMPR2_SMP0_2 | ADC_SMPR2_SMP0_1; // 239.5周期
    
    // 规则序列配置
    ADC1->SQR1 = 0;
    ADC1->SQR2 = 0;
    ADC1->SQR3 = LIGHT_SENSOR_ADC_CHANNEL;
    
    // 校准ADC
    ADC1->CR2 |= ADC_CR2_RSTCAL;
    while(ADC1->CR2 & ADC_CR2_RSTCAL);
    
    ADC1->CR2 |= ADC_CR2_CAL;
    while(ADC1->CR2 & ADC_CR2_CAL);
}

// USART配置
void USART_Configuration(void)
{
    // 波特率配置 115200
    USART1->BRR = 0x0271;
    
    // 使能USART, 发送, 接收, 接收中断
    USART1->CR1 = USART_CR1_UE | USART_CR1_TE | USART_CR1_RE | USART_CR1_RXNEIE;
}

// NVIC配置
void NVIC_Configuration(void)
{
    NVIC->ISER[0] |= (1 << USART1_IRQn);  // 使能USART1中断
}

// 读取ADC值
uint16_t Read_ADC(uint8_t channel)
{
    // 设置通道
    ADC1->SQR3 = channel;
    
    // 启动转换
    ADC1->CR2 |= ADC_CR2_ADON;
    Delay_ms(1);
    ADC1->CR2 |= ADC_CR2_ADON;
    
    // 等待转换完成
    while(!(ADC1->SR & ADC_SR_EOC));
    
    return ADC1->DR;
}

// 延时函数
void Delay_ms(uint32_t nTime)
{
    volatile uint32_t i, j;
    for(i = 0; i < nTime; i++)
        for(j = 0; j < 8000; j++);
}

// 继电器控制
void Control_Relay(uint8_t state)
{
    if(state)
        GPIOC->BSRR = RELAY_PIN;  // 打开继电器
    else
        GPIOC->BRR = RELAY_PIN;   // 关闭继电器
    
    light_status = state;
}

// 读取光照强度
uint16_t Read_Light_Sensor(void)
{
    uint16_t adc_value = Read_ADC(LIGHT_SENSOR_ADC_CHANNEL);
    // 转换为光照强度值 (0-1000)
    return (adc_value * 1000) / 4095;
}

// 发送数据到Zigbee
void Send_To_Zigbee(uint8_t* data, uint8_t len)
{
    for(uint8_t i = 0; i < len; i++)
    {
        while(!(USART1->SR & USART_SR_TXE));
        USART1->DR = data[i];
    }
}

// 自动光照控制
void Auto_Light_Control(void)
{
    if(auto_mode)
    {
        if(light_level < 300)  // 光照阈值
            Control_Relay(1);  // 打开灯光
        else
            Control_Relay(0);  // 关闭灯光
    }
}

// 处理Zigbee命令
void Process_Zigbee_Command(uint8_t* cmd)
{
    switch(cmd[0])
    {
        case 'O':  // ON
            auto_mode = 0;
            Control_Relay(1);
            break;
        case 'F':  // OFF
            auto_mode = 0;
            Control_Relay(0);
            break;
        case 'A':  // AUTO
            auto_mode = 1;
            break;
        case 'G':  // GET_STATUS
            {
                uint8_t status_msg[4];
                status_msg[0] = 'S';
                status_msg[1] = light_status ? '1' : '0';
                status_msg[2] = (light_level / 100) + '0';
                status_msg[3] = (light_level % 100 / 10) + '0';
                Send_To_Zigbee(status_msg, 4);
            }
            break;
    }
}

// USART1中断服务函数
void USART1_IRQHandler(void)
{
    if(USART1->SR & USART_SR_RXNE)
    {
        uint8_t received_data = USART1->DR;
        Process_Zigbee_Command(&received_data);
    }
}

// 主函数
int main(void)
{
    // 系统初始化
    RCC_Configuration();
    GPIO_Configuration();
    ADC_Configuration();
    USART_Configuration();
    NVIC_Configuration();
    
    // 初始状态
    Control_Relay(0);
    
    while(1)
    {
        // 读取光照强度
        light_level = Read_Light_Sensor();
        
        // 自动控制
        Auto_Light_Control();
        
        // 延时
        Delay_ms(1000);
    }
}

项目核心代码

#include "stm32f10x.h"

// 引脚定义
#define LIGHT_SENSOR_PIN    GPIO_Pin_0   // PA0 - 光照传感器
#define RELAY_PIN           GPIO_Pin_1   // PA1 - 继电器控制
#define ZIGBEE_TX_PIN       GPIO_Pin_9   // PA9 - Zigbee TX
#define ZIGBEE_RX_PIN       GPIO_Pin_10  // PA10 - Zigbee RX

// 光照阈值
#define LIGHT_THRESHOLD     500

// 设备状态
typedef enum {
    LIGHT_OFF = 0,
    LIGHT_ON = 1
} LightState;

// 场景模式
typedef enum {
    MODE_NORMAL = 0,
    MODE_ALL_ON = 1,
    MODE_ALL_OFF = 2,
    MODE_NIGHT = 3
} SceneMode;

// 全局变量
volatile LightState currentLightState = LIGHT_OFF;
volatile SceneMode currentSceneMode = MODE_NORMAL;
volatile uint16_t lightSensorValue = 0;

// 函数声明
void System_Init(void);
void GPIO_Init(void);
void USART_Init(void);
void ADC_Init(void);
void TIM_Init(void);
uint16_t Read_Light_Sensor(void);
void Control_Light(LightState state);
void Process_Zigbee_Command(uint8_t* command);
void Send_Zigbee_Data(uint8_t* data, uint8_t len);
void Process_Scene_Mode(SceneMode mode);

int main(void)
{
    System_Init();
    
    while(1)
    {
        // 读取光照传感器值
        lightSensorValue = Read_Light_Sensor();
        
        // 自动模式下的光照控制
        if(currentSceneMode == MODE_NORMAL)
        {
            if(lightSensorValue < LIGHT_THRESHOLD)
            {
                Control_Light(LIGHT_ON);
            }
            else
            {
                Control_Light(LIGHT_OFF);
            }
        }
        else if(currentSceneMode == MODE_NIGHT)
        {
            // 夜间模式:仅在非常暗时开启
            if(lightSensorValue < (LIGHT_THRESHOLD / 2))
            {
                Control_Light(LIGHT_ON);
            }
            else
            {
                Control_Light(LIGHT_OFF);
            }
        }
        
        // 处理Zigbee通信
        if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET)
        {
            uint8_t rxData[32];
            uint8_t index = 0;
            
            // 读取Zigbee数据
            while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET && index < 32)
            {
                rxData[index++] = USART_ReceiveData(USART1);
            }
            
            // 处理命令
            Process_Zigbee_Command(rxData);
        }
        
        // 定时上报状态
        static uint32_t lastReportTime = 0;
        if(SystemCoreClock - lastReportTime > 5000000) // 5秒上报一次
        {
            uint8_t statusData[4];
            statusData[0] = 0xAA; // 帧头
            statusData[1] = currentLightState;
            statusData[2] = lightSensorValue >> 8;
            statusData[3] = lightSensorValue & 0xFF;
            
            Send_Zigbee_Data(statusData, 4);
            lastReportTime = SystemCoreClock;
        }
    }
}

void System_Init(void)
{
    // 开启时钟
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_AFIOEN | 
                    RCC_APB2ENR_USART1EN | RCC_APB2ENR_ADC1EN;
    
    GPIO_Init();
    USART_Init();
    ADC_Init();
    TIM_Init();
    
    // 配置NVIC
    NVIC_EnableIRQ(USART1_IRQn);
}

void GPIO_Init(void)
{
    // PA0 - 光照传感器输入
    GPIOA->CRL &= ~(GPIO_CRL_MODE0 | GPIO_CRL_CNF0);
    GPIOA->CRL |= GPIO_CRL_CNF0_1; // 模拟输入
    
    // PA1 - 继电器控制输出
    GPIOA->CRL &= ~(GPIO_CRL_MODE1 | GPIO_CRL_CNF1);
    GPIOA->CRL |= GPIO_CRL_MODE1_0; // 推挽输出,2MHz
    
    // PA9 - USART1 TX 复用推挽输出
    GPIOA->CRH &= ~(GPIO_CRH_MODE9 | GPIO_CRH_CNF9);
    GPIOA->CRH |= GPIO_CRH_MODE9_0 | GPIO_CRH_CNF9_1;
    
    // PA10 - USART1 RX 浮空输入
    GPIOA->CRH &= ~(GPIO_CRH_MODE10 | GPIO_CRH_CNF10);
    GPIOA->CRH |= GPIO_CRH_CNF10_0;
}

void USART_Init(void)
{
    // 波特率115200
    USART1->BRR = 72000000 / 115200;
    
    // 使能USART, RXNE中断, 收发使能
    USART1->CR1 = USART_CR1_UE | USART_CR1_RXNEIE | 
                  USART_CR1_TE | USART_CR1_RE;
}

void ADC_Init(void)
{
    // ADC1初始化
    ADC1->CR2 = ADC_CR2_ADON; // 开启ADC
    ADC1->SQR3 = 0; // 通道0
    ADC1->SQR1 = 0; // 1个转换
}

void TIM_Init(void)
{
    // 定时器用于延时和定时任务
    RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
    TIM2->PSC = 7200 - 1; // 10kHz
    TIM2->ARR = 10000 - 1; // 1秒
    TIM2->CR1 = TIM_CR1_CEN;
}

uint16_t Read_Light_Sensor(void)
{
    ADC1->CR2 |= ADC_CR2_ADON;
    
    // 启动转换
    ADC1->CR2 |= ADC_CR2_SWSTART;
    
    // 等待转换完成
    while(!(ADC1->SR & ADC_SR_EOC));
    
    return ADC1->DR;
}

void Control_Light(LightState state)
{
    if(state == LIGHT_ON)
    {
        GPIOA->BSRR = RELAY_PIN; // 置位,开灯
        currentLightState = LIGHT_ON;
    }
    else
    {
        GPIOA->BRR = RELAY_PIN; // 复位,关灯
        currentLightState = LIGHT_OFF;
    }
}

void Process_Zigbee_Command(uint8_t* command)
{
    if(command[0] == 0x55) // 命令帧头
    {
        switch(command[1])
        {
            case 0x01: // 开关控制
                Control_Light((LightState)command[2]);
                break;
                
            case 0x02: // 场景模式
                Process_Scene_Mode((SceneMode)command[2]);
                break;
                
            case 0x03: // 状态查询
                {
                    uint8_t status[3];
                    status[0] = 0xBB;
                    status[1] = currentLightState;
                    status[2] = currentSceneMode;
                    Send_Zigbee_Data(status, 3);
                }
                break;
        }
    }
}

void Send_Zigbee_Data(uint8_t* data, uint8_t len)
{
    for(uint8_t i = 0; i < len; i++)
    {
        while(!(USART1->SR & USART_SR_TXE));
        USART1->DR = data[i];
    }
}

void Process_Scene_Mode(SceneMode mode)
{
    currentSceneMode = mode;
    
    switch(mode)
    {
        case MODE_ALL_ON:
            Control_Light(LIGHT_ON);
            break;
            
        case MODE_ALL_OFF:
            Control_Light(LIGHT_OFF);
            break;
            
        case MODE_NIGHT:
            // 夜间模式逻辑在main循环中处理
            break;
            
        case MODE_NORMAL:
            // 正常模式逻辑在main循环中处理
            break;
    }
}

// USART1中断服务函数
void USART1_IRQHandler(void)
{
    if(USART1->SR & USART_SR_RXNE)
    {
        // RXNE标志会在读取DR时自动清除
        volatile uint8_t temp = USART1->DR;
    }
}

总结

该系统基于Zigbee无线通信技术,成功构建了一个高效、灵活的智能家居灯光控制系统。通过协调器、路由器和终端设备的协同工作,系统实现了稳定的网络组建,支持环境光照强度的实时监测与灯具的智能控制,为用户提供便捷的远程操作体验。

硬件方面,系统采用STM32单片机与Zigbee模块(如CC2530)作为核心控制单元,结合光敏电阻模块进行光照感知,继电器模块执行灯光开关操作,并通过Zigbee-USB协调器连接上位机或网关,确保手机APP能够远程控制任意房间的灯光。

整体而言,该系统不仅支持多种场景模式,如“全开”、“全关”和“夜间模式”,还提升了家居自动化的智能化水平和能源效率,适用于现代家庭和商业环境,充分体现了Zigbee技术在智能家居领域的应用优势。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。