#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// --- WiFi & MQTT Configuration ---
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.emqx.io"; // Change to AWS Endpoint later
const int mqtt_port = 1883;
// --- Hardware Pin Mapping ---
#define TEMP_PIN 4 // DS18B20
#define VIB_PIN 18 // SW-420 (Slide Switch)
#define CURRENT_PIN 34 // ACS712 (Potentiometer)
// --- Sensor Objects ---
Adafruit_BMP085 bmp;
OneWire oneWire(TEMP_PIN);
DallasTemperature tempSensors(&oneWire);
// --- Global Variables ---
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastPublishTime = 0;
const int publishInterval = 5000; // 5 seconds
// Vibration Interrupt Logic
volatile bool vibrationDetected = false;
void IRAM_ATTR handleVibration() {
vibrationDetected = true;
}
// --- Functions ---
void setup_wifi() {
delay(10);
Serial.print("\nConnecting to WiFi: ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi Connected! IP: " + WiFi.localIP().toString());
}
void reconnect() {
while (!client.connected()) {
Serial.print("Connecting to MQTT Broker...");
// Create a random client ID
String clientId = "ESP32Client-" + String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("Connected!");
} else {
Serial.print("Failed, rc=");
Serial.print(client.state());
Serial.println(" Retrying in 5s...");
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
// 1. Initialize Hardware
if (!bmp.begin()) {
Serial.println("Could not find BMP180 sensor!");
}
tempSensors.begin();
// 2. Setup Vibration Interrupt
pinMode(VIB_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(VIB_PIN), handleVibration, FALLING);
// 3. Setup Networking
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
unsigned long now = millis();
if (now - lastPublishTime > publishInterval) {
lastPublishTime = now;
// --- A. Read All Sensors ---
tempSensors.requestTemperatures();
float temp = tempSensors.getTempCByIndex(0);
long pressure = bmp.readPressure();
// Convert 12-bit ADC (0-4095) to 0-30 Amps
float current = (analogRead(CURRENT_PIN) / 4095.0) * 30.0;
// Check vibration status
bool vibStatus = vibrationDetected;
if (vibrationDetected) vibrationDetected = false; // Reset flag after reading
// --- B. Defect Detection logic (Local) ---
if (temp > 50.0) Serial.println("LOCAL ALERT: High Temperature!");
if (current > 20.0) Serial.println("LOCAL ALERT: Overcurrent!");
// --- C. Create JSON Payload (AWS Style) ---
StaticJsonDocument<256> doc;
doc["device_id"] = "ESP32_IND_01";
doc["temperature"] = temp;
doc["pressure"] = pressure;
doc["current_amps"] = current;
doc["vibration_fault"] = vibStatus;
doc["timestamp"] = now;
char buffer[256];
serializeJson(doc, buffer);
// --- D. Publish to Cloud ---
Serial.print("Publishing to MQTT: ");
Serial.println(buffer);
client.publish("industrial/monitor/test", buffer);
}
}
Loading
bmp180
bmp180