#define BLYNK_TEMPLATE_ID "TMPL3WnOzwC7P"
#define BLYNK_TEMPLATE_NAME "Quickstart Template"
#define BLYNK_AUTH_TOKEN "j4HaXLI19MbpUzuKP1uIXpWw27LhRZOU"

#include <Wire.h>
#include <WiFi.h>
#include <DHT.h>
#include <PubSubClient.h>
#include <Arduino.h>
#include <BlynkSimpleEsp32.h>

#define DHT_PIN 12 
#define PULSE_PIN 35

#define MQTT_SERVER "broker.emqx.io"
#define MQTT_PORT 1883

const char *ssid = "Wokwi-GUEST";
const char *password = "";



#define MQTT_TOPIC_HR "/heartRate"
#define MQTT_TOPIC_TEMP "/tempValue"
#define MQTT_TOPIC_HUM "/humValue"

WiFiClient espClient;
PubSubClient client(espClient);

DHT dht(DHT_PIN, DHT22);

void setup() {
  Wire.begin(23, 22);
  Serial.begin(115200);
  Serial.println("Hello, ESP32!");

  connectToWiFi();
  
  client.setServer(MQTT_SERVER, MQTT_PORT);

  dht.begin();

  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, password);
}

void loop() {
  Blynk.run();
  
  if (!client.connected()) {
    reconnect();
  }

  float temperature = dht.readTemperature();
  float humidity = dht.readHumidity();  
  
  int16_t pulseValue = analogRead(PULSE_PIN);
  float voltage = pulseValue * (5.0 / 4095.0);
  int heartRate = (voltage / 3.3) * 675;

  Serial.print("Heart Rate: ");
  Serial.print(heartRate);
  Serial.print(" Temp: ");
  Serial.print(temperature);
  Serial.print(" Humidity: ");
  Serial.println(humidity);
  Serial.print(" Latitude: 12.9165 N\t");
  Serial.print("longitude: 79.1325 E\t");

  delay(100);

  client.publish(MQTT_TOPIC_HR, String(heartRate).c_str());
  client.publish(MQTT_TOPIC_TEMP, String(temperature).c_str());
  client.publish(MQTT_TOPIC_HUM, String(humidity).c_str());

  Blynk.virtualWrite(V1, heartRate);  // Assuming V1 is for Heart Rate
  Blynk.virtualWrite(V2, temperature); // Assuming V2 is for Temperature
  Blynk.virtualWrite(V3, humidity); // Assuming V3 is for Humidity

  delay(10);
}

void connectToWiFi() {
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi");
}

void reconnect() {
  while (!client.connected()) {
    if (client.connect("esp32_neopixel_controller")) {
      Serial.println("Connected to MQTT");
    } else {
      Serial.print("Failed, rc=");
      Serial.print(client.state());
      Serial.println(" Retrying in 5 seconds...");
      delay(5000);
}
}
}
pulse-sensorBreakout
gpsBreakout