#include <WiFi.h>
const int lm35pin = 35;
const int numReadings = 10;
int readings[numReadings];
int readingIndex = 0;
String ssid = "Wokwi-GUEST";
String pass = "";
String tbhost = "thingsboard.cloud";
String tbtoken = "c74blBMvJHg5NsM5yJhK";
void connectWifi() {
WiFi.begin(ssid.c_str(), pass.c_str());
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
}
#include <WiFi.h>
#include "PubSubClient.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define PULSES_PER_BEAT 1
#define INTERRUPT_PIN 5
#define SAMPLING_INTERVAL 1000
#define SCREEN_WIDTH 16
#define SCREEN_HEIGHT 2
volatile uint16_t heartPulse; // Count of heart pulses (volatile for use in interrupt)
uint16_t pulseCount; // Current count of heart pulses
float heartRate; // Calculated heart rate
float lastHeartRate = -1.0; // Last recorded heart rate
const int ledPin = 13; // Pin connected to LED to indicate elevated heart rate
portMUX_TYPE mutex = portMUX_INITIALIZER_UNLOCKED; // Mutex to protect critical section in ISR
const char *wifiSSID = "Wokwi-GUEST";
const char *wifiPassword = "";
// Flespi MQTT details
const char *mqttServer = "mqtt.flespi.io";
const char *mqttUser = "mmV7UcyWRMXkzvwEc96PimGo0hv9hm3ryOohQN3ynPGMa2ea1aN8kjmboH8tR1Jg";
const char *mqttPassword = "";
const int mqttPort = 1883;
const char *mqttTopic = "Tabasan/Tapongot/Banaynal/Naduma/HeartRate";
WiFiClient espClient;
PubSubClient client(espClient);
// Initialize LCD object
LiquidCrystal_I2C lcd(0x27, SCREEN_WIDTH, SCREEN_HEIGHT);
void IRAM_ATTR PulseInterrupt() {
portENTER_CRITICAL_ISR(&mutex);
heartPulse++; // Increment the heartPulse variable safely within ISR
portEXIT_CRITICAL_ISR(&mutex);
}
void setup() {
Serial.begin(115200);
pinMode(INTERRUPT_PIN, INPUT);
attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), PulseInterrupt, RISING);
pinMode(ledPin, OUTPUT);
lcd.init();
lcd.backlight();
lcd.clear();
connectToWiFi(); // Function to connect to WiFi
connectToMqtt(); // Function to connect to MQTT
}
void connectToWiFi() {
Serial.print("Connecting to WiFi");
WiFi.begin(wifiSSID, wifiPassword);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void connectToMqtt() {
client.setServer(mqttServer, mqttPort);
while (!client.connected()) {
Serial.print("Connecting to MQTT...");
long r = random(1000);
String clientId = "clientId-" + String(r);
if (client.connect(clientId.c_str(), mqttUser, mqttPassword)) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void loop() {
if (!client.connected()) {
connectToMqtt();
}
client.loop();
CalculateHeartRate(); // Function to calculate and publish heart rate data
delay(500);
}
void CalculateHeartRate() {
static unsigned long startTime;
if (millis() - startTime < SAMPLING_INTERVAL) return; // Sampling interval
startTime = millis();
portENTER_CRITICAL(&mutex); // Enter a critical section
pulseCount = heartPulse; // Save the current value of heartPulse and reset heartPulse
heartPulse = 0;
portEXIT_CRITICAL(&mutex); // Exit the critical section
heartRate = map(pulseCount, 0, 220, 0, 220); // Map the pulseCount to the desired range
const int blinkDuration = 500; // Blink duration in milliseconds
if (heartRate < 60 || heartRate > 140) {
// Blink the LED if heart rate is below 60 or above 140 BPM
digitalWrite(ledPin, HIGH);
delay(blinkDuration);
digitalWrite(ledPin, LOW);
delay(blinkDuration);
} else {
digitalWrite(ledPin, LOW); // Turn off the LED otherwise
}
// if (heartRate > 80) {
// digitalWrite(ledPin, HIGH); // Turn on the LED if heart rate is above 80 BPM
// } else {
// digitalWrite(ledPin, LOW); // Turn off the LED otherwise
// }
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Heart Rate:");
lcd.setCursor(0, 1);
lcd.print(String(heartRate, 2) + " BPM");
String heartRateStr = String(heartRate, 2);
client.publish(mqttTopic, heartRateStr.c_str()); // Publish heart rate data to MQTT
Serial.println("Heart Rate: " + String(heartRate, 2) + " BPM");
}