// ------------------------------------------
/*
* Hardware{
* bmp280 : {sck:GPIO23, sdo:GPIO19, sdi:GPIO22, cd:GPIO18}
* uart2 : {tx:GPIO17, rx:GPIO16}
* blue_led : GPIO12 | WIFI
* red_led : GPIO13 | MQTT
* }
*/
// ------------------------------------------
#include <Wire.h>
#include <Adafruit_BMP280.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <HardwareSerial.h>
// ----------------- MBP280 -----------------
#define BMP_SCK (23)
#define BMP_SDO (19)
#define BMP_SDI (22)
#define BMP_CS (18)
#define BMP_READ_PERIOD (3000)
Adafruit_BMP280 BMP_SENSOR (BMP_CS, BMP_SDI, BMP_SDO, BMP_SCK);
// LINK: https://wokwi.com/projects/394841903979791361
// ----------------- UART -------------------
#define UART_TX (17) // PUSH Data | Connected to RX serialMonitor
#define UART_RX (16) // PULL Data
#define UART_PUBLISH_PERIOD (6000)
HardwareSerial UART(2);
// FORMAT: "Pressure: XXXX.X hPa"
// LINK: https://blog.wokwi.com/wokwi-logic-analyzer-uart-part-1/
// ----------------- WIFI -------------------
const char* WIFI_SSID = "Wokwi-GUEST";
const char* WIFI_NATIVE_PASSWORD = "";
const char* WIFI_NEW_PASSWORD = "secure456"; // not work in wokwi network
#define WIFI_PUBLISH_PERIOD (5000)
#define WIFI_LED (12)
WiFiClient WIFI_ESP_CLIENT;
// LINK: https://wokwi.com/projects/389054627163117569
// ----------------- MQTT -------------------
const char* MQTT_SERVER_HOST = "broker.hivemq.com";
const int MQTT_SERVER_PORT = 1883;
const char* MQTT_TOPIC_CHANNEL = "sensors/pressure";
#define MQTT_PUBLISH_PERIOD (10000)
#define MQTT_LED (13)
PubSubClient MQTT_ESP_CLIENT(WIFI_ESP_CLIENT);
// LINK: https://wokwi.com/projects/379986008338388993
// ----------------- TIMER ------------------
#define TICKRATE (1000)
float pressureValue;
unsigned long lastPressureRead = 0;
unsigned long lastUARTTransmit = 0;
unsigned long lastWiFiCheck = 0;
unsigned long lastMQTTPublish = 0;
// ------------------------------------------
void setup() {
Serial.begin(115200);
while (!Serial) delay(TICKRATE);
// BMP
if (!BMP_SENSOR.begin()) {
Serial.println(F("BMP is not implemented"));
while (1) delay(TICKRATE);
} else Serial.println(F("BMP implemented"));
// UART
UART.begin(9600, SERIAL_8N1, UART_RX, UART_TX);
Serial.println(F("UART implemented"));
// WIFI
Serial.print("Connecting to Wi-Fi [");
Serial.print(WiFi.localIP());
Serial.print("]");
WiFi.begin(WIFI_SSID, WIFI_NATIVE_PASSWORD);
pinMode(WIFI_LED, OUTPUT);
while (WiFi.status() != WL_CONNECTED) {
delay(TICKRATE);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi connected [SECURE].");
digitalWrite(WIFI_LED, HIGH);
// MQTT
MQTT_ESP_CLIENT.setServer(MQTT_SERVER_HOST, MQTT_SERVER_PORT);
pinMode(MQTT_LED, OUTPUT);
Serial.print("Connecting to MQTT");
while (!MQTT_ESP_CLIENT.connected()) {
if (MQTT_ESP_CLIENT.connect("MQTT_ESP_CLIENT")) {
break;
}
delay(TICKRATE);
Serial.print(".");
}
Serial.println();
Serial.println("MQTT connected.");
digitalWrite(MQTT_LED, HIGH);
}
// ------------------------------------------
void loop() {
unsigned long currentMillis = millis();
// ------------------------------------------
if (currentMillis - lastPressureRead >= BMP_READ_PERIOD) {
lastPressureRead = currentMillis;
pressureValue = BMP_SENSOR.readPressure() / 100.0;
char buffer[32];
snprintf(buffer, sizeof(buffer), "Pressure: %.1f hPa", pressureValue);
Serial.println(buffer);
}
// ------------------------------------------
if (currentMillis - lastUARTTransmit >= UART_PUBLISH_PERIOD) {
lastUARTTransmit = currentMillis;
char buffer[32];
snprintf(buffer, sizeof(buffer), "[UART] Pressure: %.1f hPa", pressureValue);
UART.println(buffer);
Serial.print("PUSH ");
Serial.print(buffer);
Serial.println(" ✓");
}
// ------------------------------------------
if (currentMillis - lastWiFiCheck >= WIFI_PUBLISH_PERIOD) {
lastWiFiCheck = currentMillis;
long rssi = WiFi.RSSI();
Serial.print("[WiFi] RSSI: ");
Serial.print(rssi);
Serial.println(" dBm");
}
if (currentMillis - lastMQTTPublish >= MQTT_PUBLISH_PERIOD) {
lastMQTTPublish = currentMillis;
if(!MQTT_ESP_CLIENT.connected()) {
digitalWrite(MQTT_LED, LOW);
while (!MQTT_ESP_CLIENT.connected()) {
if (MQTT_ESP_CLIENT.connect("MQTT_ESP_CLIENT")) {
break;
}
Serial.print(".");
}
Serial.println();
Serial.println("MQTT reconnected.");
digitalWrite(MQTT_LED, HIGH);
}
char buffer[32];
snprintf(buffer, sizeof(buffer), "[MQTT] Pressure: %.1f hPa", pressureValue);
bool mqtt_public_status = MQTT_ESP_CLIENT.publish(MQTT_TOPIC_CHANNEL, buffer);
Serial.print("PUSH ");
Serial.print(buffer);
Serial.println(mqtt_public_status ? " ✓" : " ✗");
}
// ------------------------------------------
MQTT_ESP_CLIENT.loop();
delay(TICKRATE);
}
WIFI
MQTT