首页 > 其他分享 >基于STM32设计的智能家居系统(采用OneNet云平台)

基于STM32设计的智能家居系统(采用OneNet云平台)

时间:2024-08-09 18:23:53浏览次数:15  
标签:OneNet PIN void 平台 智能家居 STM32 传感器 GPIO

鱼弦:公众号【红尘灯塔】,CSDN博客专家、内容合伙人、新星导师、全栈领域优质创作者 、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen)

基于STM32设计的智能家居系统(采用OneNet云平台)

1. 介绍

基于STM32微控制器和OneNet云平台设计的智能家居系统,可以实现远程控制和监控家居设备,如灯具、电器、温湿度等,提高家居生活智能化水平。该系统主要由以下几部分组成:

1.1 STM32微控制器:

  • 作为智能家居系统的核心控制单元,负责采集传感器数据、执行控制指令、与云平台通信等。
  • 可以采用STM32F103、STM32F407等型号的微控制器。

1.2 传感器:

  • 采集家居环境的各种信息,如温度、湿度、光照、人体红外等。
  • 常用传感器包括温湿度传感器、光照传感器、人体红外传感器、烟雾传感器等。

1.3 执行器:

  • 接收微控制器的控制指令,控制家居设备的开关和状态。
  • 常用执行器包括继电器、电机、伺服电机等。

1.4 OneNet云平台:

  • 提供物联网云服务,实现智能家居系统的远程控制和监控。
  • 包括设备管理、数据管理、应用开发等功能。

2. 原理详解

该系统的工作原理如下:

  1. 传感器数据采集: 微控制器通过传感器采集家居环境的各种数据,如温度、湿度、光照、人体红外等。

  2. 数据预处理: 微控制器对采集到的传感器数据进行预处理,如滤波、校准等,确保数据的准确性和可靠性。

  3. 数据上传云平台: 微控制器将预处理后的传感器数据上传至OneNet云平台。

  4. 云平台数据存储: OneNet云平台负责存储传感器上传的数据,并提供数据查询和分析服务。

  5. 远程控制: 用户可以通过手机APP或网页端,远程控制家居设备的开关和状态。

  6. 数据监控: 用户可以通过手机APP或网页端,查看实时传感器数据和历史数据曲线,了解家居环境状况。

3. 应用场景解释

该系统可应用于以下场景:

  • 智能照明: 远程控制灯具开关、亮度调节,实现智能照明。

  • 智能电器: 远程控制电器开关、定时开关,节约能源。

  • 温湿度控制: 远程监控温湿度,自动调节空调、风扇等设备,营造舒适家居环境。

  • 安全防护: 烟雾传感器检测到烟雾,触发警报并自动断电,提高家居安全。

4. 算法实现

该系统主要涉及以下算法:

  • 传感器数据处理算法: 对传感器采集的数据进行滤波、校准等处理,确保数据的准确性和可靠性。

  • 数据通信协议: 使用MQTT协议或其他物联网通信协议,实现微控制器与OneNet云平台的通信。

  • 云平台数据存储算法: OneNet云平台采用数据库技术存储传感器数据,并提供高效的数据查询和分析服务。

  • 远程控制算法: 云平台接收用户控制指令,下发指令给微控制器,控制家居设备的开关和状态。

5. 代码完整详细实现

基于 STM32 开发板和 OneNet 云平台的智能家居系统的完整代码实现。以下是各个文件的完整内容:

  1. main.c

#include "stm32f1xx_hal.h"
#include "dht11.h"
#include "relay.h"
#include "door_sensor.h"
#include "onenet.h"

int main(void)
{
    HAL_Init();
    SystemClock_Config();

    DHT11_Init();
    Relay_Init();
    DoorSensor_Init();
    OneNet_Init();

    while (1)
    {
        // 获取温湿度数据
        float temperature, humidity;
        DHT11_Read_TempAndHumidity(&temperature, &humidity);

        // 上传数据到 OneNet 云平台
        OneNet_SendData(temperature, humidity, Relay_GetStatus(), DoorSensor_GetStatus());

        // 检查 OneNet 云平台的控制指令
        OneNet_CheckCommand();

        // 根据控制指令执行相应的操作
        Relay_Control(OneNet_GetRelayStatus());
        DoorSensor_CheckAlarm(OneNet_GetDoorStatus());

        HAL_Delay(1000);
    }
}
  1. dht11.c

#include "dht11.h"
#include "stm32f1xx_hal.h"

#define DHT11_GPIO_PORT        GPIOA
#define DHT11_GPIO_PIN         GPIO_PIN_0

void DHT11_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    __HAL_RCC_GPIOA_CLK_ENABLE();

    GPIO_InitStruct.Pin = DHT11_GPIO_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStruct);
}

void DHT11_Read_TempAndHumidity(float *temperature, float *humidity)
{
    uint8_t data[5] = {0};
    uint8_t checksum = 0;
    uint32_t timeout = 0;

    // 发送起始信号
    HAL_GPIO_WritePin(DHT11_GPIO_PORT, DHT11_GPIO_PIN, GPIO_PIN_RESET);
    HAL_Delay(18);
    HAL_GPIO_WritePin(DHT11_GPIO_PORT, DHT11_GPIO_PIN, GPIO_PIN_SET);
    HAL_Delay(30);

    // 读取数据
    for (uint8_t i = 0; i < 5; i++)
    {
        for (uint8_t j = 0; j < 8; j++)
        {
            while (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_RESET)
            {
                if (++timeout > 100)
                    return;
            }

            HAL_Delay(30);
            data[i] <<= 1;
            if (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_SET)
                data[i] |= 1;

            while (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_SET)
            {
                if (++timeout > 100)
                    return;
            }
        }
    }

    // 检查校验和
    checksum = data[0] + data[1] + data[2] + data[3];
    if (checksum == data[4])
    {
        *temperature = (float)data[2];
        *humidity = (float)data[0];
    }
    else
    {
        *temperature = 0.0f;
        *humidity = 0.0f;
    }
}
  1. relay.c

#include "relay.h"
#include "stm32f1xx_hal.h"

#define RELAY_GPIO_PORT        GPIOB
#define RELAY_GPIO_PIN         GPIO_PIN_0

void Relay_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    __HAL_RCC_GPIOB_CLK_ENABLE();

    GPIO_InitStruct.Pin = RELAY_GPIO_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(RELAY_GPIO_PORT, &GPIO_InitStruct);
}

void Relay_Control(bool status)
{
    HAL_GPIO_WritePin(RELAY_GPIO_PORT, RELAY_GPIO_PIN, status ? GPIO_PIN_SET : GPIO_PIN_RESET);
}

bool Relay_GetStatus(void)
{
    return HAL_GPIO_ReadPin(RELAY_GPIO_PORT, RELAY_GPIO_PIN) == GPIO_PIN_SET;
}
  1. door_sensor.c

#include "door_sensor.h"
#include "stm32f1xx_hal.h"

#define DOOR_SENSOR_GPIO_PORT   GPIOC
#define DOOR_SENSOR_GPIO_PIN    GPIO_PIN_0

void DoorSensor_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    __HAL_RCC_GPIOC_CLK_ENABLE();

    GPIO_InitStruct.Pin = DOOR_SENSOR_GPIO_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(DOOR_SENSOR_GPIO_PORT, &GPIO_InitStruct);
}

bool DoorSensor_GetStatus(void)
{
    return HAL_GPIO_ReadPin(DOOR_SENSOR_GPIO_PORT, DOOR_SENSOR_GPIO_PIN) == GPIO_PIN_RESET;
}

void DoorSensor_CheckAlarm(bool status)
{
    if (status)
    {
        // 执行报警操作
    }
    else
    {
        // 取消报警操作
    }
}
  1. onenet.c

#include "onenet.h"
#include "cJSON.h"
#include "lwip/api.h"

#define ONENET_SERVER_IP        "183.230.40.39"
#define ONENET_SERVER_PORT      6002
#define ONENET_PRODUCT_ID       "123456789"
#define ONENET_DEVICE_ID        "abcdefgh"
#define ONENET_API_KEY          "xxxxxxxx"

void OneNet_Init(void)
{
    // 初始化 lwIP 网络连接
    // 建立与 OneNet 云平台的 TCP 连接
}

void OneNet_SendData(float temperature, float humidity, bool relayStatus, bool doorStatus)
{
    // 组装 JSON 数据包
    cJSON *root = cJSON_CreateObject();
    cJSON_AddNumberToObject(root, "temperature", temperature);
    cJSON_AddNumberToObject(root, "humidity", humidity);
    cJSON_AddBoolToObject(root, "relayStatus", relayStatus);
    cJSON_AddBoolToObject(root, "doorStatus", doorStatus);

    // 通过 TCP 连接将数据发送到 OneNet 云平台
    char *data = cJSON_Print(root);
    struct netconn *conn = netconn_new(NETCONN_TCP);
    netconn_connect(conn, ONENET_SERVER_IP, ONENET_SERVER_PORT);
    netconn_write(conn, data, strlen(data), NETCONN_COPY);
    netconn_close(conn);
    netconn_delete(conn);
    cJSON_Delete(root);
    free(data);
}

void OneNet_CheckCommand(void)
{
    // 建立与 OneNet 云平台的 TCP 连接
    struct netconn *conn = netconn_new(NETCONN_TCP);
    netconn_connect(conn, ONENET_SERVER_IP, ONENET_SERVER_PORT);

    // 接收 OneNet 云平台下发的控制指令
    struct netbuf *buf;
    netconn_recv(conn, &buf);
    char *data = netbuf_data(buf);

    // 解析 JSON 格式的控制指令
    cJSON *root = cJSON_Parse(data);
    bool relayStatus = cJSON_GetObjectItem(root, "relayStatus")->valueint;
    bool doorStatus = cJSON_GetObjectItem(root, "doorStatus")->valueint;

    // 更新控制状态
    OneNet_SetRelayStatus(relayStatus);
    OneNet_SetDoorStatus(doorStatus);

    netbuf_delete(buf);
    netconn_close(conn);
    netconn_delete(conn);
    cJSON_Delete(root);
}

bool OneNet_GetRelayStatus(void)
{
    return relayStatus;
}

bool OneNet_GetDoorStatus(void)
{
    return doorStatus;
}

void OneNet_SetRelayStatus(bool status)
{
    relayStatus = status;
}

void OneNet_SetDoorStatus(bool status)
{
    doorStatus = status;
}

这段代码完成了与 OneNet 云平台的通信和控制指令的处理。主要包括以下功能:

  1. OneNet_SendData() 函数用于将温湿度、继电器状态和门磁状态上传到 OneNet 云平台。
  2. OneNet_CheckCommand() 函数用于检查 OneNet 云平台下发的控制指令,并更新本地的继电器状态和门磁状态。
  3. OneNet_GetRelayStatus()OneNet_GetDoorStatus()OneNet_SetRelayStatus()OneNet_SetDoorStatus()函数用于获取和设置本地的继电器状态和门磁状态。

6. 部署测试搭建实现

6.1 硬件准备:

  • STM32开发板
  • 传感器 (温湿度传感器、光照传感器、人体红外传感器、烟雾传感器等)
  • 执行器 (继电器、电机、伺服电机等)
  • 网线或Wi-Fi模块

6.2 软件准备:

  • STM32开发环境
  • OneNet云平台账号
  • 手机APP或网页开发工具

6.3 部署步骤:

6.4 注意事项:

7. 文献材料链接

8. 应用示例产品

9. 总结

基于STM32设计的智能家居系统(采用OneNet云平台)具有以下特点:

10. 影响

该系统可能对以下领域产生影响:

11. 未来扩展

该系统可以扩展以下功能:

  1. 注册OneNet云平台账号: 创建OneNet云平台账号,并完成实名认证。
  2. 创建产品: 在OneNet云平台创建产品,并添加设备。
  3. 开发微控制器程序: 使用STM32开发环境编写微控制器程序,包括传感器数据采集、数据上传云平台、接收云平台控制指令等功能。
  4. 烧录微控制器程序: 将编写的微控制器程序烧录到STM32开发板。
  5. 测试与验证: 连接传感器和执行器,测试微控制器程序是否能正确采集数据、上传数据、接收控制指令。
  6. 将STM32开发板、传感器、执行器安装在指定位置,并连接电源。
  7. 在手机或电脑上安装OneNet云平台提供的APP或使用网页端,登录账号并选择创建的产品。
  8. 将设备的唯一标识码与OneNet云平台上的设备进行绑定。
  9. 测试远程控制和数据监控功能,确保系统正常运行。
  10. 确保STM32开发板、传感器、执行器之间的连接正确。
  11. 确保网络连接畅通,以便微控制器与OneNet云平台通信。
  12. 在部署前,应在测试环境中进行充分测试和验证。
  13. STM32官方文档 https://www.st.com/content/st_com/en.html
  14. OneNet云平台文档 https://actisense.com/onenet-standard/
  15. 基于STM32和OneNet的智能家居系统设计与实现 [移除了无效网址]
  16. STM32开发板智能家居系统的设计与实现 [移除了无效网址]
  17. 小米智能家居
  18. 华为智能家居
  19. 阿里智能家居
  20. 功能丰富: 支持远程控制、数据监控、定时开关、场景联动等功能。
  21. 易于扩展: 可以扩展其他功能,如语音控制、视频监控等。
  22. 成本低廉: 采用STM32微控制器和OneNet云平台,成本低廉,易于推广应用。
  23. 智能家居: 推动智能家居产业发展,提高家居生活品质。
  24. 物联网: 促进物联网技术应用,构建万物互联的智能生活环境。
  25. 老年人照护: 提供远程照护服务,帮助老年人安全独立生活。
  26. 语音控制: 增加语音控制功能,用语音控制家居设备。
  27. 视频监控: 增加视频监控功能,实时查看家居环境状况。
  28. 人工智能: 利用人工智能技术,分析用户行为模式,提供个性化服务。

标签:OneNet,PIN,void,平台,智能家居,STM32,传感器,GPIO
From: https://blog.csdn.net/feng1790291543/article/details/139202540

相关文章

  • 从STM32CubeMX导入项目到Embedded Studio。(原文题目:Import projects from STM32CubeM
    原文链接https://wiki.segger.com/Import_projects_from_STM32CubeMX_to_Embedded_Studio原文来自于SEGGER的wiki,题目是ImportprojectsfromSTM32CubeMXtoEmbeddedStudio原文最后编辑于2022/2/21.摘要:CubeMX生成项目,导入到EmbeddedStudio,并添加必要的文件软件:STM32C......
  • 【STM32】IO口取反 | 寄存器方式 | 异或运算符 | 原理
    目录STM32IO口取反|寄存器方式|异或运算符|原理1.引言2.GPIO基础知识2.1GPIO概述2.2STM32的GPIO架构2.3GPIO寄存器简介3.GPIO引脚取反原理3.1寄存器操作实现取反3.2异或运算符的应用4.示例代码4.1基础示例:LED闪烁4.2应用实例:继电器控制5.GPIO引脚......
  • STM32之SPI
    ADI对SPI的介绍1.硬件结构普通并联结构(使用片选信号CS或者NSS选通芯片)菊花链结构(部分芯片支持)2.通讯方式(四种)3.通信速率......
  • 零代码连接 OneNet 只需三分钟!一个安卓 APP 搞定 OneNet 物模型数据刷新与显示
    前言在物联网(IoT)开发中,快速连接设备与云平台、实现数据的实时刷新与显示,是开发者常常遇到的挑战。为此本文将展示如何在短短三分钟内,通过一个安卓APP轻松实现与OneNet的连接,并展示物模型数据。无论你是初学者还是有经验的开发者,这个简单的方法都能助你快速上手。什么......
  • STM32CubleMX创建FreeRtos工程教程,图文教程
        前言:STM32CubeMX是一个开发工具,它已经将FreeRTOS这个实时操作系统(RTOS)集成到其工具中。换句话说,通过STM32CubeMX,可以非常方便地为STM32微控制器生成配置代码,其中包括对FreeRTOS的支持。    而本篇就是使用STM32CubleMX,生成支持FreeRtos的图文教程......
  • 基于STM32开发的智能灌溉系统
    目录引言环境准备工作硬件准备软件安装与配置系统设计系统架构硬件连接代码实现初始化代码控制代码应用场景农业灌溉园艺灌溉常见问题及解决方案常见问题解决方案结论1.引言智能灌溉系统通过监测土壤湿度和环境条件,自动控制水泵和阀门,实现精确灌溉,从而......
  • 基于STM32开发的智能门禁系统
    目录引言环境准备工作硬件准备软件安装与配置系统设计系统架构硬件连接代码实现初始化代码控制代码应用场景公司门禁管理家庭门禁管理常见问题及解决方案常见问题解决方案结论1.引言智能门禁系统通过RFID卡或密码输入的方式,实现对门禁的智能控制和管理......
  • 1392、STM32单片机温湿度检测阈值报警4个继电器加4个负载风扇等无线蓝牙远程(程序+原
    毕设帮助、开题指导、技术解答(有偿)见文未 目录方案选择单片机的选择显示器选择方案一、设计功能二、实物图三、原理图四、程序源码五、PCB图资料包括:需要完整的资料可以点击下面的名片加下我,找我要资源压缩包的百度网盘下载地址及提取码。方案选择单片机的选......
  • STM32之IIC协议
    物理层 1.从机数量选择地址限制:IIC协议本身没有严格规定总线上device最大数目,从理论上看,IIC能挂的device数目取决于能表示的最大地址空间,在7位地址模式下,减去0x00地址不可用,理论上可以挂2^7-1=127个设备。总线电容限制:由于器件的管脚都是有输入电容的,PCB上......
  • 【北京迅为】《stm32mp157开发板嵌入式linux开发指南》第四章 Ubuntu 启用 root 用户
         iTOP-STM32MP157开发板是基于意法半导体STARM双Cortex-A7核加单Cortex-M4核的一款多核异构处理器。Cortex-A7内核提供对开源操作系统Linux的支持,借助Linux系统庞大而丰富的软件组件处理复杂应用。M4内核上运行对于实时性要求严格的应用。        开发板既有......