Arduino - ESP32使用温湿度传感器发布到MQTT

#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);  // 发布间隔
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个基于ESP32湿度采集系统,我会为您提供一些指导和建议。 1. 硬件准备 您需要准备以下硬件: - ESP32开发板 - DHT11湿度传感器 - 面包板 - 杜邦线 2. 硬件连接 将DHT11传感器的VCC引脚接到ESP32的3.3V引脚,将DHT11传感器的GND引脚接到ESP32的GND引脚,将DHT11传感器的DATA引脚接到ESP32的GPIO引脚。 3. 软件准备 您需要安装Arduino IDE,并在Arduino IDE中安装ESP32开发板库和PubSubClient库。 4. 编写代码 请参考以下代码: ``` #include <WiFi.h> #include <PubSubClient.h> #include <Adafruit_Sensor.h> #include <DHT.h> #define WIFI_SSID "your_wifi_ssid" #define WIFI_PASSWORD "your_wifi_password" #define MQTT_SERVER "your_mqtt_server" #define MQTT_PORT 1883 #define MQTT_USERNAME "your_mqtt_username" #define MQTT_PASSWORD "your_mqtt_password" #define MQTT_TOPIC "your_mqtt_topic" #define DHTPIN 18 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); WiFiClient wifiClient; PubSubClient mqttClient(wifiClient); void setup() { Serial.begin(115200); delay(1000); dht.begin(); connectWiFi(); connectMQTT(); } void loop() { float temperature = dht.readTemperature(); float humidity = dht.readHumidity(); if (isnan(temperature) || isnan(humidity)) { Serial.println("Failed to read data from DHT sensor"); return; } Serial.print("Temperature: "); Serial.print(temperature); Serial.println(" °C"); Serial.print("Humidity: "); Serial.print(humidity); Serial.println(" %"); char payload[50]; sprintf(payload, "{\"temperature\":%.2f,\"humidity\":%.2f}", temperature, humidity); mqttClient.publish(MQTT_TOPIC, payload); delay(5000); } void connectWiFi() { Serial.print("Connecting to WiFi..."); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } Serial.println("Connected to WiFi"); } void connectMQTT() { mqttClient.setServer(MQTT_SERVER, MQTT_PORT); while (!mqttClient.connected()) { Serial.print("Connecting to MQTT server..."); if (mqttClient.connect("ESP32Client", MQTT_USERNAME, MQTT_PASSWORD)) { Serial.println("Connected to MQTT server"); } else { Serial.print("Failed to connect to MQTT server, rc="); Serial.print(mqttClient.state()); Serial.println(" retrying in 5 seconds"); delay(5000); } } } ``` 5. 上传代码 将代码上传到ESP32开发板。 6. 测试 打开串口监视器,将波特率设置为115200,可以看到ESP32连接WiFi和MQTT服务器,并且定期上传湿度数据。 以上是基于ESP32湿度采集系统的设计和制作过程。如果您有任何疑问,请随时向我提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值