#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "base64.h"
#include <WiFi.h>
#include <PubSubClient.h>
#define PULSE_PIN 35 //le Pin qui correspond au pulse sensor sur la carte ESP 32
#define TEMP_PIN 25 // Temperature sensor
Adafruit_SSD1306 ecranOLED(128, 64, &Wire, -1);
// ThingSpeak channel and API key
const char* channel_id = "2596128";
const char* write_api_key = "PK1DCXEGFLFPS6VZ";
// WiFi credentials
const char* ssid = "Wokwi-GUEST"; // The SSID of the WiFi network
const char* password = ""; // WiFi password
// MQTT server details
const char* mqtt_server = "mqtt3.thingspeak.com"; // The MQTT server address
const int mqtt_port = 1883; // MQTT server port
const char* mqtt_client_id = "FSIUBRMSPCg5OTkRBDsOKRQ"; // MQTT client ID
const char* mqtt_username = "FSIUBRMSPCg5OTkRBDsOKRQ"; // MQTT username
const char* mqtt_password = "eSGLbSSVAI0rgr0kQDSvJRmS"; // MQTT password
WiFiClient espClient;
PubSubClient mqtt_client(espClient);
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
ecranOLED.begin(SSD1306_SWITCHCAPVCC, 0x3c);
Serial.println("Hello, ESP32!");
ecranOLED.clearDisplay();
ecranOLED.setTextSize(1);
ecranOLED.setTextColor(SSD1306_WHITE);
connectToWiFi(); // Connect to WiFi network
mqtt_client.setServer(mqtt_server, mqtt_port); // Setup MQTT connection
}
void loop() {
// put your main code here, to run repeatedly:
// Read pulseValue from PULSE_PIN
ecranOLED.clearDisplay();
ecranOLED.setCursor(20,0);
int16_t pulseValue = analogRead(PULSE_PIN);
int tempValue = analogRead(TEMP_PIN);
// Convert pulseValue to voltage
float voltage = (pulseValue * (5 / 4095.0));
// calculate heartRate from voltage
int heartRate = ((voltage / 3.3) * 67.5);
ecranOLED.println("Signes Vitaux");
ecranOLED.println("_____________________");
ecranOLED.println("");
ecranOLED.print("Coeur : ");
ecranOLED.print(String(heartRate));
ecranOLED.print (" BPM");
ecranOLED.println("");
ecranOLED.println("");
ecranOLED.print("Temperature : ");
ecranOLED.print((tempValue/100));
ecranOLED.display();
delay(2000);
// Ensure MQTT connection is maintained
if (!mqtt_client.connected()) {
reconnectMQTT();
}
mqtt_client.loop();
// Read and publish sensor data every 2 seconds
static unsigned long lastPublishTime = 0;
if (millis() - lastPublishTime > 2000) {
lastPublishTime = millis();
readAndPublishSensorData(heartRate, tempValue);
}
}
// fonction connectToWifi
void connectToWiFi() {
Serial.print("Connecting to Wi-Fi");
WiFi.begin(ssid, password);
// Wait until connected to WiFi
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" Connected!");
}
void reconnectMQTT() {
// Reconnect to MQTT server if disconnected
while (!mqtt_client.connected()) {
Serial.print("Attempting MQTT connection...");
if (mqtt_client.connect(mqtt_client_id, mqtt_username, mqtt_password)) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(mqtt_client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
// read and publih data
void readAndPublishSensorData(int heart,int temp) {
// Prepare data string for ThingSpeak
String data = String("Temperature=" + String(temp/100, 1) +
"&Heartbeat=" + String(heart, 1)) ;
//String data = String("Temperature=") + String(temp/100, 1));
char dataChar[100];
data.toCharArray(dataChar, 100);
// Publish the data to ThingSpeak
if (mqtt_client.publish("channels/2596128/publish/PK1DCXEGFLFPS6VZ", dataChar)) {
Serial.println("Publish successful");
} else {
Serial.println("Publish failed");
}
}