前言:本文保姆式教学如何搭建基于STM32于onenet平台的全屋智能系统设计。首先介绍一下系统的框架:主控使用的是STM43F407,引入了FreeRTOS操作系统进行任务管理,以及LVGL的图像界面设计(在LCD上进行显示并且操作),WIFI模块使用的是ESP8266用串口连接跟STM32进行通信,WIFI模块与ONENET平台用的是MQTT协议进行通信;从控设备用的是ESP32DEVKIT1控制灯,风扇、以及温湿度传感器(DHT11),ESP32模块使用的是Arduino IDE进行编程;手机端是用HBuilder X进行VUE编写成一个UNIAPP。

框架图:

手机端:

一、设置ONENET平台

1、OneNet平台的登录和注册

① 登录 OneNET物联网开放平台 官方网址

官方网址:open.iot.10086.cn 没账号就注册

② 登陆之后点击左上角进入官网主界面

③ 点击右上角官网主界面的开发者中心

④ 开发者中心界面

2、在开发者中心创建产品

PS:根据你的需求选择不同的产品智能化方式来开发产品,这决定了你的产品和OneNET平台双向通信时的交互方式。

第一步:在开发者界面点击产品开发,然点击创建产品

第二步:点击创建产品之后的第一步

选择产品品类(提供设备开发、设备调试、数据解析等功能,快速实现产品接入物联网平台,多适用于行业应用场景。)

我们以智慧生活---》智能安防--》中的温湿度传感器为主(这里其实就是选下位机的传感功能)

第三步:点2击创建产品之后的第二步:选择设备接入产品里面

设备接入:提供设备开发、设备调试、数据解析等功能,快速实现产品接入物联网平台,多适用于行业应用场景。 产品智能化:提供设备面板开发、场景联动、APP控制等功能,快速完成产品智能化改造,多适用于智慧生活场景。 深入使用mqtt,我们肯定选择设备接入

产品创建完成:

3、物理模型添加

1)、创建物模型

点击创建的产品右边的设备管理:

自定义创建温湿度设备:

创建物模型设备完成之后,在设备管理中是可以看到之前添加的物模型设备

2)、查看并且保存产品ID和设备秘钥,以及设备名称

点击设备管理中的设备详情:

设备详情界面:

二、ESP8266的使用

1)简要说明      

  这里的ESP8266WIFI模块要和STM32进行连接串口连接,然后通过串口进行通信(在MDK Kile 5中的标准库有一个接口可以直接调用进行串口通信);

        但是在这里有一个细节,ESP8266在使用MQTT的时候,大多数的ESP8266他是没有跟MQTT相关的固件的,所以得你自己去找固件烧入,而且ESP8266他下载的接线必须要拉低GPIO0才能进入下载模式(如果需要的评论加点赞,我私发给你,因为篇幅太长了);

        你在测试ESP8266与ONENET平台连接的时候,可以用串口工具直接发送,等你成功能连上再去写代码;

2)指令

下面是与ONENET连接的指令(如果有遇到问题可以后台私信我)

下面需要你的:设备名称

                          产品ID

                          以及生成的密钥(生成密钥的方法有很多可以搜索到的,如果实在解决不了可以后台私信我)

AT
AT+RST						//重置
AT+CWMODE=1				//设置 ESP8266 的 WiFi 模式为 “Station 模式”
AT+CWDHCP=1,1				//开启 Station 模式下的 DHCP 功能
AT+CWJAP="CSX","12345678"	//连接wifi
AT+MQTTUSERCFG=0,1,"DB01","NLJ6CZqXq0","你生成的密钥=lrz6aXiULllaSYDGw%3D%3D",0,0,""		//MQTT 连接配置(对接中移物联网平台)
AT+MQTTCONN=0,"mqtts.heclouds.com",1883,1								//建立与 MQTT 服务器的连接。
AT+MQTTSUB=0,"$sys/NLJ6CZqXq0/DB01/thing/property/post/reply",0			//订阅 “属性上报回复” 主题
AT+MQTTSUB=0,"$sys/NLJ6CZqXq0/DB01/thing/property/set",1					//订阅 “属性设置” 主题

AT+MQTTPUB=0,"$sys/NLJ6CZqXq0/DB01/thing/property/post","{\"id\":\"2313\"\,\"version\":\"1.0\"\,\"params\":{\"Temp\":{\"value\":22}}}",0,0															//MQTT 消息发布(上传数据)

MQTT跟ESP8266的通信连接,建议去看这个前辈的:物联网实践教程:微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制 远程上报和接收数据——AT指令连接OneNET MQTT设备(整合版)_esp prog v1.0-CSDN博客

三、ESP32DEVKIT的设置

        ESP32DEVKIT他集成了WIFI和蓝牙模块,功能还是比较强大的,而且他的成本也很低。淘宝都能搜索的到,但是他的资料却很少,部分商家连原理图什么都没有,如果你想用这款进行开放你可以私信我。

        ESP32DEVKIT要使用到Arduino IDE进行编程,他用MQTT连接ONENET其实代码会更简洁了,但是很多人的熟悉程度不够,可能会一直卡在这。

        1)ESP32DEVKIT联网

                Arduino中有专门的库函数,所以使用起来还是非常方便的:

void init_wifi(void)
{
  // 初始化WiFi为STA模式
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);
  
  Serial.println("ESP32 WiFi初始化");
  Serial.println("=================");
  
  bool connected = false;
  
  while(!connected) {
    // 扫描WiFi网络
    Serial.println("扫描WiFi网络中...");
    int n = WiFi.scanNetworks();
    
    if (n == 0) {
      Serial.println("未找到任何WiFi网络");
      delay(2000); // 等待2秒后重新扫描
      continue;
    }
    
    bool found_target = false;
    int target_rssi = 0;
    
    for (int i = 0; i < n; i++) {
      String ssid = WiFi.SSID(i);
      
      // 检查是否找到目标SSID
      if (ssid.equals(WIFI_SSID)) {
        found_target = true;
        target_rssi = WiFi.RSSI(i);
        break;
      }
    }
    
    // 如果找到目标SSID,尝试连接
    if (found_target) {
      Serial.print("找到目标网络: ");
      Serial.print(WIFI_SSID);
      Serial.print(", 信号强度: ");
      Serial.print(target_rssi);
      Serial.println(" dBm");
      
      Serial.print("尝试连接到 ");
      Serial.println(WIFI_SSID);
      
      WiFi.begin(WIFI_SSID, WIFI_PASS);
      
      int attempts = 0;
      while (WiFi.status() != WL_CONNECTED && attempts < 20) {
        delay(500);
        Serial.print(".");
        attempts++;
      }
      Serial.println();
      
      if (WiFi.status() == WL_CONNECTED) {
        Serial.println("连接成功!");
        Serial.print("IP地址: ");
        Serial.println(WiFi.localIP());
        connected = true; // 设置连接标志为true,退出循环
      } else {
        Serial.println("连接失败,5秒后重新尝试...");
        delay(5000); // 等待5秒后重新尝试
      }
    } else {
      Serial.println("未找到目标网络,5秒后重新扫描...");
      delay(5000); // 等待5秒后重新扫描
    }
    
    // 清理扫描结果
    WiFi.scanDelete();
    // 在My_wifi.cpp的init_wifi()中,WiFi连接成功后添加
    if (WiFi.status() == WL_CONNECTED) {
      Serial.println("测试互联网连接...");
      HTTPClient http;
      if (http.begin("http://www.baidu.com")) { // 用HTTP测试(避免HTTPS证书问题)
        int code = http.GET();
        if (code == HTTP_CODE_OK) {
          Serial.println("互联网连接正常");
        } else {
          Serial.printf("互联网连接失败,状态码:%d\n", code);
        }
        http.end();
      }
    }
  }
}

2)ESP32DEVKI连接ONENET

void OneNetClient::init() {
  // 初始化MQTT客户端
  client.setClient(espClient);
  client.setServer(mqtt_server, mqtt_port);
  client.setCallback([this](char* topic, byte* payload, unsigned int length) {
    this->callback(topic, payload, length);
  });
  
  // 尝试初始连接
  reconnect();
}

void OneNetClient::setFanCallback(FanSetCallback callback) {
  this->fanCallback = callback;
}

void OneNetClient::reconnect() {
  // 如果未连接,则尝试连接
  if (!client.connected()) {
    Serial.print("尝试MQTT连接...");
    
    // 尝试连接
    if (client.connect(mqtt_client_id, mqtt_username, mqtt_password)) {
      Serial.println("已连接");

      // 订阅属性设置主题
      if (client.subscribe(sub_topic)) {
        Serial.println("订阅属性设置主题成功");
      } else {
        Serial.println("订阅属性设置主题失败");
      }
    } else {
      Serial.print("失败, rc=");
      Serial.print(client.state());
      Serial.println(" 稍后将重试");
    }
  }
}

四、手机APP的创建

        这里我是用HBuilder X编了一个简单的控制平台,下面是主要的关键代码:

  <view class="page-container">
    <view class="app-header">
      <text class="app-title">智能设备控制中心</text>
    </view>
    
    <view class="content">
      <!-- 数据显示卡片 -->
      <view class="data-card">
        <view class="card-header">
          <text class="card-title">环境监测</text>
        </view>
        
        <view class="data-grid">
          <!-- 温度显示 -->
          <view class="data-item">
            <view class="data-icon temperature-icon">
              <text class="icon">🌡️</text>
            </view>
            <view class="data-info">
              <text class="data-label">温度</text>
              <text class="data-value">{{ temp || '加载中...' }} °C</text>
            </view>
          </view>
          
          <!-- 湿度显示 -->
          <view class="data-item">
            <view class="data-icon humidity-icon">
              <text class="icon">💧</text>
            </view>
            <view class="data-info">
              <text class="data-label">湿度</text>
              <text class="data-value">{{ humidity || '加载中...' }} %</text>
            </view>
          </view>
        </view>
      </view>
      
      <!-- 设备控制卡片 -->
      <view class="control-card">
        <view class="card-header">
          <text class="card-title">设备控制</text>
        </view>
        
        <!-- 灯光开关 -->
        <view class="control-item" @click="handleLedClick">
          <view class="control-icon light-icon">
            <text class="icon">💡</text>
          </view>
          <view class="control-info">
            <text class="control-name">灯光开关</text>
            <text class="control-status">{{ led ? '开启' : '关闭' }}</text>
          </view>
          <switch 
            :checked="led" 
            @change="handleLedChange" 
            class="switch-item" 
            active-color="#409eff"
          />
        </view>
        
        <!-- 风扇开关 -->
        <view class="control-item" @click="handleFanClick">
          <view class="control-icon fan-icon">
            <text class="icon">🌀</text>
          </view>
          <view class="control-info">
            <text class="control-name">风扇开关</text>
            <text class="control-status">{{ fan ? '开启' : '关闭' }}</text>
          </view>
          <switch 
            :checked="fan" 
            @change="handleFanChange" 
            class="switch-item" 
            active-color="#409eff"
          />
        </view>
      </view>
      
      <!-- 状态提示 -->
      <view class="status-message" v-if="statusMessage" :class="statusType">
        <text class="message-text">{{ statusMessage }}</text>
      </view>

然后需要下载到手机端,剩下的我会在下篇文章教剩下的步骤;

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐