基于ESP32+arduino+platformIO驱动小米模组接入米家app(以温湿度传感器为例)

1. 选择开发板以及开发环境

1.ESP32-C3-DevKitC-02作为主控(以下称为ESP32模块)

相关文档:ESP32-C3-DevKitC-02 - ESP32-C3 - — ESP-IDF 编程指南 latest 文档icon-default.png?t=N7T8https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32c3/hw-reference/esp32c3/user-guide-devkitc-02.html

2.小米IoT的MHCWB6G-B模块(以下称为小米IOT模块)

3.小熊派的E53_IA1扩展板(以下称为扩展板)

相关文档:E53原理图icon-default.png?t=N7T8https://gitee.com/bearpi/bearpi-iot_std/raw/master/docs/hardware/E53%E6%89%A9%E5%B1%95%E6%9D%BF%E8%B5%84%E6%96%99/E53_IA1_%E6%99%BA%E6%85%A7%E5%86%9C%E4%B8%9A/%E5%8E%9F%E7%90%86%E5%9B%BE/E53_IA1.pdf

4.基于VSCode的platformio开发

5.开启小米IoT开发者平台的开发者权限以及米家app

6.小米IoT平台链接:小米IoT开发者平台icon-default.png?t=N7T8https://iot.mi.com/

2.在小米IoT平台中创建对应产品

点击确定

2.配置产品信息

小米IoT平台为我们创建了一个用于温湿度采集的扩展程序,无需编写

点击固件开发,编辑固件设置

选择对应型号

点开产品基本信息,查看对应model以及pid

3.编写代码

库的选择和下载

在ini文件中添加配置信息如下

upload_speed = 921600
lib_deps=
    robtillaart/SHT31 @ ^0.4.0
    claws/BH1750 @ ^1.3.0

建立IOT.cpp文件,代码如下

#include<IOT.h>
#include <HardwareSerial.h>
#include <string.h>
extern HardwareSerial SerialIot;
String rpy = "" ;


String model="model *******";//产品model,替换掉*******
String pid="ble_config set ***** 0001";//产品pid替换掉*****
String mcu_version="mcu_version 0001";

/*函数名称: Mi_Attach
 *说明: 小米模块入网
 *参数: 无
 *返回值:无
 */
void Mi_Attach(void){
  SerialIot.println("get_down");
  delay(20);
  SendCmdTomi_IoT("set_log_level 0","ok");
  delay(20);
  SendCmdTomi_IoT(model,"ok");
  delay(20);
  SendCmdTomi_IoT(pid,"ok");
  delay(20);
  SendCmdTomi_IoT(mcu_version,"ok");
  delay(20);
}


/*函数名称: Mi_iic_Pub
 *说明: 上报温湿度数据
 *参数: 
 *返回值:无
 */
void Mi_iic_Pub(Data data)
{
  String temp = String(data.temp,2);
  String hum = String(data.hum, 2);
  hum = "properties_changed 2 2 "+ hum;
  temp = "properties_changed 2 1 "+ temp;
  SendCmdTomi_IoT(hum,"ok");
  SendCmdTomi_IoT(temp,"ok");
}




/*函数名称: SendCmdToNB_IoT
 *说明: esp32向wifi模组发送指令
 *参数: data: 要发送的指令  res:期望mi-IoT模组返回的消息
 *返回值:无
 */
void SendCmdTomi_IoT(String data, const char *res)
{
  Serial.print("esp: ");
  Serial.println(data);
  SerialIot.println(data); // 向SerialIoT串口发送数据
  int i = 0;
  rpy = "";
  while (SerialIot.available())
  {
    rpy = SerialIot.readString(); // 读取SerialIot串口缓存数组内的数据保存到rpy中

    if (rpy.indexOf(res) >= 0) // 在rpy中查找是否存在与res相同的内容,若找到,则返回字符串所在的位置
    {
      Serial.print("IoT: ");
      Serial.println(rpy); // 打印获取到的回复信息
      break;
    }
    else
    {
      Serial.print("error : ");
      Serial.println(rpy);
      delay(200);
      SerialIot.println(data);

    }
    delay(10);
    i++;
    if (i > 5)
      break;
  }
}

IOT.h文件,如下

#ifndef IOT_H
#define IOT_H

#include <Arduino.h>
#include<E53_IA1.h>


//定义esp32与小米模组相连的引脚
#define PIN_RX 8
#define PIN_TX 9

void SendCmdTomi_IoT(String data, const char *res);

#endif

E53_IA1.cpp文件如下

#include "E53_IA1.h"

/*函数名称: ReadData
*说明: 读取E53_IA1的温度、湿度和光照数据
*参数: 无
*返回值:包含三个数据的结构体Data
*/
Data ReadData(){
    //获取光照强度
    float lux = lightMeter.readLightLevel();
    //获取温湿度
    sht30.read();     
    float temperature = sht30.getTemperature();
    float humidity = sht30.getHumidity();
    Data data;
    data.hum = humidity;
    data.temp = temperature;
    data.light = lux;
    return data;
}

E53_IA1.h如下

#ifndef E53_IA1_H
#define E53_IA1_H

#include <BH1750.h>
#include <Wire.h>
#include "SHT31.h"

//自定义IIC的引脚
#define I2C_SDA_PIN 2
#define I2C_SCL_PIN 3



// 定义 E53_IA1 模块的 I2C 地址
#define SHT31_ADDRESS   0x44
SHT31 sht30;
BH1750 lightMeter(0x23);

uint32_t start;
uint32_t stop;

//E53_IA1的属性名称
const char* device1 = "light";
const char* device2 = "temp";
const char* device3 = "hum";

//E53_IA1的温湿度和光照数据,结构体类型
struct Data{
    float temp;
    float hum;
    float light;
};

Data ReadData();
 
#endif

main.cpp如下 

#include <Arduino.h>
#include<IOT.cpp>
#include<E53_IA1.cpp>
HardwareSerial SerialIot(1);

void setup() {
  Serial.begin(115200);//初始化用于查看调试信息的串口
  SerialIot.begin(115200, SERIAL_8N1, PIN_RX,PIN_TX);//初始化与小米iot模块连接的串口
  Mi_Attach();
  // 开启与智慧农业板块相连的I2C引脚
  Wire.begin(I2C_SDA_PIN, I2C_SCL_PIN);
  sht30.begin(I2C_SDA_PIN, I2C_SCL_PIN);
  if (lightMeter.begin(BH1750::CONTINUOUS_HIGH_RES_MODE))
  {
    Serial.println(F("BH1750 Advanced begin"));
  }
  else
  {
    Serial.println(F("Error initialising BH1750"));
  }
  uint16_t stat = sht30.readStatus();

}

void loop() {
  Data data = ReadData();
  Mi_iic_Pub(data);
  delay(5000);
}

以下为扩展板的原理图

演示

在米家app添加设备,通过蓝牙配网即可查看温湿度

  • 24
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值