#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <math.h>
// -------- WIFI --------
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// -------- AWS --------
const char* awsEndpoint = "a2l6kap51y222v-ats.iot.ap-south-1.amazonaws.com";
// -------- CERTIFICATES --------
// (keep your certificates exactly same)
static const char* root_ca = R"EOF(
-----BEGIN CERTIFICATE-----
MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF
ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL
MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv
b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj
ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM
9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw
IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6
VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L
93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm
jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA
A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI
U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs
N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv
o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU
5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy
rqXRfboQnoZsG4q5WTP468SQvvG5
-----END CERTIFICATE-----
)EOF";
static const char* certificate = R"KEY(
-----BEGIN CERTIFICATE-----
MIIDWTCCAkGgAwIBAgIUdZ9wKHFTrgXu8N1Ebw8RexUAVKwwDQYJKoZIhvcNAQEL
BQAwTTFLMEkGA1UECwxCQW1hem9uIFdlYiBTZXJ2aWNlcyBPPUFtYXpvbi5jb20g
SW5jLiBMPVNlYXR0bGUgU1Q9V2FzaGluZ3RvbiBDPVVTMB4XDTI2MDQxNzExMDMy
NFoXDTQ5MTIzMTIzNTk1OVowHjEcMBoGA1UEAwwTQVdTIElvVCBDZXJ0aWZpY2F0
ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMWgn4kHxc0a//sVXMMW
WXCy/RXwVk4UUm0INgH5UKAkvzS9UEW8yWnXkVS47zpaeu5Cwispo972hC8MPJw2
QMoPBjG1KDd55P/XN7GonqDNmNLQB1VULyz85Gc5LGQaXK99ooC4iAAyoBCYOYCT
c0/s5w55zZ6/FH/pJDbT89N0UhB6qtM5iCWnc9ruLijx0W0h9ZOsipDH3F+Kgc1Q
MFib45pH3xxQKE8xWgjyZnix9L22Z5qvyg2CDiRHyeQDRV7dhQDe0Vv38HrYjlxZ
PRWs6OwWDa2CBD5A1hV+F4KubP8P0CnEyAmALfmubOvjw5whuInbpi90fbSBrTCC
jCECAwEAAaNgMF4wHwYDVR0jBBgwFoAUgR6ii9odkXahHcF6PAbrHZq0gEwwHQYD
VR0OBBYEFJxqUKDY42sTfE7S/W2nyZo1MdMPMAwGA1UdEwEB/wQCMAAwDgYDVR0P
AQH/BAQDAgeAMA0GCSqGSIb3DQEBCwUAA4IBAQA3/wAWfPiHEGHkz71KU1miod2h
e44o43wSqPT7Ihdl7obrISSkMAFge6ts6GTf9T4mqyndLJu2JEyOAtqMsdME+Uxn
RIovOmvWDyizn0b1PxEwS8LCqXaauPlEsiOpMvCdYS4bslUB41dv/QoIWjHHze3K
JEsCbgvrlLQfJv9Se3AzpsDWQEJiZFvEo2BkgH+tMlkGXDO43wKGzuKwwpCW8nw/
DhXN6RUWQgXGBCkrgh9J9DsYavyQSjKSw3Rp+S//axfMkjzhzqqMdyacJpA4xnpm
tSkEAXG/E3CKPbH2gdJ9g8fF7B2f68I/8V04y4Ipz4SXA8CBLvbhVmt/nE+s
-----END CERTIFICATE-----
)KEY";
static const char* private_key = R"KEY(
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAxaCfiQfFzRr/+xVcwxZZcLL9FfBWThRSbQg2AflQoCS/NL1Q
RbzJadeRVLjvOlp67kLCKymj3vaELww8nDZAyg8GMbUoN3nk/9c3saieoM2Y0tAH
VVQvLPzkZzksZBpcr32igLiIADKgEJg5gJNzT+znDnnNnr8Uf+kkNtPz03RSEHqq
0zmIJadz2u4uKPHRbSH1k6yKkMfcX4qBzVAwWJvjmkffHFAoTzFaCPJmeLH0vbZn
mq/KDYIOJEfJ5ANFXt2FAN7RW/fwetiOXFk9Fazo7BYNrYIEPkDWFX4Xgq5s/w/Q
KcTICYAt+a5s6+PDnCG4idumL3R9tIGtMIKMIQIDAQABAoIBAEJi7ZR7fu+iVUED
8RA7rrnT9n5rKKK74uBrdLD/Dh1tmqldutxiSYp7dn9uTDZe9JKa7FzRdRHN36Nq
SeXzt5noqB0EjMjt8oYaxsOwL/E2f1K5vOzmBZ7oKNWf+BB8Zoww+OiilFT0rJ5G
dHKDlaXQn+FV+0OLTpiVOawNUQfDoTp18l4GGbrasWSElxfKooaUl8vV4K6js/6M
zfzNYLipUoeB+E0a/s/mg641eFubuUqz81J8A8573sNvKVrGFN/BUD2aws40wRVH
1JoTWVxoUEe6o7+MAEGx6+vJ9zcSLuE/mCnahhb0aFbh7pxerCFu4DGJGRuIJuUn
vwKUHu0CgYEA4sAODh5Y6ugYOkzQu8+B92KBaDHhZTRzpFLQU+/tQbKGY9llezkC
NHdws+Sf6WgiogPKzsVdfLLzL0WEQLD8IxmvI8mUO+mb3iQwh9yyfvSyrEvIhwRp
z5MADXoZ/MGGlp20FVOcp0s2ewhT3dJvzoDQf5GfMgqpZ1StyjHvyCsCgYEA3x7Z
p2qrwRRvuHQsFGwLq0f0QtDEehFbIWf9U75AvRCNrTv3LCPrlqpT/HOLhPiatWN4
wRj1zmOBDZnvnDNxANQph96uwgrKUUVsjBxGeji5/kwaLlEvvnUzt7zNBCX+Jmnv
QUeAs811C9+p6tUn5tNlNFwq4yQ1eJKo5PqnKuMCgYBW8mHxU/2whbLUmCPqAFXL
sIACni3ZitVVC1RK+1M0v+n8W54oM+H+kFYtBNu0unOdQGsCAngoms3ZMITX8YWd
R/n6dQ9cMeXMtn/NePkQ6W+h1aVc8HpKWAnLISjZ3LNpCavGCbumApcvcjAGfOzW
eFp6sDIlFCWFM9k4ERHq5QKBgQDJrPMD1vGktro9OhTV6MuraICrHFVcGPAMhBiB
Z4jQ3HOTUI6cwWMjbpY3rKFB8gy1RFJUCCG3Ck4OY0QoJn9QRnW7sFa6YlJ5n4z8
IFq8AyZra5KGpy/Gsd2riOavhz/wrPRsRxtYarAPqX3HHCDTDeV+rIi/g20prTco
skAEDQKBgQCbgbxJASx2meV9wgpvxa1uqr5MZv3qRAFSkzRPWPY164dfrC2bf4wf
cjunNj3EwYwkZ1ZQxuYmW4CqjDYzQlAYt7y9V3wF/D0gYXTcgLSL6zsFljz2yQbw
Ycel4FobA59LfLh6TRMhr8BCrz8jdZ8P6+HI5ry1F0F/qRacDELT7w==
-----END RSA PRIVATE KEY-----
)KEY";
// -------- CLIENT --------
WiFiClientSecure net;
PubSubClient client(net);
// -------- STATES --------
float temp = 30.0f;
float vibration = 0.0f;
float wear = 0.0f;
float balance = 1000.0f;
float ambient_temp = 28.0f;
// -------- CONNECT --------
void connectAWS() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi Connected");
net.setCACert(root_ca);
net.setCertificate(certificate);
net.setPrivateKey(private_key);
client.setServer(awsEndpoint, 8883);
while (!client.connected()) {
Serial.print("Connecting to AWS...");
if (client.connect("machine_1")) {
Serial.println("Connected!");
} else {
Serial.print("Failed, rc=");
Serial.println(client.state());
delay(2000);
}
}
}
// -------- SETUP --------
void setup() {
Serial.begin(115200);
connectAWS();
}
// -------- LOOP --------
void loop() {
if (!client.connected()) {
connectAWS();
}
client.loop();
float load = random(0, 100) / 100.0f;
float current = 2.0f + (8.0f * load);
float P_in = 100.0f * logf(1.0f + 4.0f * load);
// temperature
float dT = (P_in - 0.5f * (temp - ambient_temp)) / 50.0f;
temp += dT;
// vibration
float dV = (2.0f * load + 1.5f * wear - 1.2f * vibration);
vibration += dV;
// wear (FIXED LINE)
float dW = (0.0005f * load +
0.0002f * max(0.0f, temp - 40.0f) +
0.0003f * fabs(vibration));
wear += dW;
// JSON
String payload = "{";
payload += "\"machine_id\":\"M1\",";
payload += "\"temp\":" + String(temp, 2) + ",";
payload += "\"vibration\":" + String(vibration, 2) + ",";
payload += "\"load\":" + String(load * 100.0f, 2) + ",";
payload += "\"current\":" + String(current, 2) + ",";
payload += "\"balance\":" + String(balance, 2);
payload += "}";
client.publish("factory/machines", payload.c_str());
Serial.println(payload);
delay(2000);
}