carbonized bamboo · bluetooth proximity · heartbeat · warmth
63.5 × 88.9 × 12mm · playing card form factor · № 0001
Most devices demand your attention. ommphone asks for something different — your presence. A piece of carbonized bamboo that pulses with a heartbeat. That grows warm when another one is near.
Not a notification. Not a message. Just warmth. Just a heartbeat. Just the quiet signal that another human being chose the same thing you did.
Hold it. Breathe with the pulse. A double thump — lub-dub — every 7 seconds. Your breath slows to match. No instructions. No timer. No streak. Just bamboo and a heartbeat.
BLE scans continuously. Another ommphone detected nearby — the heartbeat quickens. The bamboo grows warm. The closer you get, the faster it beats. At <3m both devices sync to the same rhythm simultaneously.
Two strangers. Two devices beating in perfect phase. They both feel it at the same moment. No words needed. The device already said everything. A connection without a screen in sight.
Complete Gerber package for JLCPCB. Upload and order. 2-layer FR4, all layers included.
Complete JLCPCB SMT assembly package. BOM with LCSC part numbers. CPL with exact coordinates.
Playing card form factor. 63.5 × 88.9 × 12mm. Double groove, icon recesses, USB-C slot.
531 lines of production C. nRF5 SDK 17.1.0. Three modes, NTC safety, BLE scanning and advertising.
18-step build plan. Every cost itemised. Who does what. Every file mapped to every vendor.
Full embedded engineer job description for ITviec / TopDev HCMC. Firmware + Gerber review.
/* OMPHONE FIRMWARE v1.0 — nRF52832 Three modes: meditation · proximity · sync */ #define BEAT_INTERVAL_MEDITATION 7000 // 7s — meditation #define BEAT_INTERVAL_MIN 800 // fastest — very close #define LUB_DURATION 70 // first thump ms #define LUB_DUB_GAP 180 // gap between lub + dub #define NTC_ADC_THRESHOLD 680 // ~45°C safety cutoff static void heartbeat_beat(void) { /* Scale pulse to proximity */ uint32_t pulse = (rssi >= RSSI_CLOSE) ? MOTOR_STRONG : MOTOR_SOFT; motor_pulse(pulse); // LUB nrf_delay_ms(LUB_DUB_GAP); motor_pulse(pulse); // DUB } static void heartbeat_timer_handler(void *p) { heartbeat_beat(); heater_set_duty(proximity_to_heat(m_nearest_rssi)); uint32_t next = map_range(m_nearest_rssi, RSSI_FAR, RSSI_CLOSE, BEAT_INTERVAL_MAX, BEAT_INTERVAL_MIN); app_timer_start(m_heartbeat_timer, APP_TIMER_TICKS(next), NULL); }
| Ref | Component | Package | LCSC # | Qty |
|---|---|---|---|---|
| U1 | nRF52832 — BLE SoC | QFN-48 | C112885 | 1 |
| X1 | 32MHz Crystal | SMD-3225 | C9002 | 1 |
| U2 | TTP223 Cap Touch IC | SOT-23-6 | C80757 | 1 |
| U3 | TP4056 LiPo Charger | SOP-8 | C16581 | 1 |
| U4 | DW01A Batt Protection | SOT-23-6 | C351370 | 1 |
| Q1 | FS8205A Dual N-FET | SOT-23-6 | C32254 | 1 |
| Q2 | 2N7002 NPN MOSFET | SOT-23 | C8545 | 1 |
| J1–J4 | JST-PH 2-pin connector | JST-PH-2 | C157929 | 4 |
| J5 | USB-C Receptacle | USB-C-SMD | C2765186 | 1 |
| LED1 | Red LED 0402 | 0402 | C2286 | 1 |
| C1–C8 | MLCC 100nF / 4.7uF / 10uF | 0402 | C49678 | 8 |
| R1–R3 | Resistors 1.2k / 10k / 100Ω | 0402 | C25867 | 3 |
2-layer FR4 · HASL lead-free · all SMT · JLCPCB assembly ready
Not on the PCB — these live inside the bamboo enclosure and connect via JST-PH cables
3V DC · 70mA · glue to inner bamboo wall for resonance · connects to J2
search Amazon ↗10kΩ at 25°C · B=3950 · leads ≥80mm · sits at copper spreader · connects to J3
search Amazon ↗3.7V · JST-PH 2-pin · check polarity (red=+) before connecting · connects to J4
search Adafruit ↗5V · 15×15mm · stick under copper spreader at grip zone · connects to J1
search Amazon ↗100mm pre-crimped · pack of 10 · connects all off-board components to J1–J4
search Amazon ↗Flashes nRF52832 firmware via SWD · 4 wires to PCB · reuse forever
search Amazon ↗0.5mm thick · cut from copper sheet · sits between heating pad and bamboo surface
search Amazon ↗Double-sided · mounts heating pad and motor inside enclosure without screws
search Amazon ↗hold the rhythm · 7 seconds · no counting needed