智能家居继电器控制与蓝牙4.0开发

一、内容

内容组成

  • 硬件平台:nrf51822蓝牙开发板或STM32F103系列
  • 软件部分:STM32源程序、蓝牙4.0开发APK、微信小程序源码
  • 功能模块:继电器控制、温度采集、蓝牙通信、手机APP控制

二、核心代码实现

1. STM32蓝牙继电器控制主程序(HAL库)

#include "main.h"
#include "relay.h"
#include "bluetooth.h"

// 继电器初始化
void Relay_Init(void)
{
    __HAL_RCC_GPIOB_CLK_ENABLE();
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStructure.Pin = GPIO_PIN_0;
    GPIO_InitStructure.Pull = GPIO_PULLUP;
    GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
}

// 蓝牙命令处理
void Bluetooth_Command_Handler(uint8_t cmd)
{
    switch(cmd)
    {
        case 'A':  // 打开继电器1
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
            printf("Relay1 ON\r\n");
            break;
            
        case 'B':  // 关闭继电器1
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
            printf("Relay1 OFF\r\n");
            break;
            
        case 'C':  // 打开继电器2
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
            printf("Relay2 ON\r\n");
            break;
            
        case 'D':  // 关闭继电器2
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
            printf("Relay2 OFF\r\n");
            break;
    }
}

// 串口接收中断回调
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART1)
    {
        uint8_t rx_data;
        HAL_UART_Receive_IT(&huart1, &rx_data, 1);
        Bluetooth_Command_Handler(rx_data);
    }
}

2. 51单片机蓝牙继电器控制

#include <reg52.h>

sbit Relay1 = P1^0;
sbit Relay2 = P1^1;

void UART_Init(void)
{
    TMOD = 0x20;     // 定时器1工作方式2
    TH1 = 0xFD;      // 9600波特率@11.0592MHz
    TL1 = 0xFD;
    TR1 = 1;
    
    SCON = 0x50;     // 串口方式1,允许接收
    ES = 1;          // 允许串口中断
    EA = 1;          // 开总中断
}

void UART_Interrupt(void) interrupt 4
{
    if(RI == 1)
    {
        RI = 0;
        
        switch(SBUF)
        {
            case '1': Relay1 = 0; break;  // 打开继电器1
            case '2': Relay1 = 1; break;  // 关闭继电器1
            case '3': Relay2 = 0; break;  // 打开继电器2
            case '4': Relay2 = 1; break;  // 关闭继电器2
        }
    }
}

3. Arduino蓝牙继电器控制

#include <SoftwareSerial.h>

SoftwareSerial bluetooth(10, 11);  // RX=10, TX=11
#define RELAY1_PIN 7
#define RELAY2_PIN 8

void setup()
{
    pinMode(RELAY1_PIN, OUTPUT);
    pinMode(RELAY2_PIN, OUTPUT);
    digitalWrite(RELAY1_PIN, HIGH);  // 初始关闭
    digitalWrite(RELAY2_PIN, HIGH);
    
    Serial.begin(9600);
    bluetooth.begin(9600);
}

void loop()
{
    if(bluetooth.available())
    {
        char command = bluetooth.read();
        
        switch(command)
        {
            case 'A':
                digitalWrite(RELAY1_PIN, LOW);
                Serial.println("Relay1 ON");
                break;
                
            case 'B':
                digitalWrite(RELAY1_PIN, HIGH);
                Serial.println("Relay1 OFF");
                break;
                
            case 'C':
                digitalWrite(RELAY2_PIN, LOW);
                Serial.println("Relay2 ON");
                break;
                
            case 'D':
                digitalWrite(RELAY2_PIN, HIGH);
                Serial.println("Relay2 OFF");
                break;
        }
    }
}

三、蓝牙4.0开发软件

1. Android APK开发资源

  1. 官方BLE Demo:谷歌官方Android蓝牙4.0 BLE示例代码,包含完整的设备扫描、连接、数据读写功能。
  2. AndroidBle SDK:开源的蓝牙4.0开发框架,简化BLE开发流程。
  3. 通信控制APP源码:支持Android 4.3以上版本,使用Eclipse开发环境。

2. 微信小程序蓝牙开发

// 小程序蓝牙连接示例
wx.openBluetoothAdapter({
  success: function(res) {
    wx.startBluetoothDevicesDiscovery({
      services: ['FFF0'],
      success: function(res) {
        wx.createBLEConnection({
          deviceId: deviceId,
          success: function(res) {
            // 连接成功,获取服务
            wx.getBLEDeviceServices({
              deviceId: deviceId,
              success: function(res) {
                // 获取特征值并订阅通知
              }
            })
          }
        })
      }
    })
  }
})

// 发送控制指令
function sendRelayCommand(relayNum, state) {
  const buffer = new ArrayBuffer(1);
  const dataView = new DataView(buffer);
  dataView.setUint8(0, state ? 0x01 : 0x00);
  
  wx.writeBLECharacteristicValue({
    deviceId: deviceId,
    serviceId: serviceId,
    characteristicId: characteristicId,
    value: buffer,
    success: function(res) {
      console.log('控制指令发送成功');
    }
  })
}

3. 通信协议设计

// 控制指令格式
#define CMD_RELAY1_ON    0xA1
#define CMD_RELAY1_OFF   0xA2
#define CMD_RELAY2_ON    0xB1
#define CMD_RELAY2_OFF   0xB2
#define CMD_QUERY_STATUS 0xC0

// 状态反馈格式
typedef struct {
    uint8_t relay1_state;  // 继电器1状态
    uint8_t relay2_state;  // 继电器2状态
    uint16_t temperature;  // 温度值
    uint16_t humidity;     // 湿度值
} Device_Status_t;

参考代码 智能家居继电器控制源程序+蓝牙4.0开发软件 www.youwenfan.com/contentcnt/135460.html

四、完整项目功能架构

1. 硬件连接配置

模块 连接引脚 功能说明
HC-05蓝牙模块 VCC→5V, GND→GND, TX→MCU RX, RX→MCU TX 经典蓝牙4.0通信
继电器模块 VCC→5V, GND→GND, IN1→GPIO1, IN2→GPIO2 控制家电开关
温湿度传感器 VCC→3.3V, GND→GND, DATA→GPIO3 DHT11传感器
STM32主控 PA9/PA10 (USART1) 串口通信

2. 软件架构设计

├── 硬件层
│   ├── 蓝牙通信模块 (HC-05/HC-06)
│   ├── 继电器驱动模块
│   ├── 传感器采集模块
│   └── 电源管理模块
├── 驱动层
│   ├── 串口驱动
│   ├── GPIO驱动
│   ├── 定时器驱动
│   └── 中断管理
├── 应用层
│   ├── 蓝牙协议解析
│   ├── 继电器控制逻辑
│   ├── 数据采集处理
│   └── 状态反馈机制
└── 用户界面层
    ├── Android APP
    ├── 微信小程序
    └── Web控制界面

五、开发环境与工具

1. 硬件平台选择

  • 入门级:STM32F103C8T6最小系统板 + HC-05蓝牙模块
  • 中级:nrf51822蓝牙开发板(集成BLE 4.0)
  • 高级:ESP32开发板(集成Wi-Fi和蓝牙)

2. 软件开发工具

  1. 嵌入式开发:Keil MDK 5.xx、STM32CubeMX、Arduino IDE
  2. Android开发:Android Studio 4.0+、官方BLE API
  3. 小程序开发:微信开发者工具、蓝牙API
  4. 调试工具:串口调试助手、蓝牙调试APP、逻辑分析仪

3. 测试设备要求

  • 手机:Android 4.3+(支持BLE 4.0)
  • 电脑:Windows/Linux/Mac + 蓝牙适配器
  • 测试仪器:万用表、示波器(可选)

六、常见问题解决方案

1. 蓝牙连接不稳定

  • 问题:连接频繁断开或数据传输错误
  • 解决方案
    1. 增加数据校验机制(CRC校验)
    2. 实现心跳包机制保持连接
    3. 优化天线布局,避免干扰

2. 继电器误触发

  • 问题:继电器在未收到指令时误动作
  • 解决方案
    1. 增加软件去抖动处理
    2. 使用光耦隔离继电器控制信号
    3. 实现双重验证机制

3. 功耗过高

  • 问题:电池供电时续航时间短
  • 解决方案
    1. 使用低功耗蓝牙(BLE)模块
    2. 实现睡眠模式,空闲时降低功耗
    3. 优化程序逻辑,减少不必要的操作
posted @ 2026-04-14 11:25  小前端攻城狮  阅读(13)  评论(0)    收藏  举报