Live crossing

Ion4 Smart Crossing

Adam Tas Corridor crossing, Stellenbosch · live from device crossing-01
Cloud broker: connecting Device: waiting City link: unknown Emergency

The crossing

LEFT
Waiting
Mode--
Train--
Railway gate--
Car at barrier--
Car barrier--
Trains / cars counted--
Tunnel (PIR)--
RFID reader--
RIGHT

Device screen

A live copy of the 0.96" OLED screen on the crossing pole. People waiting see the robot colour, WALK or CARS GO, a train or emergency warning, and the road conditions.

People crossing

Waiting now--nobody waiting
Average wait--sent to the city as wait_s
Last wait--press to red
Crossings served---- button presses

Environment

Road temperature----
Humidity--DHT11 sensor
Gas / smoke----
Soil moisture----
Daylight--lamp --

Priority crossing (RFID)

People who need more time (elderly, disabled, school patrol) tap a registered fob on the reader at the pole and get a longer WALK. Any other card works like the walk button.

Reader--PN532 UART on D27 / D12
Cards tapped---- priority
Last card----
Registered fobs--ready
WALK time--normal
Press "Register next card", then tap the fob on the reader within 20 s.

Live map

Where people are around the crossing, live. A person inside the crossing zone while the robots show green (cars go), or on the railway while a train is coming, is logged as an infraction. Free map (OpenStreetMap), no API key. Locations are shared only when a person presses "Share my location".

Open this page on a phone and press "Share my location" to appear on every screen.

Zones

Crossing zone (30 m): on the road and the railway
Approach zone (120 m): about to cross
You  Others  Simulated

People now 0

Nobody is sharing a location yet.

Infractions 0

None so far.

Voice announcer

The website says out loud what happens on the crossing.

Last spoken: nothing yet

Controls

Closes the crossing for 8 s, like a real train (works with or without the IR sensor). For the real sensor, pass the train or a hand 1 cm in front of it.

Gates move from here only through the hardware tests below, which run in maintenance mode and are refused while a train is on the crossing. A remote command can never lift a barrier onto a train.

Data export (CSV)

Every reading from the crossing (every 5 s) is recorded in this browser while the page is open, and the last 3,000 are kept after a refresh. Download them as CSV files for Excel, Google Sheets or the report.

0readings
0events
0infractions
0self-test results
No readings recorded yet.

Event log

Ask the crossing

AI assistant (Gemini 3.8 Flash). It sees the live crossing data with every question.

Hi, I'm the Ion4 crossing assistant. Ask me about the trains, the wait times, the environment or how the system works.
AI face call

RoboFace Live

Meet Ion4

The crossing's robot companion. It sees you through your camera, hears your questions and answers out loud, using the live data from the crossing.

Allow the camera and microphone when the browser asks. Works best in Chrome or Edge.

Sees what you show it

Every question goes with a camera frame: show it the breadboard, a sensor or the crossing and ask what it sees.

Voice conversation

Speak naturally. Ion4 listens, thinks, answers with its own voice and listens again. Tap the face to interrupt.

Knows the crossing

It reads the live state: robots, train, gates, tunnel guard, temperature, gas and wait times.

Has a personality

It blinks, looks around, smiles, winks and thinks visibly while it works out an answer.

Email alerts

Send an email when something needs attention
  • Fire or gas emergency at the crossing
  • Flooded path or ice risk on the road
  • Train on the crossing for more than 60 s
  • Device offline for more than 60 s

Each alert type sends at most once every 10 minutes. Alerts go out from this page, so keep it open on one laptop during the demo. Preview data never sends email.

Hardware test

tests locked Tests run only in maintenance mode, so the crossing is out of service while you test.

Robots (both lanes)

Lights

Buzzer

Railway gate

Car barrier

Whole crossing

Each test lasts 3 seconds (the up-and-down tests and the train drill 6 s). Gates moved by a test go back to automatic after 30 seconds. Device reply: --

Takes about 90 s. Stand by the device and watch and listen.

Boot self-test

no results yet Runs on its own after every reset: 5 s per part, the Serial Monitor says what to do.
PartResultDetail
Reset the ESP32, or press "Run self-test again" in maintenance mode.

Inputs: check each one on the real device

PartReading nowHow to check itResult
DHT temperature--Breathe on it or hold it, temperature and humidity rise--
MQ-5 gas--Unlit lighter gas near it, the value jumps--
Soil moisture--Dip the probe in water, it rises--
LDR light--Cover it with your hand, it drops--
Train sensor (IR)--Pass a hand 1 cm in front of the IR sensor: train detected--
RFID reader (PN532)--Tap the blue fob or any card on the reader--
PIR tunnel guard--Walk in front of it (wait 45 s after power-up)--
Button 1 pedestrian--Press it on the device--
Button 2 railway gate--Press it on the device--
Button 3 car barrier--Press it on the device--
Button 4 street lamp--Press it on the device--
WiFi signal--Better than -75 dBm is solid--
City mainframe link--Needs CITY_HOST in config.h--

Pinout

ESP32 DevKit V1, 30 pins, seen from the top with the USB port at the bottom. Every pin we use and what is connected to it.

LightsInputsOutputs EnvironmentPowerBoardFree

Power

Laptop USB powers the ESP32 (3V3 pin feeds DHT, soil, LDR, buzzer, OLED).
Breadboard 5V rail (power module) feeds both servos, MQ-5 and PIR. Use a power bank or adapter, a 9 V battery runs flat fast.
One GND wire joins ESP32 GND to the breadboard GND rail. Never join the two 5V supplies.

Pin connections

ESP32 Dev Board 30-pin (CP2102), labels as printed on the board. Buttons use the internal pull-up: one leg to the pin, the opposite leg to GND. Every LED has its own resistor.

PinPartWiringExtra part
Traffic robots (left and right lane share pins)
D25RED, both robotsD25 → 220Ω → LED → GND, twice2 × 220Ω
D26YELLOW, both robotsD26 → 220Ω → LED → GND, twice2 × 220Ω
D33GREEN, both robotsD33 → 100Ω to 220Ω → LED → GND, twice2 × 100Ω to 220Ω
Push buttons
D13Button 1, pedestrianD13 ↔ button ↔ GNDnone
D18Button 2, railway gateD18 ↔ button ↔ GNDnone
D19Button 3, car barrier (hold 3 s = emergency)D19 ↔ button ↔ GNDnone
D21Button 4, street lamp (hold 3 s = maintenance)D21 ↔ button ↔ GNDnone
Train sensor and gates
VNIR train sensor (TCRT5000 module, 3 pins)OUT → VN, VCC → 3V3, GND → GND; train = OUT goes LOW (range about 1 cm, blue knob)none
RX2Servo, car barrierorange → RX2, red → breadboard 5V rail, brown → GNDnone
TX2Servo, railway gateorange → TX2, red → breadboard 5V rail, brown → GNDnone
Environment
D4DHT temperature + humidity (3-pin module)S → D4, + (middle) → 3V3, − → GNDnone (pull-up on the module)
D34MQ-5 gasAO → 10kΩ → D34 → 10kΩ → GND, VCC → breadboard 5V rail2 × 10kΩ
D35Soil moistureAO → D35, VCC → 3V3, GND → GNDnone
D32LDR light sensor3V3 → LDR → D32 → 10kΩ → GND10kΩ
D22Street lamp LEDD22 → 220Ω → LED → GND220Ω
D23Buzzer module, 3 pins (− , middle, S)S → D23, middle (+) → 5V rail (louder) or 3V3, − → GNDnone
OLED screen (0.96" SSD1306, 7-pin SPI)
D14OLED SCL (clock)SCL → D14none
D15OLED SDA (data)SDA → D15none
D5OLED DCDC → D5; RES → EN; CS → GND; VCC → 3V3; GND → GNDnone
VPPIR tunnel guard (HC-SR501)OUT → VP, VCC → 5V rail, GND → GNDnone
D2Status LEDonboard, nothing to wirenone
RFID reader (Elechouse PN532 V3, UART / HSU mode)
D27RFID TXD (hole marked SDA)SDA/TXD → D27, the ESP32 receives (was the ultrasonic TRIG, free with the IR sensor)none
D12RFID RXD (hole marked SCL)SCL/RXD → D12, the ESP32 sends; VCC → 3V3, GND → GND; BOTH DIP switches OFF (HSU). D12 is safe because this board's flash voltage eFuse is set to 3.3 Vnone
Power
3V33.3V railDHT11, soil moisture, LDR, buzzer, OLED, IR sensor, RFID reader
5V railBreadboard power supply, jumper on 5V9V battery clip → its barrel jack; 5V rail → both servos, MQ-5 VCC, PIR VCCsupply module
USBESP32 powerlaptop USB powers the ESP32; do NOT also link VIN to the 5V rail
GNDCommon groundESP32 GND → breadboard GND rail: the only wire between the two supplies
VINRun without the laptopunplug USB first, then VIN → breadboard 5V rail
Reserved / free
D14Used by the OLED (was for ultrasonic 2, car)VP is now used by the PIR

Device console

Live log from the ESP32 (the same lines it prints on the Serial Monitor), plus what this website does. Everything is also written to the browser console (F12).

Waiting for the device. Lines appear here as soon as the ESP32 is on WiFi.

Serial Monitor commands (115200 baud, type a letter then Enter)

hlist the commands
pfull status line now
vraw sensor values
nmenormal, maintenance, emergency
1to4act as buttons 1 to 4
trun the boot self-test again
sskip the rest of a self-test

Download the app

The live crossing on your phone or PC, with voice alerts.

The Ion4 dashboard on a laptop, phone, tablet and monitor (concept illustration made with AI)

Android

APK file: coming soon.

Windows

Download for Windows 111 MB installer. If Windows warns you: "More info", then "Run anyway".

Linux

Download for Linux x64, 125 MB. Unzip, then run ./ion4-smart-crossing

Browser extension

Download extension
  1. Unzip it
  2. Open chrome://extensions
  3. Developer mode on, then "Load unpacked"
Chrome, Edge, Brave, Opera.

iPhone and iPad

  1. Open this site in Safari
  2. Tap Share
  3. Tap "Add to Home Screen"

Mac and Chromebook

Mac: Safari, File, "Add to Dock". Chromebook: Install app, or use the Android APK.

Tip: "Install app" works in Chrome or Edge.

Gallery

The real prototype and concept art (AI). Tap to open.

Community chat

Talk with people around the crossing. You stay anonymous. Type @Ion4 to ask the AI.

Not connected

By joining you accept the chat rules. Our AI checks every message. Messages are deleted after 7 days.

Chat rules
  • Keep it about the crossing, trains, roads, safety, weather and the town.
  • No adverts or business promotion, and no links except Ion4 links.
  • No phone numbers, emails, ID numbers or home addresses. Yours or anyone else's.
  • Be kind. No insults, threats or hate.
  • Our AI removes messages that break the rules. Tap "Report" on a message to flag it.
  • Emergency? Call 10111 or 10177 first, then use Report.

Report and emergency

Someone in danger? Call first. This website is not an emergency service. A report reaches the Ion4 team by email, not the police.

Send a report

What happened?
Location not added

Find help near me

Police stations, hospitals, clinics and fire stations near you, from OpenStreetMap.

    The crossing also has an SOS button: hold it for 2 seconds and the team is alerted.

    Terms and privacy

    Last updated 5 October 2026. By using this website you agree to these terms. If you do not agree, please do not use it.

    1. What this is

    Ion4 Smart Crossing is a prototype built by Team Ion4 during Octoco Hack the City 2026 in Stellenbosch. This website shows a working demonstration device and sample data. It is not a product, and it is not run or endorsed by the municipality or by Octoco.

    2. Not a safety system

    Never rely on this website, the device or the AI assistant to decide when it is safe to cross a road or a railway. Always follow the real traffic signals, railway signs and barriers, and look and listen for trains and cars. Readings can be late, missing or wrong.

    3. Your location

    The live map shows your position only after you press "Share my location", and only while this page is open. Your browser asks for permission first. Other visitors see a dot and a short random name, never your real name. Stop at any time by closing the page or turning off location in your browser.

    4. What data is used

    • The crossing uses no cameras and stores no names. It counts presses, wait times, trains and sensor readings.
    • RFID cards are stored only as a card number on the device, to give a longer walk time. No personal details are linked to them.
    • Readings, events and settings you choose (theme, alerts) are kept in your own browser so you can export them as CSV. Clear them at any time with "Clear stored data" or by clearing your browser data.
    • Live data travels through HiveMQ Cloud (a message service) to reach this page.

    5. AI assistant and RoboFace Live

    Questions, photos, camera pictures and the live device readings you send to the AI assistant are sent to Google Gemini to produce an answer, under Google's terms. Do not send photos of other people without their permission, or anything private. Answers can be wrong and are advice only.

    6. Email alerts

    If alerts are switched on, alert messages about the crossing (for example fire, gas or a train blocking the crossing) are sent by Formspree to the team's address. They contain device readings, not visitor data.

    7. Your rights (POPIA)

    We follow the Protection of Personal Information Act: we collect as little as possible, only for the purpose above, and only with your consent. You may ask what we hold about you, or ask us to delete it, using the contact below.

    8. Fair use

    The controls and hardware tests are for demonstrations by the team and the judges. Do not send commands to disrupt the device, try to break into the services, or overload them. We may block access that misuses the system.

    9. Ownership

    The design, code, drawings and brand "Ion4 Smart Crossing" belong to Team Ion4 (Henock, Nathan, Emmanuel and Joshua). Pictures marked "Concept illustration (AI)" were made with AI tools. Map data © OpenStreetMap contributors. Please ask before reusing our material.

    10. No warranty

    The website and device are provided "as is" for demonstration, without any warranty. As far as the law allows, Team Ion4 is not liable for any loss or harm from using them.

    11. Community chat

    • The chat is anonymous: you pick a nickname, and we do not ask for your name, number or email.
    • Every message is checked by AI (Google Gemini) before it is shown, to keep people safe and protect privacy. Messages that break the chat rules are not posted, and repeat offenders are paused.
    • No adverts or business promotion without written permission from HNK IoT Solutions. No personal details of anyone.
    • The AI may answer questions in the chat. Its answers can be wrong.
    • Messages are kept for 7 days, then deleted. Reported messages and the report reason are emailed to the team.
    • We may remove any message or block any user that misuses the chat.

    12. Reports, emergencies and SOS

    Reports you send (with your location and contact only if you add them) are checked by AI and emailed to the Ion4 team so we can alert the right people. A short note without personal details may be shown in the chat to warn others. This is not an emergency service: in danger, call 10111 (police), 10177 (ambulance and fire) or 112. The SOS button on the crossing sends an alert to the team, not to the police.

    13. Changes and contact

    We may update these terms; the date above shows the latest version. Questions or requests: speak to Team Ion4 at our table, or use the team contact in the About page.

    About Ion4 Smart Crossing

    A safer, smarter level crossing for the Adam Tas Corridor in Stellenbosch, where the R44 and the railway line split communities. One small device runs the robots, the gates and the street light, watches the road conditions, and tells the city how long people wait to cross.

    HenockNathanEmmanuelJoshua

    Team Ion4 (team ID qsoju) · Hack the City by Octoco, October 2026 · Challenge: Getting Around, moving people across the divide

    The problem

    People walking between Kayamandi, the town and the university cross busy roads and the railway with long, unpredictable waits. Planners have little data on where people wait and where they bottleneck.

    What the crossing does

    • Two robots (left and right lane) run red, red + yellow, green, yellow in sync.
    • A pedestrian button cuts the cars' green short, and the wait is measured.
    • An IR sensor at the track sees the train: bell, red robots, railway gate and car barrier down.
    • A registered RFID fob gives people who need more time a longer WALK.
    • Road temperature (ice, heat, fire), gas and smoke, and flooding are watched all the time.
    • The street light turns on by itself at night.

    Three modes

    • Normal: the robot cycle with the walk chirp.
    • Maintenance: flashing yellow; hardware tests allowed.
    • Emergency: flashing red and a siren, barrier down, railway gate open so people can leave, street light on.

    Hardware

    ESP32 (30-pin), 6 LEDs on 3 pins, 2 SG90 servos, IR train sensor, PN532 RFID reader, DHT11, MQ-5, soil moisture probe, LDR, buzzer, 4 push buttons, and a breadboard power supply for the 5 V parts. After every reset the device tests each part for 5 s.

    Software and data

    Firmware in Arduino C++ on two cores: control on one, WiFi and MQTT on the other. Every 30 s it sends uptime, average wait, road temperature and gas level to the Octoco city mainframe, with an HTTP fallback. Its status is retained, with a last will so the city knows when it goes offline. This website gets the full state over HiveMQ Cloud, with an AI assistant and email alerts.

    Why it matters

    Every press of the button becomes a data point: where people wait, for how long, and at what time of day. That is the evidence the corridor planners need to place crossings, change timings and make the case for funding.

    Cloud broker

    Brokereeb1e83a06da4b44b7a340bc19cd1e75.s1.eu.hivemq.cloud (HiveMQ Cloud)
    Device port8883 MQTT over TLS
    Website port8884 MQTT over secure WebSocket, path /mqtt
    State topicion4/crossing/state, full JSON every 5 s
    Command topicion4/crossing/cmd, for example {"cmd":"mode","val":"maintenance"}, {"cmd":"test","val":"train_drill"}, {"cmd":"self_test","val":"run"}
    People topicion4/crossing/people, phone positions from the Live map: {"id","name","lat","lng","acc"}
    Log topicion4/crossing/log, one line of text per device event (the Device console page)
    City mainframehack/qsoju/crossing-01/telemetry every 30 s and hack/qsoju/crossing-01/status (retained), on the Octoco broker