knolleary / pubsubclient

A client library for the Arduino Ethernet Shield that provides support for MQTT.
http://pubsubclient.knolleary.net/
MIT License
3.78k stars 1.46k forks source link

Failed to Connect to MQTT broker using ESP8266 #1013

Open ahmadaufash opened 1 year ago

ahmadaufash commented 1 year ago

Please help me, i should finish this project as soon I want to make project monitoring using ESP8266, MQTT, and Node-RED dashboard but I have an issue that my serial monitors showing cannot connected to MQTT "Failed to connect to MQTT broker, rc=-2" I try to test my mqtt in CMD using Sub and Pub, i send some text and it works well. but in my project it's failed. here is my code:

#include <Wire.h>
#include <Adafruit_MLX90614.h>
#include <Wire.h>
#include "MAX30100_PulseOximeter.h"
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

// Replace with your Wi-Fi credentials
const char* ssid = "mywifi";
const char* password = "password";

// Replace with your MQTT broker IP address
const char* mqttServer = "127.0.0.1";
const int mqttPort = 1883;

// Replace with your MQTT topics
const char* mqttTopicTemp = "sensors/temperature";
const char* mqttTopicOxygen = "sensors/oxygen";

WiFiClient espClient;
PubSubClient client(espClient);

Adafruit_MLX90614 mlx = Adafruit_MLX90614();
PulseOximeter pox;

void onHeartRateBeatDetected()
{
  float hr = pox.getHeartRate();
  Serial.print("Heart rate:");
  Serial.println(hr);
}

void setup() {
  Serial.begin(115200);

  // Connect to Wi-Fi
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }

  Serial.println("Connected to WiFi");

  // Connect to MQTT broker
  client.setServer(mqttServer, mqttPort);

  while (!client.connected()) {
    if (client.connect("ESP8266Client")) {
      Serial.println("Connected to MQTT broker");
    }
    else {
      Serial.print("Failed to connect to MQTT broker, rc=");
      Serial.println(client.state());
      delay(2000);
    }
  }

  // Initialize sensors
  mlx.begin();
  pox.begin();

  // Set up a callback for pulse detection
  pox.setOnBeatDetectedCallback(onHeartRateBeatDetected);
}

void loop() {
  // Read temperature from MLX90614 sensor
  float temperature = mlx.readObjectTempC();

  // Convert temperature to string
  String tempPayload = String(temperature);

  // Publish temperature to MQTT topic
  client.publish(mqttTopicTemp, tempPayload.c_str());

  // Update pulse oximeter
  pox.update();

  // Read oxygen level from MAX30100 sensor
  if (pox.begin()) {
    float oxygen = pox.getSpO2();

    // Convert oxygen level to string
    String oxygenPayload = String(oxygen);

    // Publish oxygen level to MQTT topic
    client.publish(mqttTopicOxygen, oxygenPayload.c_str());
  }

  delay(1000);  // Adjust the delay based on your needs
}
superbool commented 11 months ago

Make sure your local PC "127.0.0.1" and the "mywifi" in the same wifi. You can print you ESP8266's ip address and the PC ip address to check.