Hi there,
i’m totally new into PlatformIO.
I build a weatherstation with an esp32 + bme280 transmitting the data via mqtt to my rasp-pi (influxdb + grafana).
I made this code with Arduino but with boardversion 1.0.4 is an anoying wifi reconnect bug, so i need to use 1.10.0 with PlatformIO.
Evertyhing is working fine except of this wifi bug.
I added #include <Arduino.h> but i got 4 errors.
‘setupWifi’ was not declared in this scope (58 , 13)
‘mqttReconnect’ was not declared in this scope (66, 19)
‘mqttPublish’ was not declared in this scope (86, 52)
“BME280_ADDRESS” redefined (21, 1)
I need some help please, i installed all missing libraries and installed board esp32 1.10.0
This is my code:
/**
Required libraries:
- Adafruit BME280 Library
- Adafruit Unified Sensor
- PubSubClient
**/
#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <PubSubClient.h>
#include <WiFi.h>
#define MQTT_TOPIC_HUMIDITY "home/bme280/humidity"
#define MQTT_TOPIC_TEMPERATURE "home/bme280/temperature"
#define MQTT_TOPIC_STATE "home/bme280/status"
#define MQTT_PUBLISH_DELAY 5000
#define MQTT_CLIENT_ID "esp32bme280"
#define BME280_ADDRESS 0x76
#define uS_TO_S_FACTOR 1000000 // micro seconds for sleep mode
#define TIME_TO_SLEEP 300 // seconds for sleep mode, the esp32 sends data every 10 seconds
and goes to sleep mode, you can change this value as your mind
const char *WIFI_SSID = "xxxxx";
const char *WIFI_PASSWORD = "xxxx";
const char *MQTT_SERVER = "10.0.1.3";
const char *MQTT_USER = "pi"; // NULL for no authentication
const char *MQTT_PASSWORD = "123"; // NULL for no authentication
float humidity;
float temperature;
long lastMsgTime = 0;
Adafruit_BME280 bme;
WiFiClient espClient;
PubSubClient mqttClient(espClient);
void setup() {
Serial.begin(115200);
while (! Serial);
if (!bme.begin(BME280_ADDRESS)) {
Serial.println("Could not find a valid BME280 sensor, check wiring or BME-280 address!");
while (1);
}
// Use force mode so that the sensor returns to sleep mode when the measurement is finished
bme.setSampling(Adafruit_BME280::MODE_FORCED,
Adafruit_BME280::SAMPLING_X1, // temperature
Adafruit_BME280::SAMPLING_NONE, // pressure
Adafruit_BME280::SAMPLING_X1, // humidity
Adafruit_BME280::FILTER_OFF);
setupWifi();
mqttClient.setServer(MQTT_SERVER, 1883);
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
}
void loop() {
if (!mqttClient.connected()) {
mqttReconnect();
}
mqttClient.loop();
long now = millis();
if (now - lastMsgTime > MQTT_PUBLISH_DELAY) {
lastMsgTime = now;
// Reading BME280 sensor data
bme.takeForcedMeasurement(); // has no effect in normal mode
humidity = bme.readHumidity();
temperature = bme.readTemperature();
if (isnan(humidity) || isnan(temperature)) {
Serial.println(temperature);
Serial.println(humidity);
Serial.println("BME280 reading issues");
return;
}
// Publishing sensor data
mqttPublish(MQTT_TOPIC_TEMPERATURE, temperature);
mqttPublish(MQTT_TOPIC_HUMIDITY, humidity);
delay(100);
esp_deep_sleep_start();
}
}
void setupWifi() {
Serial.print("Connecting to ");
Serial.println(WIFI_SSID);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void mqttReconnect() {
while (!mqttClient.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (mqttClient.connect(MQTT_CLIENT_ID, MQTT_USER, MQTT_PASSWORD,
MQTT_TOPIC_STATE, 1, true, "disconnected", false)) {
Serial.println("connected");
// Once connected, publish an announcement...
mqttClient.publish(MQTT_TOPIC_STATE, "connected", true);
} else {
Serial.print("failed, rc=");
Serial.print(mqttClient.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void mqttPublish(char *topic, float payload) {
Serial.print(topic);
Serial.print(": ");
Serial.println(payload);
mqttClient.publish(topic, String(payload).c_str(), true);
}