take i2c and analog sensor together

Raylpast
Posts: 1
Joined: Fri May 23, 2025 7:15 am

take i2c and analog sensor together

Postby Raylpast » Tue May 27, 2025 7:38 am

i make a project to take a raw ppg's data with infrared led that take from max30105 sensor and green's led data from heart rate pulse sensor. I take data simultaneously with frequency sampling 100 Hz in different esp32 microcontroller. When i take data for 1 minute, i get 2900 data from max30105 and 5790 data from heart rate pulse sensor. This different sample data from max30105 and pulse sensor making the data difficult to process. Can you help me how to fix this?
This is my analog program
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>

const char* ssid = "xxxx";
const char* password = "vvvv";

const char* mqtt_server = "a20555bc.s1.eu.hivemq.cloud";
const int mqtt_port = 8883;
const char* mqtt_user = "pulupulu";
const char* mqtt_pass = "12345";

WiFiClientSecure wifiClient;
PubSubClient client(wifiClient);

// Buffer untuk 10 data
int buffer[10];
int bufferIndex = 0;

void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected");
}

void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP32_Analog", mqtt_user, mqtt_pass)) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" retrying in 5 seconds...");
delay(5000);
}
}
}

void setup() {
Serial.begin(115200);
setup_wifi();

wifiClient.setInsecure(); // Tanpa SSL sertifikat manual
client.setServer(mqtt_server, mqtt_port);
}

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

// Baca sensor analog
int value = analogRead(32);
buffer[bufferIndex] = value;
bufferIndex++;

// Jika sudah 10 data, kirim sekaligus
if (bufferIndex >= 10) {
String payload = "[";
for (int i = 0; i < 10; i++) {
payload += String(buffer);
if (i < 9) payload += ","; // Tambah koma kecuali terakhir
}
payload += "]";

// Kirim ke HiveMQ
client.publish("sensor/analog", payload.c_str());

Serial.print("Kirim data: ");
Serial.println(payload);

bufferIndex = 0; // Reset buffer
}

delay(10); // Sampling 100Hz
}

this is my max30105 program
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include "MAX30105.h"

// Ganti dengan SSID dan password WiFi kamu
const char* ssid = "xxxx";
const char* password = "vvvv";

// Konfigurasi HiveMQ Cloud
const char* mqtt_server = "a040555bc.s1.eu.hivemq.cloud";
const int mqtt_port = 8883;
const char* mqtt_user = "pulupulu";
const char* mqtt_pass = "12345";

// Objek koneksi
WiFiClientSecure wifiClient;
PubSubClient client(wifiClient);
MAX30105 particleSensor;

// Buffer untuk menampung data IR
String irBuffer = "[";
int count = 0;

// Sertifikat root untuk SSL
static const char *root_ca PROGMEM = R"EOF(
-----BEGIN CERTIFICATE-----
MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
-----END CERTIFICATE-----
)EOF";

// Setup WiFi
void setup_wifi() {
Serial.print("Menghubungkan ke WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\n✅ WiFi tersambung.");
}

// Setup awal
void setup() {
Serial.begin(115200);
setup_wifi();

// SSL root certificate
wifiClient.setCACert(root_ca);
client.setServer(mqtt_server, mqtt_port);

Serial.print("🩺 Inisialisasi sensor MAX30105... ");
if (!particleSensor.begin()) {
Serial.println("❌ Gagal! Periksa koneksi sensor.");
while (1); // Berhenti
} else {
Serial.println("✅ Berhasil.");
}

particleSensor.setup(); // Konfigurasi default
}

// Koneksi ulang jika putus
void reconnect() {
if (!client.connected()) {
Serial.print("🔌 Menghubungkan ke MQTT... ");
if (client.connect("ESP32_MAX30105", mqtt_user, mqtt_pass)) {
Serial.println("✅ Terhubung ke MQTT.");
} else {
Serial.print("❌ Gagal, rc=");
Serial.print(client.state());
Serial.println(" (cek dokumentasi PubSubClient)");
}
}
}

// Sampling tiap 10ms (100Hz)
unsigned long lastSampleTime = 0;
const int sampleInterval = 10;

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

client.loop();

unsigned long currentMillis = millis();
if (currentMillis - lastSampleTime >= sampleInterval) {
lastSampleTime = currentMillis;

long ir = particleSensor.getIR();

// Tambahkan ke buffer JSON
irBuffer += String(ir);
count++;

if (count < 10) {
irBuffer += ",";
} else {
irBuffer += "]";
Serial.println("📤 Mengirim data: " + irBuffer);
client.publish("sensor/max30105", irBuffer.c_str());
irBuffer = "[";
count = 0;
}
}
}

Who is online

Users browsing this forum: Barkrowler, ChatGPT-User, meta-externalagent and 2 guests