embedded project — ESP32 simulation

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

Components

Sketch code

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// =====================================================
// PINS
// =====================================================

// Sensor inputs (from the custom chip)
#define PH_PIN          34
#define TDS_PIN         35
#define TURBIDITY_PIN   32

// Outputs - CHANGE these numbers to match your wiring
#define RELAY_PH_PIN    25   // relay 1: pH correction
#define RELAY_TDS_PIN   26   // relay 2: RO filter (TDS)
#define RELAY_TURB_PIN  27   // relay 3: sand filter (turbidity)
#define BUZZER_PIN      14
#define LED_PIN         13

// OLED
#define SCREEN_WIDTH  128
#define SCREEN_HEIGHT 64
#define OLED_RESET    -1
#define OLED_ADDRESS  0x3C
#define OLED_SDA      21
#define OLED_SCL      22

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// =====================================================
// WATER QUALITY LIMITS
// =====================================================

const float PH_MIN   = 6.5;
const float PH_MAX   = 8.5;
const float TDS_MAX  = 500.0;   // ppm
const float TURB_MAX = 5.0;     // NTU

// =====================================================
// TIMINGS (ms)
// =====================================================

const unsigned long SETUP_WAIT_MS    = 30000; // wait after start so you can set the sliders (60000 = 1 min, 30000 = 30 s)
const unsigned long READ_MS         = 3000;  // show parameters
const unsigned long GOOD_MS         = 3000;  // show GOOD result
const unsigned long BAD_MS          = 6000;  // show BAD result (2 screens)
const unsigned long FILTER_START_MS = 2500;  // "filtration started"
const unsigned long FILTER_MS       = 8000;  // filtration running
const unsigned long FILTER_DONE_MS  = 2500;  // "filtration completed"
const unsigned long RECHECK_MS      = 3000;  // "rechecking water"

// =====================================================
// ADC -> SENSOR VALUE (matches the chip's voltage mapping)
// =====================================================

float readPH(int raw)        { return raw * 14.0   / 4095.0; }
float readTDS(int raw)       { return raw * 2000.0 / 4095.0; }
float readTurbidity(int raw) { return raw * 3000.0 / 4095.0; }

int readAvg(int pin) {
  long sum = 0;
  for (int i = 0; i < 4; i++) {
    sum += analogRead(pin);
  }
  return sum / 4;
}

// =====================================================
// STATE MACHINE
// =====================================================

#define S_READ          0   // show parameters
#define S_RESULT        1   // show GOOD / BAD (+ filters needed)
#define S_FILTER_START  2   // "filtration started"
#define S_FILTERING     3   // filtration running
#define S_FILTER_DONE   4   // "filtration completed"
#define S_RECHECK       5   // "rechecking water"
#define S_MONITOR       6   // water is good, keep watching
#define S_WAIT          7   // startup: wait for slider changes

int state = S_READ;
unsigned long stateStart = 0;

float ph = 0, tds = 0, turb = 0;

More projects by manyanaik1713