#include <Wire.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <Arduino.h>
#include <LiquidCrystal_I2C.h>
// LCD I2C Konfigurasi
#define lcd_ADDR 0x27
#define lcd_COLUMNS 16
#define lcd_ROWS 2
LiquidCrystal_I2C lcd(lcd_ADDR, lcd_COLUMNS, lcd_ROWS);
// WiFi dan MQTT Konfigurasi
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define THINGSBOARD_SERVER "thingsboard.cloud"
#define THINGSBOARD_TOKEN "kbusQW1u5hByj6xfYcaC"
// Pin LED dan Sensor
#define PULSE_PIN 35
#define redLEDPin 12
#define greenLEDPin 14
// Objek untuk WiFi dan MQTT
WiFiClient espClient;
PubSubClient client(espClient);
// Variabel Detak Jantung
int minHeartRate = 60;
int maxHeartRate = 100;
void setup() {
// Inisialisasi LCD
lcd.init();
lcd.backlight();
// Inisialisasi Serial Monitor
Serial.begin(115200);
lcd.print("Heart Monitor");
// Inisialisasi Pin
pinMode(redLEDPin, OUTPUT);
pinMode(greenLEDPin, OUTPUT);
// Hubungkan ke WiFi
connectToWiFi();
// Konfigurasi MQTT server
client.setServer(THINGSBOARD_SERVER, 1883);
client.setCallback(mqttCallback);
// Hubungkan ke ThingsBoard
connectToThingsBoard();
}
void loop() {
// Periksa Koneksi MQTT
if (!client.connected()) {
connectToThingsBoard();
}
client.loop();
// Baca dan kirim data detak jantung
int heartRate = readHeartRate();
sendTelemetry(heartRate);
delay(1000);
}
void connectToWiFi() {
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Menghubungkan ke WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
lcd.setCursor(0, 1);
lcd.print("WiFi Connecting...");
}
Serial.println("\nWiFi Connected");
lcd.setCursor(0, 1);
lcd.print("WiFi Connected");
}
void connectToThingsBoard() {
while (!client.connected()) {
Serial.println("Menghubungkan ke ThingsBoard...");
lcd.clear();
lcd.print("Connecting TB...");
if (client.connect("ESP32", THINGSBOARD_TOKEN, NULL)) {
Serial.println("Terhubung ke ThingsBoard!");
lcd.print("TB Connected!");
} else {
Serial.print("Gagal terhubung ke ThingsBoard, rc=");
Serial.println(client.state());
lcd.print("TB Conn Failed");
delay(5000);
}
}
}
int readHeartRate() {
// Simulasi pembacaan detak jantung dari sensor
int pulseValue = analogRead(PULSE_PIN);
float voltage = pulseValue * (5.0 / 4095.0);
return (voltage / 3.3) * 675; // Kalkulasi detak jantung
}
void sendTelemetry(int heartRate) {
String payload = "{\"heartRate\":";
payload += heartRate;
payload += "}";
client.publish("v1/devices/me/telemetry", payload.c_str());
Serial.println("Data dikirim: " + payload);
}
void mqttCallback(char *topic, byte *payload, unsigned int length) {
Serial.print("Pesan diterima [");
Serial.print(topic);
Serial.print("]: ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}