Go Down

Topic: Arduino ProMicro + MAXREFDES117 + ESP32 (Read 863 times) previous topic - next topic

chooselive95

Buenas tardes,

Estoy haciendo un proyecto en el cual realizo una monitorización de frecuencia cardíaca y saturación arterial de oxígeno. Una vez habiendo conectado el Arduino ProMicro y la placa MAXREFDES117, me gustaría implementar además el módulo ESP32 con el cual realizar una conexión wireless (WiFi o Bluetooth). Por ello, mi duda es la siguiente: Cuáles serían las conexiones entre la placa de desarrollo ProMicro con el módulo ESP32? Supongo que las conexiones entre el Arduino ProMicro + MAXREFDES117 son las mismas, no?

Muchas gracias.

surbyte

Y para que quieres el PROMicro si usaras un semejante microcontrolador doble núcleo como el ESP32?
Solo usa el ESP32 con el MAXREFDES117 y listo.
Es 3.3V al iquel que el PROMicro y como dije mucho mas potente.

chooselive95

#2
Jul 01, 2019, 08:39 pm Last Edit: Jul 04, 2019, 12:55 am by chooselive95
Buenas tardes,

Es cierto eso que dices, pero hice ésto (juntar los tres dispositivos) ya que el fichero SoftI2CMaster estaba diseñado para el Arduino ProMicro:

Code: [Select]

 #define SDA_PIN  1
 #define SDA_PORT PORTD
 #define SCL_PIN  0
 #define SCL_PORT PORTD


Para usar este fichero con, únicamente, el módulo ESP32 no veo la manera de poder implementarlo. Es posible usar sólamente  la placa MAXREFDES117 + ESP32 junto con el fichero SoftI2CMaster? (además de los ficheros: max30102.h, max30102.cpp, algorithm.p, algorithm,cpp y RD117_ARDUINO.ino). La verdad, no sé si hay alguna manera de modificar este fichero para poder reutilizarlo con el ESP32.

Saludos.



surbyte

Y para que quieres un SoftI2CMaster si el ProMicro como cualquier Arduino tiene I2C Hardware?

chooselive95

Hola,

Necesito el fichero SoftI2CMaster.h ya que dentro del fichero max30102.cpp está implementado. Sino , no funcionaría.

La duda que tenía es hacer funcionar el módulo ESP32 con los ficheros que nombré en el post anterior.

Un saludo.

surbyte

#5
Jul 03, 2019, 12:56 am Last Edit: Jul 03, 2019, 01:15 am by surbyte
Y la respuesta a eso es ver si esta soportado. Tu tienes la librería mira en su interior si aparece el ESP32.
Y digo esto porque en ningún momento has puesto link de la librería mencionada. Si todo gira en torno a dicha librería lo mas acertado hubiera sido colocarlo.
Ya me ha pasado que busco librerías y como hay tantas de tantos autores, las pequeñas diferencias hace que hablemos de cosas distintas.

En esta veo código para ATMEGA de modo que no te servirá en un ESP32

Además ni siquiera menciona a los Expressif ESP8266/ESP32
Code: [Select]

#if defined(ARDUINO_AVR_FLORA8) || defined(ARDUINO_AVR_LILYPAD_USB)
#define SDA_PORT PORTD
#define SDA_PIN 1
#define SCL_PORT PORTD
#define SCL_PIN 0
#endif

#ifdef ARDUINO_AVR_UNO
#define SDA_PORT PORTC
#define SDA_PIN 4
#define SCL_PORT PORTC
#define SCL_PIN 5
#endif

#define I2C_TIMEOUT 100
#define I2C_NOINTERRUPT 0
#define I2C_SLOWMODE 1
#define FAC 1
#define I2C_CPUFREQ (F_CPU/FAC)


Por cierto, gracias por hacer caso omiso a mi pedido de que editartas el post#2

Que tal esto todo para ESP32
MAX30102 pulse oximetry and heart-rate monitor sensor and ESP32

tauro0221

Hi,
Es posible no tener problemas pues los sensores se comuninican con I2C usando dos senales el SDA y el SCK. Ahora debes de tener cuidado pues ls esp32 vienen de diferentes configuracion de los pines. Tienes que determinar cuales son los pines que coresponden para el LDA y SCK.

chooselive95

Buenas noches a todos,

Con respecto al enlace que ha enviado surbyte, ya lo he probado y en principio parece que funciona correctamente. Ahora, la duda que me surge es saber si hay alguna manera de poder visualizar los datos en un servicio web. Es decir, a partir de haber obtenido el ip en el monitor de arduino, abro una nueva pestaña en cualquier navegador web y copio la ip obtenida. Una vez realizados estos pasos, me gustaría mostrar los datos en tiempo real del sensor.
He buscado acerca de este tema y no sabría como implementar el código del enlace que enviaste con el código del esp32 conectado a una red wifi.

Acerca del mensaje enviado por tauro0221, veo que no sería posible usar el fichero SoftI2CMaster.h. Habría alguna otra opción en vez de usar este fichero??

Un saludo.

surbyte

Lo que yo te sugiero es trabajar integramente en ESP32. Para ello tienes cientos de tutoriales (no aquí) de como usarlo. Es similar al uso del ESP8266 y si puedes manejar en tiempo real y por esa razón inisistí en que no tenia sentido todo el ida y vuelta que querias hacer con dos microcontroladores cuando el ESP32 puede hacer todo con lujo de detalles.

Busca ESP32 servidor Web y cosas asi y encontrarás como trabajar. Ve de a poco.

chooselive95

Hola,

Finalmente he podido resolver las dudas que planteaba al principio. Pero me gustaría realizar un pequeño cambio. Quisiera tener una comunicación SPI en vez de la I2C utilizada hasta el momento. Sabiendo que con esta última comunicación conecto SDA con el pin 21 del módulo esp32, SCL conectado al pin 22. Me he informado acerca de los pines a usar de la comunicación SPI con el esp32 (MOSI->PIN23, MISO->PIN19, SCK->PIN18 y SS->PIN5), veo que requiere 2 conexiones más que las utilizadas en la comunicación I2C.
Cabe destacar que el módulo esp32 está conectado con la placa MAXREFDES117, la cual tiene pines SDA y SCL.
No sabría como pasar de una comunicación I2C a SPI con estos dos elementos (ESP32 y MAXREFDES117).

Un saludo.

chooselive95

Hola,

Me gustaría saber como poder cambiar el código establecido para el módulo ESP32 al módulo ESP8266.
He buscado varias soluciones pero ninguna me ha podido servir. El programa es para que se muestre en un servidor web los datos sensados del sensor MAX30102.
A continuación mando el código del ESP32:

Code: [Select]

#include <Arduino.h>
#include <Wire.h>
#include <WiFi.h>
#include <SPI.h>
#include "algorithm_by_RF.h"
#include "max30102.h"

#define DEBUG // Uncomment for debug output to the Serial stream

// Interrupt pin
const byte oxiInt = 5; // pin connected to MAX30102 INT

uint32_t elapsedTime,timeStart;
uint32_t aun_ir_buffer[BUFFER_SIZE]; //infrared LED sensor data
uint32_t aun_red_buffer[BUFFER_SIZE];  //red LED sensor data
float old_n_spo2;  // Previous SPO2 valuec
uint8_t uch_dummy,k;


//------------------Servidor Web en puerto 80---------------------

WiFiServer server(80);

//---------------------Credenciales de WiFi-----------------------

const char* ssid     = "MOVISTAR_1470";
const char* password = "YFzXwXxRws9WEuw9yCyy";

//---------------------VARIABLES GLOBALES-------------------------
int contconexion = 0;

String header; // Variable para guardar el HTTP request

//------------------------CODIGO HTML------------------------------
String paginaInicio = "<!DOCTYPE html>"
"<html>"
"<head>"
"<meta charset='utf-8' />"
"<META HTTP-EQUIV='Refresh' CONTENT='1'>"

"</head>";

String paginaFin = "</center>"

"</html>";

void setup() {

  pinMode(oxiInt, INPUT);  //pin D10 connects to the interrupt output pin of the MAX30102


  Wire.begin();

#if defined(DEBUG) || !defined(USE_ADALOGGER)
  // initialize serial communication at 115200 bits per second:
  Serial.begin(115200);
  Serial.println("Initializing...");

#endif

   // Connect to Wi-Fi network with SSID and password
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  // Print local IP address and start web server
  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  server.begin();

  maxim_max30102_reset(); //resets the MAX30102

  maxim_max30102_read_reg(REG_INTR_STATUS_1,&uch_dummy);  //Reads/clears the interrupt status register
  maxim_max30102_init();  //initialize the MAX30102
  old_n_spo2=0.0;



  while(Serial.available()==0)  //wait until user presses a key
  {
    Serial.println(F("Press any key to start conversion"));
    delay(1000);
  }
  uch_dummy=Serial.read();

  Serial.print(F("Time[s]\tSpO2\tHR\tClock\tRatio\tCorr"));

 
  timeStart=millis();
}




//Continuously taking samples from MAX30102.  Heart rate and SpO2 are calculated every ST seconds
void loop() {
  float n_spo2,ratio,correl;  //SPO2 value
  int8_t ch_spo2_valid;  //indicator to show if the SPO2 calculation is valid
  int32_t n_heart_rate; //heart rate value
  int8_t  ch_hr_valid;  //indicator to show if the heart rate calculation is valid
  int32_t i;
  char hr_str[10];

     
  //buffer length of BUFFER_SIZE stores ST seconds of samples running at FS sps
  //read BUFFER_SIZE samples, and determine the signal range
  for(i=0;i<BUFFER_SIZE;i++)
  {
    while(digitalRead(oxiInt)==1);  //wait until the interrupt pin asserts
    maxim_max30102_read_fifo((aun_red_buffer+i), (aun_ir_buffer+i));  //read from MAX30102 FIFO
#ifdef DEBUG
    Serial.print(i, DEC);
    Serial.print(F("\t"));
    Serial.print(aun_red_buffer[i], DEC);
    Serial.print(F("\t"));
    Serial.print(aun_ir_buffer[i], DEC);   
    Serial.println("");
#endif // DEBUG
  }


  //calculate heart rate and SpO2 after BUFFER_SIZE samples (ST seconds of samples) using Robert's method
  rf_heart_rate_and_oxygen_saturation(aun_ir_buffer, BUFFER_SIZE, aun_red_buffer, &n_spo2, &ch_spo2_valid, &n_heart_rate, &ch_hr_valid, &ratio, &correl);


#ifdef DEBUG
  Serial.println("--RF--");
  Serial.print(elapsedTime);
  Serial.print("\t");
  Serial.print(n_spo2);
  Serial.print("\t");
  Serial.print(n_heart_rate, DEC);
  Serial.print("\t");
  Serial.println(hr_str);
  Serial.println("------");
#endif // DEBUG
    old_n_spo2=n_spo2;

     WiFiClient client = server.available();   // Escucha a los clientes entrantes

  if (client) {                             // Si se conecta un nuevo cliente
    Serial.println("New Client.");          //
    String currentLine = "";                //
    while (client.connected()) {            // loop mientras el cliente está conectado
      if (client.available()) {             // si hay bytes para leer desde el cliente
        char c = client.read();             // lee un byte
        Serial.write(c);                    // imprime ese byte en el monitor serial
        header += c;
        if (c == '\n') {                    // si el byte es un caracter de salto de linea
          // si la nueva linea está en blanco significa que es el fin del
          // HTTP request del cliente, entonces respondemos:
          if (currentLine.length() == 0) {
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println("Connection: close");
            client.println();

              // Muestra la página web
           // Display the HTML web page
            client.println("<!DOCTYPE html><html>");
            client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
            client.println("<link rel=\"icon\" href=\"data:,\">");
            // CSS to style the table
            client.println("<style>body { text-align: center; font-family: \"Trebuchet MS\", Arial;}");
            client.println("table { border-collapse: collapse; width:35%; margin-left:auto; margin-right:auto; }");
            client.println("th { padding: 12px; background-color: #0043af; color: white; }");
            client.println("tr { border: 1px solid #ddd; padding: 12px; }");
            client.println("tr:hover { background-color: #bcbcbc; }");
            client.println("td { border: none; padding: 12px; }");
            client.println(".sensor { color:white; font-weight: bold; background-color: #bcbcbc; padding: 1px; }");

       
      //send samples and calculation result to terminal program through UART
            // Web Page Heading
            client.println("</style></head><body><h1>ESP32 with MAX30102</h1>");
            client.println("<table><tr><th>MEASUREMENT</th><th>VALUE</th></tr>");
             
            client.println("<tr><td>HR</td><td><span class=\"sensor\">");
            client.println(paginaInicio + n_heart_rate + paginaFin);
            client.println(" </span></td></tr>"); 

            client.println("<tr><td>HRValid</td><td><span class=\"sensor\">");
            client.println(paginaInicio + ch_hr_valid + paginaFin);
            client.println(" </span></td></tr>"); 
                           
            client.println("<tr><td>SPO2</td><td><span class=\"sensor\">");
            client.println(paginaInicio + n_spo2 + paginaFin);
            client.println(" </span></td></tr>"); 
                                   
            client.println("<tr><td>SPO2Valid</td><td><span class=\"sensor\">");
            client.println(paginaInicio + ch_spo2_valid + paginaFin);
            client.println(" </span></td></tr>"); 


   //After gathering 25 new samples recalculate HR and SP02
  rf_heart_rate_and_oxygen_saturation(aun_ir_buffer, BUFFER_SIZE, aun_red_buffer, &n_spo2, &ch_spo2_valid, &n_heart_rate, &ch_hr_valid, &ratio, &correl);

            // la respuesta HTTP temina con una linea en blanco
            client.println();
            break;
          } else { // si tenemos una nueva linea limpiamos currentLine
            currentLine = "";

          }
        } else if (c != '\r') {  // si C es distinto al caracter de retorno de carro
          currentLine += c;      // lo agrega al final de currentLine
        }
      }
    }
    // Limpiamos la variable header
    header = "";
    // Cerramos la conexión
    client.stop();
    Serial.println("Client disconnected.");
    Serial.println("");
  }
  }


Un saludo.

Go Up