#include <Wire.h>
#include <WiFi.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <PubSubClient.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.hivemq.com";
const char* clientID = "clientId-carHXNUwjt"; // Client ID username+0001
const char* mqtt_topic = "ECG"; // Ensure the MQTT topic is defined here
WiFiClient espClient;
PubSubClient client(espClient);
double Heartbeats[] = {
0.0012456,0.71141435,-2.1140915000000002,-4.1410067999999995,
-4.574471599999999,-3.4319085,-1.9507914000000002,-1.1070666999999998,
-0.63232248,0.33457718,0.87883579,0.83106672,0.83246584,0.79099271,
0.73318448,0.67531414,0.76075122,0.64545074,0.64472425,0.59314006,
0.60070077,0.4967947,0.40954629,0.33081901,0.15958058,0.20091363,
0.10775284,-0.039164736,-0.096833474,-0.17062963,-0.2969516,
-0.38126935,-0.36309706,-0.5013618,-0.67307625,-0.55188068,-0.65094102,
-0.54260816,-0.66110174,-0.58118387,-0.45428738,-0.45106516,-0.29907368,
-0.21448719,-0.076921402,0.10233773,0.20839504,0.15054113,0.21366603,
0.24493933,0.30699451,0.33835116,0.34609696,0.41369076,0.44100555,
0.39159341,0.41750854,0.30276646,0.38036357,0.28972908,0.37412731,
0.39876561,0.36499806,0.63122707,0.50918961,0.46911811,0.61013159,
0.59380291,0.56851494,0.6185489000000001,0.75104048,0.49345872,
0.53952164,0.64126341,0.60935203,0.59405769,0.40790413,0.42761301,
0.43085571,0.41528731,0.31350561,0.35372391,0.26930733,0.16958593,
0.2408928,0.13035327,0.18621097,0.024304192999999998,-0.06815265599999999,
0.0095436502,-0.16012437,-0.135601,-0.15552812,-0.14475897,-0.00397988,
-0.040228089,-0.051341236,0.038336424,0.34101747,0.6159584,0.81549648,
0.91215047,1.1970379999999998,1.5258563,1.6774093,1.4938023999999999,
1.3328848999999998,1.033417,0.70938029,0.50417612,0.12197655,-0.14469165,
-0.70622151,-0.97195913,-1.0928120000000001,-1.2048382,-1.1141656999999998,
-1.0873249,-1.2853534,-1.2481586,-1.2101423999999998,-1.2784696000000002,
-1.2789237,-1.3769847,-1.2328171,-1.189943,-1.3444163999999998,-1.2390104,
-1.1742654,-0.69966643,-0.032476949,0.022846766,0.18893657,0.48093188,
0.62925026,0.57729083,0.66552725,1.0359968000000002,1.4922866000000001,
-1.9050734
};
int numHeartbeats = sizeof(Heartbeats) / sizeof(Heartbeats[0]);
int xOffset = 0;
void setup() {
Serial.begin(115200);
Wire.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.display();
delay(2000);
display.clearDisplay();
setup_wifi();
client.setServer(mqtt_server, 1883);
}
void setup_wifi() {
delay(10);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
while (!client.connected()) {
if (client.connect(clientID)) {
Serial.println("MQTT connected");
client.subscribe(mqtt_topic);
Serial.println("Topic Subscribed");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void loop() {
for (int i = 0; i < numHeartbeats - 1; i++) {
double ecgValueStart = Heartbeats[i] * (SCREEN_HEIGHT / 60.0)*5; // 60 هو الحد الأقصى للقيمة في Heartbeats
double ecgValueEnd = Heartbeats[i + 1] * (SCREEN_HEIGHT / 60.0)*5;
// رسم الخط من النقطة الحالية إلى النقطة التالية
display.drawLine(xOffset, SCREEN_HEIGHT / 2 - ecgValueStart, xOffset + 1, SCREEN_HEIGHT / 2 - ecgValueEnd, WHITE);
xOffset++;
if (xOffset >= SCREEN_WIDTH - 1) {
xOffset = 0;
display.clearDisplay();
}
display.display();
delay(100); // تأخير لتمثيل الزمن بين القراءات
}
if (!client.connected()) {
reconnect();
}
client.loop();
char msg[50];
snprintf(msg, 50, "%f", numHeartbeats);
client.publish(mqtt_topic, msg);
}