#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <DHT.h>
const char* ssid = "wifi名称";
const char* password = "wifi密码";
const char* mqtt_server = "127.0.0.1";
const int mqtt_port = 1883;
const char* mqtt_username = "martin";
const char* mqtt_password = "martin123";
const char* mqtt_topic = "/ceshi";
#define DHTPIN 4 //设置获取数据的引脚
#define DHTTYPE DHT11 //对应DHT的版本,DHT22 DHT21
DHT dht(DHTPIN, DHTTYPE);//创建一个DHT对象
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
dht.begin();
}
void setup_wifi() {
// 连接WiFi网络
Serial.println("开始连接wifi!");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
Serial.println("开始连接wifi成功!");
}
void callback(char* topic, byte* payload, unsigned int length) {
// 处理订阅到的消息
}
void reconnect() {
// 重新连接MQTT服务器
while (!client.connected()) {
String client_id = "esp32-client-";
client_id += String(WiFi.macAddress());
Serial.printf("The client %s connects to the public MQTT broker\n", client_id.c_str());
if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
Serial.println("Public EMQX MQTT broker connected");
client.subscribe(mqtt_topic);
} else {
Serial.print("failed with state ");
Serial.print(client.state());
delay(2000);
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// 发布温湿度数据到MQTT主题
// 创建JSON对象
StaticJsonDocument<300> jsonDoc;
jsonDoc["temperature"] = t;
jsonDoc["humidity"] = h;
char jsonStr[300];
serializeJson(jsonDoc, jsonStr);
client.publish(mqtt_topic, jsonStr);
delay(2000); // 发布间隔
}