
Pura mainboard noroute
rvbcrs/PoolLab
PH‑4502C (pH bordje) JC3248W535 (ESP32‑S3) VCC ────────────────────── 3.3 V GND ────────────────────── GND PO ────────────────────── GPIO6 (ADC1CH5) DO niet aansluiten TO niet aansluiten BNC ←── pH‑electrode

PH‑4502C (pH bordje) JC3248W535 (ESP32‑S3) VCC ────────────────────── 3.3 V GND ────────────────────── GND PO ────────────────────── GPIO6 (ADC1CH5) DO niet aansluiten TO niet aansluiten BNC ←── pH‑electrode
Pura mainboard-0.4 is an open-source printed circuit board by rvbcrs, from the rvbcrs/PoolLab repository on GitHub. It is a 2-layer board of 50 × 50 mm with 39 parts on 32 nets, routed with 441 tracks and 60 vias.
It is built around the B0505S-1WR3L, ADS1115IDGST and CH224K, with the ADUM1250ARZ-RL7-HXY among its other parts. Its parts include 6 ICs, 3 diodes, 1 connector and 1 inductor. It belongs with the computers and single-board computers boards of this library.
| Onderdeel | Omschrijving |
|---|---|
| MCU | JC3248W535 — ESP32‑S3, 3.5" IPS 320×480 QSPI display, capacitief touch |
| Sensoren | 2× PH‑4502C bordje (één voor pH, één voor ORP), LM358 vervangen door MCP6002 |
| Motor driver | SparkFun ROB‑14450 / TB6612FNG |
| Pompen | 2× peristaltische pomp (pH‑dosering en ORP/chloor‑dosering) |
Belangrijk: Voed het bordje op 3.3 V, niet 5 V. De MCP6002 is rail‑to‑rail (1.8–6 V). Bij 5 V kan de analoge output bij zuur water boven 3.3 V uitkomen en de ESP32 ADC beschadigen.
PH‑4502C (pH bordje) JC3248W535 (ESP32‑S3)
VCC ────────────────────── 3.3 V
GND ────────────────────── GND
PO ────────────────────── GPIO6 (ADC1_CH5)
DO niet aansluiten
TO niet aansluiten
BNC ←── pH‑electrode
PH‑4502C (ORP bordje) JC3248W535 (ESP32‑S3)
VCC ────────────────────── 3.3 V
GND ────────────────────── GND
PO ────────────────────── GPIO7 (ADC1_CH6)
DO niet aansluiten
TO niet aansluiten
BNC ←── ORP‑electrodeGPIO6 en GPIO7 zijn vrije ADC1‑pinnen (geen WiFi‑conflict). De overige ADC1‑pinnen zijn in gebruik door QSPI‑display (21/39/40/45/47/48), touch I2C (4/8), motoren (9/14–18) en I2S‑speaker (2/41/42).
Testen zonder probe: Verbind de BNC center pin met de BNC outer ring via een 10 kΩ weerstand → simuleert 0 mV (pH 7 / 0 mV ORP) → de display toont ~pH 7.0 en ~0 mV.
Platformio.ini flags (al ingesteld voor esp32‑s3‑35):
-D USE_ANALOG_SENSORS=1
-D PH_ADC_PIN=6
-D ORP_ADC_PIN=7Kalibratie defaults (MCP6002 op 3.3 V, gain ≈ 5.2×):
| Punt | Spanning |
|---|---|
| pH 4 | ≈ 2.58 V |
| pH 7 | ≈ 1.65 V (mid‑supply) |
| pH 10 | ≈ 0.72 V |
| ORP 0 mV | ≈ 1.65 V |
Kalibreer altijd met pH 4 en pH 7 buffervloeistof voor nauwkeurige metingen. Waarden worden opgeslagen in NVS via WebUI → Settings → Calibration.
ESP32‑S3 — Analoge sensoren (PH‑4502C met MCP6002)
flowchart LR
PH_PROBE["pH‑electrode\n(BNC)"] --> PH_BOARD["PH‑4502C\n(MCP6002 op 3.3 V)"]
ORP_PROBE["ORP‑electrode\n(BNC)"] --> ORP_BOARD["PH‑4502C ORP\n(MCP6002 op 3.3 V)"]
PH_BOARD --"PO → GPIO6"--> MCU["JC3248W535\nESP32‑S3"]
ORP_BOARD --"PO → GPIO7"--> MCU
V33["3.3 V"] --> PH_BOARD
V33 --> ORP_BOARD
GND["GND"] --> PH_BOARD
GND --> ORP_BOARD
GND --> MCUESP32‑C6 — ADS1115 via I2C
flowchart LR
PH_PROBE["pH‑electrode\n(BNC)"] --> PH_BOARD["PH‑4502C"]
ORP_PROBE["ORP‑electrode\n(BNC)"] --> ORP_BOARD["PH‑4502C ORP"]
PH_BOARD --"AO → A0"--> ADS["ADS1115\n(0x48)"]
ORP_BOARD --"AO → A1"--> ADS
ADS --"SDA → GPIO18"--> MCU["ESP32‑C6"]
ADS --"SCL → GPIO19"--> MCU
V33["3.3 V"] --> ADS
GND["GND"] --> ADS
GND --> MCUESP32‑S3 — Motor driver (TB6612FNG)
flowchart LR
MCU["JC3248W535\nESP32‑S3"] --"GPIO15 IN1\nGPIO16 IN2\nGPIO17 PWM"--> M1["TB6612\nMotor A"]
MCU --"GPIO18 IN1\nGPIO14 IN2\nGPIO9 PWM"--> M2["TB6612\nMotor B"]
MCU --"GPIO46 STBY"--> M1
MCU --"GPIO46 STBY"--> M2
M1 --"A01/A02"--> PUMP1["pH‑pomp"]
M2 --"B01/B02"--> PUMP2["ORP‑pomp"]
VM["6–12 V"] --> M1
VM --> M2De C6‑build (esp32‑c6‑147) leest pH en ORP via een ADS1115 16‑bit ADC op I2C:
ADS1115 ESP32‑C6
VDD ────────── 3.3 V
GND ────────── GND
SDA ────────── GPIO18
SCL ────────── GPIO19
A0 ────────── pH AO
A1 ────────── ORP AOFlags (al ingesteld):
-D USE_ADS1115=1
-D ADS_ADDR=0x48
-D ADS_SDA=18
-D ADS_SCL=19
-D ADS_CH_PH=0
-D ADS_CH_ORP=1TB6612FNG JC3248W535 (ESP32‑S3)
VCC ────────── 3.3 V (logica)
GND ────────── GND
VM ────────── motorspanning (6–12 V)
STBY ────────── GPIO46
AIN1 ────────── GPIO15 (M1 IN1 / pH pomp)
AIN2 ────────── GPIO16 (M1 IN2)
PWMA ────────── GPIO17 (M1 PWM — LEDC CH5 / Timer 3)
BIN1 ────────── GPIO18 (M2 IN1 / ORP pomp)
BIN2 ────────── GPIO14 (M2 IN2)
PWMB ────────── GPIO9 (M2 PWM — LEDC CH4 / Timer 2)
A01/A02 ─────── Motor 1 (pH‑pomp)
B01/B02 ─────── Motor 2 (ORP‑pomp)Wat wordt bijgehouden:
Flow kalibreren:
Limieten (instelbaar in src/main.cpp):
MAX_DAILY_VOLUME = 500.0f; // ml/dag per pomp
MAX_SESSION_VOLUME = 200.0f; // ml per aanslag
MAX_SESSION_DURATION = 120; // seconden per aanslag
PH_SANITY_MIN = 4.0f;
PH_SANITY_MAX = 10.0f;
ORP_SANITY_MIN = -500.0f;
ORP_SANITY_MAX = 1500.0f;
SENSOR_TIMEOUT = 300; // seconden zonder data → alarmGedrag bij trigger:
⚠️ EMERGENCY STOP - <reden>pool/alert/<type>WhatsApp Setup (CallMeBot):
31612345678) + API key invullenMQTT Alert Topics:
pool/alert/daily_limit_m1 pool/alert/daily_limit_m2
pool/alert/session_volume_m1 pool/alert/session_volume_m2
pool/alert/session_duration_m1 pool/alert/session_duration_m2
pool/alert/ph_sanity_low pool/alert/ph_sanity_high
pool/alert/orp_sanity_low pool/alert/orp_sanity_high
pool/alert/ph_sensor_timeout pool/alert/orp_sensor_timeoutPrimaire build (ESP32‑S3 35"):
pio run -e esp32-s3-35 -t upload --upload-port <ip> # OTA
pio run -e esp32-s3-35 -t upload # USBC6 build:
pio run -e esp32-c6-147 -t uploadSeriële monitor: 115200 baud.
WiFi via captive portal:
Pura‑Setup.MQTT instelbaar via WebUI → Settings (host/port/user/pass) of in src/main.cpp:
MQTT_HOST, MQTT_PORT, MQTT_USER, MQTT_PASS, MQTT_CLIENTIDOTA: hostnaam pura-XXXXXX (chip‑ID). Upload via PlatformIO "Upload using network" of ArduinoOTA.
State:
pool/sensor/ph
pool/sensor/orp
pool/sensor/tempHome Assistant discovery:
homeassistant/sensor/pool_ph/config
homeassistant/sensor/pool_orp/config
homeassistant/sensor/pool_temp/configDrempels (write/echo):
pool/cmd/ph_min ↔ pool/cfg/ph_min
pool/cmd/ph_max ↔ pool/cfg/ph_max
pool/cmd/orp_min ↔ pool/cfg/orp_min
pool/cmd/orp_max ↔ pool/cfg/orp_max| URL | Pagina |
|---|---|
http://<ip>/ | Live sensor tiles + pump stats (WebSocket) |
http://<ip>/settings | pH/ORP drempels, pompsnelheden, flow kalibratie, MQTT |
http://<ip>/safety | Emergency status, WhatsApp config, volume resets, test alerts |
WebSocket op poort 81.
S3 LVGL watchdog: rebuild complete.| Bestand | Rol |
|---|---|
src/main.cpp | Bootvolgorde, WiFi/MQTT, Zigbee, periodic publish, safety |
src/core/Storage.{h,cpp} | NVS wrapper (drempels, snelheden, modus, volumes, config) |
src/core/boards/Esp32S3Board.{h,cpp} | S3 board: display, touch, pins, LVGL lock |
src/core/boards/Esp32C6Board.{h,cpp} | C6 board |
src/boards/BoardSelect.{h,cpp} | Board‑selectie op basis van build flag |
src/domain/Metrics.{h,cpp} | Laatste pH/ORP/temp; bron voor UI en MQTT |
src/domain/ControlPolicy.{h,cpp} | Safety logic, sanity checks, emergency stop |
src/io/AnalogPhOrpSensor.h | ADC‑lezer voor PH‑4502C via ESP32 ADC (S3) |
src/io/AdsPhOrpSensor.{h,cpp} | ADS1115 I2C lezer voor pH/ORP (C6) |
src/io/MotorController.h | Motor state machine, LEDC PWM, flow tracking |
src/io/MqttClient.{h,cpp} | PubSubClient: discovery, publish, command topics, alerts |
src/io/WebUI.{h,cpp} | Async web server: homepage, settings, safety, WebSocket, API |
src/io/ZigbeeClient.{h,cpp} | Zigbee abstractie (C6; no‑op op S3) |
src/ui/UI.{h,cpp} | LVGL UI builder (3‑card S3 / tileview C6), emergency banner |
src/domain/DummySensor.h | Gesimuleerde sensordata voor testen |
src/fonts, src/images | LVGL assets (fonts, iconen) |
pH/ORP waarden kloppen niet:
WiFi "NO_AP_FOUND": controleer SSID/ontvangst; auto‑reconnect + periodieke hard restart.
MQTT extern werkt niet, lokaal wel:
mosquitto_sub/pub voordat je het device test.Pompen werken niet:
[MOTOR] Check: MOTOR_ENABLE=1 motorsEnabled=? — beide moeten 1 zijn.Emergency stop reset niet automatisch:
WhatsApp notificaties werken niet:
31612345678).[SAFETY] WhatsApp API response: 200.Huidig:
onPh/OrpMinMaxWrite stubs voor non‑Zigbee builds (fix compile‑fout S3).core::Board.h include toegevoegd aan UI.cpp (fix UiConfig compile‑fout).AnalogPhOrpSensor 2.h, AdsPhOrpSensor 2.*).Eerder:
pool/alert/<type>.| Qty | Value | Footprint | References |
|---|---|---|---|
| 5 | 100nF | tscircuit:capacitor_0805 | C_ADS, C_ISO1, C_ISO2, C_VCC, C_VM2 |
| 4 | 4.7kΩ | tscircuit:resistor_res0805 | R_SCL, R_SCL2, R_SDA, R_SDA2 |
| 3 | 10uF | tscircuit:capacitor_0805 | C_DC_IN, C_DC_OUT, C_VM |
| 2 | 2.2kΩ | tscircuit:resistor_res0805 | R_LED, R_LED2 |
| 1 | 0Ω | tscircuit:resistor_res0805 | R_ADDR |
| 1 | 100uF | tscircuit:capacitor | C_IN |
| 1 | 10kΩ | tscircuit:resistor_res0805 | R_VSNS |
| 1 | 1kΩ | tscircuit:resistor_res0805 | R_VDD |
| 1 | 1uF | tscircuit:capacitor_0805 | C_VDD |
| 1 | 220uF | tscircuit:capacitor | C_OUT |
| 1 | 24kΩ | tscircuit:resistor_res0805 | R_CFG1 |
| 1 | 330Ω | tscircuit:resistor_res0805 | R_BLD |
| 1 | 33H | tscircuit:inductor | L1 |
| 1 | ADS1115IDGST | tscircuit:ADS1115IDGST | U3 |
| 1 | ADUM1250ARZ_RL7 | tscircuit:ADUM1250ARZ_RL7 | U6 |
| 1 | B0505S_1WR3 | tscircuit:B0505S_1WR3 | U5 |
| 1 | CH224K | tscircuit:CH224K | U1 |
| 1 | D | tscircuit:SS34 | D1 |
| 1 | J_12V | tscircuit:pin_header_pinrow2_nopinlabels | J_12V |
| 1 | J_ESP | tscircuit:pin_header_pinrow11_nopinlabels | J_ESP |
| 1 | J_M1 | tscircuit:pin_header_pinrow2_nopinlabels | J_M1 |
| 1 | J_M2 | tscircuit:pin_header_pinrow2_nopinlabels | J_M2 |
| 1 | J_PROBE | tscircuit:pin_header_pinrow4_nopinlabels | J_PROBE |
| 1 | LED | tscircuit:led_0805_color(cyan) | LED2 |
| 1 | LED | tscircuit:led_0805_color(green) | LED1 |
| 1 | LM2596S_5_0_UMW_ | tscircuit:LM2596S_5_0_UMW | U2 |
| 1 | LOGO | LOGO | G*** |
| 1 | TB6612FNG_C_8_EL | tscircuit:TB6612FNG_C_8_EL | U4 |
| 1 | TYPE_C_16PIN_2MD_073_ | tscircuit:TYPE_C_16PIN_2MD_073 | J1 |

rvbcrs/PoolLab
PH‑4502C (pH bordje) JC3248W535 (ESP32‑S3) VCC ────────────────────── 3.3 V GND ────────────────────── GND PO ────────────────────── GPIO6 (ADC1CH5) DO niet aansluiten TO niet aansluiten BNC ←── pH‑electrode

ddasdkimo/rack-atx-controller
10-host isolated ATX rack controller hardware planning, interactive 3D model and wiring documentation

PerMalmberg/IO-Card-G3
This is my custom I/O card, third generation. Main purpose is to serve as an alarm system.

CoryPearl/opencalc
A new and improved, better than the TI-84, open-source, graphing calculator

Elektropac/MCS_Control
All the firmware for Control module

Nuclear-Squid/KiCad-Templates
A KiCad plugin to save and reuse schematic + routing templates.


SrivarsanK/PranRakshak
Project README · Hardware designs · Original PCB ZIP

CodeByMika/technikerarbeit2026-hardwarepruefadapter
Im Schuljahr 2025/2026 wurde im Rahmen der Ausbildung zum staatlich geprüften Techniker diese Technikerarbeit in Zusammenarbeit mit der Gottlieb Daimler Schule 2 in Sindelfingen sowie der SOTEC GmbH & Co KG in…
It measures 50 × 50 mm and has 2 copper layers, 1.6 mm thick.
39 parts, built around the B0505S-1WR3L, ADS1115IDGST, CH224K and ADUM1250ARZ-RL7-HXY. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the rvbcrs/PoolLab repository on GitHub, at the commit this page was made from: the board is pcb/pura-mainboard-0.4.kicad/pura-mainboard-0.4.kicad_pcb and its schematic pcb/pura-mainboard-0.4.kicad/pura-mainboard-0.4.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask rvbcrs before reusing the design.