#include <Wire.h>
#include <WiFi.h>
#include <DHT.h>
#include <PubSubClient.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define DHT_PIN 12
// Define PULSE_PIN
#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"
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(128, 64, &Wire, OLED_RESET);
WiFiClient espClient;
PubSubClient client(espClient);
DHT dht(DHT_PIN, DHT22);
void setup() {
Wire.begin(23, 22);
Serial.begin(115200);
Serial.println("Starting...");
dht.begin();
pinMode(PULSE_PIN, INPUT);
connectToWiFi();
client.setServer(MQTT_SERVER, MQTT_PORT);
// Initialize OLED display
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x64
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.display();
delay(2000); // Pause for 2 seconds
display.clearDisplay();
}
void loop() {
if (!client.connected()) {
reconnect();
}
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// Read pulseValue from PULSE_PIN
int16_t pulseValue = analogRead(PULSE_PIN);
// Convert pulseValue to voltage
float voltage = pulseValue * (5.0 / 4095.0);
// calculate heartRate from voltage
int heartRate = (voltage / 3.3) * 675;
display.clearDisplay();
display.setTextSize(1); // Normal 1:1 pixel scale
display.setTextColor(SSD1306_WHITE); // Draw white text
display.setCursor(0,0); // Start at top-left corner
display.print("Heart Rate: ");
display.println(heartRate);
display.print("Temp: ");
display.println(temperature);
display.print("Humidity: ");
display.println(humidity);
display.display();
Serial.print("Heart Rate: ");
Serial.print(heartRate);
Serial.print(", Temp: ");
Serial.print(temperature);
Serial.print(", Humidity: ");
Serial.println(humidity);
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());
Serial.println("Sent MQTT data");
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");
// Subscribe to MQTT topics here if needed
// client.subscribe("topic_name");
} else {
Serial.print("Failed, rc=");
Serial.print(client.state());
Serial.println(" Retrying in 5 seconds...");
delay(5000);
}
}
}