#include <WiFi.h>
#include <PubSubClient.h>
#include <esp_system.h>
// ========================
// WiFi配置
// ========================
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ========================
// MQTT配置
// ========================
const char* mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;
const char* mqtt_topic =
"scuec/ue-demo/7f3a9c/sensor";
// ========================
// MQTT客户端
// ========================
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastSend = 0;
// ========================
// 生成一位小数随机数
// ========================
float randomFloat(float minValue, float maxValue)
{
int minInt = (int)(minValue * 10);
int maxInt = (int)(maxValue * 10);
return random(minInt, maxInt + 1) / 10.0f;
}
// ========================
// 温度三档随机
//
// SAFE:
// 20.0 ~ 30.0
//
// WARNING:
// 30.1 ~ 40.0
//
// ERROR:
// 40.1 ~ 50.0
// ========================
float generateTemperature()
{
// 0 = SAFE
// 1 = WARNING
// 2 = ERROR
int level = random(0, 3);
switch (level)
{
case 0:
return randomFloat(20.0f, 30.0f);
case 1:
return randomFloat(30.1f, 40.0f);
case 2:
return randomFloat(40.1f, 50.0f);
}
return 25.0f;
}
// ========================
// 湿度三档随机
//
// SAFE:
// 40.0 ~ 60.0
//
// WARNING:
// 30.0 ~ 39.9
// 或
// 60.1 ~ 70.0
//
// ERROR:
// 20.0 ~ 29.9
// 或
// 70.1 ~ 90.0
// ========================
float generateHumidity()
{
// 0 = SAFE
// 1 = WARNING
// 2 = ERROR
int level = random(0, 3);
switch (level)
{
case 0:
{
return randomFloat(40.0f, 60.0f);
}
case 1:
{
// 随机选择偏低或偏高
if (random(0, 2) == 0)
{
return randomFloat(30.0f, 39.9f);
}
else
{
return randomFloat(60.1f, 70.0f);
}
}
case 2:
{
// 随机选择严重偏低或严重偏高
if (random(0, 2) == 0)
{
return randomFloat(20.0f, 29.9f);
}
else
{
return randomFloat(70.1f, 90.0f);
}
}
}
return 50.0f;
}
// ========================
// 连接WiFi
// ========================
void setup_wifi()
{
Serial.print("Connecting WiFi");
WiFi.begin(
ssid,
password,
6
);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi connected");
}
// ========================
// 连接MQTT
// ========================
void reconnect()
{
while (!client.connected())
{
Serial.print("Connecting MQTT...");
// 创建随机客户端ID
// 防止多人连接公共Broker时互相顶掉
String clientId =
"ESP32-UE-Demo-";
clientId +=
String(random(0xffff), HEX);
if (client.connect(clientId.c_str()))
{
Serial.println("connected");
}
else
{
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(
", retry in 2 seconds"
);
delay(2000);
}
}
}
// ========================
// 初始化
// ========================
void setup()
{
Serial.begin(115200);
// 初始化随机种子
randomSeed(esp_random());
setup_wifi();
client.setServer(
mqtt_server,
mqtt_port
);
}
// ========================
// 主循环
// ========================
void loop()
{
// MQTT断开后自动重连
if (!client.connected())
{
reconnect();
}
client.loop();
// 每1秒发送一次数据
if (millis() - lastSend >= 1000)
{
lastSend = millis();
// 生成随机温度
float temperature =
generateTemperature();
// 生成随机湿度
float humidity =
generateHumidity();
// ========================
// 构造JSON
// ========================
String data = "{";
data += "\"temperature\":";
data += String(
temperature,
1
);
data += ",";
data += "\"humidity\":";
data += String(
humidity,
1
);
data += "}";
// ========================
// 发布MQTT消息
// ========================
bool success =
client.publish(
mqtt_topic,
data.c_str()
);
if (success)
{
Serial.print("Publish: ");
Serial.println(data);
}
else
{
Serial.println(
"Publish failed"
);
}
}
}