/*#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <MPU6050.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <ArduinoJson.h>
#include <Preferences.h>
#include <math.h>
// -------- WIFI --------
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// -------- MQTT --------
const char* mqtt_server = "broker.hivemq.com";
const char* topicData = "machine/data";
const char* topicConfig = "machine/config";
const char* topicAck = "machine/ack";
WiFiClient espClient;
PubSubClient client(espClient);
Preferences preferences;
// -------- Sensors --------
MPU6050 mpu;
#define tempPin 4
OneWire oneWire(tempPin);
DallasTemperature sensors(&oneWire);
// -------- Variables --------
int16_t ax, ay, az;
float magnitude;
// -------- MAX samples --------
const int MAX_SAMPLES = 100;
float samples[MAX_SAMPLES];
// -------- Config --------
String machineId = "MACHINE_01";
int sampleSize = 50;
int sampleDelayMs = 20;
float alpha = 0.2;
float tempWarning = 60;
float tempCritical = 80;
float vibWarning = 15000;
float vibCritical = 22000;
float shockFactor = 2.5;
bool alertEnabled = true;
bool enableTemperature = true;
bool enableVibration = true;
// -------- Filter --------
float filteredValue = 0;
// -------- Metrics --------
float mean = 0;
float rms = 0;
float peak = 0;
float minVal = 0;
float peakToPeak = 0;
float stdDev = 0;
float crestFactor = 0;
int shockCount = 0;
// -------- WIFI --------
void setup_wifi() {
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(200);
}
}
// -------- ACK --------
void sendAck(const char* status, const char* message) {
String ackPayload = "{";
ackPayload += "\"status\":\"" + String(status) + "\",";
ackPayload += "\"message\":\"" + String(message) + "\",";
ackPayload += "\"machine_id\":\"" + machineId + "\"";
ackPayload += "}";
client.publish(topicAck, ackPayload.c_str());
}
// -------- MQTT reconnect --------
void reconnect() {
while (!client.connected()) {
if (client.connect("ESP32Client")) {
client.subscribe(topicConfig);
sendAck("OK", "ESP32 connected");
} else {
delay(2000);
}
}
}
// -------- MQTT callback --------
void callback(char* topic, byte* payload, unsigned int length) {
String message;
for (unsigned int i = 0; i < length; i++) {
message += (char)payload[i];
}
StaticJsonDocument<1024> doc;
DeserializationError error = deserializeJson(doc, message);
if (error) {
sendAck("ERROR", "JSON parse failed");
return;
}
if (doc.containsKey("machine_id")) machineId = doc["machine_id"].as<String>();
if (doc.containsKey("sample_size")) sampleSize = doc["sample_size"];
if (doc.containsKey("sample_delay_ms")) sampleDelayMs = doc["sample_delay_ms"];
if (doc.containsKey("alpha_filter")) alpha = doc["alpha_filter"];
if (doc.containsKey("temp_warning")) tempWarning = doc["temp_warning"];
if (doc.containsKey("temp_critical")) tempCritical = doc["temp_critical"];
if (doc.containsKey("vib_warning")) vibWarning = doc["vib_warning"];
if (doc.containsKey("vib_critical")) vibCritical = doc["vib_critical"];
if (doc.containsKey("shock_factor")) shockFactor = doc["shock_factor"];
if (doc.containsKey("alert_enabled")) alertEnabled = doc["alert_enabled"];
if (doc.containsKey("enable_temperature")) enableTemperature = doc["enable_temperature"];
if (doc.containsKey("enable_vibration")) enableVibration = doc["enable_vibration"];
}
// -------- Filter --------
float lowPassFilter(float input) {
filteredValue = alpha * input + (1 - alpha) * filteredValue;
return filteredValue;
}
// -------- Magnitude --------
float calcMagnitude(float x, float y, float z) {
return sqrt(x*x + y*y + z*z);
}
// -------- Setup --------
void setup() {
Serial.begin(115200);
Wire.begin(8, 9);
mpu.initialize();
sensors.begin();
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
// -------- Loop --------
void loop() {
if (!client.connected()) reconnect();
client.loop();
// Sampling
for (int i = 0; i < sampleSize; i++) {
mpu.getAcceleration(&ax, &ay, &az);
magnitude = calcMagnitude(ax, ay, az);
samples[i] = lowPassFilter(magnitude);
delay(sampleDelayMs);
}
// Calculations
float sum = 0, sumSq = 0;
peak = samples[0];
minVal = samples[0];
for (int i = 0; i < sampleSize; i++) {
sum += samples[i];
sumSq += samples[i] * samples[i];
if (samples[i] > peak) peak = samples[i];
if (samples[i] < minVal) minVal = samples[i];
}
mean = sum / sampleSize;
rms = sqrt(sumSq / sampleSize);
peakToPeak = peak - minVal;
float variance = 0;
for (int i = 0; i < sampleSize; i++) {
variance += pow(samples[i] - mean, 2);
}
stdDev = sqrt(variance / sampleSize);
crestFactor = (rms > 0) ? peak / rms : 0;
shockCount = 0;
for (int i = 0; i < sampleSize; i++) {
if (samples[i] > rms * shockFactor) shockCount++;
}
// Temperature
float temperature = -127;
if (enableTemperature) {
sensors.requestTemperatures();
temperature = sensors.getTempCByIndex(0);
}
// -------- JSON WITH SIGNIFICATION --------
String payload = "{\n";
payload += "\"temperature\":{\"value\":" + String(temperature,2) + ",\"unit\":\"C\",\"description\":\"Measured temperature\",\"role\":\"thermal monitoring\"},\n";
payload += "\"mean\":{\"value\":" + String(mean,2) + ",\"unit\":\"raw\",\"description\":\"Average vibration\",\"role\":\"general level\"},\n";
payload += "\"rms\":{\"value\":" + String(rms,2) + ",\"unit\":\"raw\",\"description\":\"RMS vibration\",\"role\":\"energy indicator\"},\n";
payload += "\"peak\":{\"value\":" + String(peak,2) + ",\"unit\":\"raw\",\"description\":\"Max vibration\",\"role\":\"shock detection\"},\n";
payload += "\"peak_to_peak\":{\"value\":" + String(peakToPeak,2) + ",\"unit\":\"raw\",\"description\":\"Signal amplitude\",\"role\":\"variation\"},\n";
payload += "\"std_dev\":{\"value\":" + String(stdDev,2) + ",\"unit\":\"raw\",\"description\":\"Signal dispersion\",\"role\":\"stability\"},\n";
payload += "\"crest_factor\":{\"value\":" + String(crestFactor,2) + ",\"unit\":\"ratio\",\"description\":\"Peak/RMS\",\"role\":\"shock severity\"},\n";
payload += "\"shock_count\":{\"value\":" + String(shockCount) + ",\"unit\":\"count\",\"description\":\"Number of shocks\",\"role\":\"shock frequency\"}\n";
payload += "}";
client.publish(topicData, payload.c_str());
Serial.println(payload);
delay(3000);
}*/
/#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <MPU6050.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <ArduinoJson.h>
#include <Preferences.h>
#include <math.h>
// -------- WIFI --------
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// -------- MQTT --------
const char* mqtt_server = "broker.hivemq.com";
const char* topicData = "machine/data";
const char* topicConfig = "machine/config";
const char* topicAck = "machine/ack";
WiFiClient espClient;
PubSubClient client(espClient);
Preferences preferences;
// -------- Sensors --------
MPU6050 mpu;
#define tempPin 4
OneWire oneWire(tempPin);
DallasTemperature sensors(&oneWire);
// -------- Variables --------
int16_t ax, ay, az;
float magnitude;
// -------- MAX samples --------
const int MAX_SAMPLES = 100;
float samples[MAX_SAMPLES];
// -------- Config --------
String machineId = "MACHINE_01";
int sampleSize = 50;
int sampleDelayMs = 20;
float alpha = 0.2;
float tempWarning = 60;
float tempCritical = 80;
float vibWarning = 15000;
float vibCritical = 22000;
float shockFactor = 2.5;
bool alertEnabled = true;
bool enableTemperature = true;
bool enableVibration = true;
// -------- Filter --------
float filteredValue = 0;
// -------- Metrics --------
float mean = 0;
float rms = 0;
float peak = 0;
float minVal = 0;
float peakToPeak = 0;
float stdDev = 0;
float crestFactor = 0;
int shockCount = 0;
// -------- WIFI --------
void setup_wifi() {
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(200);
Serial.print(".");
}
Serial.println("\nWiFi connected");
}
// -------- ACK --------
void sendAck(const char* status, const char* message) {
String ackPayload = "{";
ackPayload += "\"status\":\"" + String(status) + "\",";
ackPayload += "\"message\":\"" + String(message) + "\",";
ackPayload += "\"machine_id\":\"" + machineId + "\"";
ackPayload += "}";
client.publish(topicAck, ackPayload.c_str());
Serial.println("ACK sent:");
Serial.println(ackPayload);
}
// -------- MQTT reconnect --------
void reconnect() {
while (!client.connected()) {
Serial.print("Connecting to MQTT...");
if (client.connect("ESP32Client")) {
Serial.println(" connected");
client.subscribe(topicConfig);
sendAck("OK", "ESP32 connected");
} else {
Serial.println(" retrying...");
delay(2000);
}
}
}
// -------- Config save --------
void saveConfig() {
preferences.begin("config", false);
preferences.putString("machineId", machineId);
preferences.putInt("sampleSize", sampleSize);
preferences.putInt("sampleDelay", sampleDelayMs);
preferences.putFloat("alpha", alpha);
preferences.putFloat("tempWarn", tempWarning);
preferences.putFloat("tempCrit", tempCritical);
preferences.putFloat("vibWarn", vibWarning);
preferences.putFloat("vibCrit", vibCritical);
preferences.putFloat("shockFactor", shockFactor);
preferences.putBool("alertEnabled", alertEnabled);
preferences.putBool("enTemp", enableTemperature);
preferences.putBool("enVib", enableVibration);
preferences.end();
}
// -------- Config load --------
void loadConfig() {
preferences.begin("config", true);
machineId = preferences.getString("machineId", "MACHINE_01");
sampleSize = preferences.getInt("sampleSize", 50);
sampleDelayMs = preferences.getInt("sampleDelay", 20);
alpha = preferences.getFloat("alpha", 0.2);
tempWarning = preferences.getFloat("tempWarn", 60);
tempCritical = preferences.getFloat("tempCrit", 80);
vibWarning = preferences.getFloat("vibWarn", 15000);
vibCritical = preferences.getFloat("vibCrit", 22000);
shockFactor = preferences.getFloat("shockFactor", 2.5);
alertEnabled = preferences.getBool("alertEnabled", true);
enableTemperature = preferences.getBool("enTemp", true);
enableVibration = preferences.getBool("enVib", true);
preferences.end();
if (sampleSize < 1) sampleSize = 1;
if (sampleSize > MAX_SAMPLES) sampleSize = MAX_SAMPLES;
}
// -------- MQTT callback --------
void callback(char* topic, byte* payload, unsigned int length) {
String message;
for (unsigned int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.println("Config received:");
Serial.println(message);
StaticJsonDocument<768> doc;
if (deserializeJson(doc, message)) {
sendAck("ERROR", "JSON parse failed");
return;
}
if (doc.containsKey("machine_id")) machineId = doc["machine_id"].as<String>();
if (doc.containsKey("sample_size")) sampleSize = doc["sample_size"];
if (doc.containsKey("sample_delay_ms")) sampleDelayMs = doc["sample_delay_ms"];
if (doc.containsKey("alpha_filter")) alpha = doc["alpha_filter"];
if (doc.containsKey("temp_warning")) tempWarning = doc["temp_warning"];
if (doc.containsKey("temp_critical")) tempCritical = doc["temp_critical"];
if (doc.containsKey("vib_warning")) vibWarning = doc["vib_warning"];
if (doc.containsKey("vib_critical")) vibCritical = doc["vib_critical"];
if (doc.containsKey("shock_factor")) shockFactor = doc["shock_factor"];
if (doc.containsKey("enable_temperature")) enableTemperature = doc["enable_temperature"];
if (doc.containsKey("enable_vibration")) enableVibration = doc["enable_vibration"];
saveConfig();
sendAck("OK", "Configuration updated");
}
// -------- Filter --------
float lowPassFilter(float input) {
filteredValue = alpha * input + (1 - alpha) * filteredValue;
return filteredValue;
}
// -------- Magnitude --------
float calcMagnitude(float x, float y, float z) {
return sqrt(x*x + y*y + z*z);
}
// -------- Setup --------
void setup() {
Serial.begin(115200);
Wire.begin(8, 9);
mpu.initialize();
sensors.begin();
loadConfig();
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
// -------- Loop --------
void loop() {
if (!client.connected()) reconnect();
client.loop();
for (int i = 0; i < sampleSize; i++) {
mpu.getAcceleration(&ax, &ay, &az);
magnitude = calcMagnitude(ax, ay, az);
samples[i] = lowPassFilter(magnitude);
delay(sampleDelayMs);
}
// -------- Calculs --------
float sum = 0;
float sumSq = 0;
peak = samples[0];
minVal = samples[0];
for (int i = 0; i < sampleSize; i++) {
sum += samples[i];
sumSq += samples[i] * samples[i];
if (samples[i] > peak) peak = samples[i];
if (samples[i] < minVal) minVal = samples[i];
}
mean = sum / sampleSize;
rms = sqrt(sumSq / sampleSize);
peakToPeak = peak - minVal;
float variance = 0;
for (int i = 0; i < sampleSize; i++) {
variance += pow(samples[i] - mean, 2);
}
stdDev = sqrt(variance / sampleSize);
crestFactor = (rms > 0) ? peak / rms : 0;
shockCount = 0;
for (int i = 0; i < sampleSize; i++) {
if (samples[i] > rms * shockFactor) shockCount++;
}
// -------- Temperature --------
float temperature = -127;
if (enableTemperature) {
sensors.requestTemperatures();
temperature = sensors.getTempCByIndex(0);
}
// -------- JSON --------
String payload = "{\n";
payload += "\"machine_id\":\"" + machineId + "\",\n";
payload += "\"timestamp_ms\":" + String(millis()) + ",\n";
payload += "\"temperature\":" + String(temperature) + ",\n";
payload += "\"mean\":" + String(mean) + ",\n";
payload += "\"rms\":" + String(rms) + ",\n";
payload += "\"peak\":" + String(peak) + ",\n";
payload += "\"peak_to_peak\":" + String(peakToPeak) + ",\n";
payload += "\"std_dev\":" + String(stdDev) + ",\n";
payload += "\"crest_factor\":" + String(crestFactor) + ",\n";
payload += "\"shock_count\":" + String(shockCount) + "\n";
payload += "}";
client.publish(topicData, payload.c_str());
Serial.println(payload);
delay(3000);
}
/*#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <MPU6050.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <math.h>
// -------- WIFI --------
//const char* ssid = "TOPNET_7F90";
//const char* password = "jannene2025";
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// -------- MQTT --------
const char* mqtt_server = "broker.hivemq.com";
WiFiClient espClient;
PubSubClient client(espClient);
// -------- Sensors --------
MPU6050 mpu;
// -------- DS18B20 --------
#define tempPin 4
OneWire oneWire(tempPin);
DallasTemperature sensors(&oneWire);
// -------- Vibration variables --------
int16_t ax, ay, az;
float magnitude;
// -------- Filter --------
float alpha = 0.2;
float filteredValue = 0;
// -------- Sampling --------
const int sampleSize = 50;
float samples[50];
// -------- Metrics --------
float mean = 0;
float rms = 0;
float peak = -100000;
float minVal = 100000;
float peakToPeak = 0;
// -------- Temperature thresholds --------
float tempWarning = 60;
float tempCritical = 80;
// -------- Vibration thresholds --------
float vibWarning = 1.5;
float vibCritical = 3.0;
// -------- WIFI --------
void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
}
// -------- MQTT reconnect --------
void reconnect() {
while (!client.connected()) {
if (client.connect("ESP32Client")) {
Serial.println("MQTT Connected");
}
else {
delay(2000);
}
}
}
// -------- Low Pass Filter --------
float lowPassFilter(float input) {
filteredValue = alpha * input + (1 - alpha) * filteredValue;
return filteredValue;
}
// -------- Magnitude --------
float calcMagnitude(float x, float y, float z) {
return sqrt(x*x + y*y + z*z);
}
// -------- Setup --------
void setup() {
Serial.begin(115200);
// I2C pins
Wire.begin(8, 9);
mpu.initialize();
sensors.begin();
setup_wifi();
client.setServer(mqtt_server, 1883);
}
// -------- Loop --------
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// -------- Sampling vibration --------
for(int i=0;i<sampleSize;i++){
mpu.getAcceleration(&ax, &ay, &az);
magnitude = calcMagnitude(ax, ay, az);
float filtered = lowPassFilter(magnitude);
samples[i] = filtered;
delay(20);
}
// -------- Mean --------
float sum = 0;
for(int i=0;i<sampleSize;i++){
sum += samples[i];
}
mean = sum / sampleSize;
// -------- RMS --------
float sumSquares = 0;
for(int i=0;i<sampleSize;i++){
sumSquares += samples[i] * samples[i];
}
rms = sqrt(sumSquares / sampleSize);
// -------- Peak & Min --------
peak = samples[0];
minVal = samples[0];
for(int i=0;i<sampleSize;i++){
if(samples[i] > peak)
peak = samples[i];
if(samples[i] < minVal)
minVal = samples[i];
}
// -------- Peak to Peak --------
peakToPeak = peak - minVal;
// -------- Temperature --------
sensors.requestTemperatures();
float temperature = sensors.getTempCByIndex(0);
// -------- Temperature Status --------
String tempStatus;
if (temperature < tempWarning)
tempStatus = "NORMAL";
else if (temperature < tempCritical)
tempStatus = "WARNING";
else
tempStatus = "CRITICAL";
// -------- Vibration Status --------
String vibStatus;
if (rms < vibWarning)
vibStatus = "NORMAL";
else if (rms < vibCritical)
vibStatus = "WARNING";
else
vibStatus = "CRITICAL";
// -------- JSON --------
String payload = "{";
payload += "\"temperature\":" + String(temperature) + ",";
payload += "\"mean\":" + String(mean) + ",";
payload += "\"rms\":" + String(rms) + ",";
payload += "\"peak\":" + String(peak) + ",";
payload += "\"peak_to_peak\":" + String(peakToPeak) + ",";
payload += "\"temp_status\":\"" + tempStatus + "\",";
payload += "\"vibration_status\":\"" + vibStatus + "\"";
payload += "}";
// -------- Send MQTT --------
client.publish("machine/data", payload.c_str());
Serial.println(payload);
delay(3000);
}*/