-
-
Save sarasantos/fa4cdd5012c296fbf41141a2f45c5765 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Rui Santos | |
Complete project details at https://RandomNerdTutorials.com/esp8266-nodemcu-mqtt-publish-bme280-arduino/ | |
Permission is hereby granted, free of charge, to any person obtaining a copy | |
of this software and associated documentation files. | |
The above copyright notice and this permission notice shall be included in all | |
copies or substantial portions of the Software. | |
*/ | |
#include <Wire.h> | |
#include <Adafruit_Sensor.h> | |
#include <Adafruit_BME280.h> | |
#include <ESP8266WiFi.h> | |
#include <Ticker.h> | |
#include <AsyncMqttClient.h> | |
#define WIFI_SSID "XXXXXXXXXX" | |
#define WIFI_PASSWORD "XXXXXXXXXX" | |
// Raspberri Pi Mosquitto MQTT Broker | |
#define MQTT_HOST IPAddress(192, 168, XX, XX) | |
#define MQTT_PORT 1883 | |
// For a cloud MQTT broker, type the domain name | |
//#define MQTT_HOST "example.com" | |
// Temperature MQTT Topics | |
#define MQTT_PUB_TEMP "esp/bme280/temperature" | |
#define MQTT_PUB_HUM "esp/bme280/humidity" | |
#define MQTT_PUB_PRES "esp/bme280/pressure" | |
// BME280 I2C | |
Adafruit_BME280 bme; | |
// Variables to hold sensor readings | |
float temp; | |
float hum; | |
float pres; | |
AsyncMqttClient mqttClient; | |
Ticker mqttReconnectTimer; | |
WiFiEventHandler wifiConnectHandler; | |
WiFiEventHandler wifiDisconnectHandler; | |
Ticker wifiReconnectTimer; | |
unsigned long previousMillis = 0; // Stores last time temperature was published | |
const long interval = 10000; // Interval at which to publish sensor readings | |
void connectToWifi() { | |
Serial.println("Connecting to Wi-Fi..."); | |
WiFi.begin(WIFI_SSID, WIFI_PASSWORD); | |
} | |
void connectToMqtt() { | |
Serial.println("Connecting to MQTT..."); | |
mqttClient.connect(); | |
} | |
void onWifiConnect(const WiFiEventStationModeGotIP& event) { | |
Serial.println("Connected to Wi-Fi."); | |
connectToMqtt(); | |
} | |
void onWifiDisconnect(const WiFiEventStationModeDisconnected& event) { | |
Serial.println("Disconnected from Wi-Fi."); | |
mqttReconnectTimer.detach(); // ensure we don't reconnect to MQTT while reconnecting to Wi-Fi | |
wifiReconnectTimer.once(2, connectToWifi); | |
} | |
void onMqttConnect(bool sessionPresent) { | |
Serial.println("Connected to MQTT."); | |
Serial.print("Session present: "); | |
Serial.println(sessionPresent); | |
} | |
void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) { | |
Serial.println("Disconnected from MQTT."); | |
if (WiFi.isConnected()) { | |
mqttReconnectTimer.once(2, connectToMqtt); | |
} | |
} | |
/*void onMqttSubscribe(uint16_t packetId, uint8_t qos) { | |
Serial.println("Subscribe acknowledged."); | |
Serial.print(" packetId: "); | |
Serial.println(packetId); | |
Serial.print(" qos: "); | |
Serial.println(qos); | |
} | |
void onMqttUnsubscribe(uint16_t packetId) { | |
Serial.println("Unsubscribe acknowledged."); | |
Serial.print(" packetId: "); | |
Serial.println(packetId); | |
}*/ | |
void onMqttPublish(uint16_t packetId) { | |
Serial.print("Publish acknowledged."); | |
Serial.print(" packetId: "); | |
Serial.println(packetId); | |
} | |
void setup() { | |
Serial.begin(115200); | |
Serial.println(); | |
// Initialize BME280 sensor | |
if (!bme.begin(0x76)) { | |
Serial.println("Could not find a valid BME280 sensor, check wiring!"); | |
while (1); | |
} | |
wifiConnectHandler = WiFi.onStationModeGotIP(onWifiConnect); | |
wifiDisconnectHandler = WiFi.onStationModeDisconnected(onWifiDisconnect); | |
mqttClient.onConnect(onMqttConnect); | |
mqttClient.onDisconnect(onMqttDisconnect); | |
//mqttClient.onSubscribe(onMqttSubscribe); | |
//mqttClient.onUnsubscribe(onMqttUnsubscribe); | |
mqttClient.onPublish(onMqttPublish); | |
mqttClient.setServer(MQTT_HOST, MQTT_PORT); | |
// If your broker requires authentication (username and password), set them below | |
//mqttClient.setCredentials("REPlACE_WITH_YOUR_USER", "REPLACE_WITH_YOUR_PASSWORD"); | |
connectToWifi(); | |
delay(2000); | |
// New BME280 sensor readings | |
//temp = bme.readTemperature(); | |
temp = 1.8*bme.readTemperature() + 32; | |
hum = bme.readHumidity(); | |
pres = bme.readPressure()/100.0F; | |
// Publish an MQTT message on topic esp/bme280/temperature | |
uint16_t packetIdPub1 = mqttClient.publish(MQTT_PUB_TEMP, 1, true, String(temp).c_str()); | |
Serial.printf("Publishing on topic %s at QoS 1, packetId: %i ", MQTT_PUB_TEMP, packetIdPub1); | |
Serial.printf("Message: %.2f \n", temp); | |
// Publish an MQTT message on topic esp/bme280/humidity | |
uint16_t packetIdPub2 = mqttClient.publish(MQTT_PUB_HUM, 1, true, String(hum).c_str()); | |
Serial.printf("Publishing on topic %s at QoS 1, packetId: %i ", MQTT_PUB_HUM, packetIdPub2); | |
Serial.printf("Message: %.2f \n", hum); | |
// Publish an MQTT message on topic esp/bme280/pressure | |
uint16_t packetIdPub3 = mqttClient.publish(MQTT_PUB_PRES, 1, true, String(pres).c_str()); | |
Serial.printf("Publishing on topic %s at QoS 1, packetId: %i ", MQTT_PUB_PRES, packetIdPub3); | |
Serial.printf("Message: %.3f \n", pres); | |
Serial.println("I'm awake, but I'm going into deep sleep mode for 30 seconds"); | |
delay(2000); | |
ESP.deepSleep(30e6); | |
} | |
void loop() { | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Please post this issue on our forum or send an email to our support.
Please mention which issues exactly you're getting, any errors codes, and which exact code you are running.
It's easier to follow the issues there.