以下是使用 Arduino IDE 环境下 esp8266 使用 MQTT 协议传输 DHT11 数据的示例代码:

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>

// 替换为您的网络凭据
const char* ssid = 'your_SSID';
const char* password = 'your_PASSWORD';

// 替换为您的 MQTT 代理 IP 地址
const char* mqtt_server = 'your_MQTT_broker_IP_address';

// 替换为您的 MQTT 代理用户名和密码(如果有)
const char* mqtt_user = 'your_MQTT_broker_username';
const char* mqtt_password = 'your_MQTT_broker_password';

// 初始化 DHT 传感器
#define DHTPIN 2          // DHT 数据引脚
#define DHTTYPE DHT11     // DHT 11
DHT dht(DHTPIN, DHTTYPE);

// 初始化 WiFi 客户端和 MQTT 客户端
WiFiClient espClient;
PubSubClient client(espClient);

// 回调函数用于接收 MQTT 消息
void callback(char* topic, byte* payload, unsigned int length) {
  // 打印接收到的消息
  Serial.print('Message received: ');
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

void setup_wifi() {
  delay(10);
  // 我们首先连接到 WiFi 网络
  Serial.println();
  Serial.print('Connecting to ');
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print('.');
  }
  Serial.println('');
  Serial.println('WiFi connected');
  Serial.println('IP address: ');
  Serial.println(WiFi.localIP());
}

void reconnect() {
  // 循环直到我们重新连接
  while (!client.connected()) {
    Serial.print('Attempting MQTT connection...');
    // 尝试连接
    if (client.connect('ESP8266Client', mqtt_user, mqtt_password)) {
      Serial.println('connected');
      // 连接后,订阅主题
      client.subscribe('dht11');
    } else {
      Serial.print('failed, rc=');
      Serial.print(client.state());
      Serial.println(' try again in 5 seconds');
      // 等待 5 秒钟后重试
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(9600);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
  dht.begin();
}

void loop() {
  // 检查 MQTT 客户端是否仍然连接
  if (!client.connected()) {
    reconnect();
  }
  // 从 DHT 传感器读取温度和湿度
  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature();
  // 检查是否有任何读取失败
  if (isnan(humidity) || isnan(temperature)) {
    Serial.println('Failed to read from DHT sensor!');
    return;
  }
  // 创建并发布消息
  char message[50];
  sprintf(message, '{\'temperature\': %0.1f, \'humidity\': %0.1f}', temperature, humidity);
  client.publish('dht11', message);
  Serial.println('Message published');
  // 等待 5 秒钟后再次读取
  delay(5000);
}

在代码中,我们首先导入了所需的库文件,包括 WiFi、PubSubClient 和 DHT。然后,我们定义了 WiFi 网络和 MQTT 代理的凭据,以及 DHT 传感器的引脚和类型。接下来,我们初始化了 WiFi 客户端和 MQTT 客户端,并定义了一个回调函数来接收 MQTT 消息。

在 setup() 函数中,我们初始化了串口和 WiFi,并通过调用 client.setServer() 方法来设置 MQTT 代理的 IP 地址和端口。我们还通过调用 client.setCallback() 方法设置了 MQTT 消息的回调函数。

在循环中,我们首先检查 MQTT 客户端是否仍然连接,如果未连接,则通过调用 reconnect() 方法来尝试重新连接。然后,我们从 DHT 传感器读取温度和湿度,并检查是否有任何读取失败。最后,我们创建一个 JSON 格式的消息,其中包含温度和湿度数据,并通过调用 client.publish() 方法将其发布到 MQTT 代理。我们还通过调用 Serial.println() 方法在串口上输出消息,以便进行调试。

请注意,此示例代码仅适用于使用 DHT11 传感器的情况。如果您使用的是其他类型的传感器,请相应更改 DHTPIN 和 DHTTYPE 变量。另外,如果您使用的 MQTT 代理需要使用 TLS / SSL 进行安全连接,请将端口号更改为 8883,并调用 client.setSecure() 方法来设置 SSL 选项。

Arduino IDE ESP8266 MQTT DHT11 传感器数据传输代码

原文地址: http://www.cveoy.top/t/topic/mE0w 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录