2024-04-10-ESP32通过MQTT协议上传数据至云平台并控制多设备
ESP32通过MQTT协议上传数据至云平台并控制多设备
一、云平台部署
1.1物模型设置:
物模型选择时要注意标识符与代码中的标识符保持一致,数据类型也要保持一致,不同的数据类型的可选步长根据传感器而定,比如DHT11温湿度传感器,其温度可精确到小数点后两位,而湿度只能是整数,那么上传时,其步长要设置为1。
光照强度物模型设置参考:
温度物模型设置参考:
当我们需要控制外设时,可以选择使用布尔类型去控制,通过上传的true或false查看设备的工作状态,同样的,我们也可以通过云平台上下发true或false去控制设备的工作状态。
外设物模型设置参考
完成部署之后,通过增加云平台的物模型数量,可以达到查看多个传感器和多个设备的效果。
1.2对上传的数据进行处理:
目前常用的传感器有DHT11温湿度,追求更高的温度精度还可以选择DS18B20温度传感器。还有光敏传感器,烟雾传感器等等。都是常用的传感器。
温湿度传感器并没有什么好说的,CSDN上已经有许多相关的代码,这里我也贴上两个代码
DHT11温湿度传感器:
#include <DHT.h>
DHT dht(DHTPIN, DHTTYPE); // 创建DHT对象
void setup()
{
Serial.begin(115200); // 初始化串口通信
dht.begin(); // 初始化DHT传感器
}
void loop()
{
// 读取温湿度传感器的数据
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// 检查读取是否成功
if (isnan(humidity) || isnan(temperature))
{
Serial.println("无法从DHT传感器读取数据");
return;
}
// 打印温湿度数据
Serial.print("湿度: ");
Serial.print(humidity);
Serial.print("%\t");
Serial.print("温度: ");
Serial.print(temperature);
Serial.println("°C");
delay(500); // 延迟2秒后再次读取数据
}
DS18B20温度传感器:(如果无法读取数据,在数据读取线和VCC之间搭一个电阻)
#include <OneWire.h>
#include <DallasTemperature.h>
//数据线与VCC之间接上拉电阻;
// 数据输出脚接开发板数字引脚2
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
void setup(void)
{
Serial.begin(9600);
sensors.begin();
}
void loop(void)
{
sensors.requestTemperatures(); // 发送命令获取温度
Serial.print("Temperature for the device 1 (index 0) is: ");
Serial.println(sensors.getTempCByIndex(0));
delay(500);
}
光敏传感器则需要进行处理,ESP32的ADC引脚会读取光敏传感器的电压值,当光照强度越大,光敏电阻的阻值越大,读取的电压值越小,光照强度越小,读取的电压值越大,其取值范围是0-4095之间,所有为了取得0-100的光照值,需要对读取的电压值进行处理。
定义三个变量,即可实现将0-4095重映射为0-100;
data=analogRead(beam);
light=4096-data;
adcx=map(light,0,4096,0,100);
二、对上传的量进行修改:
esp32我是使用Arduino IDE 进行开发的,在上传数据量较小,控制设备较少的情况下比较好用,在修改登录设备时,需要更改WIFI名称和密码,产品名称,产品ID和鉴权信息,同时使用时需要核对上传的标识符是否和云平台的保持一致。关于这些方面的修改CSDN上也有足够的资料,这里就不在赘述。
我上传的量有温度,水浊度,光照强度,5个设备的工作状态,设备的工作状态使用布尔类型来表示,true 表示开启,false表示关闭。上传设备的标识符与云平台需要保持一致。设备的数量和传感器数量可以按照自己的需求进行增删,当传感器数量和设备数量过多时,传感器数据和设备数据需要分段发送,一次发生的设备和传感器数据大约是5个。
三、APP上的修改:
app方面使用的是uniapp,需要修改的是 用户名,产品ID,产品名称,用户秘钥 ,接收的数据,还有开关组件,根据接收的数据和开关组件数量进行修改:
uniapp上获取数据的部分代码:
success: (res) => {
console.log(res.data);
console.log(res.data.data[0].value);
this.temp = res.data.data[6].value;
this.turbidity = res.data.data[7].value;
this.adcx = res.data.data[0].value;
this.aerator = res.data.data[1].value == 'true' ? true : false;
this.feed = res.data.data[2].value == 'true' ? true : false;
this.hearter = res.data.data[3].value == 'true' ? true : false;
this.led = res.data.data[4].value == 'true' ? true : false;
this.pump = res.data.data[5].value == 'true' ? true : false;
[0]中的数字对应的是云平台上的数据,代表云平台从左往右第一个,[1]表示表示第二个
最终的显示效果如下:
68747470733a2f2f626c6f:672e6373646e2e6e65742f323330325f37373931353537362f:61727469636c652f64657461696c732f313337353931343030