#include <Wire.h>
#include <WiFi.h>
#include <DHT.h>
#include <PubSubClient.h>
#include <Arduino.h>
#include <LiquidCrystal_I2C.h>
#define lcd_ADDR 0x27
#define lcd_COLUMNS 16
#define lcd_ROWS 2
LiquidCrystal_I2C lcd(lcd_ADDR, lcd_COLUMNS, lcd_ROWS);
#define PULSE_PIN 35
//#define MQTT_SERVER "broker.emqx.io"
//#define MQTT_PORT 1883
//const char *ssid = "Wokwi-GUEST";
//const char *password = "";
#define redLEDPin 12
#define greenLEDPin 14
//#define MQTT_TOPIC_HR "/heartRate"
//WiFiClient espClient;
//PubSubClient client(espClient);
int minHeartRate = 60;
int maxHeartRate = 100;
void setup() {
lcd.init();
lcd.backlight();
Wire.begin(23, 22);
Serial.begin(115200);
lcd.print("Heart Monitor");
pinMode(redLEDPin, OUTPUT);
pinMode(greenLEDPin, OUTPUT);
//connectToWiFi();
//client.setServer(MQTT_SERVER, MQTT_PORT);
}
void loop() {
//if (!client.connected()) {
//reconnect();
//}
// Read pulseValue from PULSE_PIN
int16_t pulseValue = analogRead(PULSE_PIN);
// Convert pulseValue to voltage
float voltage = pulseValue * (5 / 4095.0);
// calculate heartRate from voltage
int heartRate = (voltage / 3.3) * 675;
if (heartRate < minHeartRate){
lcd.clear();
lcd.print("Heart rate below ");
lcd.setCursor(0, 1);
lcd.print("minimum: ");
lcd.println(heartRate);
lcd.setCursor(13,1);
lcd.print("b/m");
digitalWrite(redLEDPin, HIGH); // Turn on LED
delay(20); // Wait for half of the blink interval
digitalWrite(redLEDPin, LOW); // Turn off LED
delay(20); // Wait for the other half of the blink interval
}
else if (heartRate > maxHeartRate){
lcd.clear();
lcd.print("Heart rate above ");
lcd.setCursor(0, 1);
lcd.print("maximum: ");
lcd.println(heartRate);
lcd.setCursor(13,1);
lcd.print("b/m");
digitalWrite(redLEDPin, HIGH); // Turn on LED
delay(20); // Wait for half of the blink interval
digitalWrite(redLEDPin, LOW); // Turn off LED
delay(20); // Wait for the other half of the blink interval
}else{
lcd.clear();
lcd.println("Heart Monitor");
lcd.setCursor(0, 1);
lcd.print("Heart rate:");
lcd.println(heartRate);
lcd.setCursor(13,1);
lcd.println("b/m");
digitalWrite(greenLEDPin, HIGH); // Turn on LED
delay(100); // Wait for half of the blink interval
digitalWrite(greenLEDPin, LOW); // Turn off LED
delay(100); // Wait for the other half of the blink interval
}
delay(1000); // Add delay to avoid flooding the MQTT server with messages
//client.publish(MQTT_TOPIC_HR, String(heartRate).c_str());
//Serial.println("Sent MQTT data");
}
/*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);
}
}
}*/