WorkerMine — ESP32 simulation

An interactive ESP32 circuit simulation you can run free in your browser on Velxio, by kshittss.

Components

Sketch code

#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
#include <math.h>
#include <string.h>

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

#include "driver/gpio.h"
#include "driver/adc.h"
#include "driver/i2c.h"
#include "driver/uart.h"

#include "esp_log.h"


/* =========================================================
   WORKER ESP32 PIN CONFIGURATION
   ========================================================= */

/* Heart Rate potentiometer */
#define HEART_RATE_ADC       ADC1_CHANNEL_6      // GPIO34

/* SpO2 potentiometer */
#define SPO2_ADC             ADC1_CHANNEL_7      // GPIO35

/* MPU6050 */
#define MPU6050_SDA          GPIO_NUM_21
#define MPU6050_SCL          GPIO_NUM_22

/* Panic button */
#define PANIC_BUTTON_GPIO    GPIO_NUM_27


/* =========================================================
   COMMUNICATION WITH ENVIRONMENTAL ESP32
   =========================================================

   ONE-WAY COMMUNICATION

   Worker ESP32:
       GPIO25 = TX

   Environmental ESP32:
       GPIO26 = RX

   Connections:

       Worker GPIO25 TX
              |
              |
              +-----------------> Environmental GPIO26 RX

       Worker GND
              |
              +-----------------> Environmental GND

   Worker GPIO26 is NOT USED.
   Environmental GPIO25 is NOT USED.

   ========================================================= */

#define ENV_UART            UART_NUM_2

#define ENV_UART_TX         GPIO_NUM_25
#define ENV_UART_BAUD       9600

#define ENV_UART_BUF_SIZE   512


/* =========================================================
   MPU6050
   ========================================================= */

#define MPU6050_ADDR          0x68

#define MPU6050_PWR_MGMT_1    0x6B
#define MPU6050_WHO_AM_I      0x75
#define MPU6050_ACCEL_XOUT_H  0x3B
#define MPU6050_TEMP_OUT_H    0x41

#define I2C_PORT              I2C_NUM_0

#define FALL_THRESHOLD_G      2.5f

#define DEFAULT_TEMPERATURE   36.5f


/* =========================================================
   TAG
   ========================================================= */

static const char *TAG = "MineGuard";


/* =========================================================
   WORKER DATA
   ========================================================= */

typedef struct
{
    float heart_rate;
    float spo2;
    float temperature;

    bool fall_detected;
    bool panic_pressed;

} WorkerData;


/* =========================================================
   HEART RATE
   ========================================================= */

static float read_heart_rate(void)
{
    int value;

    value = adc1_get_raw(HEART_RATE_ADC);

    /*
       Potentiometer:

       0    -> 40 BPM
       4095 -> 160 BPM
    */

    return 40.0f +
           ((float)value / 4095.0f) * 120.0f;
}


/* =========================================================
   SPO2
   ========================================================= */

static float read_spo2(void)
{
    int value