1. 选择开发板以及开发环境
1.ESP32-C3-DevKitC-02作为主控(以下称为ESP32模块)
2.小米IoT的MHCWB6G-B模块(以下称为小米IOT模块)
3.小熊派的E53_IA1扩展板(以下称为扩展板)
4.基于VSCode的platformio开发
5.开启小米IoT开发者平台的开发者权限以及米家app
6.小米IoT平台链接:小米IoT开发者平台https://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添加设备,通过蓝牙配网即可查看温湿度
标签:platformIO,String,arduino,温湿度,IoT,IA1,include,data,E53 From: https://blog.csdn.net/sztublzs/article/details/139537013