<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="nl">
	<id>https://revspace.nl/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bertrik+Sikken</id>
	<title>RevSpace - Gebruikersbijdragen [nl]</title>
	<link rel="self" type="application/atom+xml" href="https://revspace.nl/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bertrik+Sikken"/>
	<link rel="alternate" type="text/html" href="https://revspace.nl/Speciaal:Bijdragen/Bertrik_Sikken"/>
	<updated>2026-09-08T12:38:15Z</updated>
	<subtitle>Gebruikersbijdragen</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35507</id>
		<title>Its-g5</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35507"/>
		<updated>2026-09-02T13:39:28Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* WeAct ESP32-C3FH4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=ITS-G5&lt;br /&gt;
   |Picture=its-g5.png&lt;br /&gt;
   |Omschrijving=Receiving ITS-G5 signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[[File:its-g5-wireshark.png|thumb|right|alt=wireshark analysis]]&lt;br /&gt;
&lt;br /&gt;
This page is about investigating reception and processing of so-called C-ITS or ITS-G5 signals (802.11p) as used in the Netherlands, see also https://en.wikipedia.org/wiki/Vehicle-to-everything&lt;br /&gt;
These signals are exchanged between passenger cars, emergency vehicles, traffic lights and other traffic-related equipment.&lt;br /&gt;
&lt;br /&gt;
An ESP32-C5 development board is capable of receiving WiFi in the 5 GHz band and can receive/sniff these kinds of packets from live traffic.&lt;br /&gt;
&lt;br /&gt;
Stuff to investigate:&lt;br /&gt;
* Crowd-sourced live map of messages received: https://opentrafficmap.org/ Their wiki: https://wiki.opentrafficmap.org&lt;br /&gt;
* Source code for an ITS-G5 receiver https://github.com/pit711/v2x2map&lt;br /&gt;
* Simplest source code for Arduino-based sniffer: https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
* Transmitting ITS-G5 signals? https://codeberg.org/opentrafficmap/its-g5-receiver-firmware_txenabled/src/branch/main/main/tx_custom.c Would be nice to have on your bicycle! :D&lt;br /&gt;
&lt;br /&gt;
In the Netherlands, SPAT/MAPem messages from traffic lights are not transferred over wifi-p, but over UDAP.&lt;br /&gt;
You need credentials to access that data, it is not clear if it is feasible to hobbyist to access it.&lt;br /&gt;
Interesting project: https://github.com/idkmanLool9/Verkeerslicht&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
[[File:esp32-c5-sniffer.jpg|thumb|right|alt=esp32-c5-sniffer]]&lt;br /&gt;
&lt;br /&gt;
The design is:&lt;br /&gt;
* Use an esp32-c5 for sniffing 802.11p frames only&lt;br /&gt;
* Use an esp32-c3 for receiving sniffed frames from the esp32-c5, connect to WiFi and upload packets over MQTT&lt;br /&gt;
* The interface beteween the two boards is &#039;&#039;&#039;serial&#039;&#039;&#039;, this is simpler than SPI as used in other projects:&lt;br /&gt;
** Only three wires required: GND, +5V and serial DATA&lt;br /&gt;
** No hardware modification required (e.g. desolder capacitors on SPI wires of the esp32-c5)&lt;br /&gt;
** A serial interface is more universal, e.g. can be connected to an arbitrary linux SBC, to run a python bridge for example&lt;br /&gt;
** On the esp32-c5 use the same wires as the existing USB-UART bridge, so you can also receive packets over USB-serial&lt;br /&gt;
* Run a simple web server on the esp-c3:&lt;br /&gt;
** Configuration page with MQTT settings: protocol, host, port, user, pass&lt;br /&gt;
** Optional: show some nice stats: mqtt status, packet rate, last packet, packets per type&lt;br /&gt;
** Optional: run a very basic parser for e.g. CAM messages&lt;br /&gt;
* Power is provided to the esp32-c3, which then distributes power as raw 5V/GND to the esp32-c5. The esp32-c5 uses its own regulator to turn it into a stable internal supply voltage.&lt;br /&gt;
&lt;br /&gt;
Practical:&lt;br /&gt;
* The serial link runs over the USB-UART chip of the esp32-c5.&lt;br /&gt;
* A simple command processor runs on the other UART (the emulated USB serial port)&lt;br /&gt;
* On the esp32-c5 side, use pins GND, 5V, UART-TX for the ESP-ESP serial connection.&lt;br /&gt;
* The esp32-c3 and esp32-c5 share their 5V and GND power lines. Each board derives its own internal power supplies from this 5V.&lt;br /&gt;
* The serial link doesn&#039;t have to be very high speed, 115200 for example. We use a hardware UART on both sides of the serial link.&lt;br /&gt;
* Use https://registry.platformio.org/libraries/thomasfredericks/MicroSlip for framing packets over the serial port.&lt;br /&gt;
&lt;br /&gt;
=== opentraffic map interface ===&lt;br /&gt;
See https://github.com/MPW1412/openwrt-otm-bridge#wire-format-mimics-the-esp32-c5-firmware for the mqtt wire format.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/pit711/v2x2map/blob/main/firmware/main/mqtt.c&lt;br /&gt;
&lt;br /&gt;
In short: server = mqtts://cits1.opentrafficmap.org:8883 :&lt;br /&gt;
* no user name / password&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/status&#039; (online or offline), retained&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/info&#039; with a JSON string, like {&amp;quot;emac&amp;quot;:&amp;quot;xx:xx:xx:xx:xx:xx&amp;quot;,&amp;quot;ver&amp;quot;:&amp;quot;github.com/bertrik/its-g5-receiver-v0.0.1&amp;quot;,&amp;quot;hwv&amp;quot;:&amp;quot;esp32-c5-devkit-c1&amp;quot;}&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/packet&#039; for sniffed packets (raw, not JSON encoded)&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Sniffer ===&lt;br /&gt;
[[File:esp32-c5-devkitc-1.jpg|thumb|right|alt=esp32-c5]]&lt;br /&gt;
[[File:esp32-c3-supermini.jpg|thumb|right|alt=esp32-c3]]&lt;br /&gt;
&lt;br /&gt;
This project uses an ESP32-C5-devkitC-1 board for the sniffer part:&lt;br /&gt;
* Aliexpress product page https://nl.aliexpress.com/item/1005012416463528.html&lt;br /&gt;
* Espressif schematic https://dl.espressif.com/dl/schematics/SCH_ESP32-C5-DevkitC-1_V1.1_20240621.pdf . Actually my board is not exactly like this, the USB-UART is connected to pins GPIO11 (TX) and GPIO12 (RX), not GPIO25/GPIO24.&lt;br /&gt;
* Espressif devkit-c page: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c5/esp32-c5-devkitc-1/user_guide.html&lt;br /&gt;
&lt;br /&gt;
It has an onboard antenna. There are also other boards with an antenna connection, which allows using an external antenna. This may be better, I don&#039;t know yet.&lt;br /&gt;
&lt;br /&gt;
=== Bridge ===&lt;br /&gt;
&lt;br /&gt;
An ESP32-C3 is used as the bridge part. &lt;br /&gt;
&lt;br /&gt;
==== Supermini ESP32 ====&lt;br /&gt;
At first, I used a &#039;supermini&#039;.&lt;br /&gt;
&lt;br /&gt;
How to wire it up, what I did:&lt;br /&gt;
* Put both the esp32-c3-supermini board and the esp32-c5-devkit-c1 on a breadboard&lt;br /&gt;
* Use male-male dupont wires to connect:&lt;br /&gt;
** 5V to 5V, GND to GND, esp32-c5 TX to esp32-c3 RX&lt;br /&gt;
* Programmed the esp32-c5 with firmware&lt;br /&gt;
* Plug an USB-C cable into the esp32-c3, programmed it with firmware, now it&#039;s powering both the esp32-c3 and the esp32-c5&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Connections&lt;br /&gt;
|-&lt;br /&gt;
! ESP32-c5 !! ESP32-c3 !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| GND || GND || shared ground&lt;br /&gt;
|-&lt;br /&gt;
| 5V || 5V || raw power&lt;br /&gt;
|-&lt;br /&gt;
| U0TXD/GPIO11 || RX/GPIO20 || Data link&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The esp32-c3 supermini apparently has a design flaw causing it to run very hot:&lt;br /&gt;
* https://www.dailyduino.com/index.php/2026/01/20/the-spicy-esp32-c3-super-mini-when-2-boards-become-2-heaters/&lt;br /&gt;
* https://community.home-assistant.io/t/esp32-c3-supermini-getting-very-hot/980177/5&lt;br /&gt;
So in software you need to keep this in mind:&lt;br /&gt;
* lower the CPU frequency, makes a few degrees difference: this seems to make SSL network connections unreliable though&lt;br /&gt;
* allow some &#039;idle&#039; time in Arduino, e.g. using delay(50) or delay(100) in loop()&lt;br /&gt;
&lt;br /&gt;
==== WeAct ESP32-C3FH4 ====&lt;br /&gt;
I plan to try this as an alternative to the &amp;quot;supermini&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
More info: https://github.com/WeActStudio/WeActStudio.ESP32C3CoreBoard&lt;br /&gt;
&lt;br /&gt;
Is a larger board, has a PCB antenna instead of a chip antenna.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See https://github.com/bertrik/its-g5-receiver&lt;br /&gt;
&lt;br /&gt;
This is heavily inspired by https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
but with a fixed size ring buffer instead of dynamic allocation.&lt;br /&gt;
&lt;br /&gt;
=== Compiling the firmware ===&lt;br /&gt;
Uses python and platformio, see the README.md in the source archive.&lt;br /&gt;
&lt;br /&gt;
Watch packets come in:&lt;br /&gt;
  pio device monitor&lt;br /&gt;
Packets are logged as a &#039;hexdump&#039;.&lt;br /&gt;
&lt;br /&gt;
The can be converted for wireshark, for example:&lt;br /&gt;
  text2pcap -l 105 message.txt message.pcap&lt;br /&gt;
Then viewed in wireshark:&lt;br /&gt;
  wireshark message.pcap&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35505</id>
		<title>Its-g5</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35505"/>
		<updated>2026-09-01T08:49:33Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* WeAct ESP32-C3FH4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=ITS-G5&lt;br /&gt;
   |Picture=its-g5.png&lt;br /&gt;
   |Omschrijving=Receiving ITS-G5 signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[[File:its-g5-wireshark.png|thumb|right|alt=wireshark analysis]]&lt;br /&gt;
&lt;br /&gt;
This page is about investigating reception and processing of so-called C-ITS or ITS-G5 signals (802.11p) as used in the Netherlands, see also https://en.wikipedia.org/wiki/Vehicle-to-everything&lt;br /&gt;
These signals are exchanged between passenger cars, emergency vehicles, traffic lights and other traffic-related equipment.&lt;br /&gt;
&lt;br /&gt;
An ESP32-C5 development board is capable of receiving WiFi in the 5 GHz band and can receive/sniff these kinds of packets from live traffic.&lt;br /&gt;
&lt;br /&gt;
Stuff to investigate:&lt;br /&gt;
* Crowd-sourced live map of messages received: https://opentrafficmap.org/ Their wiki: https://wiki.opentrafficmap.org&lt;br /&gt;
* Source code for an ITS-G5 receiver https://github.com/pit711/v2x2map&lt;br /&gt;
* Simplest source code for Arduino-based sniffer: https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
* Transmitting ITS-G5 signals? https://codeberg.org/opentrafficmap/its-g5-receiver-firmware_txenabled/src/branch/main/main/tx_custom.c Would be nice to have on your bicycle! :D&lt;br /&gt;
&lt;br /&gt;
In the Netherlands, SPAT/MAPem messages from traffic lights are not transferred over wifi-p, but over UDAP.&lt;br /&gt;
You need credentials to access that data, it is not clear if it is feasible to hobbyist to access it.&lt;br /&gt;
Interesting project: https://github.com/idkmanLool9/Verkeerslicht&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
[[File:esp32-c5-sniffer.jpg|thumb|right|alt=esp32-c5-sniffer]]&lt;br /&gt;
&lt;br /&gt;
The design is:&lt;br /&gt;
* Use an esp32-c5 for sniffing 802.11p frames only&lt;br /&gt;
* Use an esp32-c3 for receiving sniffed frames from the esp32-c5, connect to WiFi and upload packets over MQTT&lt;br /&gt;
* The interface beteween the two boards is &#039;&#039;&#039;serial&#039;&#039;&#039;, this is simpler than SPI as used in other projects:&lt;br /&gt;
** Only three wires required: GND, +5V and serial DATA&lt;br /&gt;
** No hardware modification required (e.g. desolder capacitors on SPI wires of the esp32-c5)&lt;br /&gt;
** A serial interface is more universal, e.g. can be connected to an arbitrary linux SBC, to run a python bridge for example&lt;br /&gt;
** On the esp32-c5 use the same wires as the existing USB-UART bridge, so you can also receive packets over USB-serial&lt;br /&gt;
* Run a simple web server on the esp-c3:&lt;br /&gt;
** Configuration page with MQTT settings: protocol, host, port, user, pass&lt;br /&gt;
** Optional: show some nice stats: mqtt status, packet rate, last packet, packets per type&lt;br /&gt;
** Optional: run a very basic parser for e.g. CAM messages&lt;br /&gt;
* Power is provided to the esp32-c3, which then distributes power as raw 5V/GND to the esp32-c5. The esp32-c5 uses its own regulator to turn it into a stable internal supply voltage.&lt;br /&gt;
&lt;br /&gt;
Practical:&lt;br /&gt;
* The serial link runs over the USB-UART chip of the esp32-c5.&lt;br /&gt;
* A simple command processor runs on the other UART (the emulated USB serial port)&lt;br /&gt;
* On the esp32-c5 side, use pins GND, 5V, UART-TX for the ESP-ESP serial connection.&lt;br /&gt;
* The esp32-c3 and esp32-c5 share their 5V and GND power lines. Each board derives its own internal power supplies from this 5V.&lt;br /&gt;
* The serial link doesn&#039;t have to be very high speed, 115200 for example. We use a hardware UART on both sides of the serial link.&lt;br /&gt;
* Use https://registry.platformio.org/libraries/thomasfredericks/MicroSlip for framing packets over the serial port.&lt;br /&gt;
&lt;br /&gt;
=== opentraffic map interface ===&lt;br /&gt;
See https://github.com/MPW1412/openwrt-otm-bridge#wire-format-mimics-the-esp32-c5-firmware for the mqtt wire format.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/pit711/v2x2map/blob/main/firmware/main/mqtt.c&lt;br /&gt;
&lt;br /&gt;
In short: server = mqtts://cits1.opentrafficmap.org:8883 :&lt;br /&gt;
* no user name / password&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/status&#039; (online or offline), retained&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/info&#039; with a JSON string, like {&amp;quot;emac&amp;quot;:&amp;quot;xx:xx:xx:xx:xx:xx&amp;quot;,&amp;quot;ver&amp;quot;:&amp;quot;github.com/bertrik/its-g5-receiver-v0.0.1&amp;quot;,&amp;quot;hwv&amp;quot;:&amp;quot;esp32-c5-devkit-c1&amp;quot;}&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/packet&#039; for sniffed packets (raw, not JSON encoded)&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Sniffer ===&lt;br /&gt;
[[File:esp32-c5-devkitc-1.jpg|thumb|right|alt=esp32-c5]]&lt;br /&gt;
[[File:esp32-c3-supermini.jpg|thumb|right|alt=esp32-c3]]&lt;br /&gt;
&lt;br /&gt;
This project uses an ESP32-C5-devkitC-1 board for the sniffer part:&lt;br /&gt;
* Aliexpress product page https://nl.aliexpress.com/item/1005012416463528.html&lt;br /&gt;
* Espressif schematic https://dl.espressif.com/dl/schematics/SCH_ESP32-C5-DevkitC-1_V1.1_20240621.pdf . Actually my board is not exactly like this, the USB-UART is connected to pins GPIO11 (TX) and GPIO12 (RX), not GPIO25/GPIO24.&lt;br /&gt;
* Espressif devkit-c page: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c5/esp32-c5-devkitc-1/user_guide.html&lt;br /&gt;
&lt;br /&gt;
It has an onboard antenna. There are also other boards with an antenna connection, which allows using an external antenna. This may be better, I don&#039;t know yet.&lt;br /&gt;
&lt;br /&gt;
=== Bridge ===&lt;br /&gt;
&lt;br /&gt;
An ESP32-C3 is used as the bridge part. &lt;br /&gt;
&lt;br /&gt;
==== Supermini ESP32 ====&lt;br /&gt;
At first, I used a &#039;supermini&#039;.&lt;br /&gt;
&lt;br /&gt;
How to wire it up, what I did:&lt;br /&gt;
* Put both the esp32-c3-supermini board and the esp32-c5-devkit-c1 on a breadboard&lt;br /&gt;
* Use male-male dupont wires to connect:&lt;br /&gt;
** 5V to 5V, GND to GND, esp32-c5 TX to esp32-c3 RX&lt;br /&gt;
* Programmed the esp32-c5 with firmware&lt;br /&gt;
* Plug an USB-C cable into the esp32-c3, programmed it with firmware, now it&#039;s powering both the esp32-c3 and the esp32-c5&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Connections&lt;br /&gt;
|-&lt;br /&gt;
! ESP32-c5 !! ESP32-c3 !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| GND || GND || shared ground&lt;br /&gt;
|-&lt;br /&gt;
| 5V || 5V || raw power&lt;br /&gt;
|-&lt;br /&gt;
| U0TXD/GPIO11 || RX/GPIO20 || Data link&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The esp32-c3 supermini apparently has a design flaw causing it to run very hot:&lt;br /&gt;
* https://www.dailyduino.com/index.php/2026/01/20/the-spicy-esp32-c3-super-mini-when-2-boards-become-2-heaters/&lt;br /&gt;
* https://community.home-assistant.io/t/esp32-c3-supermini-getting-very-hot/980177/5&lt;br /&gt;
So in software you need to keep this in mind:&lt;br /&gt;
* lower the CPU frequency, makes a few degrees difference: this seems to make SSL network connections unreliable though&lt;br /&gt;
* allow some &#039;idle&#039; time in Arduino, e.g. using delay(50) or delay(100) in loop()&lt;br /&gt;
&lt;br /&gt;
==== WeAct ESP32-C3FH4 ====&lt;br /&gt;
I plan to try this as an alternative to the &amp;quot;supermini&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
More info: https://github.com/WeActStudio/WeActStudio.ESP32C3CoreBoard&lt;br /&gt;
&lt;br /&gt;
Is a larger board, has a PCB antenna instead of a chip antenna.&lt;br /&gt;
Unfortunately, this board does not have a user-controllable LED.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See https://github.com/bertrik/its-g5-receiver&lt;br /&gt;
&lt;br /&gt;
This is heavily inspired by https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
but with a fixed size ring buffer instead of dynamic allocation.&lt;br /&gt;
&lt;br /&gt;
=== Compiling the firmware ===&lt;br /&gt;
Uses python and platformio, see the README.md in the source archive.&lt;br /&gt;
&lt;br /&gt;
Watch packets come in:&lt;br /&gt;
  pio device monitor&lt;br /&gt;
Packets are logged as a &#039;hexdump&#039;.&lt;br /&gt;
&lt;br /&gt;
The can be converted for wireshark, for example:&lt;br /&gt;
  text2pcap -l 105 message.txt message.pcap&lt;br /&gt;
Then viewed in wireshark:&lt;br /&gt;
  wireshark message.pcap&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35504</id>
		<title>Its-g5</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35504"/>
		<updated>2026-08-30T21:24:46Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* WeAct ESP32-C3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=ITS-G5&lt;br /&gt;
   |Picture=its-g5.png&lt;br /&gt;
   |Omschrijving=Receiving ITS-G5 signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[[File:its-g5-wireshark.png|thumb|right|alt=wireshark analysis]]&lt;br /&gt;
&lt;br /&gt;
This page is about investigating reception and processing of so-called C-ITS or ITS-G5 signals (802.11p) as used in the Netherlands, see also https://en.wikipedia.org/wiki/Vehicle-to-everything&lt;br /&gt;
These signals are exchanged between passenger cars, emergency vehicles, traffic lights and other traffic-related equipment.&lt;br /&gt;
&lt;br /&gt;
An ESP32-C5 development board is capable of receiving WiFi in the 5 GHz band and can receive/sniff these kinds of packets from live traffic.&lt;br /&gt;
&lt;br /&gt;
Stuff to investigate:&lt;br /&gt;
* Crowd-sourced live map of messages received: https://opentrafficmap.org/ Their wiki: https://wiki.opentrafficmap.org&lt;br /&gt;
* Source code for an ITS-G5 receiver https://github.com/pit711/v2x2map&lt;br /&gt;
* Simplest source code for Arduino-based sniffer: https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
* Transmitting ITS-G5 signals? https://codeberg.org/opentrafficmap/its-g5-receiver-firmware_txenabled/src/branch/main/main/tx_custom.c Would be nice to have on your bicycle! :D&lt;br /&gt;
&lt;br /&gt;
In the Netherlands, SPAT/MAPem messages from traffic lights are not transferred over wifi-p, but over UDAP.&lt;br /&gt;
You need credentials to access that data, it is not clear if it is feasible to hobbyist to access it.&lt;br /&gt;
Interesting project: https://github.com/idkmanLool9/Verkeerslicht&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
[[File:esp32-c5-sniffer.jpg|thumb|right|alt=esp32-c5-sniffer]]&lt;br /&gt;
&lt;br /&gt;
The design is:&lt;br /&gt;
* Use an esp32-c5 for sniffing 802.11p frames only&lt;br /&gt;
* Use an esp32-c3 for receiving sniffed frames from the esp32-c5, connect to WiFi and upload packets over MQTT&lt;br /&gt;
* The interface beteween the two boards is &#039;&#039;&#039;serial&#039;&#039;&#039;, this is simpler than SPI as used in other projects:&lt;br /&gt;
** Only three wires required: GND, +5V and serial DATA&lt;br /&gt;
** No hardware modification required (e.g. desolder capacitors on SPI wires of the esp32-c5)&lt;br /&gt;
** A serial interface is more universal, e.g. can be connected to an arbitrary linux SBC, to run a python bridge for example&lt;br /&gt;
** On the esp32-c5 use the same wires as the existing USB-UART bridge, so you can also receive packets over USB-serial&lt;br /&gt;
* Run a simple web server on the esp-c3:&lt;br /&gt;
** Configuration page with MQTT settings: protocol, host, port, user, pass&lt;br /&gt;
** Optional: show some nice stats: mqtt status, packet rate, last packet, packets per type&lt;br /&gt;
** Optional: run a very basic parser for e.g. CAM messages&lt;br /&gt;
* Power is provided to the esp32-c3, which then distributes power as raw 5V/GND to the esp32-c5. The esp32-c5 uses its own regulator to turn it into a stable internal supply voltage.&lt;br /&gt;
&lt;br /&gt;
Practical:&lt;br /&gt;
* The serial link runs over the USB-UART chip of the esp32-c5.&lt;br /&gt;
* A simple command processor runs on the other UART (the emulated USB serial port)&lt;br /&gt;
* On the esp32-c5 side, use pins GND, 5V, UART-TX for the ESP-ESP serial connection.&lt;br /&gt;
* The esp32-c3 and esp32-c5 share their 5V and GND power lines. Each board derives its own internal power supplies from this 5V.&lt;br /&gt;
* The serial link doesn&#039;t have to be very high speed, 115200 for example. We use a hardware UART on both sides of the serial link.&lt;br /&gt;
* Use https://registry.platformio.org/libraries/thomasfredericks/MicroSlip for framing packets over the serial port.&lt;br /&gt;
&lt;br /&gt;
=== opentraffic map interface ===&lt;br /&gt;
See https://github.com/MPW1412/openwrt-otm-bridge#wire-format-mimics-the-esp32-c5-firmware for the mqtt wire format.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/pit711/v2x2map/blob/main/firmware/main/mqtt.c&lt;br /&gt;
&lt;br /&gt;
In short: server = mqtts://cits1.opentrafficmap.org:8883 :&lt;br /&gt;
* no user name / password&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/status&#039; (online or offline), retained&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/info&#039; with a JSON string, like {&amp;quot;emac&amp;quot;:&amp;quot;xx:xx:xx:xx:xx:xx&amp;quot;,&amp;quot;ver&amp;quot;:&amp;quot;github.com/bertrik/its-g5-receiver-v0.0.1&amp;quot;,&amp;quot;hwv&amp;quot;:&amp;quot;esp32-c5-devkit-c1&amp;quot;}&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/packet&#039; for sniffed packets (raw, not JSON encoded)&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Sniffer ===&lt;br /&gt;
[[File:esp32-c5-devkitc-1.jpg|thumb|right|alt=esp32-c5]]&lt;br /&gt;
[[File:esp32-c3-supermini.jpg|thumb|right|alt=esp32-c3]]&lt;br /&gt;
&lt;br /&gt;
This project uses an ESP32-C5-devkitC-1 board for the sniffer part:&lt;br /&gt;
* Aliexpress product page https://nl.aliexpress.com/item/1005012416463528.html&lt;br /&gt;
* Espressif schematic https://dl.espressif.com/dl/schematics/SCH_ESP32-C5-DevkitC-1_V1.1_20240621.pdf . Actually my board is not exactly like this, the USB-UART is connected to pins GPIO11 (TX) and GPIO12 (RX), not GPIO25/GPIO24.&lt;br /&gt;
* Espressif devkit-c page: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c5/esp32-c5-devkitc-1/user_guide.html&lt;br /&gt;
&lt;br /&gt;
It has an onboard antenna. There are also other boards with an antenna connection, which allows using an external antenna. This may be better, I don&#039;t know yet.&lt;br /&gt;
&lt;br /&gt;
=== Bridge ===&lt;br /&gt;
&lt;br /&gt;
An ESP32-C3 is used as the bridge part. &lt;br /&gt;
&lt;br /&gt;
==== Supermini ESP32 ====&lt;br /&gt;
At first, I used a &#039;supermini&#039;.&lt;br /&gt;
&lt;br /&gt;
How to wire it up, what I did:&lt;br /&gt;
* Put both the esp32-c3-supermini board and the esp32-c5-devkit-c1 on a breadboard&lt;br /&gt;
* Use male-male dupont wires to connect:&lt;br /&gt;
** 5V to 5V, GND to GND, esp32-c5 TX to esp32-c3 RX&lt;br /&gt;
* Programmed the esp32-c5 with firmware&lt;br /&gt;
* Plug an USB-C cable into the esp32-c3, programmed it with firmware, now it&#039;s powering both the esp32-c3 and the esp32-c5&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Connections&lt;br /&gt;
|-&lt;br /&gt;
! ESP32-c5 !! ESP32-c3 !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| GND || GND || shared ground&lt;br /&gt;
|-&lt;br /&gt;
| 5V || 5V || raw power&lt;br /&gt;
|-&lt;br /&gt;
| U0TXD/GPIO11 || RX/GPIO20 || Data link&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The esp32-c3 supermini apparently has a design flaw causing it to run very hot:&lt;br /&gt;
* https://www.dailyduino.com/index.php/2026/01/20/the-spicy-esp32-c3-super-mini-when-2-boards-become-2-heaters/&lt;br /&gt;
* https://community.home-assistant.io/t/esp32-c3-supermini-getting-very-hot/980177/5&lt;br /&gt;
So in software you need to keep this in mind:&lt;br /&gt;
* lower the CPU frequency, makes a few degrees difference: this seems to make SSL network connections unreliable though&lt;br /&gt;
* allow some &#039;idle&#039; time in Arduino, e.g. using delay(50) or delay(100) in loop()&lt;br /&gt;
&lt;br /&gt;
==== WeAct ESP32-C3FH4 ====&lt;br /&gt;
I plan to try this as an alternative to the &amp;quot;supermini&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
More info: https://github.com/WeActStudio/WeActStudio.ESP32C3CoreBoard&lt;br /&gt;
&lt;br /&gt;
Is a larger board, has a PCB antenna instead of a chip antenna.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See https://github.com/bertrik/its-g5-receiver&lt;br /&gt;
&lt;br /&gt;
This is heavily inspired by https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
but with a fixed size ring buffer instead of dynamic allocation.&lt;br /&gt;
&lt;br /&gt;
=== Compiling the firmware ===&lt;br /&gt;
Uses python and platformio, see the README.md in the source archive.&lt;br /&gt;
&lt;br /&gt;
Watch packets come in:&lt;br /&gt;
  pio device monitor&lt;br /&gt;
Packets are logged as a &#039;hexdump&#039;.&lt;br /&gt;
&lt;br /&gt;
The can be converted for wireshark, for example:&lt;br /&gt;
  text2pcap -l 105 message.txt message.pcap&lt;br /&gt;
Then viewed in wireshark:&lt;br /&gt;
  wireshark message.pcap&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35503</id>
		<title>Its-g5</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35503"/>
		<updated>2026-08-30T21:23:51Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Bridge */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=ITS-G5&lt;br /&gt;
   |Picture=its-g5.png&lt;br /&gt;
   |Omschrijving=Receiving ITS-G5 signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[[File:its-g5-wireshark.png|thumb|right|alt=wireshark analysis]]&lt;br /&gt;
&lt;br /&gt;
This page is about investigating reception and processing of so-called C-ITS or ITS-G5 signals (802.11p) as used in the Netherlands, see also https://en.wikipedia.org/wiki/Vehicle-to-everything&lt;br /&gt;
These signals are exchanged between passenger cars, emergency vehicles, traffic lights and other traffic-related equipment.&lt;br /&gt;
&lt;br /&gt;
An ESP32-C5 development board is capable of receiving WiFi in the 5 GHz band and can receive/sniff these kinds of packets from live traffic.&lt;br /&gt;
&lt;br /&gt;
Stuff to investigate:&lt;br /&gt;
* Crowd-sourced live map of messages received: https://opentrafficmap.org/ Their wiki: https://wiki.opentrafficmap.org&lt;br /&gt;
* Source code for an ITS-G5 receiver https://github.com/pit711/v2x2map&lt;br /&gt;
* Simplest source code for Arduino-based sniffer: https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
* Transmitting ITS-G5 signals? https://codeberg.org/opentrafficmap/its-g5-receiver-firmware_txenabled/src/branch/main/main/tx_custom.c Would be nice to have on your bicycle! :D&lt;br /&gt;
&lt;br /&gt;
In the Netherlands, SPAT/MAPem messages from traffic lights are not transferred over wifi-p, but over UDAP.&lt;br /&gt;
You need credentials to access that data, it is not clear if it is feasible to hobbyist to access it.&lt;br /&gt;
Interesting project: https://github.com/idkmanLool9/Verkeerslicht&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
[[File:esp32-c5-sniffer.jpg|thumb|right|alt=esp32-c5-sniffer]]&lt;br /&gt;
&lt;br /&gt;
The design is:&lt;br /&gt;
* Use an esp32-c5 for sniffing 802.11p frames only&lt;br /&gt;
* Use an esp32-c3 for receiving sniffed frames from the esp32-c5, connect to WiFi and upload packets over MQTT&lt;br /&gt;
* The interface beteween the two boards is &#039;&#039;&#039;serial&#039;&#039;&#039;, this is simpler than SPI as used in other projects:&lt;br /&gt;
** Only three wires required: GND, +5V and serial DATA&lt;br /&gt;
** No hardware modification required (e.g. desolder capacitors on SPI wires of the esp32-c5)&lt;br /&gt;
** A serial interface is more universal, e.g. can be connected to an arbitrary linux SBC, to run a python bridge for example&lt;br /&gt;
** On the esp32-c5 use the same wires as the existing USB-UART bridge, so you can also receive packets over USB-serial&lt;br /&gt;
* Run a simple web server on the esp-c3:&lt;br /&gt;
** Configuration page with MQTT settings: protocol, host, port, user, pass&lt;br /&gt;
** Optional: show some nice stats: mqtt status, packet rate, last packet, packets per type&lt;br /&gt;
** Optional: run a very basic parser for e.g. CAM messages&lt;br /&gt;
* Power is provided to the esp32-c3, which then distributes power as raw 5V/GND to the esp32-c5. The esp32-c5 uses its own regulator to turn it into a stable internal supply voltage.&lt;br /&gt;
&lt;br /&gt;
Practical:&lt;br /&gt;
* The serial link runs over the USB-UART chip of the esp32-c5.&lt;br /&gt;
* A simple command processor runs on the other UART (the emulated USB serial port)&lt;br /&gt;
* On the esp32-c5 side, use pins GND, 5V, UART-TX for the ESP-ESP serial connection.&lt;br /&gt;
* The esp32-c3 and esp32-c5 share their 5V and GND power lines. Each board derives its own internal power supplies from this 5V.&lt;br /&gt;
* The serial link doesn&#039;t have to be very high speed, 115200 for example. We use a hardware UART on both sides of the serial link.&lt;br /&gt;
* Use https://registry.platformio.org/libraries/thomasfredericks/MicroSlip for framing packets over the serial port.&lt;br /&gt;
&lt;br /&gt;
=== opentraffic map interface ===&lt;br /&gt;
See https://github.com/MPW1412/openwrt-otm-bridge#wire-format-mimics-the-esp32-c5-firmware for the mqtt wire format.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/pit711/v2x2map/blob/main/firmware/main/mqtt.c&lt;br /&gt;
&lt;br /&gt;
In short: server = mqtts://cits1.opentrafficmap.org:8883 :&lt;br /&gt;
* no user name / password&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/status&#039; (online or offline), retained&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/info&#039; with a JSON string, like {&amp;quot;emac&amp;quot;:&amp;quot;xx:xx:xx:xx:xx:xx&amp;quot;,&amp;quot;ver&amp;quot;:&amp;quot;github.com/bertrik/its-g5-receiver-v0.0.1&amp;quot;,&amp;quot;hwv&amp;quot;:&amp;quot;esp32-c5-devkit-c1&amp;quot;}&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/packet&#039; for sniffed packets (raw, not JSON encoded)&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Sniffer ===&lt;br /&gt;
[[File:esp32-c5-devkitc-1.jpg|thumb|right|alt=esp32-c5]]&lt;br /&gt;
[[File:esp32-c3-supermini.jpg|thumb|right|alt=esp32-c3]]&lt;br /&gt;
&lt;br /&gt;
This project uses an ESP32-C5-devkitC-1 board for the sniffer part:&lt;br /&gt;
* Aliexpress product page https://nl.aliexpress.com/item/1005012416463528.html&lt;br /&gt;
* Espressif schematic https://dl.espressif.com/dl/schematics/SCH_ESP32-C5-DevkitC-1_V1.1_20240621.pdf . Actually my board is not exactly like this, the USB-UART is connected to pins GPIO11 (TX) and GPIO12 (RX), not GPIO25/GPIO24.&lt;br /&gt;
* Espressif devkit-c page: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c5/esp32-c5-devkitc-1/user_guide.html&lt;br /&gt;
&lt;br /&gt;
It has an onboard antenna. There are also other boards with an antenna connection, which allows using an external antenna. This may be better, I don&#039;t know yet.&lt;br /&gt;
&lt;br /&gt;
=== Bridge ===&lt;br /&gt;
&lt;br /&gt;
An ESP32-C3 is used as the bridge part. &lt;br /&gt;
&lt;br /&gt;
==== Supermini ESP32 ====&lt;br /&gt;
At first, I used a &#039;supermini&#039;.&lt;br /&gt;
&lt;br /&gt;
How to wire it up, what I did:&lt;br /&gt;
* Put both the esp32-c3-supermini board and the esp32-c5-devkit-c1 on a breadboard&lt;br /&gt;
* Use male-male dupont wires to connect:&lt;br /&gt;
** 5V to 5V, GND to GND, esp32-c5 TX to esp32-c3 RX&lt;br /&gt;
* Programmed the esp32-c5 with firmware&lt;br /&gt;
* Plug an USB-C cable into the esp32-c3, programmed it with firmware, now it&#039;s powering both the esp32-c3 and the esp32-c5&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Connections&lt;br /&gt;
|-&lt;br /&gt;
! ESP32-c5 !! ESP32-c3 !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| GND || GND || shared ground&lt;br /&gt;
|-&lt;br /&gt;
| 5V || 5V || raw power&lt;br /&gt;
|-&lt;br /&gt;
| U0TXD/GPIO11 || RX/GPIO20 || Data link&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The esp32-c3 supermini apparently has a design flaw causing it to run very hot:&lt;br /&gt;
* https://www.dailyduino.com/index.php/2026/01/20/the-spicy-esp32-c3-super-mini-when-2-boards-become-2-heaters/&lt;br /&gt;
* https://community.home-assistant.io/t/esp32-c3-supermini-getting-very-hot/980177/5&lt;br /&gt;
So in software you need to keep this in mind:&lt;br /&gt;
* lower the CPU frequency, makes a few degrees difference: this seems to make SSL network connections unreliable though&lt;br /&gt;
* allow some &#039;idle&#039; time in Arduino, e.g. using delay(50) or delay(100) in loop()&lt;br /&gt;
&lt;br /&gt;
==== WeAct ESP32-C3 ====&lt;br /&gt;
I plan to try this as an alternative to the &amp;quot;supermini&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Is a larger board, has a PCB antenna instead of a chip antenna.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See https://github.com/bertrik/its-g5-receiver&lt;br /&gt;
&lt;br /&gt;
This is heavily inspired by https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
but with a fixed size ring buffer instead of dynamic allocation.&lt;br /&gt;
&lt;br /&gt;
=== Compiling the firmware ===&lt;br /&gt;
Uses python and platformio, see the README.md in the source archive.&lt;br /&gt;
&lt;br /&gt;
Watch packets come in:&lt;br /&gt;
  pio device monitor&lt;br /&gt;
Packets are logged as a &#039;hexdump&#039;.&lt;br /&gt;
&lt;br /&gt;
The can be converted for wireshark, for example:&lt;br /&gt;
  text2pcap -l 105 message.txt message.pcap&lt;br /&gt;
Then viewed in wireshark:&lt;br /&gt;
  wireshark message.pcap&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=MainsFrequency2.0&amp;diff=35499</id>
		<title>MainsFrequency2.0</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=MainsFrequency2.0&amp;diff=35499"/>
		<updated>2026-08-26T14:01:40Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: Bertrik Sikken heeft pagina MainsFrequency2.0 hernoemd naar GridFrequency&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#DOORVERWIJZING [[GridFrequency]]&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=GridFrequency&amp;diff=35498</id>
		<title>GridFrequency</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=GridFrequency&amp;diff=35498"/>
		<updated>2026-08-26T14:01:40Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: Bertrik Sikken heeft pagina MainsFrequency2.0 hernoemd naar GridFrequency&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=MainsFrequency2.0&lt;br /&gt;
   |Picture=gridfrequency.jpg&lt;br /&gt;
   |Omschrijving=A simple mains frequency counter&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This project is a reboot of this [[MainsFrequency|earlier main frequency counter]], aiming for more accuracy and lower latency.&lt;br /&gt;
&lt;br /&gt;
This has been achieved by using an ESP32c3 board with the &#039;phasing&#039; algorithm described below.&lt;br /&gt;
No mains interfacing hardware is required, measurement data can be easily transferred using MQTT over a WiFi network.&lt;br /&gt;
&lt;br /&gt;
=== Concept ===&lt;br /&gt;
Instead of just counting pulses from zero-crossings, we sample the actual 50 Hz waveform and try to estimate the zero-crossing as accurately as possible.&lt;br /&gt;
&lt;br /&gt;
Desired end result:&lt;br /&gt;
* get more accurate frequency measurement, aiming for 1 milli-Hertz accuracy&lt;br /&gt;
* get more responsive frequency measurement, i.e. instantaneous value (1 second), not a running average over 50 seconds.&lt;br /&gt;
&lt;br /&gt;
A suitable module for relatively safely sampling the mains voltage is this&lt;br /&gt;
[https://nl.aliexpress.com/item/1005001499454445.html ZMPT101B] module.&lt;br /&gt;
It contains a transformer and an op-amp circuit.&lt;br /&gt;
&lt;br /&gt;
More information about this module:&lt;br /&gt;
* https://www.electroschematics.com/voltage-sensor/&lt;br /&gt;
&lt;br /&gt;
=== Phasing algorithm ===&lt;br /&gt;
The algorithm is as follows:&lt;br /&gt;
* Sample the mains frequency waveform continuously at 5000 Hz&lt;br /&gt;
* Correlate each sample with a perfect 50 Hz reference waveform, by keeping a sum of the waveform multiplied by a cosine (I) and a sum of the waveform multiplied by a sine (Q)&lt;br /&gt;
* For each second, calculate the phase using the accumulated I and Q sums with atan2(Q, I).&lt;br /&gt;
* The change in phase during one second is directly proportional to the frequency deviation from the 50 Hz reference frequency&lt;br /&gt;
&lt;br /&gt;
This results in:&lt;br /&gt;
* A continuous process, with a new frequency value every second&lt;br /&gt;
* The algorithm uses *all* of the data contained in one second (there is no single threshold value), thus producing a robust value&lt;br /&gt;
* Any DC offset in the mains frequency waveform is automatically balanced out, no need to keep track of the median or quartile values&lt;br /&gt;
&lt;br /&gt;
=== Zero cross algoritm (old idea) ===&lt;br /&gt;
This is my older idea for an algorithm to get accurate instantaneous frequency:&lt;br /&gt;
* During approximately 100 ms, sample the mains frequency waveform and store it in a buffer.&lt;br /&gt;
* Calculate the median, lower and upper quartiles of the waveform amplitude data&lt;br /&gt;
* During approximately 1000 ms, sample the waveform and apply a linear regression algorithm on the waveform value (shifted by the median value)&lt;br /&gt;
* The linear regression algorithm is active in between the lower and higher quartile values and calculates an interpolated zero crossing of the waveform (with sub-sample resolution)&lt;br /&gt;
* Keep track of the first and the 50th interpolated zero-crossing time, then calculate the frequency from the time difference&lt;br /&gt;
-&amp;gt; this should give about 1 millihertz frequency resolution in one second&lt;br /&gt;
&lt;br /&gt;
== Visualisation ==&lt;br /&gt;
There are (at least) the following two ways we can output the data:&lt;br /&gt;
* publish frequency as a number over WiFi / MQTT for visualization as a graph-over-time on our grafana server&lt;br /&gt;
* idea: directly on a LED ring. The ring shows an integer number (e.g.) of 50 Hz cycles, with the color of the pixel indicating the analog value&lt;br /&gt;
* just show the relative phase angle on the LED ring, this could be a single bright pixel for the latest phase measurement and progressively dimmer pixels for older phase measurements.&lt;br /&gt;
&lt;br /&gt;
=== Analog panel meter ===&lt;br /&gt;
Get a basic panel voltage meter, make sure of the following:&lt;br /&gt;
* it measures *DC voltage*&lt;br /&gt;
* range is *3V*&lt;br /&gt;
Typically sold as &amp;quot;85c1-v&amp;quot; 3V DC.&lt;br /&gt;
&lt;br /&gt;
=== Mains waveform ring ===&lt;br /&gt;
Concepts:&lt;br /&gt;
* The LED ring shows the raw waveform over time. Position along the ring is time, intensity/color is based on the instantaneous value of the mains voltage. So (for example) three 50 Hz cycles show up as 3 dark spots and 3 light spots around the ring, approximately 120 degrees apart. Basically it shows the phase compared to a reference 50 Hz frequency.&lt;br /&gt;
* The LED ring is drawn based on a reference time (derived from the crystal oscillator), assumed to be exactly 50 Hz. A slightly fast mains waveform results in a clockwise rotation of the waveform pattern, a slightly slow mains waveform results in a counter-clockwise rotation of the waveform pattern.&lt;br /&gt;
* Use a colourful gradient, not just intensity. Example: https://github.com/FastLED/FastLED/wiki/Gradient-color-palettes&lt;br /&gt;
&lt;br /&gt;
Calculation:&lt;br /&gt;
* Mains frequency is nominally 50 Hz, so period is 20 ms (0.02 sec)&lt;br /&gt;
* With three waveforms around the ring, the ring represents 60 ms of mains signal&lt;br /&gt;
* Intended LED ring has 24 RGB LEDs, so 60ms / 24 LEDs = 2.5 ms per LED. So we could sample the waveform at 400 Hz, and put 1 sample on each LED.&lt;br /&gt;
* Example: 16 LED ring -&amp;gt; sample frequency 266.66.. Hz, or sample at 800 Hz and average 3 samples/LED&lt;br /&gt;
* Example: 40 LED ring -&amp;gt; sample frequency 666.66.. Hz, or sample at 2000 Hz and average 3 samples/LED&lt;br /&gt;
* Example: 45 LED ring -&amp;gt; sample frequency 750 Hz&lt;br /&gt;
* Example: 60 LED ring -&amp;gt; sample frequency 1000 Hz&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:luatos_esp32c3_pinout.png|right|thumb|ESP32c3 luatos board pinout]]&lt;br /&gt;
&lt;br /&gt;
=== Luatos ESP32C3 ===&lt;br /&gt;
This module (I recommend the one with serial chip) seems to work quite well so far:&lt;br /&gt;
* Senses mains waveform from surroundings with just a wire into its ADC input, using the &#039;phase&#039; software algorithm&lt;br /&gt;
* Clock crystal appears to be accurate, ESP32c3 datasheet claims it requires a 10 ppm crystal (or 0.5 mHz at 50Hz). Measured value corresponds to https://mainsfrequency.com&lt;br /&gt;
* Has WiFi, works with WifiManager library, so can easily push measurements to MQTT over WiFi for example&lt;br /&gt;
* Inexpensive, only 3 euros or so&lt;br /&gt;
&lt;br /&gt;
The ADC1/UART1 RX pin is the input for 50 Hz. You can just leave that unconnected and it will pick up 50 Hz, or perhaps connect a short piece (20 cm or so) of wire to it.&lt;br /&gt;
&lt;br /&gt;
=== Using ZMPT101B (old idea) ===&lt;br /&gt;
For measurement with an ESP8266, like a Wemos D1 mini or nodemcu, you need to put a 180k ohm resistor in line with the output from the ZMPT101B to the A0 input.&lt;br /&gt;
The A0 input already has a 220k/100k resistive divider, effectively becoming a 400k/100k resistive divider with the series resistor, scaling down the 0-5V range to the 0-1V range required for the ADC on the ESP8266.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;blue pill&amp;quot; seems to have too low accuracy of the built-in crystal, about 100 ppm, while we need about 20 ppm to get 1 mHz resolution. Notes about blue pill crystal accuracy:&lt;br /&gt;
https://sparklogic.ru/arduino-for-stm32/accurate-blue-pill-clock-frequency-adjustment.html&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Connections&lt;br /&gt;
|-&lt;br /&gt;
!ZMPT101B&lt;br /&gt;
!Wemos D1 mini&lt;br /&gt;
!Remark&lt;br /&gt;
|-&lt;br /&gt;
|GND&lt;br /&gt;
|GND&lt;br /&gt;
|Ground&lt;br /&gt;
|-&lt;br /&gt;
|VCC&lt;br /&gt;
|5V&lt;br /&gt;
|Powers the ZMPT101B from the wemos D1 mini&lt;br /&gt;
|-&lt;br /&gt;
|OUT&lt;br /&gt;
|A0&lt;br /&gt;
|Analog mains waveform, 0..5V, 180 kohm resistor in series&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
New github project: https://github.com/bertrik/GridFrequency&lt;br /&gt;
&lt;br /&gt;
To flash the esp32c3 board:&lt;br /&gt;
* Clone the code from github:&lt;br /&gt;
  git clone https://github.com/bertrik/GridFrequency&lt;br /&gt;
  cd GridFrequency&lt;br /&gt;
* Set up a python virtual environment and install platformio&lt;br /&gt;
  python3 -m venv .venv&lt;br /&gt;
  source .venv/bin/activate&lt;br /&gt;
  pip3 install platformio&lt;br /&gt;
* Connect the board, compile and upload&lt;br /&gt;
  pio run -t upload&lt;br /&gt;
* Connect over WiFi to the access point inside the ESP32&lt;br /&gt;
* Configure your WiFi credentials on 192.168.4.1&lt;br /&gt;
* Connect with serial terminal, to watch frequency measurements&lt;br /&gt;
  pio device monitor&lt;br /&gt;
&lt;br /&gt;
== Integration into revspace sensor infrastructure ==&lt;br /&gt;
There is a measurement device present at revspace (above the green tool board). It sends frequency data to the revspace MQTT server once every 5 seconds.&lt;br /&gt;
&lt;br /&gt;
Processing of this data into something that our grafana can display is unfortunately broken (is that documented somewhere anyway!?), see:&lt;br /&gt;
https://revspace.nl/grafiekjes/d/3deykmVmz/power?orgId=1&amp;amp;refresh=1m&lt;br /&gt;
&lt;br /&gt;
You can watch the data (using mosquitto for example):&lt;br /&gt;
  mosquitto_sub -h revspace.nl -t revspace/sensors/ac/frequency -v&lt;br /&gt;
Example data:&lt;br /&gt;
  topic = &amp;quot;revspace/sensors/ac/frequency&amp;quot;, payload = &amp;quot;50.025 Hz&amp;quot; (retained)&lt;br /&gt;
&lt;br /&gt;
In the #revspace IRC channel, you can issue a command to show the most recently known value:&lt;br /&gt;
  !netfrequentie&lt;br /&gt;
(where is the script that handles this?)&lt;br /&gt;
Example data:&lt;br /&gt;
  23:00 &amp;lt;@bertrik&amp;gt; !netfrequentie&lt;br /&gt;
  23:00 &amp;lt;@bar&amp;gt; bertrik: 49.898 Hz&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Bestand:Gridfrequency.jpg&amp;diff=35497</id>
		<title>Bestand:Gridfrequency.jpg</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Bestand:Gridfrequency.jpg&amp;diff=35497"/>
		<updated>2026-08-26T13:21:33Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=GridFrequency&amp;diff=35496</id>
		<title>GridFrequency</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=GridFrequency&amp;diff=35496"/>
		<updated>2026-08-26T13:21:22Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=MainsFrequency2.0&lt;br /&gt;
   |Picture=gridfrequency.jpg&lt;br /&gt;
   |Omschrijving=A simple mains frequency counter&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This project is a reboot of this [[MainsFrequency|earlier main frequency counter]], aiming for more accuracy and lower latency.&lt;br /&gt;
&lt;br /&gt;
This has been achieved by using an ESP32c3 board with the &#039;phasing&#039; algorithm described below.&lt;br /&gt;
No mains interfacing hardware is required, measurement data can be easily transferred using MQTT over a WiFi network.&lt;br /&gt;
&lt;br /&gt;
=== Concept ===&lt;br /&gt;
Instead of just counting pulses from zero-crossings, we sample the actual 50 Hz waveform and try to estimate the zero-crossing as accurately as possible.&lt;br /&gt;
&lt;br /&gt;
Desired end result:&lt;br /&gt;
* get more accurate frequency measurement, aiming for 1 milli-Hertz accuracy&lt;br /&gt;
* get more responsive frequency measurement, i.e. instantaneous value (1 second), not a running average over 50 seconds.&lt;br /&gt;
&lt;br /&gt;
A suitable module for relatively safely sampling the mains voltage is this&lt;br /&gt;
[https://nl.aliexpress.com/item/1005001499454445.html ZMPT101B] module.&lt;br /&gt;
It contains a transformer and an op-amp circuit.&lt;br /&gt;
&lt;br /&gt;
More information about this module:&lt;br /&gt;
* https://www.electroschematics.com/voltage-sensor/&lt;br /&gt;
&lt;br /&gt;
=== Phasing algorithm ===&lt;br /&gt;
The algorithm is as follows:&lt;br /&gt;
* Sample the mains frequency waveform continuously at 5000 Hz&lt;br /&gt;
* Correlate each sample with a perfect 50 Hz reference waveform, by keeping a sum of the waveform multiplied by a cosine (I) and a sum of the waveform multiplied by a sine (Q)&lt;br /&gt;
* For each second, calculate the phase using the accumulated I and Q sums with atan2(Q, I).&lt;br /&gt;
* The change in phase during one second is directly proportional to the frequency deviation from the 50 Hz reference frequency&lt;br /&gt;
&lt;br /&gt;
This results in:&lt;br /&gt;
* A continuous process, with a new frequency value every second&lt;br /&gt;
* The algorithm uses *all* of the data contained in one second (there is no single threshold value), thus producing a robust value&lt;br /&gt;
* Any DC offset in the mains frequency waveform is automatically balanced out, no need to keep track of the median or quartile values&lt;br /&gt;
&lt;br /&gt;
=== Zero cross algoritm (old idea) ===&lt;br /&gt;
This is my older idea for an algorithm to get accurate instantaneous frequency:&lt;br /&gt;
* During approximately 100 ms, sample the mains frequency waveform and store it in a buffer.&lt;br /&gt;
* Calculate the median, lower and upper quartiles of the waveform amplitude data&lt;br /&gt;
* During approximately 1000 ms, sample the waveform and apply a linear regression algorithm on the waveform value (shifted by the median value)&lt;br /&gt;
* The linear regression algorithm is active in between the lower and higher quartile values and calculates an interpolated zero crossing of the waveform (with sub-sample resolution)&lt;br /&gt;
* Keep track of the first and the 50th interpolated zero-crossing time, then calculate the frequency from the time difference&lt;br /&gt;
-&amp;gt; this should give about 1 millihertz frequency resolution in one second&lt;br /&gt;
&lt;br /&gt;
== Visualisation ==&lt;br /&gt;
There are (at least) the following two ways we can output the data:&lt;br /&gt;
* publish frequency as a number over WiFi / MQTT for visualization as a graph-over-time on our grafana server&lt;br /&gt;
* idea: directly on a LED ring. The ring shows an integer number (e.g.) of 50 Hz cycles, with the color of the pixel indicating the analog value&lt;br /&gt;
* just show the relative phase angle on the LED ring, this could be a single bright pixel for the latest phase measurement and progressively dimmer pixels for older phase measurements.&lt;br /&gt;
&lt;br /&gt;
=== Analog panel meter ===&lt;br /&gt;
Get a basic panel voltage meter, make sure of the following:&lt;br /&gt;
* it measures *DC voltage*&lt;br /&gt;
* range is *3V*&lt;br /&gt;
Typically sold as &amp;quot;85c1-v&amp;quot; 3V DC.&lt;br /&gt;
&lt;br /&gt;
=== Mains waveform ring ===&lt;br /&gt;
Concepts:&lt;br /&gt;
* The LED ring shows the raw waveform over time. Position along the ring is time, intensity/color is based on the instantaneous value of the mains voltage. So (for example) three 50 Hz cycles show up as 3 dark spots and 3 light spots around the ring, approximately 120 degrees apart. Basically it shows the phase compared to a reference 50 Hz frequency.&lt;br /&gt;
* The LED ring is drawn based on a reference time (derived from the crystal oscillator), assumed to be exactly 50 Hz. A slightly fast mains waveform results in a clockwise rotation of the waveform pattern, a slightly slow mains waveform results in a counter-clockwise rotation of the waveform pattern.&lt;br /&gt;
* Use a colourful gradient, not just intensity. Example: https://github.com/FastLED/FastLED/wiki/Gradient-color-palettes&lt;br /&gt;
&lt;br /&gt;
Calculation:&lt;br /&gt;
* Mains frequency is nominally 50 Hz, so period is 20 ms (0.02 sec)&lt;br /&gt;
* With three waveforms around the ring, the ring represents 60 ms of mains signal&lt;br /&gt;
* Intended LED ring has 24 RGB LEDs, so 60ms / 24 LEDs = 2.5 ms per LED. So we could sample the waveform at 400 Hz, and put 1 sample on each LED.&lt;br /&gt;
* Example: 16 LED ring -&amp;gt; sample frequency 266.66.. Hz, or sample at 800 Hz and average 3 samples/LED&lt;br /&gt;
* Example: 40 LED ring -&amp;gt; sample frequency 666.66.. Hz, or sample at 2000 Hz and average 3 samples/LED&lt;br /&gt;
* Example: 45 LED ring -&amp;gt; sample frequency 750 Hz&lt;br /&gt;
* Example: 60 LED ring -&amp;gt; sample frequency 1000 Hz&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:luatos_esp32c3_pinout.png|right|thumb|ESP32c3 luatos board pinout]]&lt;br /&gt;
&lt;br /&gt;
=== Luatos ESP32C3 ===&lt;br /&gt;
This module (I recommend the one with serial chip) seems to work quite well so far:&lt;br /&gt;
* Senses mains waveform from surroundings with just a wire into its ADC input, using the &#039;phase&#039; software algorithm&lt;br /&gt;
* Clock crystal appears to be accurate, ESP32c3 datasheet claims it requires a 10 ppm crystal (or 0.5 mHz at 50Hz). Measured value corresponds to https://mainsfrequency.com&lt;br /&gt;
* Has WiFi, works with WifiManager library, so can easily push measurements to MQTT over WiFi for example&lt;br /&gt;
* Inexpensive, only 3 euros or so&lt;br /&gt;
&lt;br /&gt;
The ADC1/UART1 RX pin is the input for 50 Hz. You can just leave that unconnected and it will pick up 50 Hz, or perhaps connect a short piece (20 cm or so) of wire to it.&lt;br /&gt;
&lt;br /&gt;
=== Using ZMPT101B (old idea) ===&lt;br /&gt;
For measurement with an ESP8266, like a Wemos D1 mini or nodemcu, you need to put a 180k ohm resistor in line with the output from the ZMPT101B to the A0 input.&lt;br /&gt;
The A0 input already has a 220k/100k resistive divider, effectively becoming a 400k/100k resistive divider with the series resistor, scaling down the 0-5V range to the 0-1V range required for the ADC on the ESP8266.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;blue pill&amp;quot; seems to have too low accuracy of the built-in crystal, about 100 ppm, while we need about 20 ppm to get 1 mHz resolution. Notes about blue pill crystal accuracy:&lt;br /&gt;
https://sparklogic.ru/arduino-for-stm32/accurate-blue-pill-clock-frequency-adjustment.html&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Connections&lt;br /&gt;
|-&lt;br /&gt;
!ZMPT101B&lt;br /&gt;
!Wemos D1 mini&lt;br /&gt;
!Remark&lt;br /&gt;
|-&lt;br /&gt;
|GND&lt;br /&gt;
|GND&lt;br /&gt;
|Ground&lt;br /&gt;
|-&lt;br /&gt;
|VCC&lt;br /&gt;
|5V&lt;br /&gt;
|Powers the ZMPT101B from the wemos D1 mini&lt;br /&gt;
|-&lt;br /&gt;
|OUT&lt;br /&gt;
|A0&lt;br /&gt;
|Analog mains waveform, 0..5V, 180 kohm resistor in series&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
New github project: https://github.com/bertrik/GridFrequency&lt;br /&gt;
&lt;br /&gt;
To flash the esp32c3 board:&lt;br /&gt;
* Clone the code from github:&lt;br /&gt;
  git clone https://github.com/bertrik/GridFrequency&lt;br /&gt;
  cd GridFrequency&lt;br /&gt;
* Set up a python virtual environment and install platformio&lt;br /&gt;
  python3 -m venv .venv&lt;br /&gt;
  source .venv/bin/activate&lt;br /&gt;
  pip3 install platformio&lt;br /&gt;
* Connect the board, compile and upload&lt;br /&gt;
  pio run -t upload&lt;br /&gt;
* Connect over WiFi to the access point inside the ESP32&lt;br /&gt;
* Configure your WiFi credentials on 192.168.4.1&lt;br /&gt;
* Connect with serial terminal, to watch frequency measurements&lt;br /&gt;
  pio device monitor&lt;br /&gt;
&lt;br /&gt;
== Integration into revspace sensor infrastructure ==&lt;br /&gt;
There is a measurement device present at revspace (above the green tool board). It sends frequency data to the revspace MQTT server once every 5 seconds.&lt;br /&gt;
&lt;br /&gt;
Processing of this data into something that our grafana can display is unfortunately broken (is that documented somewhere anyway!?), see:&lt;br /&gt;
https://revspace.nl/grafiekjes/d/3deykmVmz/power?orgId=1&amp;amp;refresh=1m&lt;br /&gt;
&lt;br /&gt;
You can watch the data (using mosquitto for example):&lt;br /&gt;
  mosquitto_sub -h revspace.nl -t revspace/sensors/ac/frequency -v&lt;br /&gt;
Example data:&lt;br /&gt;
  topic = &amp;quot;revspace/sensors/ac/frequency&amp;quot;, payload = &amp;quot;50.025 Hz&amp;quot; (retained)&lt;br /&gt;
&lt;br /&gt;
In the #revspace IRC channel, you can issue a command to show the most recently known value:&lt;br /&gt;
  !netfrequentie&lt;br /&gt;
(where is the script that handles this?)&lt;br /&gt;
Example data:&lt;br /&gt;
  23:00 &amp;lt;@bertrik&amp;gt; !netfrequentie&lt;br /&gt;
  23:00 &amp;lt;@bar&amp;gt; bertrik: 49.898 Hz&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=GridFrequency&amp;diff=35495</id>
		<title>GridFrequency</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=GridFrequency&amp;diff=35495"/>
		<updated>2026-08-26T13:13:17Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Analog panel meter */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=MainsFrequency2.0&lt;br /&gt;
   |Picture=ZMPT101B.png&lt;br /&gt;
   |Omschrijving=A simple mains frequency counter&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This project is a reboot of this [[MainsFrequency|earlier main frequency counter]], aiming for more accuracy and lower latency.&lt;br /&gt;
&lt;br /&gt;
This has been achieved by using an ESP32c3 board with the &#039;phasing&#039; algorithm described below.&lt;br /&gt;
No mains interfacing hardware is required, measurement data can be easily transferred using MQTT over a WiFi network.&lt;br /&gt;
&lt;br /&gt;
=== Concept ===&lt;br /&gt;
Instead of just counting pulses from zero-crossings, we sample the actual 50 Hz waveform and try to estimate the zero-crossing as accurately as possible.&lt;br /&gt;
&lt;br /&gt;
Desired end result:&lt;br /&gt;
* get more accurate frequency measurement, aiming for 1 milli-Hertz accuracy&lt;br /&gt;
* get more responsive frequency measurement, i.e. instantaneous value (1 second), not a running average over 50 seconds.&lt;br /&gt;
&lt;br /&gt;
A suitable module for relatively safely sampling the mains voltage is this&lt;br /&gt;
[https://nl.aliexpress.com/item/1005001499454445.html ZMPT101B] module.&lt;br /&gt;
It contains a transformer and an op-amp circuit.&lt;br /&gt;
&lt;br /&gt;
More information about this module:&lt;br /&gt;
* https://www.electroschematics.com/voltage-sensor/&lt;br /&gt;
&lt;br /&gt;
=== Phasing algorithm ===&lt;br /&gt;
The algorithm is as follows:&lt;br /&gt;
* Sample the mains frequency waveform continuously at 5000 Hz&lt;br /&gt;
* Correlate each sample with a perfect 50 Hz reference waveform, by keeping a sum of the waveform multiplied by a cosine (I) and a sum of the waveform multiplied by a sine (Q)&lt;br /&gt;
* For each second, calculate the phase using the accumulated I and Q sums with atan2(Q, I).&lt;br /&gt;
* The change in phase during one second is directly proportional to the frequency deviation from the 50 Hz reference frequency&lt;br /&gt;
&lt;br /&gt;
This results in:&lt;br /&gt;
* A continuous process, with a new frequency value every second&lt;br /&gt;
* The algorithm uses *all* of the data contained in one second (there is no single threshold value), thus producing a robust value&lt;br /&gt;
* Any DC offset in the mains frequency waveform is automatically balanced out, no need to keep track of the median or quartile values&lt;br /&gt;
&lt;br /&gt;
=== Zero cross algoritm (old idea) ===&lt;br /&gt;
This is my older idea for an algorithm to get accurate instantaneous frequency:&lt;br /&gt;
* During approximately 100 ms, sample the mains frequency waveform and store it in a buffer.&lt;br /&gt;
* Calculate the median, lower and upper quartiles of the waveform amplitude data&lt;br /&gt;
* During approximately 1000 ms, sample the waveform and apply a linear regression algorithm on the waveform value (shifted by the median value)&lt;br /&gt;
* The linear regression algorithm is active in between the lower and higher quartile values and calculates an interpolated zero crossing of the waveform (with sub-sample resolution)&lt;br /&gt;
* Keep track of the first and the 50th interpolated zero-crossing time, then calculate the frequency from the time difference&lt;br /&gt;
-&amp;gt; this should give about 1 millihertz frequency resolution in one second&lt;br /&gt;
&lt;br /&gt;
== Visualisation ==&lt;br /&gt;
There are (at least) the following two ways we can output the data:&lt;br /&gt;
* publish frequency as a number over WiFi / MQTT for visualization as a graph-over-time on our grafana server&lt;br /&gt;
* idea: directly on a LED ring. The ring shows an integer number (e.g.) of 50 Hz cycles, with the color of the pixel indicating the analog value&lt;br /&gt;
* just show the relative phase angle on the LED ring, this could be a single bright pixel for the latest phase measurement and progressively dimmer pixels for older phase measurements.&lt;br /&gt;
&lt;br /&gt;
=== Analog panel meter ===&lt;br /&gt;
Get a basic panel voltage meter, make sure of the following:&lt;br /&gt;
* it measures *DC voltage*&lt;br /&gt;
* range is *3V*&lt;br /&gt;
Typically sold as &amp;quot;85c1-v&amp;quot; 3V DC.&lt;br /&gt;
&lt;br /&gt;
=== Mains waveform ring ===&lt;br /&gt;
Concepts:&lt;br /&gt;
* The LED ring shows the raw waveform over time. Position along the ring is time, intensity/color is based on the instantaneous value of the mains voltage. So (for example) three 50 Hz cycles show up as 3 dark spots and 3 light spots around the ring, approximately 120 degrees apart. Basically it shows the phase compared to a reference 50 Hz frequency.&lt;br /&gt;
* The LED ring is drawn based on a reference time (derived from the crystal oscillator), assumed to be exactly 50 Hz. A slightly fast mains waveform results in a clockwise rotation of the waveform pattern, a slightly slow mains waveform results in a counter-clockwise rotation of the waveform pattern.&lt;br /&gt;
* Use a colourful gradient, not just intensity. Example: https://github.com/FastLED/FastLED/wiki/Gradient-color-palettes&lt;br /&gt;
&lt;br /&gt;
Calculation:&lt;br /&gt;
* Mains frequency is nominally 50 Hz, so period is 20 ms (0.02 sec)&lt;br /&gt;
* With three waveforms around the ring, the ring represents 60 ms of mains signal&lt;br /&gt;
* Intended LED ring has 24 RGB LEDs, so 60ms / 24 LEDs = 2.5 ms per LED. So we could sample the waveform at 400 Hz, and put 1 sample on each LED.&lt;br /&gt;
* Example: 16 LED ring -&amp;gt; sample frequency 266.66.. Hz, or sample at 800 Hz and average 3 samples/LED&lt;br /&gt;
* Example: 40 LED ring -&amp;gt; sample frequency 666.66.. Hz, or sample at 2000 Hz and average 3 samples/LED&lt;br /&gt;
* Example: 45 LED ring -&amp;gt; sample frequency 750 Hz&lt;br /&gt;
* Example: 60 LED ring -&amp;gt; sample frequency 1000 Hz&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:luatos_esp32c3_pinout.png|right|thumb|ESP32c3 luatos board pinout]]&lt;br /&gt;
&lt;br /&gt;
=== Luatos ESP32C3 ===&lt;br /&gt;
This module (I recommend the one with serial chip) seems to work quite well so far:&lt;br /&gt;
* Senses mains waveform from surroundings with just a wire into its ADC input, using the &#039;phase&#039; software algorithm&lt;br /&gt;
* Clock crystal appears to be accurate, ESP32c3 datasheet claims it requires a 10 ppm crystal (or 0.5 mHz at 50Hz). Measured value corresponds to https://mainsfrequency.com&lt;br /&gt;
* Has WiFi, works with WifiManager library, so can easily push measurements to MQTT over WiFi for example&lt;br /&gt;
* Inexpensive, only 3 euros or so&lt;br /&gt;
&lt;br /&gt;
The ADC1/UART1 RX pin is the input for 50 Hz. You can just leave that unconnected and it will pick up 50 Hz, or perhaps connect a short piece (20 cm or so) of wire to it.&lt;br /&gt;
&lt;br /&gt;
=== Using ZMPT101B (old idea) ===&lt;br /&gt;
For measurement with an ESP8266, like a Wemos D1 mini or nodemcu, you need to put a 180k ohm resistor in line with the output from the ZMPT101B to the A0 input.&lt;br /&gt;
The A0 input already has a 220k/100k resistive divider, effectively becoming a 400k/100k resistive divider with the series resistor, scaling down the 0-5V range to the 0-1V range required for the ADC on the ESP8266.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;blue pill&amp;quot; seems to have too low accuracy of the built-in crystal, about 100 ppm, while we need about 20 ppm to get 1 mHz resolution. Notes about blue pill crystal accuracy:&lt;br /&gt;
https://sparklogic.ru/arduino-for-stm32/accurate-blue-pill-clock-frequency-adjustment.html&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Connections&lt;br /&gt;
|-&lt;br /&gt;
!ZMPT101B&lt;br /&gt;
!Wemos D1 mini&lt;br /&gt;
!Remark&lt;br /&gt;
|-&lt;br /&gt;
|GND&lt;br /&gt;
|GND&lt;br /&gt;
|Ground&lt;br /&gt;
|-&lt;br /&gt;
|VCC&lt;br /&gt;
|5V&lt;br /&gt;
|Powers the ZMPT101B from the wemos D1 mini&lt;br /&gt;
|-&lt;br /&gt;
|OUT&lt;br /&gt;
|A0&lt;br /&gt;
|Analog mains waveform, 0..5V, 180 kohm resistor in series&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
New github project: https://github.com/bertrik/GridFrequency&lt;br /&gt;
&lt;br /&gt;
To flash the esp32c3 board:&lt;br /&gt;
* Clone the code from github:&lt;br /&gt;
  git clone https://github.com/bertrik/GridFrequency&lt;br /&gt;
  cd GridFrequency&lt;br /&gt;
* Set up a python virtual environment and install platformio&lt;br /&gt;
  python3 -m venv .venv&lt;br /&gt;
  source .venv/bin/activate&lt;br /&gt;
  pip3 install platformio&lt;br /&gt;
* Connect the board, compile and upload&lt;br /&gt;
  pio run -t upload&lt;br /&gt;
* Connect over WiFi to the access point inside the ESP32&lt;br /&gt;
* Configure your WiFi credentials on 192.168.4.1&lt;br /&gt;
* Connect with serial terminal, to watch frequency measurements&lt;br /&gt;
  pio device monitor&lt;br /&gt;
&lt;br /&gt;
== Integration into revspace sensor infrastructure ==&lt;br /&gt;
There is a measurement device present at revspace (above the green tool board). It sends frequency data to the revspace MQTT server once every 5 seconds.&lt;br /&gt;
&lt;br /&gt;
Processing of this data into something that our grafana can display is unfortunately broken (is that documented somewhere anyway!?), see:&lt;br /&gt;
https://revspace.nl/grafiekjes/d/3deykmVmz/power?orgId=1&amp;amp;refresh=1m&lt;br /&gt;
&lt;br /&gt;
You can watch the data (using mosquitto for example):&lt;br /&gt;
  mosquitto_sub -h revspace.nl -t revspace/sensors/ac/frequency -v&lt;br /&gt;
Example data:&lt;br /&gt;
  topic = &amp;quot;revspace/sensors/ac/frequency&amp;quot;, payload = &amp;quot;50.025 Hz&amp;quot; (retained)&lt;br /&gt;
&lt;br /&gt;
In the #revspace IRC channel, you can issue a command to show the most recently known value:&lt;br /&gt;
  !netfrequentie&lt;br /&gt;
(where is the script that handles this?)&lt;br /&gt;
Example data:&lt;br /&gt;
  23:00 &amp;lt;@bertrik&amp;gt; !netfrequentie&lt;br /&gt;
  23:00 &amp;lt;@bar&amp;gt; bertrik: 49.898 Hz&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=GridFrequency&amp;diff=35494</id>
		<title>GridFrequency</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=GridFrequency&amp;diff=35494"/>
		<updated>2026-08-26T12:34:09Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Visualisation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {{Project&lt;br /&gt;
   |Name=MainsFrequency2.0&lt;br /&gt;
   |Picture=ZMPT101B.png&lt;br /&gt;
   |Omschrijving=A simple mains frequency counter&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This project is a reboot of this [[MainsFrequency|earlier main frequency counter]], aiming for more accuracy and lower latency.&lt;br /&gt;
&lt;br /&gt;
This has been achieved by using an ESP32c3 board with the &#039;phasing&#039; algorithm described below.&lt;br /&gt;
No mains interfacing hardware is required, measurement data can be easily transferred using MQTT over a WiFi network.&lt;br /&gt;
&lt;br /&gt;
=== Concept ===&lt;br /&gt;
Instead of just counting pulses from zero-crossings, we sample the actual 50 Hz waveform and try to estimate the zero-crossing as accurately as possible.&lt;br /&gt;
&lt;br /&gt;
Desired end result:&lt;br /&gt;
* get more accurate frequency measurement, aiming for 1 milli-Hertz accuracy&lt;br /&gt;
* get more responsive frequency measurement, i.e. instantaneous value (1 second), not a running average over 50 seconds.&lt;br /&gt;
&lt;br /&gt;
A suitable module for relatively safely sampling the mains voltage is this&lt;br /&gt;
[https://nl.aliexpress.com/item/1005001499454445.html ZMPT101B] module.&lt;br /&gt;
It contains a transformer and an op-amp circuit.&lt;br /&gt;
&lt;br /&gt;
More information about this module:&lt;br /&gt;
* https://www.electroschematics.com/voltage-sensor/&lt;br /&gt;
&lt;br /&gt;
=== Phasing algorithm ===&lt;br /&gt;
The algorithm is as follows:&lt;br /&gt;
* Sample the mains frequency waveform continuously at 5000 Hz&lt;br /&gt;
* Correlate each sample with a perfect 50 Hz reference waveform, by keeping a sum of the waveform multiplied by a cosine (I) and a sum of the waveform multiplied by a sine (Q)&lt;br /&gt;
* For each second, calculate the phase using the accumulated I and Q sums with atan2(Q, I).&lt;br /&gt;
* The change in phase during one second is directly proportional to the frequency deviation from the 50 Hz reference frequency&lt;br /&gt;
&lt;br /&gt;
This results in:&lt;br /&gt;
* A continuous process, with a new frequency value every second&lt;br /&gt;
* The algorithm uses *all* of the data contained in one second (there is no single threshold value), thus producing a robust value&lt;br /&gt;
* Any DC offset in the mains frequency waveform is automatically balanced out, no need to keep track of the median or quartile values&lt;br /&gt;
&lt;br /&gt;
=== Zero cross algoritm (old idea) ===&lt;br /&gt;
This is my older idea for an algorithm to get accurate instantaneous frequency:&lt;br /&gt;
* During approximately 100 ms, sample the mains frequency waveform and store it in a buffer.&lt;br /&gt;
* Calculate the median, lower and upper quartiles of the waveform amplitude data&lt;br /&gt;
* During approximately 1000 ms, sample the waveform and apply a linear regression algorithm on the waveform value (shifted by the median value)&lt;br /&gt;
* The linear regression algorithm is active in between the lower and higher quartile values and calculates an interpolated zero crossing of the waveform (with sub-sample resolution)&lt;br /&gt;
* Keep track of the first and the 50th interpolated zero-crossing time, then calculate the frequency from the time difference&lt;br /&gt;
-&amp;gt; this should give about 1 millihertz frequency resolution in one second&lt;br /&gt;
&lt;br /&gt;
== Visualisation ==&lt;br /&gt;
There are (at least) the following two ways we can output the data:&lt;br /&gt;
* publish frequency as a number over WiFi / MQTT for visualization as a graph-over-time on our grafana server&lt;br /&gt;
* idea: directly on a LED ring. The ring shows an integer number (e.g.) of 50 Hz cycles, with the color of the pixel indicating the analog value&lt;br /&gt;
* just show the relative phase angle on the LED ring, this could be a single bright pixel for the latest phase measurement and progressively dimmer pixels for older phase measurements.&lt;br /&gt;
&lt;br /&gt;
=== Analog panel meter ===&lt;br /&gt;
Get a basic panel voltage meter, make sure of the following:&lt;br /&gt;
* it measures DC *voltage*&lt;br /&gt;
* range is *3V*&lt;br /&gt;
Typically sold as &amp;quot;85c1-v&amp;quot; 3V DC.&lt;br /&gt;
&lt;br /&gt;
=== Mains waveform ring ===&lt;br /&gt;
Concepts:&lt;br /&gt;
* The LED ring shows the raw waveform over time. Position along the ring is time, intensity/color is based on the instantaneous value of the mains voltage. So (for example) three 50 Hz cycles show up as 3 dark spots and 3 light spots around the ring, approximately 120 degrees apart. Basically it shows the phase compared to a reference 50 Hz frequency.&lt;br /&gt;
* The LED ring is drawn based on a reference time (derived from the crystal oscillator), assumed to be exactly 50 Hz. A slightly fast mains waveform results in a clockwise rotation of the waveform pattern, a slightly slow mains waveform results in a counter-clockwise rotation of the waveform pattern.&lt;br /&gt;
* Use a colourful gradient, not just intensity. Example: https://github.com/FastLED/FastLED/wiki/Gradient-color-palettes&lt;br /&gt;
&lt;br /&gt;
Calculation:&lt;br /&gt;
* Mains frequency is nominally 50 Hz, so period is 20 ms (0.02 sec)&lt;br /&gt;
* With three waveforms around the ring, the ring represents 60 ms of mains signal&lt;br /&gt;
* Intended LED ring has 24 RGB LEDs, so 60ms / 24 LEDs = 2.5 ms per LED. So we could sample the waveform at 400 Hz, and put 1 sample on each LED.&lt;br /&gt;
* Example: 16 LED ring -&amp;gt; sample frequency 266.66.. Hz, or sample at 800 Hz and average 3 samples/LED&lt;br /&gt;
* Example: 40 LED ring -&amp;gt; sample frequency 666.66.. Hz, or sample at 2000 Hz and average 3 samples/LED&lt;br /&gt;
* Example: 45 LED ring -&amp;gt; sample frequency 750 Hz&lt;br /&gt;
* Example: 60 LED ring -&amp;gt; sample frequency 1000 Hz&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:luatos_esp32c3_pinout.png|right|thumb|ESP32c3 luatos board pinout]]&lt;br /&gt;
&lt;br /&gt;
=== Luatos ESP32C3 ===&lt;br /&gt;
This module (I recommend the one with serial chip) seems to work quite well so far:&lt;br /&gt;
* Senses mains waveform from surroundings with just a wire into its ADC input, using the &#039;phase&#039; software algorithm&lt;br /&gt;
* Clock crystal appears to be accurate, ESP32c3 datasheet claims it requires a 10 ppm crystal (or 0.5 mHz at 50Hz). Measured value corresponds to https://mainsfrequency.com&lt;br /&gt;
* Has WiFi, works with WifiManager library, so can easily push measurements to MQTT over WiFi for example&lt;br /&gt;
* Inexpensive, only 3 euros or so&lt;br /&gt;
&lt;br /&gt;
The ADC1/UART1 RX pin is the input for 50 Hz. You can just leave that unconnected and it will pick up 50 Hz, or perhaps connect a short piece (20 cm or so) of wire to it.&lt;br /&gt;
&lt;br /&gt;
=== Using ZMPT101B (old idea) ===&lt;br /&gt;
For measurement with an ESP8266, like a Wemos D1 mini or nodemcu, you need to put a 180k ohm resistor in line with the output from the ZMPT101B to the A0 input.&lt;br /&gt;
The A0 input already has a 220k/100k resistive divider, effectively becoming a 400k/100k resistive divider with the series resistor, scaling down the 0-5V range to the 0-1V range required for the ADC on the ESP8266.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;blue pill&amp;quot; seems to have too low accuracy of the built-in crystal, about 100 ppm, while we need about 20 ppm to get 1 mHz resolution. Notes about blue pill crystal accuracy:&lt;br /&gt;
https://sparklogic.ru/arduino-for-stm32/accurate-blue-pill-clock-frequency-adjustment.html&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Connections&lt;br /&gt;
|-&lt;br /&gt;
!ZMPT101B&lt;br /&gt;
!Wemos D1 mini&lt;br /&gt;
!Remark&lt;br /&gt;
|-&lt;br /&gt;
|GND&lt;br /&gt;
|GND&lt;br /&gt;
|Ground&lt;br /&gt;
|-&lt;br /&gt;
|VCC&lt;br /&gt;
|5V&lt;br /&gt;
|Powers the ZMPT101B from the wemos D1 mini&lt;br /&gt;
|-&lt;br /&gt;
|OUT&lt;br /&gt;
|A0&lt;br /&gt;
|Analog mains waveform, 0..5V, 180 kohm resistor in series&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
New github project: https://github.com/bertrik/GridFrequency&lt;br /&gt;
&lt;br /&gt;
To flash the esp32c3 board:&lt;br /&gt;
* Clone the code from github:&lt;br /&gt;
  git clone https://github.com/bertrik/GridFrequency&lt;br /&gt;
  cd GridFrequency&lt;br /&gt;
* Set up a python virtual environment and install platformio&lt;br /&gt;
  python3 -m venv .venv&lt;br /&gt;
  source .venv/bin/activate&lt;br /&gt;
  pip3 install platformio&lt;br /&gt;
* Connect the board, compile and upload&lt;br /&gt;
  pio run -t upload&lt;br /&gt;
* Connect over WiFi to the access point inside the ESP32&lt;br /&gt;
* Configure your WiFi credentials on 192.168.4.1&lt;br /&gt;
* Connect with serial terminal, to watch frequency measurements&lt;br /&gt;
  pio device monitor&lt;br /&gt;
&lt;br /&gt;
== Integration into revspace sensor infrastructure ==&lt;br /&gt;
There is a measurement device present at revspace (above the green tool board). It sends frequency data to the revspace MQTT server once every 5 seconds.&lt;br /&gt;
&lt;br /&gt;
Processing of this data into something that our grafana can display is unfortunately broken (is that documented somewhere anyway!?), see:&lt;br /&gt;
https://revspace.nl/grafiekjes/d/3deykmVmz/power?orgId=1&amp;amp;refresh=1m&lt;br /&gt;
&lt;br /&gt;
You can watch the data (using mosquitto for example):&lt;br /&gt;
  mosquitto_sub -h revspace.nl -t revspace/sensors/ac/frequency -v&lt;br /&gt;
Example data:&lt;br /&gt;
  topic = &amp;quot;revspace/sensors/ac/frequency&amp;quot;, payload = &amp;quot;50.025 Hz&amp;quot; (retained)&lt;br /&gt;
&lt;br /&gt;
In the #revspace IRC channel, you can issue a command to show the most recently known value:&lt;br /&gt;
  !netfrequentie&lt;br /&gt;
(where is the script that handles this?)&lt;br /&gt;
Example data:&lt;br /&gt;
  23:00 &amp;lt;@bertrik&amp;gt; !netfrequentie&lt;br /&gt;
  23:00 &amp;lt;@bar&amp;gt; bertrik: 49.898 Hz&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35492</id>
		<title>Its-g5</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35492"/>
		<updated>2026-08-25T09:07:17Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Bridge */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=ITS-G5&lt;br /&gt;
   |Picture=its-g5.png&lt;br /&gt;
   |Omschrijving=Receiving ITS-G5 signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[[File:its-g5-wireshark.png|thumb|right|alt=wireshark analysis]]&lt;br /&gt;
&lt;br /&gt;
This page is about investigating reception and processing of so-called C-ITS or ITS-G5 signals (802.11p) as used in the Netherlands, see also https://en.wikipedia.org/wiki/Vehicle-to-everything&lt;br /&gt;
These signals are exchanged between passenger cars, emergency vehicles, traffic lights and other traffic-related equipment.&lt;br /&gt;
&lt;br /&gt;
An ESP32-C5 development board is capable of receiving WiFi in the 5 GHz band and can receive/sniff these kinds of packets from live traffic.&lt;br /&gt;
&lt;br /&gt;
Stuff to investigate:&lt;br /&gt;
* Crowd-sourced live map of messages received: https://opentrafficmap.org/ Their wiki: https://wiki.opentrafficmap.org&lt;br /&gt;
* Source code for an ITS-G5 receiver https://github.com/pit711/v2x2map&lt;br /&gt;
* Simplest source code for Arduino-based sniffer: https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
* Transmitting ITS-G5 signals? https://codeberg.org/opentrafficmap/its-g5-receiver-firmware_txenabled/src/branch/main/main/tx_custom.c Would be nice to have on your bicycle! :D&lt;br /&gt;
&lt;br /&gt;
In the Netherlands, SPAT/MAPem messages from traffic lights are not transferred over wifi-p, but over UDAP.&lt;br /&gt;
You need credentials to access that data, it is not clear if it is feasible to hobbyist to access it.&lt;br /&gt;
Interesting project: https://github.com/idkmanLool9/Verkeerslicht&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
[[File:esp32-c5-sniffer.jpg|thumb|right|alt=esp32-c5-sniffer]]&lt;br /&gt;
&lt;br /&gt;
The design is:&lt;br /&gt;
* Use an esp32-c5 for sniffing 802.11p frames only&lt;br /&gt;
* Use an esp32-c3 for receiving sniffed frames from the esp32-c5, connect to WiFi and upload packets over MQTT&lt;br /&gt;
* The interface beteween the two boards is &#039;&#039;&#039;serial&#039;&#039;&#039;, this is simpler than SPI as used in other projects:&lt;br /&gt;
** Only three wires required: GND, +5V and serial DATA&lt;br /&gt;
** No hardware modification required (e.g. desolder capacitors on SPI wires of the esp32-c5)&lt;br /&gt;
** A serial interface is more universal, e.g. can be connected to an arbitrary linux SBC, to run a python bridge for example&lt;br /&gt;
** On the esp32-c5 use the same wires as the existing USB-UART bridge, so you can also receive packets over USB-serial&lt;br /&gt;
* Run a simple web server on the esp-c3:&lt;br /&gt;
** Configuration page with MQTT settings: protocol, host, port, user, pass&lt;br /&gt;
** Optional: show some nice stats: mqtt status, packet rate, last packet, packets per type&lt;br /&gt;
** Optional: run a very basic parser for e.g. CAM messages&lt;br /&gt;
* Power is provided to the esp32-c3, which then distributes power as raw 5V/GND to the esp32-c5. The esp32-c5 uses its own regulator to turn it into a stable internal supply voltage.&lt;br /&gt;
&lt;br /&gt;
Practical:&lt;br /&gt;
* The serial link runs over the USB-UART chip of the esp32-c5.&lt;br /&gt;
* A simple command processor runs on the other UART (the emulated USB serial port)&lt;br /&gt;
* On the esp32-c5 side, use pins GND, 5V, UART-TX for the ESP-ESP serial connection.&lt;br /&gt;
* The esp32-c3 and esp32-c5 share their 5V and GND power lines. Each board derives its own internal power supplies from this 5V.&lt;br /&gt;
* The serial link doesn&#039;t have to be very high speed, 115200 for example. We use a hardware UART on both sides of the serial link.&lt;br /&gt;
* Use https://registry.platformio.org/libraries/thomasfredericks/MicroSlip for framing packets over the serial port.&lt;br /&gt;
&lt;br /&gt;
=== opentraffic map interface ===&lt;br /&gt;
See https://github.com/MPW1412/openwrt-otm-bridge#wire-format-mimics-the-esp32-c5-firmware for the mqtt wire format.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/pit711/v2x2map/blob/main/firmware/main/mqtt.c&lt;br /&gt;
&lt;br /&gt;
In short: server = mqtts://cits1.opentrafficmap.org:8883 :&lt;br /&gt;
* no user name / password&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/status&#039; (online or offline), retained&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/info&#039; with a JSON string, like {&amp;quot;emac&amp;quot;:&amp;quot;xx:xx:xx:xx:xx:xx&amp;quot;,&amp;quot;ver&amp;quot;:&amp;quot;github.com/bertrik/its-g5-receiver-v0.0.1&amp;quot;,&amp;quot;hwv&amp;quot;:&amp;quot;esp32-c5-devkit-c1&amp;quot;}&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/packet&#039; for sniffed packets (raw, not JSON encoded)&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Sniffer ===&lt;br /&gt;
[[File:esp32-c5-devkitc-1.jpg|thumb|right|alt=esp32-c5]]&lt;br /&gt;
[[File:esp32-c3-supermini.jpg|thumb|right|alt=esp32-c3]]&lt;br /&gt;
&lt;br /&gt;
This project uses an ESP32-C5-devkitC-1 board for the sniffer part:&lt;br /&gt;
* Aliexpress product page https://nl.aliexpress.com/item/1005012416463528.html&lt;br /&gt;
* Espressif schematic https://dl.espressif.com/dl/schematics/SCH_ESP32-C5-DevkitC-1_V1.1_20240621.pdf . Actually my board is not exactly like this, the USB-UART is connected to pins GPIO11 (TX) and GPIO12 (RX), not GPIO25/GPIO24.&lt;br /&gt;
* Espressif devkit-c page: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c5/esp32-c5-devkitc-1/user_guide.html&lt;br /&gt;
&lt;br /&gt;
It has an onboard antenna. There are also other boards with an antenna connection, which allows using an external antenna. This may be better, I don&#039;t know yet.&lt;br /&gt;
&lt;br /&gt;
=== Bridge ===&lt;br /&gt;
An ESP32-C3 is used as the bridge part. I used a &#039;supermini&#039;.&lt;br /&gt;
&lt;br /&gt;
How to wire it up, what I did:&lt;br /&gt;
* Put both the esp32-c3-supermini board and the esp32-c5-devkit-c1 on a breadboard&lt;br /&gt;
* Use male-male dupont wires to connect:&lt;br /&gt;
** 5V to 5V, GND to GND, esp32-c5 TX to esp32-c3 RX&lt;br /&gt;
* Programmed the esp32-c5 with firmware&lt;br /&gt;
* Plug an USB-C cable into the esp32-c3, programmed it with firmware, now it&#039;s powering both the esp32-c3 and the esp32-c5&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Connections&lt;br /&gt;
|-&lt;br /&gt;
! ESP32-c5 !! ESP32-c3 !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| GND || GND || shared ground&lt;br /&gt;
|-&lt;br /&gt;
| 5V || 5V || raw power&lt;br /&gt;
|-&lt;br /&gt;
| U0TXD/GPIO11 || RX/GPIO20 || Data link&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The esp32-c3 supermini apparently has a design flaw causing it to run very hot:&lt;br /&gt;
* https://www.dailyduino.com/index.php/2026/01/20/the-spicy-esp32-c3-super-mini-when-2-boards-become-2-heaters/&lt;br /&gt;
* https://community.home-assistant.io/t/esp32-c3-supermini-getting-very-hot/980177/5&lt;br /&gt;
So in software you need to keep this in mind:&lt;br /&gt;
* lower the CPU frequency, makes a few degrees difference: this seems to make SSL network connections unreliable though&lt;br /&gt;
* allow some &#039;idle&#039; time in Arduino, e.g. using delay(50) or delay(100) in loop()&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See https://github.com/bertrik/its-g5-receiver&lt;br /&gt;
&lt;br /&gt;
This is heavily inspired by https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
but with a fixed size ring buffer instead of dynamic allocation.&lt;br /&gt;
&lt;br /&gt;
=== Compiling the firmware ===&lt;br /&gt;
Uses python and platformio, see the README.md in the source archive.&lt;br /&gt;
&lt;br /&gt;
Watch packets come in:&lt;br /&gt;
  pio device monitor&lt;br /&gt;
Packets are logged as a &#039;hexdump&#039;.&lt;br /&gt;
&lt;br /&gt;
The can be converted for wireshark, for example:&lt;br /&gt;
  text2pcap -l 105 message.txt message.pcap&lt;br /&gt;
Then viewed in wireshark:&lt;br /&gt;
  wireshark message.pcap&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35488</id>
		<title>Its-g5</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35488"/>
		<updated>2026-08-22T08:57:14Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Bridge */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=ITS-G5&lt;br /&gt;
   |Picture=its-g5.png&lt;br /&gt;
   |Omschrijving=Receiving ITS-G5 signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[[File:its-g5-wireshark.png|thumb|right|alt=wireshark analysis]]&lt;br /&gt;
&lt;br /&gt;
This page is about investigating reception and processing of so-called C-ITS or ITS-G5 signals (802.11p) as used in the Netherlands, see also https://en.wikipedia.org/wiki/Vehicle-to-everything&lt;br /&gt;
These signals are exchanged between passenger cars, emergency vehicles, traffic lights and other traffic-related equipment.&lt;br /&gt;
&lt;br /&gt;
An ESP32-C5 development board is capable of receiving WiFi in the 5 GHz band and can receive/sniff these kinds of packets from live traffic.&lt;br /&gt;
&lt;br /&gt;
Stuff to investigate:&lt;br /&gt;
* Crowd-sourced live map of messages received: https://opentrafficmap.org/ Their wiki: https://wiki.opentrafficmap.org&lt;br /&gt;
* Source code for an ITS-G5 receiver https://github.com/pit711/v2x2map&lt;br /&gt;
* Simplest source code for Arduino-based sniffer: https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
* Transmitting ITS-G5 signals? https://codeberg.org/opentrafficmap/its-g5-receiver-firmware_txenabled/src/branch/main/main/tx_custom.c Would be nice to have on your bicycle! :D&lt;br /&gt;
&lt;br /&gt;
In the Netherlands, SPAT/MAPem messages from traffic lights are not transferred over wifi-p, but over UDAP.&lt;br /&gt;
You need credentials to access that data, it is not clear if it is feasible to hobbyist to access it.&lt;br /&gt;
Interesting project: https://github.com/idkmanLool9/Verkeerslicht&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
[[File:esp32-c5-sniffer.jpg|thumb|right|alt=esp32-c5-sniffer]]&lt;br /&gt;
&lt;br /&gt;
The design is:&lt;br /&gt;
* Use an esp32-c5 for sniffing 802.11p frames only&lt;br /&gt;
* Use an esp32-c3 for receiving sniffed frames from the esp32-c5, connect to WiFi and upload packets over MQTT&lt;br /&gt;
* The interface beteween the two boards is &#039;&#039;&#039;serial&#039;&#039;&#039;, this is simpler than SPI as used in other projects:&lt;br /&gt;
** Only three wires required: GND, +5V and serial DATA&lt;br /&gt;
** No hardware modification required (e.g. desolder capacitors on SPI wires of the esp32-c5)&lt;br /&gt;
** A serial interface is more universal, e.g. can be connected to an arbitrary linux SBC, to run a python bridge for example&lt;br /&gt;
** On the esp32-c5 use the same wires as the existing USB-UART bridge, so you can also receive packets over USB-serial&lt;br /&gt;
* Run a simple web server on the esp-c3:&lt;br /&gt;
** Configuration page with MQTT settings: protocol, host, port, user, pass&lt;br /&gt;
** Optional: show some nice stats: mqtt status, packet rate, last packet, packets per type&lt;br /&gt;
** Optional: run a very basic parser for e.g. CAM messages&lt;br /&gt;
* Power is provided to the esp32-c3, which then distributes power as raw 5V/GND to the esp32-c5. The esp32-c5 uses its own regulator to turn it into a stable internal supply voltage.&lt;br /&gt;
&lt;br /&gt;
Practical:&lt;br /&gt;
* The serial link runs over the USB-UART chip of the esp32-c5.&lt;br /&gt;
* A simple command processor runs on the other UART (the emulated USB serial port)&lt;br /&gt;
* On the esp32-c5 side, use pins GND, 5V, UART-TX for the ESP-ESP serial connection.&lt;br /&gt;
* The esp32-c3 and esp32-c5 share their 5V and GND power lines. Each board derives its own internal power supplies from this 5V.&lt;br /&gt;
* The serial link doesn&#039;t have to be very high speed, 115200 for example. We use a hardware UART on both sides of the serial link.&lt;br /&gt;
* Use https://registry.platformio.org/libraries/thomasfredericks/MicroSlip for framing packets over the serial port.&lt;br /&gt;
&lt;br /&gt;
=== opentraffic map interface ===&lt;br /&gt;
See https://github.com/MPW1412/openwrt-otm-bridge#wire-format-mimics-the-esp32-c5-firmware for the mqtt wire format.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/pit711/v2x2map/blob/main/firmware/main/mqtt.c&lt;br /&gt;
&lt;br /&gt;
In short: server = mqtts://cits1.opentrafficmap.org:8883 :&lt;br /&gt;
* no user name / password&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/status&#039; (online or offline), retained&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/info&#039; with a JSON string, like {&amp;quot;emac&amp;quot;:&amp;quot;xx:xx:xx:xx:xx:xx&amp;quot;,&amp;quot;ver&amp;quot;:&amp;quot;github.com/bertrik/its-g5-receiver-v0.0.1&amp;quot;,&amp;quot;hwv&amp;quot;:&amp;quot;esp32-c5-devkit-c1&amp;quot;}&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/packet&#039; for sniffed packets (raw, not JSON encoded)&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Sniffer ===&lt;br /&gt;
[[File:esp32-c5-devkitc-1.jpg|thumb|right|alt=esp32-c5]]&lt;br /&gt;
[[File:esp32-c3-supermini.jpg|thumb|right|alt=esp32-c3]]&lt;br /&gt;
&lt;br /&gt;
This project uses an ESP32-C5-devkitC-1 board for the sniffer part:&lt;br /&gt;
* Aliexpress product page https://nl.aliexpress.com/item/1005012416463528.html&lt;br /&gt;
* Espressif schematic https://dl.espressif.com/dl/schematics/SCH_ESP32-C5-DevkitC-1_V1.1_20240621.pdf . Actually my board is not exactly like this, the USB-UART is connected to pins GPIO11 (TX) and GPIO12 (RX), not GPIO25/GPIO24.&lt;br /&gt;
* Espressif devkit-c page: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c5/esp32-c5-devkitc-1/user_guide.html&lt;br /&gt;
&lt;br /&gt;
It has an onboard antenna. There are also other boards with an antenna connection, which allows using an external antenna. This may be better, I don&#039;t know yet.&lt;br /&gt;
&lt;br /&gt;
=== Bridge ===&lt;br /&gt;
An ESP32-C3 is used as the bridge part. I used a &#039;supermini&#039;.&lt;br /&gt;
&lt;br /&gt;
How to wire it up, what I did:&lt;br /&gt;
* Put both the esp32-c3-supermini board and the esp32-c5-devkit-c1 on a breadboard&lt;br /&gt;
* Use male-male dupont wires to connect:&lt;br /&gt;
** 5V to 5V, GND to GND, esp32-c5 TX to esp32-c3 RX&lt;br /&gt;
* Programmed the esp32-c5 with firmware&lt;br /&gt;
* Plug an USB-C cable into the esp32-c3, programmed it with firmware, now it&#039;s powering both the esp32-c3 and the esp32-c5&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Connections&lt;br /&gt;
|-&lt;br /&gt;
! ESP32-c5 !! ESP32-c3 !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| GND || GND || shared ground&lt;br /&gt;
|-&lt;br /&gt;
| 5V || 5V || raw power&lt;br /&gt;
|-&lt;br /&gt;
| U0TXD/GPIO11 || RX/GPIO20 || Data link&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The esp32-c3 supermini apparently has a design flaw causing them to run very hot:&lt;br /&gt;
* https://www.dailyduino.com/index.php/2026/01/20/the-spicy-esp32-c3-super-mini-when-2-boards-become-2-heaters/&lt;br /&gt;
* https://community.home-assistant.io/t/esp32-c3-supermini-getting-very-hot/980177/5&lt;br /&gt;
So in software you need to keep this in mind:&lt;br /&gt;
* lower the CPU frequency, makes a few degrees difference: this seems to make SSL network connections unreliable though&lt;br /&gt;
* allow some &#039;idle&#039; time in Arduino, e.g. using delay(50) or delay(100) in loop()&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See https://github.com/bertrik/its-g5-receiver&lt;br /&gt;
&lt;br /&gt;
This is heavily inspired by https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
but with a fixed size ring buffer instead of dynamic allocation.&lt;br /&gt;
&lt;br /&gt;
=== Compiling the firmware ===&lt;br /&gt;
Uses python and platformio, see the README.md in the source archive.&lt;br /&gt;
&lt;br /&gt;
Watch packets come in:&lt;br /&gt;
  pio device monitor&lt;br /&gt;
Packets are logged as a &#039;hexdump&#039;.&lt;br /&gt;
&lt;br /&gt;
The can be converted for wireshark, for example:&lt;br /&gt;
  text2pcap -l 105 message.txt message.pcap&lt;br /&gt;
Then viewed in wireshark:&lt;br /&gt;
  wireshark message.pcap&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35439</id>
		<title>Its-g5</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35439"/>
		<updated>2026-08-06T15:29:37Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=ITS-G5&lt;br /&gt;
   |Picture=its-g5.png&lt;br /&gt;
   |Omschrijving=Receiving ITS-G5 signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[[File:its-g5-wireshark.png|thumb|right|alt=wireshark analysis]]&lt;br /&gt;
&lt;br /&gt;
This page is about investigating reception and processing of so-called C-ITS or ITS-G5 signals (802.11p) as used in the Netherlands, see also https://en.wikipedia.org/wiki/Vehicle-to-everything&lt;br /&gt;
These signals are exchanged between passenger cars, emergency vehicles, traffic lights and other traffic-related equipment.&lt;br /&gt;
&lt;br /&gt;
An ESP32-C5 development board is capable of receiving WiFi in the 5 GHz band and can receive/sniff these kinds of packets from live traffic.&lt;br /&gt;
&lt;br /&gt;
Stuff to investigate:&lt;br /&gt;
* Crowd-sourced live map of messages received: https://opentrafficmap.org/ Their wiki: https://wiki.opentrafficmap.org&lt;br /&gt;
* Source code for an ITS-G5 receiver https://github.com/pit711/v2x2map&lt;br /&gt;
* Simplest source code for Arduino-based sniffer: https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
* Transmitting ITS-G5 signals? https://codeberg.org/opentrafficmap/its-g5-receiver-firmware_txenabled/src/branch/main/main/tx_custom.c Would be nice to have on your bicycle! :D&lt;br /&gt;
&lt;br /&gt;
In the Netherlands, SPAT/MAPem messages from traffic lights are not transferred over wifi-p, but over UDAP.&lt;br /&gt;
You need credentials to access that data, it is not clear if it is feasible to hobbyist to access it.&lt;br /&gt;
Interesting project: https://github.com/idkmanLool9/Verkeerslicht&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
[[File:esp32-c5-sniffer.jpg|thumb|right|alt=esp32-c5-sniffer]]&lt;br /&gt;
&lt;br /&gt;
The design is:&lt;br /&gt;
* Use an esp32-c5 for sniffing 802.11p frames only&lt;br /&gt;
* Use an esp32-c3 for receiving sniffed frames from the esp32-c5, connect to WiFi and upload packets over MQTT&lt;br /&gt;
* The interface beteween the two boards is &#039;&#039;&#039;serial&#039;&#039;&#039;, this is simpler than SPI as used in other projects:&lt;br /&gt;
** Only three wires required: GND, +5V and serial DATA&lt;br /&gt;
** No hardware modification required (e.g. desolder capacitors on SPI wires of the esp32-c5)&lt;br /&gt;
** A serial interface is more universal, e.g. can be connected to an arbitrary linux SBC, to run a python bridge for example&lt;br /&gt;
** On the esp32-c5 use the same wires as the existing USB-UART bridge, so you can also receive packets over USB-serial&lt;br /&gt;
* Run a simple web server on the esp-c3:&lt;br /&gt;
** Configuration page with MQTT settings: protocol, host, port, user, pass&lt;br /&gt;
** Optional: show some nice stats: mqtt status, packet rate, last packet, packets per type&lt;br /&gt;
** Optional: run a very basic parser for e.g. CAM messages&lt;br /&gt;
* Power is provided to the esp32-c3, which then distributes power as raw 5V/GND to the esp32-c5. The esp32-c5 uses its own regulator to turn it into a stable internal supply voltage.&lt;br /&gt;
&lt;br /&gt;
Practical:&lt;br /&gt;
* The serial link runs over the USB-UART chip of the esp32-c5.&lt;br /&gt;
* A simple command processor runs on the other UART (the emulated USB serial port)&lt;br /&gt;
* On the esp32-c5 side, use pins GND, 5V, UART-TX for the ESP-ESP serial connection.&lt;br /&gt;
* The esp32-c3 and esp32-c5 share their 5V and GND power lines. Each board derives its own internal power supplies from this 5V.&lt;br /&gt;
* The serial link doesn&#039;t have to be very high speed, 115200 for example. We use a hardware UART on both sides of the serial link.&lt;br /&gt;
* Use https://registry.platformio.org/libraries/thomasfredericks/MicroSlip for framing packets over the serial port.&lt;br /&gt;
&lt;br /&gt;
=== opentraffic map interface ===&lt;br /&gt;
See https://github.com/MPW1412/openwrt-otm-bridge#wire-format-mimics-the-esp32-c5-firmware for the mqtt wire format.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/pit711/v2x2map/blob/main/firmware/main/mqtt.c&lt;br /&gt;
&lt;br /&gt;
In short: server = mqtts://cits1.opentrafficmap.org:8883 :&lt;br /&gt;
* no user name / password&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/status&#039; (online or offline), retained&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/info&#039; with a JSON string, like {&amp;quot;emac&amp;quot;:&amp;quot;xx:xx:xx:xx:xx:xx&amp;quot;,&amp;quot;ver&amp;quot;:&amp;quot;github.com/bertrik/its-g5-receiver-v0.0.1&amp;quot;,&amp;quot;hwv&amp;quot;:&amp;quot;esp32-c5-devkit-c1&amp;quot;}&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/packet&#039; for sniffed packets (raw, not JSON encoded)&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Sniffer ===&lt;br /&gt;
[[File:esp32-c5-devkitc-1.jpg|thumb|right|alt=esp32-c5]]&lt;br /&gt;
[[File:esp32-c3-supermini.jpg|thumb|right|alt=esp32-c3]]&lt;br /&gt;
&lt;br /&gt;
This project uses an ESP32-C5-devkitC-1 board for the sniffer part:&lt;br /&gt;
* Aliexpress product page https://nl.aliexpress.com/item/1005012416463528.html&lt;br /&gt;
* Espressif schematic https://dl.espressif.com/dl/schematics/SCH_ESP32-C5-DevkitC-1_V1.1_20240621.pdf . Actually my board is not exactly like this, the USB-UART is connected to pins GPIO11 (TX) and GPIO12 (RX), not GPIO25/GPIO24.&lt;br /&gt;
* Espressif devkit-c page: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c5/esp32-c5-devkitc-1/user_guide.html&lt;br /&gt;
&lt;br /&gt;
It has an onboard antenna. There are also other boards with an antenna connection, which allows using an external antenna. This may be better, I don&#039;t know yet.&lt;br /&gt;
&lt;br /&gt;
=== Bridge ===&lt;br /&gt;
An ESP32-C3 is used as the bridge part. I used a &#039;supermini&#039;.&lt;br /&gt;
&lt;br /&gt;
How to wire it up, what I did:&lt;br /&gt;
* Put both the esp32-c3-supermini board and the esp32-c5-devkit-c1 on a breadboard&lt;br /&gt;
* Use male-male dupont wires to connect:&lt;br /&gt;
** 5V to 5V, GND to GND, esp32-c5 TX to esp32-c3 RX&lt;br /&gt;
* Programmed the esp32-c5 with firmware&lt;br /&gt;
* Plug an USB-C cable into the esp32-c3, programmed it with firmware, now it&#039;s powering both the esp32-c3 and the esp32-c5&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Connections&lt;br /&gt;
|-&lt;br /&gt;
! ESP32-c5 !! ESP32-c3 !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| GND || GND || shared ground&lt;br /&gt;
|-&lt;br /&gt;
| 5V || 5V || raw power&lt;br /&gt;
|-&lt;br /&gt;
| U0TXD/GPIO11 || RX/GPIO20 || Data link&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The esp32-c3 supermini apparently has a design flaw causing them to run very hot:&lt;br /&gt;
* https://www.dailyduino.com/index.php/2026/01/20/the-spicy-esp32-c3-super-mini-when-2-boards-become-2-heaters/&lt;br /&gt;
So in software you need to keep this in mind:&lt;br /&gt;
* lower the CPU frequency, makes a few degrees difference: this seems to make SSL network connections unreliable though&lt;br /&gt;
* allow some &#039;idle&#039; time in Arduino, e.g. using delay(50) or delay(100) in loop()&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See https://github.com/bertrik/its-g5-receiver&lt;br /&gt;
&lt;br /&gt;
This is heavily inspired by https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
but with a fixed size ring buffer instead of dynamic allocation.&lt;br /&gt;
&lt;br /&gt;
=== Compiling the firmware ===&lt;br /&gt;
Uses python and platformio, see the README.md in the source archive.&lt;br /&gt;
&lt;br /&gt;
Watch packets come in:&lt;br /&gt;
  pio device monitor&lt;br /&gt;
Packets are logged as a &#039;hexdump&#039;.&lt;br /&gt;
&lt;br /&gt;
The can be converted for wireshark, for example:&lt;br /&gt;
  text2pcap -l 105 message.txt message.pcap&lt;br /&gt;
Then viewed in wireshark:&lt;br /&gt;
  wireshark message.pcap&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35436</id>
		<title>Its-g5</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35436"/>
		<updated>2026-07-30T10:47:24Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Bridge */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=ITS-G5&lt;br /&gt;
   |Picture=its-g5.png&lt;br /&gt;
   |Omschrijving=Receiving ITS-G5 signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[[File:its-g5-wireshark.png|thumb|right|alt=wireshark analysis]]&lt;br /&gt;
&lt;br /&gt;
This page is about investigating reception and processing of so-called C-ITS or ITS-G5 signals (802.11p) as used in the Netherlands, see also https://en.wikipedia.org/wiki/Vehicle-to-everything&lt;br /&gt;
These signals are exchanged between passenger cars, emergency vehicles, traffic lights and other traffic-related equipment.&lt;br /&gt;
&lt;br /&gt;
An ESP32-C5 development board is capable of receiving WiFi in the 5 GHz band and can receive/sniff these kinds of packets from live traffic.&lt;br /&gt;
&lt;br /&gt;
Stuff to investigate:&lt;br /&gt;
* Crowd-sourced live map of messages received: https://opentrafficmap.org/ Their wiki: https://wiki.opentrafficmap.org&lt;br /&gt;
* Source code for an ITS-G5 receiver https://github.com/pit711/v2x2map&lt;br /&gt;
* Simplest source code for Arduino-based sniffer: https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
&lt;br /&gt;
In the Netherlands, SPAT/MAPem messages from traffic lights are not transferred over wifi-p, but over UDAP.&lt;br /&gt;
You need credentials to access that data, it is not clear if it is feasible to hobbyist to access it.&lt;br /&gt;
Interesting project: https://github.com/idkmanLool9/Verkeerslicht&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
[[File:esp32-c5-sniffer.jpg|thumb|right|alt=esp32-c5-sniffer]]&lt;br /&gt;
&lt;br /&gt;
The design is:&lt;br /&gt;
* Use an esp32-c5 for sniffing 802.11p frames only&lt;br /&gt;
* Use an esp32-c3 for receiving sniffed frames from the esp32-c5, connect to WiFi and upload packets over MQTT&lt;br /&gt;
* The interface beteween the two boards is &#039;&#039;&#039;serial&#039;&#039;&#039;, this is simpler than SPI as used in other projects:&lt;br /&gt;
** Only three wires required: GND, +5V and serial DATA&lt;br /&gt;
** No hardware modification required (e.g. desolder capacitors on SPI wires of the esp32-c5)&lt;br /&gt;
** A serial interface is more universal, e.g. can be connected to an arbitrary linux SBC, to run a python bridge for example&lt;br /&gt;
** On the esp32-c5 use the same wires as the existing USB-UART bridge, so you can also receive packets over USB-serial&lt;br /&gt;
* Run a simple web server on the esp-c3:&lt;br /&gt;
** Configuration page with MQTT settings: protocol, host, port, user, pass&lt;br /&gt;
** Optional: show some nice stats: mqtt status, packet rate, last packet, packets per type&lt;br /&gt;
** Optional: run a very basic parser for e.g. CAM messages&lt;br /&gt;
* Power is provided to the esp32-c3, which then distributes power as raw 5V/GND to the esp32-c5. The esp32-c5 uses its own regulator to turn it into a stable internal supply voltage.&lt;br /&gt;
&lt;br /&gt;
Practical:&lt;br /&gt;
* The serial link runs over the USB-UART chip of the esp32-c5.&lt;br /&gt;
* A simple command processor runs on the other UART (the emulated USB serial port)&lt;br /&gt;
* On the esp32-c5 side, use pins GND, 5V, UART-TX for the ESP-ESP serial connection.&lt;br /&gt;
* The esp32-c3 and esp32-c5 share their 5V and GND power lines. Each board derives its own internal power supplies from this 5V.&lt;br /&gt;
* The serial link doesn&#039;t have to be very high speed, 115200 for example. We use a hardware UART on both sides of the serial link.&lt;br /&gt;
* Use https://registry.platformio.org/libraries/thomasfredericks/MicroSlip for framing packets over the serial port.&lt;br /&gt;
&lt;br /&gt;
=== opentraffic map interface ===&lt;br /&gt;
See https://github.com/MPW1412/openwrt-otm-bridge#wire-format-mimics-the-esp32-c5-firmware for the mqtt wire format.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/pit711/v2x2map/blob/main/firmware/main/mqtt.c&lt;br /&gt;
&lt;br /&gt;
In short: server = mqtts://cits1.opentrafficmap.org:8883 :&lt;br /&gt;
* no user name / password&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/status&#039; (online or offline), retained&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/info&#039; with a JSON string, like {&amp;quot;emac&amp;quot;:&amp;quot;xx:xx:xx:xx:xx:xx&amp;quot;,&amp;quot;ver&amp;quot;:&amp;quot;github.com/bertrik/its-g5-receiver-v0.0.1&amp;quot;,&amp;quot;hwv&amp;quot;:&amp;quot;esp32-c5-devkit-c1&amp;quot;}&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/packet&#039; for sniffed packets (raw, not JSON encoded)&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Sniffer ===&lt;br /&gt;
[[File:esp32-c5-devkitc-1.jpg|thumb|right|alt=esp32-c5]]&lt;br /&gt;
[[File:esp32-c3-supermini.jpg|thumb|right|alt=esp32-c3]]&lt;br /&gt;
&lt;br /&gt;
This project uses an ESP32-C5-devkitC-1 board for the sniffer part:&lt;br /&gt;
* Aliexpress product page https://nl.aliexpress.com/item/1005012416463528.html&lt;br /&gt;
* Espressif schematic https://dl.espressif.com/dl/schematics/SCH_ESP32-C5-DevkitC-1_V1.1_20240621.pdf . Actually my board is not exactly like this, the USB-UART is connected to pins GPIO11 (TX) and GPIO12 (RX), not GPIO25/GPIO24.&lt;br /&gt;
* Espressif devkit-c page: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c5/esp32-c5-devkitc-1/user_guide.html&lt;br /&gt;
&lt;br /&gt;
It has an onboard antenna. There are also other boards with an antenna connection, which allows using an external antenna. This may be better, I don&#039;t know yet.&lt;br /&gt;
&lt;br /&gt;
=== Bridge ===&lt;br /&gt;
An ESP32-C3 is used as the bridge part. I used a &#039;supermini&#039;.&lt;br /&gt;
&lt;br /&gt;
How to wire it up, what I did:&lt;br /&gt;
* Put both the esp32-c3-supermini board and the esp32-c5-devkit-c1 on a breadboard&lt;br /&gt;
* Use male-male dupont wires to connect:&lt;br /&gt;
** 5V to 5V, GND to GND, esp32-c5 TX to esp32-c3 RX&lt;br /&gt;
* Programmed the esp32-c5 with firmware&lt;br /&gt;
* Plug an USB-C cable into the esp32-c3, programmed it with firmware, now it&#039;s powering both the esp32-c3 and the esp32-c5&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Connections&lt;br /&gt;
|-&lt;br /&gt;
! ESP32-c5 !! ESP32-c3 !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| GND || GND || shared ground&lt;br /&gt;
|-&lt;br /&gt;
| 5V || 5V || raw power&lt;br /&gt;
|-&lt;br /&gt;
| U0TXD/GPIO11 || RX/GPIO20 || Data link&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The esp32-c3 supermini apparently has a design flaw causing them to run very hot:&lt;br /&gt;
* https://www.dailyduino.com/index.php/2026/01/20/the-spicy-esp32-c3-super-mini-when-2-boards-become-2-heaters/&lt;br /&gt;
So in software you need to keep this in mind:&lt;br /&gt;
* lower the CPU frequency, makes a few degrees difference: this seems to make SSL network connections unreliable though&lt;br /&gt;
* allow some &#039;idle&#039; time in Arduino, e.g. using delay(50) or delay(100) in loop()&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See https://github.com/bertrik/its-g5-receiver&lt;br /&gt;
&lt;br /&gt;
This is heavily inspired by https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
but with a fixed size ring buffer instead of dynamic allocation.&lt;br /&gt;
&lt;br /&gt;
=== Compiling the firmware ===&lt;br /&gt;
Uses python and platformio, see the README.md in the source archive.&lt;br /&gt;
&lt;br /&gt;
Watch packets come in:&lt;br /&gt;
  pio device monitor&lt;br /&gt;
Packets are logged as a &#039;hexdump&#039;.&lt;br /&gt;
&lt;br /&gt;
The can be converted for wireshark, for example:&lt;br /&gt;
  text2pcap -l 105 message.txt message.pcap&lt;br /&gt;
Then viewed in wireshark:&lt;br /&gt;
  wireshark message.pcap&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35435</id>
		<title>Its-g5</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35435"/>
		<updated>2026-07-30T10:47:04Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Bridge */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=ITS-G5&lt;br /&gt;
   |Picture=its-g5.png&lt;br /&gt;
   |Omschrijving=Receiving ITS-G5 signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[[File:its-g5-wireshark.png|thumb|right|alt=wireshark analysis]]&lt;br /&gt;
&lt;br /&gt;
This page is about investigating reception and processing of so-called C-ITS or ITS-G5 signals (802.11p) as used in the Netherlands, see also https://en.wikipedia.org/wiki/Vehicle-to-everything&lt;br /&gt;
These signals are exchanged between passenger cars, emergency vehicles, traffic lights and other traffic-related equipment.&lt;br /&gt;
&lt;br /&gt;
An ESP32-C5 development board is capable of receiving WiFi in the 5 GHz band and can receive/sniff these kinds of packets from live traffic.&lt;br /&gt;
&lt;br /&gt;
Stuff to investigate:&lt;br /&gt;
* Crowd-sourced live map of messages received: https://opentrafficmap.org/ Their wiki: https://wiki.opentrafficmap.org&lt;br /&gt;
* Source code for an ITS-G5 receiver https://github.com/pit711/v2x2map&lt;br /&gt;
* Simplest source code for Arduino-based sniffer: https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
&lt;br /&gt;
In the Netherlands, SPAT/MAPem messages from traffic lights are not transferred over wifi-p, but over UDAP.&lt;br /&gt;
You need credentials to access that data, it is not clear if it is feasible to hobbyist to access it.&lt;br /&gt;
Interesting project: https://github.com/idkmanLool9/Verkeerslicht&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
[[File:esp32-c5-sniffer.jpg|thumb|right|alt=esp32-c5-sniffer]]&lt;br /&gt;
&lt;br /&gt;
The design is:&lt;br /&gt;
* Use an esp32-c5 for sniffing 802.11p frames only&lt;br /&gt;
* Use an esp32-c3 for receiving sniffed frames from the esp32-c5, connect to WiFi and upload packets over MQTT&lt;br /&gt;
* The interface beteween the two boards is &#039;&#039;&#039;serial&#039;&#039;&#039;, this is simpler than SPI as used in other projects:&lt;br /&gt;
** Only three wires required: GND, +5V and serial DATA&lt;br /&gt;
** No hardware modification required (e.g. desolder capacitors on SPI wires of the esp32-c5)&lt;br /&gt;
** A serial interface is more universal, e.g. can be connected to an arbitrary linux SBC, to run a python bridge for example&lt;br /&gt;
** On the esp32-c5 use the same wires as the existing USB-UART bridge, so you can also receive packets over USB-serial&lt;br /&gt;
* Run a simple web server on the esp-c3:&lt;br /&gt;
** Configuration page with MQTT settings: protocol, host, port, user, pass&lt;br /&gt;
** Optional: show some nice stats: mqtt status, packet rate, last packet, packets per type&lt;br /&gt;
** Optional: run a very basic parser for e.g. CAM messages&lt;br /&gt;
* Power is provided to the esp32-c3, which then distributes power as raw 5V/GND to the esp32-c5. The esp32-c5 uses its own regulator to turn it into a stable internal supply voltage.&lt;br /&gt;
&lt;br /&gt;
Practical:&lt;br /&gt;
* The serial link runs over the USB-UART chip of the esp32-c5.&lt;br /&gt;
* A simple command processor runs on the other UART (the emulated USB serial port)&lt;br /&gt;
* On the esp32-c5 side, use pins GND, 5V, UART-TX for the ESP-ESP serial connection.&lt;br /&gt;
* The esp32-c3 and esp32-c5 share their 5V and GND power lines. Each board derives its own internal power supplies from this 5V.&lt;br /&gt;
* The serial link doesn&#039;t have to be very high speed, 115200 for example. We use a hardware UART on both sides of the serial link.&lt;br /&gt;
* Use https://registry.platformio.org/libraries/thomasfredericks/MicroSlip for framing packets over the serial port.&lt;br /&gt;
&lt;br /&gt;
=== opentraffic map interface ===&lt;br /&gt;
See https://github.com/MPW1412/openwrt-otm-bridge#wire-format-mimics-the-esp32-c5-firmware for the mqtt wire format.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/pit711/v2x2map/blob/main/firmware/main/mqtt.c&lt;br /&gt;
&lt;br /&gt;
In short: server = mqtts://cits1.opentrafficmap.org:8883 :&lt;br /&gt;
* no user name / password&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/status&#039; (online or offline), retained&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/info&#039; with a JSON string, like {&amp;quot;emac&amp;quot;:&amp;quot;xx:xx:xx:xx:xx:xx&amp;quot;,&amp;quot;ver&amp;quot;:&amp;quot;github.com/bertrik/its-g5-receiver-v0.0.1&amp;quot;,&amp;quot;hwv&amp;quot;:&amp;quot;esp32-c5-devkit-c1&amp;quot;}&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/packet&#039; for sniffed packets (raw, not JSON encoded)&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Sniffer ===&lt;br /&gt;
[[File:esp32-c5-devkitc-1.jpg|thumb|right|alt=esp32-c5]]&lt;br /&gt;
[[File:esp32-c3-supermini.jpg|thumb|right|alt=esp32-c3]]&lt;br /&gt;
&lt;br /&gt;
This project uses an ESP32-C5-devkitC-1 board for the sniffer part:&lt;br /&gt;
* Aliexpress product page https://nl.aliexpress.com/item/1005012416463528.html&lt;br /&gt;
* Espressif schematic https://dl.espressif.com/dl/schematics/SCH_ESP32-C5-DevkitC-1_V1.1_20240621.pdf . Actually my board is not exactly like this, the USB-UART is connected to pins GPIO11 (TX) and GPIO12 (RX), not GPIO25/GPIO24.&lt;br /&gt;
* Espressif devkit-c page: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c5/esp32-c5-devkitc-1/user_guide.html&lt;br /&gt;
&lt;br /&gt;
It has an onboard antenna. There are also other boards with an antenna connection, which allows using an external antenna. This may be better, I don&#039;t know yet.&lt;br /&gt;
&lt;br /&gt;
=== Bridge ===&lt;br /&gt;
An ESP32-C3 is used as the bridge part. I used a &#039;supermini&#039;.&lt;br /&gt;
&lt;br /&gt;
How to wire it up, what I did:&lt;br /&gt;
* Put both the esp32-c3-supermini board and the esp32-c5-devkit-c1 on a breadboard&lt;br /&gt;
* Use male-male dupont wires to connect:&lt;br /&gt;
** 5V to 5V, GND to GND, esp32-c5 TX to esp32-c3 RX&lt;br /&gt;
* Programmed the esp32-c5 with firmware&lt;br /&gt;
* Plug an USB-C cable into the esp32-c3, programmed it with firmware, now it&#039;s powering both the esp32-c3 and the esp32-c5&lt;br /&gt;
&lt;br /&gt;
The esp32-c3 supermini apparently has a design flaw causing them to run very hot:&lt;br /&gt;
* https://www.dailyduino.com/index.php/2026/01/20/the-spicy-esp32-c3-super-mini-when-2-boards-become-2-heaters/&lt;br /&gt;
So in software you need to keep this in mind:&lt;br /&gt;
* lower the CPU frequency, makes a few degrees difference: this seems to make SSL network connections unreliable though&lt;br /&gt;
* allow some &#039;idle&#039; time in Arduino, e.g. using delay(50) or delay(100) in loop()&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Connections&lt;br /&gt;
|-&lt;br /&gt;
! ESP32-c5 !! ESP32-c3 !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| GND || GND || shared ground&lt;br /&gt;
|-&lt;br /&gt;
| 5V || 5V || raw power&lt;br /&gt;
|-&lt;br /&gt;
| U0TXD/GPIO11 || RX/GPIO20 || Data link&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See https://github.com/bertrik/its-g5-receiver&lt;br /&gt;
&lt;br /&gt;
This is heavily inspired by https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
but with a fixed size ring buffer instead of dynamic allocation.&lt;br /&gt;
&lt;br /&gt;
=== Compiling the firmware ===&lt;br /&gt;
Uses python and platformio, see the README.md in the source archive.&lt;br /&gt;
&lt;br /&gt;
Watch packets come in:&lt;br /&gt;
  pio device monitor&lt;br /&gt;
Packets are logged as a &#039;hexdump&#039;.&lt;br /&gt;
&lt;br /&gt;
The can be converted for wireshark, for example:&lt;br /&gt;
  text2pcap -l 105 message.txt message.pcap&lt;br /&gt;
Then viewed in wireshark:&lt;br /&gt;
  wireshark message.pcap&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=TPMS&amp;diff=35434</id>
		<title>TPMS</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=TPMS&amp;diff=35434"/>
		<updated>2026-07-27T09:17:20Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=CC1101 TPMS receiver&lt;br /&gt;
   |Picture=whyunopicture.png&lt;br /&gt;
   |Omschrijving=Receiving TPMS signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is to use an CC1101 module, connect it to an ESP8266 and start receiving TPMS radio frames.&lt;br /&gt;
&lt;br /&gt;
Example frame, as received:&lt;br /&gt;
  22 30 61 07 E0 1D B9 39 F5&lt;br /&gt;
Analysis:&lt;br /&gt;
* byte 4: 0xE0 = wheel?&lt;br /&gt;
* bytes 5/6, bits 0-12 = 0xDB9 = 3513 hPa absolute -&amp;gt; about 2.5 bar above ambient pressure&lt;br /&gt;
* byte 7, 0x39 = 57 = temperature in Celcius?&lt;br /&gt;
* byte 8: 0xF5 = checksum?&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/merbanan/rtl_433/tree/master/src/devices and check for decoders starting with &amp;quot;tpms_&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:cc1101-module.png|right|alt=CC1101 module]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Connections&lt;br /&gt;
|-&lt;br /&gt;
!CC1101 module&lt;br /&gt;
!Wemos D1 mini&lt;br /&gt;
!Remark&lt;br /&gt;
|-&lt;br /&gt;
|1 Ground&lt;br /&gt;
|G&lt;br /&gt;
|Common ground&lt;br /&gt;
|-&lt;br /&gt;
|2 VCC&lt;br /&gt;
|3.3V&lt;br /&gt;
|Common power&lt;br /&gt;
|-&lt;br /&gt;
|3 GD0&lt;br /&gt;
|D1&lt;br /&gt;
|&amp;quot;IRQ&amp;quot; pin&lt;br /&gt;
|-&lt;br /&gt;
|4 CSN&lt;br /&gt;
|D8&lt;br /&gt;
|SPI Chip select (inv)&lt;br /&gt;
|-&lt;br /&gt;
|5 SCK&lt;br /&gt;
|D5&lt;br /&gt;
|SPI clock&lt;br /&gt;
|-&lt;br /&gt;
|6 MOSI&lt;br /&gt;
|D7&lt;br /&gt;
|SPI master out slave in&lt;br /&gt;
|-&lt;br /&gt;
|7 MISO&lt;br /&gt;
|D6&lt;br /&gt;
|SPI master in slave out&lt;br /&gt;
|-&lt;br /&gt;
|8 GDO2&lt;br /&gt;
|D2&lt;br /&gt;
|&amp;quot;GPIO&amp;quot; pin, probably unused&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
My experiments at: https://github.com/bertrik/esp-tpms&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
https://github.com/andi38/TPMS/blob/main/CC1101_TPMS_433.ino&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=TPMS&amp;diff=35433</id>
		<title>TPMS</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=TPMS&amp;diff=35433"/>
		<updated>2026-07-27T09:16:23Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Design */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=CC1101 TPMS receiver&lt;br /&gt;
   |Picture=whyunopicture.png&lt;br /&gt;
   |Omschrijving=Receiving TPMS signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is to use an CC1101 module, connect it to an ESP8266 and start receiving TPMS radio frames.&lt;br /&gt;
&lt;br /&gt;
Example frame, as received:&lt;br /&gt;
  22 30 61 07 E0 1D B9 39 F5&lt;br /&gt;
Analysis:&lt;br /&gt;
* byte 4: 0xE0 = wheel?&lt;br /&gt;
* bytes 5/6, bits 0-12 = 0xDB9 = 3513 hPa absolute -&amp;gt; about 2.5 bar above ambient pressure&lt;br /&gt;
* byte 7, 0x39 = 57 = temperature in Celcius?&lt;br /&gt;
* byte 8: 0xF5 = checksum?&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/merbanan/rtl_433/tree/master/src/devices and check for decoders starting with &amp;quot;tpms_&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:cc1101-module.png|right|alt=CC1101 module]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Connections&lt;br /&gt;
|-&lt;br /&gt;
!CC1101 module&lt;br /&gt;
!Wemos D1 mini&lt;br /&gt;
!Remark&lt;br /&gt;
|-&lt;br /&gt;
|1 Ground&lt;br /&gt;
|G&lt;br /&gt;
|Common ground&lt;br /&gt;
|-&lt;br /&gt;
|2 VCC&lt;br /&gt;
|3.3V&lt;br /&gt;
|Common power&lt;br /&gt;
|-&lt;br /&gt;
|3 GD0&lt;br /&gt;
|D1&lt;br /&gt;
|&amp;quot;IRQ&amp;quot; pin&lt;br /&gt;
|-&lt;br /&gt;
|4 CSN&lt;br /&gt;
|D8&lt;br /&gt;
|SPI Chip select (inv)&lt;br /&gt;
|-&lt;br /&gt;
|5 SCK&lt;br /&gt;
|D5&lt;br /&gt;
|SPI clock&lt;br /&gt;
|-&lt;br /&gt;
|6 MOSI&lt;br /&gt;
|D7&lt;br /&gt;
|SPI master out slave in&lt;br /&gt;
|-&lt;br /&gt;
|7 MISO&lt;br /&gt;
|D6&lt;br /&gt;
|SPI master in slave out&lt;br /&gt;
|-&lt;br /&gt;
|8 GDO2&lt;br /&gt;
|D2&lt;br /&gt;
|&amp;quot;GPIO&amp;quot; pin, probably unused&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See:&lt;br /&gt;
https://github.com/andi38/TPMS/blob/main/CC1101_TPMS_433.ino&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=TPMS&amp;diff=35432</id>
		<title>TPMS</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=TPMS&amp;diff=35432"/>
		<updated>2026-07-27T09:13:45Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=CC1101 TPMS receiver&lt;br /&gt;
   |Picture=whyunopicture.png&lt;br /&gt;
   |Omschrijving=Receiving TPMS signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is to use an CC1101 module, connect it to an ESP8266 and start receiving TPMS radio frames.&lt;br /&gt;
&lt;br /&gt;
Example frame, as received:&lt;br /&gt;
  22 30 61 07 E0 1D B9 39 F5&lt;br /&gt;
Analysis:&lt;br /&gt;
* byte 4: 0xE0 = wheel?&lt;br /&gt;
* bytes 5/6, bits 0-12 = 0xDB9 = 3513 hPa absolute -&amp;gt; about 2.5 bar above ambient pressure&lt;br /&gt;
* byte 7, 0x39 = 57 = temperature in Celcius?&lt;br /&gt;
* byte 8: 0xF5 = checksum?&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:cc1101-module.png|right|alt=CC1101 module]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Connections&lt;br /&gt;
|-&lt;br /&gt;
!CC1101 module&lt;br /&gt;
!Wemos D1 mini&lt;br /&gt;
!Remark&lt;br /&gt;
|-&lt;br /&gt;
|1 Ground&lt;br /&gt;
|G&lt;br /&gt;
|Common ground&lt;br /&gt;
|-&lt;br /&gt;
|2 VCC&lt;br /&gt;
|3.3V&lt;br /&gt;
|Common power&lt;br /&gt;
|-&lt;br /&gt;
|3 GD0&lt;br /&gt;
|D1&lt;br /&gt;
|&amp;quot;IRQ&amp;quot; pin&lt;br /&gt;
|-&lt;br /&gt;
|4 CSN&lt;br /&gt;
|D8&lt;br /&gt;
|SPI Chip select (inv)&lt;br /&gt;
|-&lt;br /&gt;
|5 SCK&lt;br /&gt;
|D5&lt;br /&gt;
|SPI clock&lt;br /&gt;
|-&lt;br /&gt;
|6 MOSI&lt;br /&gt;
|D7&lt;br /&gt;
|SPI master out slave in&lt;br /&gt;
|-&lt;br /&gt;
|7 MISO&lt;br /&gt;
|D6&lt;br /&gt;
|SPI master in slave out&lt;br /&gt;
|-&lt;br /&gt;
|8 GDO2&lt;br /&gt;
|D2&lt;br /&gt;
|&amp;quot;GPIO&amp;quot; pin, probably unused&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See:&lt;br /&gt;
https://github.com/andi38/TPMS/blob/main/CC1101_TPMS_433.ino&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=TPMS&amp;diff=35431</id>
		<title>TPMS</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=TPMS&amp;diff=35431"/>
		<updated>2026-07-26T23:07:01Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=CC1101 TPMS receiver&lt;br /&gt;
   |Picture=whyunopicture.png&lt;br /&gt;
   |Omschrijving=Receiving TPMS signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is to use an CC1101 module, connect it to an ESP8266 and start receiving TPMS radio frames.&lt;br /&gt;
&lt;br /&gt;
Example frame, as received:&lt;br /&gt;
  22 30 61 07 E0 1D B9 39 F5&lt;br /&gt;
Analysis:&lt;br /&gt;
* byte 4: 0xE0 = wheel?&lt;br /&gt;
* bytes 5/6, bits 0-12 = 0xDB9 = 3513 hPa absolute -&amp;gt; about 2.5 bar above ambient pressure&lt;br /&gt;
* byte 7, 0x39 = 57 = temperature in Celcius?&lt;br /&gt;
* byte 8: 0xF5 = checksum?&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:cc1101-module.png|right|alt=CC1101 module]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Connections&lt;br /&gt;
|-&lt;br /&gt;
!CC1101 module&lt;br /&gt;
!Wemos D1 mini&lt;br /&gt;
!Remark&lt;br /&gt;
|-&lt;br /&gt;
|1 Ground&lt;br /&gt;
|G&lt;br /&gt;
|Common ground&lt;br /&gt;
|-&lt;br /&gt;
|2 VCC&lt;br /&gt;
|3.3V&lt;br /&gt;
|Common power&lt;br /&gt;
|-&lt;br /&gt;
|3 GD0&lt;br /&gt;
|D1&lt;br /&gt;
|&amp;quot;GPIO&amp;quot; pin&lt;br /&gt;
|-&lt;br /&gt;
|4 CSN&lt;br /&gt;
|D8&lt;br /&gt;
|SPI Chip select (inv)&lt;br /&gt;
|-&lt;br /&gt;
|5 SCK&lt;br /&gt;
|D5&lt;br /&gt;
|SPI clock&lt;br /&gt;
|-&lt;br /&gt;
|6 MOSI&lt;br /&gt;
|D7&lt;br /&gt;
|SPI master out slave in&lt;br /&gt;
|-&lt;br /&gt;
|7 MISO&lt;br /&gt;
|D6&lt;br /&gt;
|SPI master in slave out&lt;br /&gt;
|-&lt;br /&gt;
|8 GDO2&lt;br /&gt;
|D2&lt;br /&gt;
|Interrupt, probably unused&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See:&lt;br /&gt;
https://github.com/andi38/TPMS/blob/main/CC1101_TPMS_433.ino&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=TPMS&amp;diff=35430</id>
		<title>TPMS</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=TPMS&amp;diff=35430"/>
		<updated>2026-07-26T23:06:30Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=CC1101 TPMS receiver&lt;br /&gt;
   |Picture=whyunopicture.png&lt;br /&gt;
   |Omschrijving=Receiving TPMS signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is to use an CC1101 module, connect it to an ESP8266 and start receiving TPMS radio frames.&lt;br /&gt;
&lt;br /&gt;
Example frame, as received:&lt;br /&gt;
  22 30 61 07 E0 1D B9 39 F5&lt;br /&gt;
Analysis:&lt;br /&gt;
* byte 4: 0xE0 = wheel?&lt;br /&gt;
* bytes 5/6, bits 0-12 = 0xDB9 = 3513 hPa absolute -&amp;gt; about 2.5 bar above ambient pressure&lt;br /&gt;
* byte 7, 0x39 = 57 = temperature in Celcius?&lt;br /&gt;
* byte 8: 0xF5 = checksum?&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:cc1101-module.png|thumb|right|alt=CC1101 module]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Connections&lt;br /&gt;
|-&lt;br /&gt;
!CC1101 module&lt;br /&gt;
!Wemos D1 mini&lt;br /&gt;
!Remark&lt;br /&gt;
|-&lt;br /&gt;
|1 Ground&lt;br /&gt;
|G&lt;br /&gt;
|Common ground&lt;br /&gt;
|-&lt;br /&gt;
|2 VCC&lt;br /&gt;
|3.3V&lt;br /&gt;
|Common power&lt;br /&gt;
|-&lt;br /&gt;
|3 GD0&lt;br /&gt;
|D1&lt;br /&gt;
|&amp;quot;GPIO&amp;quot; pin&lt;br /&gt;
|-&lt;br /&gt;
|4 CSN&lt;br /&gt;
|D8&lt;br /&gt;
|SPI Chip select (inv)&lt;br /&gt;
|-&lt;br /&gt;
|5 SCK&lt;br /&gt;
|D5&lt;br /&gt;
|SPI clock&lt;br /&gt;
|-&lt;br /&gt;
|6 MOSI&lt;br /&gt;
|D7&lt;br /&gt;
|SPI master out slave in&lt;br /&gt;
|-&lt;br /&gt;
|7 MISO&lt;br /&gt;
|D6&lt;br /&gt;
|SPI master in slave out&lt;br /&gt;
|-&lt;br /&gt;
|8 GDO2&lt;br /&gt;
|D2&lt;br /&gt;
|Interrupt, probably unused&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See:&lt;br /&gt;
https://github.com/andi38/TPMS/blob/main/CC1101_TPMS_433.ino&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=TPMS&amp;diff=35429</id>
		<title>TPMS</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=TPMS&amp;diff=35429"/>
		<updated>2026-07-26T22:52:42Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Design */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=CC1101 TPMS receiver&lt;br /&gt;
   |Picture=whyunopicture.png&lt;br /&gt;
   |Omschrijving=Receiving TPMS signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is to use an CC1101 module, connect it to an ESP8266 and start receiving TPMS radio frames.&lt;br /&gt;
&lt;br /&gt;
Example frame, as received:&lt;br /&gt;
  22 30 61 07 E0 1D B9 39 F5&lt;br /&gt;
Analysis:&lt;br /&gt;
* byte 4: 0xE0 = wheel?&lt;br /&gt;
* bytes 5/6, bits 0-12 = 0xDB9 = 3513 hPa absolute -&amp;gt; about 2.5 bar above ambient pressure&lt;br /&gt;
* byte 7, 0x39 = 57 = temperature in Celcius?&lt;br /&gt;
* byte 8: 0xF5 = checksum?&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:cc1101-module.png|thumb|right|alt=CC1101 module]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Connections&lt;br /&gt;
|-&lt;br /&gt;
!CC1101 module&lt;br /&gt;
!Wemos D1 mini&lt;br /&gt;
!Remark&lt;br /&gt;
|-&lt;br /&gt;
|1 Ground&lt;br /&gt;
|G&lt;br /&gt;
|Common ground&lt;br /&gt;
|-&lt;br /&gt;
|2 VCC&lt;br /&gt;
|3.3V&lt;br /&gt;
|Common power&lt;br /&gt;
|-&lt;br /&gt;
|3 GD0&lt;br /&gt;
|D1&lt;br /&gt;
|&amp;quot;GPIO&amp;quot; pin&lt;br /&gt;
|-&lt;br /&gt;
|4 CSN&lt;br /&gt;
|D8&lt;br /&gt;
|Chip select (inv)&lt;br /&gt;
|-&lt;br /&gt;
|5 SCK&lt;br /&gt;
|D5&lt;br /&gt;
|SPI clock&lt;br /&gt;
|-&lt;br /&gt;
|6 MOSI&lt;br /&gt;
|D7&lt;br /&gt;
|SPI master out slave in&lt;br /&gt;
|-&lt;br /&gt;
|7 MISO&lt;br /&gt;
|D6&lt;br /&gt;
|SPI master in slave out&lt;br /&gt;
|-&lt;br /&gt;
|8 GDO2&lt;br /&gt;
|D2&lt;br /&gt;
|Interrupt, probably unused&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See:&lt;br /&gt;
https://github.com/andi38/TPMS/blob/main/CC1101_TPMS_433.ino&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=TPMS&amp;diff=35428</id>
		<title>TPMS</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=TPMS&amp;diff=35428"/>
		<updated>2026-07-26T22:48:11Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Design */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=CC1101 TPMS receiver&lt;br /&gt;
   |Picture=whyunopicture.png&lt;br /&gt;
   |Omschrijving=Receiving TPMS signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is to use an CC1101 module, connect it to an ESP8266 and start receiving TPMS radio frames.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:cc1101-module.png|thumb|right|alt=CC1101 module]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Connections&lt;br /&gt;
|-&lt;br /&gt;
!CC1101 module&lt;br /&gt;
!Wemos D1 mini&lt;br /&gt;
!Remark&lt;br /&gt;
|-&lt;br /&gt;
|1 Ground&lt;br /&gt;
|G&lt;br /&gt;
|Common ground&lt;br /&gt;
|-&lt;br /&gt;
|2 VCC&lt;br /&gt;
|3.3V&lt;br /&gt;
|Common power&lt;br /&gt;
|-&lt;br /&gt;
|3 GD0&lt;br /&gt;
|D1&lt;br /&gt;
|&amp;quot;GPIO&amp;quot; pin&lt;br /&gt;
|-&lt;br /&gt;
|4 CSN&lt;br /&gt;
|D8&lt;br /&gt;
|Chip select (inv)&lt;br /&gt;
|-&lt;br /&gt;
|5 SCK&lt;br /&gt;
|D5&lt;br /&gt;
|SPI clock&lt;br /&gt;
|-&lt;br /&gt;
|6 MOSI&lt;br /&gt;
|D7&lt;br /&gt;
|SPI master out slave in&lt;br /&gt;
|-&lt;br /&gt;
|7 MISO&lt;br /&gt;
|D6&lt;br /&gt;
|SPI master in slave out&lt;br /&gt;
|-&lt;br /&gt;
|8 GDO2&lt;br /&gt;
|D2&lt;br /&gt;
|Interrupt, probably unused&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See:&lt;br /&gt;
https://github.com/andi38/TPMS/blob/main/CC1101_TPMS_433.ino&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=TPMS&amp;diff=35427</id>
		<title>TPMS</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=TPMS&amp;diff=35427"/>
		<updated>2026-07-26T22:47:46Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=CC1101 TPMS receiver&lt;br /&gt;
   |Picture=whyunopicture.png&lt;br /&gt;
   |Omschrijving=Receiving TPMS signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is to use an CC1101 module, connect it to an ESP and start receiving TPMS radio frames.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:cc1101-module.png|thumb|right|alt=CC1101 module]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Connections&lt;br /&gt;
|-&lt;br /&gt;
!CC1101 module&lt;br /&gt;
!Wemos D1 mini&lt;br /&gt;
!Remark&lt;br /&gt;
|-&lt;br /&gt;
|1 Ground&lt;br /&gt;
|G&lt;br /&gt;
|Common ground&lt;br /&gt;
|-&lt;br /&gt;
|2 VCC&lt;br /&gt;
|3.3V&lt;br /&gt;
|Common power&lt;br /&gt;
|-&lt;br /&gt;
|3 GD0&lt;br /&gt;
|D1&lt;br /&gt;
|&amp;quot;GPIO&amp;quot; pin&lt;br /&gt;
|-&lt;br /&gt;
|4 CSN&lt;br /&gt;
|D8&lt;br /&gt;
|Chip select (inv)&lt;br /&gt;
|-&lt;br /&gt;
|5 SCK&lt;br /&gt;
|D5&lt;br /&gt;
|SPI clock&lt;br /&gt;
|-&lt;br /&gt;
|6 MOSI&lt;br /&gt;
|D7&lt;br /&gt;
|SPI master out slave in&lt;br /&gt;
|-&lt;br /&gt;
|7 MISO&lt;br /&gt;
|D6&lt;br /&gt;
|SPI master in slave out&lt;br /&gt;
|-&lt;br /&gt;
|8 GDO2&lt;br /&gt;
|D2&lt;br /&gt;
|Interrupt, probably unused&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See:&lt;br /&gt;
https://github.com/andi38/TPMS/blob/main/CC1101_TPMS_433.ino&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=TPMS&amp;diff=35426</id>
		<title>TPMS</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=TPMS&amp;diff=35426"/>
		<updated>2026-07-26T22:46:27Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=CC1101 TPMS receiver&lt;br /&gt;
   |Picture=nopicture.png&lt;br /&gt;
   |Omschrijving=Receiving TPMS signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is to use an CC1101 module, connect it to an ESP and start receiving TPMS radio frames.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:cc1101-module.png|thumb|right|alt=CC1101 module]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Connections&lt;br /&gt;
|-&lt;br /&gt;
!CC1101 module&lt;br /&gt;
!Wemos D1 mini&lt;br /&gt;
!Remark&lt;br /&gt;
|-&lt;br /&gt;
|1 Ground&lt;br /&gt;
|G&lt;br /&gt;
|Common ground&lt;br /&gt;
|-&lt;br /&gt;
|2 VCC&lt;br /&gt;
|3.3V&lt;br /&gt;
|Common power&lt;br /&gt;
|-&lt;br /&gt;
|3 GD0&lt;br /&gt;
|D1&lt;br /&gt;
|&amp;quot;GPIO&amp;quot; pin&lt;br /&gt;
|-&lt;br /&gt;
|4 CSN&lt;br /&gt;
|D8&lt;br /&gt;
|Chip select (inv)&lt;br /&gt;
|-&lt;br /&gt;
|5 SCK&lt;br /&gt;
|D5&lt;br /&gt;
|SPI clock&lt;br /&gt;
|-&lt;br /&gt;
|6 MOSI&lt;br /&gt;
|D7&lt;br /&gt;
|SPI master out slave in&lt;br /&gt;
|-&lt;br /&gt;
|7 MISO&lt;br /&gt;
|D6&lt;br /&gt;
|SPI master in slave out&lt;br /&gt;
|-&lt;br /&gt;
|8 GDO2&lt;br /&gt;
|D2&lt;br /&gt;
|Interrupt, probably unused&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See:&lt;br /&gt;
https://github.com/andi38/TPMS/blob/main/CC1101_TPMS_433.ino&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=TPMS&amp;diff=35425</id>
		<title>TPMS</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=TPMS&amp;diff=35425"/>
		<updated>2026-07-26T16:59:23Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=CC1101 TPMS receiver&lt;br /&gt;
   |Picture=nopicture.png&lt;br /&gt;
   |Omschrijving=Receiving TPMS signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is to use an CC1101 module, connect it to an ESP and start receiving TPMS radio frames.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:cc1101-module.png|thumb|right|alt=CC1101 module]]&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See:&lt;br /&gt;
https://github.com/andi38/TPMS/blob/main/CC1101_TPMS_433.ino&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=TPMS&amp;diff=35424</id>
		<title>TPMS</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=TPMS&amp;diff=35424"/>
		<updated>2026-07-25T15:55:15Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=CC1101 TPMS receiver&lt;br /&gt;
   |Picture=nopicture.png&lt;br /&gt;
   |Omschrijving=Receiving TPMS signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is to use an CC1101 module, connect it to an ESP and start receiving TPMS radio frames.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:cc1101-module.png|thumb|right|alt=CC1101 module]]&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=TPMS&amp;diff=35423</id>
		<title>TPMS</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=TPMS&amp;diff=35423"/>
		<updated>2026-07-25T15:54:32Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* TPMS receiver */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=CC1101 TPMS receiver&lt;br /&gt;
   |Picture=nopicture.png&lt;br /&gt;
   |Omschrijving=Receiving TPMS signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:cc1101-module.png|thumb|right|alt=CC1101 module]]&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Bestand:Cc1101-module.png&amp;diff=35422</id>
		<title>Bestand:Cc1101-module.png</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Bestand:Cc1101-module.png&amp;diff=35422"/>
		<updated>2026-07-25T15:53:36Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=TPMS&amp;diff=35421</id>
		<title>TPMS</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=TPMS&amp;diff=35421"/>
		<updated>2026-07-25T15:53:24Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* TPMS receiver */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== TPMS receiver ==&lt;br /&gt;
[[File:cc1101-module.png|thumb|right|alt=CC1101 module]]&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=TPMS&amp;diff=35420</id>
		<title>TPMS</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=TPMS&amp;diff=35420"/>
		<updated>2026-07-25T15:52:39Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: Nieuwe pagina aangemaakt met &amp;#039;== TPMS receiver == alt=CC1101 module&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== TPMS receiver ==&lt;br /&gt;
[[File:cc101.jpg|thumb|right|alt=CC1101 module]]&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Meshcore&amp;diff=35419</id>
		<title>Meshcore</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Meshcore&amp;diff=35419"/>
		<updated>2026-07-25T14:12:45Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
 |Name=MeshCore&lt;br /&gt;
 |Status=In progress&lt;br /&gt;
 |Picture=Meshtower.png&lt;br /&gt;
 |Contact=Bas&lt;br /&gt;
 |Contact1=Anne Jan&lt;br /&gt;
 |Contact2=Paul&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Event&lt;br /&gt;
 |Name=Workshop/Lecture MeshCore&lt;br /&gt;
 |DateStart=29 November 2025 15:00&lt;br /&gt;
 |DateEnd=29 November 2025 18:00&lt;br /&gt;
 |Info=Lecture/Workshop about MeshCore&lt;br /&gt;
 |InfoLocation=RevSpace&lt;br /&gt;
 |InfoOpen=12:30&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
= Revspace meshcore repeater =&lt;br /&gt;
Er is een Revspace meshcore repeater, type [https://heltec.org/project/meshtower/ MeshTower], gegevens per 2026-7-xx:&lt;br /&gt;
* Fysiek staat ie bovenop de kast rechts naast de bar&lt;br /&gt;
* Geconfigureerd met settings volgens https://meshcore.envoyage.io/configurator/&lt;br /&gt;
* Firmware 1.16&lt;br /&gt;
* SF7/CR5&lt;br /&gt;
* 2-byte hashes (mode 1) + regio scopes&lt;br /&gt;
* -Naam &amp;quot;RevSpace&amp;quot;, password bekend bij [[Bertrik]] en [[Crashjuh]]-&lt;br /&gt;
&lt;br /&gt;
Nieuwe firmware flashen:&lt;br /&gt;
* Schroef het kastje open&lt;br /&gt;
* Steek een kabel in de USB-C van de meshtower en het andere eind in je computer&lt;br /&gt;
* Ergens naast de USB-C connector zit een klein knopje (reset of RST), druk die 2x kort in (binnen 1 seconde)&lt;br /&gt;
* Op je computer zie je een USB drive verschijnen, de meshtower is nu in bootloader mode&lt;br /&gt;
* Flash een firmware via de web interface van https://meshcore.co.uk/flasher.html , kies &amp;quot;Heltec MeshSolar / MeshTower&amp;quot;, kies rol repeater.&lt;br /&gt;
&lt;br /&gt;
Configureren:&lt;br /&gt;
* Via de browser lukte mij niet&lt;br /&gt;
* Uiteindelijk geconfigureerd via USB-seriele poort console:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen /dev/ttyACM0 115200&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In seriele poort console kan je commando&#039;s intypen zoals:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Radio instellingen (EU868): set radio 869.618,62.5,7,5&lt;br /&gt;
Advert interval: set advert.interval 180&lt;br /&gt;
Flood advert interval: set flood.advert.interval 50&lt;br /&gt;
Naam: set name RevSpace&lt;br /&gt;
Eigenaar: set owner.info bertrik@gmail.com&lt;br /&gt;
Latitude: set lat 52.0862&lt;br /&gt;
Longitude: set lon 4.3947&lt;br /&gt;
RX delay: set rxdelay 0.0&lt;br /&gt;
TX delay: set txdelay 0.5&lt;br /&gt;
Interference threshold: set int.thresh 1&lt;br /&gt;
Max hop count: set flood.max 48&lt;br /&gt;
TX power: set tx 22&lt;br /&gt;
EU regio aanmaken: region put eu&lt;br /&gt;
Land regio aanmaken: region put nl&lt;br /&gt;
Provincie regio aanmaken: region put nl-zh nl&lt;br /&gt;
Bredere regio 1 aanmaken: region put nl-hag nl&lt;br /&gt;
Bredere regio 2 aanmaken: region put nl-lid nl&lt;br /&gt;
Gemeente regio aanmaken: region put nl-zh-lsv nl-zh&lt;br /&gt;
Plaats regio aanmaken: region put nl-zh-lds nl-zh&lt;br /&gt;
Flood toestaan: EU: region allowf eu&lt;br /&gt;
Flood toestaan: land: region allowf nl&lt;br /&gt;
Flood toestaan: provincie: region allowf nl-zh&lt;br /&gt;
Flood toestaan: bredere regio 1: region allowf nl-hag&lt;br /&gt;
Flood toestaan: bredere regio 2: region allowf nl-lid&lt;br /&gt;
Flood toestaan: gemeente: region allowf nl-zh-lsv&lt;br /&gt;
Flood toestaan: plaats: region allowf nl-zh-lds&lt;br /&gt;
Standaardregio (provincie): region default nl-zh&lt;br /&gt;
Thuisregio: region home nl-zh-lds&lt;br /&gt;
Regio&#039;s opslaan: region save&lt;br /&gt;
Path hash mode: set path.hash.mode 1&lt;br /&gt;
Loop detectie: set loop.detect moderate&lt;br /&gt;
Duty cycle: set dutycycle 10&lt;br /&gt;
Admin wachtwoord: password ***&lt;br /&gt;
Herstarten: reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Workshop=&lt;br /&gt;
Een introductie in MeshCore en als je een compatible apparaatje meeneemt (wij hebben ook een aantal mee, dus geen aankoopplicht ;) ): tevens een workshop om er mee te beginnen!&lt;br /&gt;
 &lt;br /&gt;
Heb je eerder dit jaar tijdens het Hackerhotel een Meshtastic kitje aangeschaft, maar niets meer met je Meshtastic gedaan? Dan is dat kitje met Heltec V3 een prima starter bij deze MeshCore workshop.&lt;br /&gt;
&lt;br /&gt;
Je kunt eventueel een Heltec V3 meebestellen voor 25 euro incl btw. Zet dat dan even in de tabel hieronder erbij. Maar je mag natuurlijk ook je eigen spul meenemen.&lt;br /&gt;
&lt;br /&gt;
==Inhoud==&lt;br /&gt;
* Wat is MeshCore&lt;br /&gt;
* Waarom is het leuk&lt;br /&gt;
* Verschillende rollen&lt;br /&gt;
* Hardware (en hoe het uit de hand loopt)&lt;br /&gt;
* Configuratie&lt;br /&gt;
* Demo&lt;br /&gt;
* Speeltijd en hulp met het werkend krijgen.&lt;br /&gt;
&lt;br /&gt;
https://pad.bitlair.nl/p/lora&lt;br /&gt;
&lt;br /&gt;
https://docs.google.com/presentation/d/1h6CC3s-rCDkTylBscA9Ky0ZhBM5mxv8rZMoFVbLMzFs/edit?usp=sharing&lt;br /&gt;
&lt;br /&gt;
==Aanmelden==&lt;br /&gt;
Let op: we kunnen maximaal 20 deelnemers huisvesten en begeleiden.&lt;br /&gt;
&lt;br /&gt;
Je kunt geen Heltec v3 meer meebestellen. Hij is zonder case nog wel leverbaar via TinyTronics: https://www.tinytronics.nl/nl/development-boards/microcontroller-boards/met-lora/heltec-wi-fi-lora-32-esp32-s3-sx1262-met-0.96-inch-oled-display&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Bijschrift&lt;br /&gt;
|-&lt;br /&gt;
! Naam !! Meebestellen Heltec V3 !! Betaald?&lt;br /&gt;
|-&lt;br /&gt;
| Wheeze_NL || Nee || .&lt;br /&gt;
|-&lt;br /&gt;
| Crashjuh || Nee || .&lt;br /&gt;
|-&lt;br /&gt;
| polyfloyd || Nee || .&lt;br /&gt;
|-&lt;br /&gt;
| Colomax || 2x || ja&lt;br /&gt;
|-&lt;br /&gt;
| Atoomnet || Nee || .&lt;br /&gt;
|-&lt;br /&gt;
| blaat || 1x || ja&lt;br /&gt;
|-&lt;br /&gt;
| Lukkie || 1x || ja&lt;br /&gt;
|-&lt;br /&gt;
| Wilbert || nee || .&lt;br /&gt;
|-&lt;br /&gt;
| CH23 || nee || .&lt;br /&gt;
|-&lt;br /&gt;
| TeQ || nee || .&lt;br /&gt;
|-&lt;br /&gt;
| Kartoffel || nee&lt;br /&gt;
|-&lt;br /&gt;
| Ries || ja || .&lt;br /&gt;
|-&lt;br /&gt;
| Gori || nee || .&lt;br /&gt;
|-&lt;br /&gt;
| Dimi || nee || .&lt;br /&gt;
|-&lt;br /&gt;
| Muad-Dib || nee || .&lt;br /&gt;
|-&lt;br /&gt;
| florian || nee || .&lt;br /&gt;
|-&lt;br /&gt;
| Colomax + 1 || nee || .&lt;br /&gt;
|-&lt;br /&gt;
| FooBar || nee || .&lt;br /&gt;
|-&lt;br /&gt;
| - || - || .&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Inkoopactie voor een Meshcore Router op de space=&lt;br /&gt;
&lt;br /&gt;
We willen de https://heltec.org/project/meshtower/ MeshTower van Heltec. Er is al MeshCore firmware voor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Bijschrift&lt;br /&gt;
|-&lt;br /&gt;
! Wie !! Hoeveel tientjes !! Betaald?&lt;br /&gt;
|-&lt;br /&gt;
| Bas || 2 || ja&lt;br /&gt;
|-&lt;br /&gt;
| CH23 || 2 || ja&lt;br /&gt;
|-&lt;br /&gt;
| Wilbert || 2 || ja&lt;br /&gt;
|-&lt;br /&gt;
| Crashjuh || 3 || ja&lt;br /&gt;
|-&lt;br /&gt;
| Elborro || 2 || ja&lt;br /&gt;
|-&lt;br /&gt;
| sting || 1 || ja&lt;br /&gt;
|-&lt;br /&gt;
| Colomax || 1 || ja&lt;br /&gt;
|-&lt;br /&gt;
| Wheeze_NL || 1 || ja&lt;br /&gt;
|-&lt;br /&gt;
| Boekenwuurm || 1 || nee&lt;br /&gt;
|-&lt;br /&gt;
| thomas || 1 || ja&lt;br /&gt;
|-&lt;br /&gt;
| jelle || 2 || ja&lt;br /&gt;
|-&lt;br /&gt;
| Lukkie || 2 || ja&lt;br /&gt;
|-&lt;br /&gt;
| cmpxchg || 1 || nee&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Voorbeeld || Voorbeeld || Voorbeeld&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Totaal: 200 euro van de 200 euro&lt;br /&gt;
&lt;br /&gt;
Wil je ook een MeshTower meebestellen of iets anders van HelTec? Dat kan, zet het hieronder jouw bestelling. Met meerdere MeshTowers zakt de prijs van 230 euro per stuk naar ongeveer 200!&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Bijschrift&lt;br /&gt;
|-&lt;br /&gt;
! Wie !! Wat !! Totaal ex verzenden in $ !! Totaal berekend door Bas incl verzenden !! Betaald?&lt;br /&gt;
|-&lt;br /&gt;
| RandomData (via Bas)|| 1x MeshTower|| .|| 200|| Ja&lt;br /&gt;
|- &lt;br /&gt;
| Bas || 1x Heltec V4 || .|| x || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Bart Jan (RandomData) || 1x MeshTower ||.||200||Ja&lt;br /&gt;
|-&lt;br /&gt;
| Lukkie || 1x MeshTower || .||200||Ja&lt;br /&gt;
|-&lt;br /&gt;
| BlackDragon || 1x Heltec V4 || 20 || 25 || ja&lt;br /&gt;
|-&lt;br /&gt;
| Wheeze_NL || 1x Heltec V4 || 20 || ?? || ja&lt;br /&gt;
|-&lt;br /&gt;
| HS Nijmegen via Bas || 1x MeshTower ||.||200||Ja&lt;br /&gt;
|-&lt;br /&gt;
| cmpxchg || 1x MeshTower ||.||200|| ja&lt;br /&gt;
|-&lt;br /&gt;
| Synq || 1x MeshTower, 1x V3||.||225||Ja&lt;br /&gt;
|-&lt;br /&gt;
| Elborro || 1x MeshTower ||.||200||Ja&lt;br /&gt;
|-&lt;br /&gt;
| Dimi || 1x MeshTower ||.||200||Ja&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De inkoopactie is gesloten. Alle hardware is besteld (9x MeshTower, 6x V3 en 3x V4).&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Meshcore&amp;diff=35406</id>
		<title>Meshcore</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Meshcore&amp;diff=35406"/>
		<updated>2026-07-13T14:26:52Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Revspace meshcore repeater */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
 |Name=MeshCore&lt;br /&gt;
 |Status=In progress&lt;br /&gt;
 |Picture=Meshtower.png&lt;br /&gt;
 |Contact=Bas&lt;br /&gt;
 |Contact1=Anne Jan&lt;br /&gt;
 |Contact2=Paul&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Event&lt;br /&gt;
 |Name=Workshop/Lecture MeshCore&lt;br /&gt;
 |DateStart=29 November 2025 15:00&lt;br /&gt;
 |DateEnd=29 November 2025 18:00&lt;br /&gt;
 |Info=Lecture/Workshop about MeshCore&lt;br /&gt;
 |InfoLocation=RevSpace&lt;br /&gt;
 |InfoOpen=12:30&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
= Revspace meshcore repeater =&lt;br /&gt;
Er is een Revspace meshcore repeater, type [https://heltec.org/project/meshtower/ MeshTower], gegevens per 2026-6-6:&lt;br /&gt;
* Fysiek staat ie bovenop de kast rechts naast de bar&lt;br /&gt;
* Geconfigureerd met settings volgens https://meshcore.envoyage.io/configurator/&lt;br /&gt;
* Firmware 1.15&lt;br /&gt;
* SF7/CR5&lt;br /&gt;
* 2-byte hashes (mode 1) + regio scopes&lt;br /&gt;
* Naam &amp;quot;RevSpace&amp;quot;, password bekend bij [[Bertrik]] en [[Crashjuh]]&lt;br /&gt;
&lt;br /&gt;
Nieuwe firmware flashen:&lt;br /&gt;
* Schroef het kastje open&lt;br /&gt;
* Steek een kabel in de USB-C van de meshtower en het andere eind in je computer&lt;br /&gt;
* Ergens naast de USB-C connector zit een klein knopje (reset of RST), druk die 2x kort in (binnen 1 seconde)&lt;br /&gt;
* Op je computer zie je een USB drive verschijnen, de meshtower is nu in bootloader mode&lt;br /&gt;
* Flash een firmware via de web interface van https://meshcore.co.uk/flasher.html , kies &amp;quot;Heltec MeshSolar / MeshTower&amp;quot;, kies rol repeater.&lt;br /&gt;
&lt;br /&gt;
Configureren:&lt;br /&gt;
* Via de browser lukte mij niet&lt;br /&gt;
* Uiteindelijk geconfigureerd via USB-seriele poort console:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen /dev/ttyACM0 115200&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In seriele poort console kan je commando&#039;s intypen zoals:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Radio instellingen (EU868): set radio 869.618,62.5,7,5&lt;br /&gt;
Advert interval: set advert.interval 180&lt;br /&gt;
Flood advert interval: set flood.advert.interval 50&lt;br /&gt;
Naam: set name RevSpace&lt;br /&gt;
Eigenaar: set owner.info bertrik@gmail.com&lt;br /&gt;
Latitude: set lat 52.0862&lt;br /&gt;
Longitude: set lon 4.3947&lt;br /&gt;
RX delay: set rxdelay 0.0&lt;br /&gt;
TX delay: set txdelay 0.5&lt;br /&gt;
Interference threshold: set int.thresh 1&lt;br /&gt;
Max hop count: set flood.max 48&lt;br /&gt;
TX power: set tx 22&lt;br /&gt;
EU regio aanmaken: region put eu&lt;br /&gt;
Land regio aanmaken: region put nl&lt;br /&gt;
Provincie regio aanmaken: region put nl-zh nl&lt;br /&gt;
Bredere regio 1 aanmaken: region put nl-hag nl&lt;br /&gt;
Bredere regio 2 aanmaken: region put nl-lid nl&lt;br /&gt;
Gemeente regio aanmaken: region put nl-zh-lsv nl-zh&lt;br /&gt;
Plaats regio aanmaken: region put nl-zh-lds nl-zh&lt;br /&gt;
Flood toestaan: EU: region allowf eu&lt;br /&gt;
Flood toestaan: land: region allowf nl&lt;br /&gt;
Flood toestaan: provincie: region allowf nl-zh&lt;br /&gt;
Flood toestaan: bredere regio 1: region allowf nl-hag&lt;br /&gt;
Flood toestaan: bredere regio 2: region allowf nl-lid&lt;br /&gt;
Flood toestaan: gemeente: region allowf nl-zh-lsv&lt;br /&gt;
Flood toestaan: plaats: region allowf nl-zh-lds&lt;br /&gt;
Standaardregio (provincie): region default nl-zh&lt;br /&gt;
Thuisregio: region home nl-zh-lds&lt;br /&gt;
Regio&#039;s opslaan: region save&lt;br /&gt;
Path hash mode: set path.hash.mode 1&lt;br /&gt;
Loop detectie: set loop.detect moderate&lt;br /&gt;
Duty cycle: set dutycycle 10&lt;br /&gt;
Admin wachtwoord: password ***&lt;br /&gt;
Herstarten: reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Workshop=&lt;br /&gt;
Een introductie in MeshCore en als je een compatible apparaatje meeneemt (wij hebben ook een aantal mee, dus geen aankoopplicht ;) ): tevens een workshop om er mee te beginnen!&lt;br /&gt;
 &lt;br /&gt;
Heb je eerder dit jaar tijdens het Hackerhotel een Meshtastic kitje aangeschaft, maar niets meer met je Meshtastic gedaan? Dan is dat kitje met Heltec V3 een prima starter bij deze MeshCore workshop.&lt;br /&gt;
&lt;br /&gt;
Je kunt eventueel een Heltec V3 meebestellen voor 25 euro incl btw. Zet dat dan even in de tabel hieronder erbij. Maar je mag natuurlijk ook je eigen spul meenemen.&lt;br /&gt;
&lt;br /&gt;
==Inhoud==&lt;br /&gt;
* Wat is MeshCore&lt;br /&gt;
* Waarom is het leuk&lt;br /&gt;
* Verschillende rollen&lt;br /&gt;
* Hardware (en hoe het uit de hand loopt)&lt;br /&gt;
* Configuratie&lt;br /&gt;
* Demo&lt;br /&gt;
* Speeltijd en hulp met het werkend krijgen.&lt;br /&gt;
&lt;br /&gt;
https://pad.bitlair.nl/p/lora&lt;br /&gt;
&lt;br /&gt;
https://docs.google.com/presentation/d/1h6CC3s-rCDkTylBscA9Ky0ZhBM5mxv8rZMoFVbLMzFs/edit?usp=sharing&lt;br /&gt;
&lt;br /&gt;
==Aanmelden==&lt;br /&gt;
Let op: we kunnen maximaal 20 deelnemers huisvesten en begeleiden.&lt;br /&gt;
&lt;br /&gt;
Je kunt geen Heltec v3 meer meebestellen. Hij is zonder case nog wel leverbaar via TinyTronics: https://www.tinytronics.nl/nl/development-boards/microcontroller-boards/met-lora/heltec-wi-fi-lora-32-esp32-s3-sx1262-met-0.96-inch-oled-display&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Bijschrift&lt;br /&gt;
|-&lt;br /&gt;
! Naam !! Meebestellen Heltec V3 !! Betaald?&lt;br /&gt;
|-&lt;br /&gt;
| Wheeze_NL || Nee || .&lt;br /&gt;
|-&lt;br /&gt;
| Crashjuh || Nee || .&lt;br /&gt;
|-&lt;br /&gt;
| polyfloyd || Nee || .&lt;br /&gt;
|-&lt;br /&gt;
| Colomax || 2x || ja&lt;br /&gt;
|-&lt;br /&gt;
| Atoomnet || Nee || .&lt;br /&gt;
|-&lt;br /&gt;
| blaat || 1x || ja&lt;br /&gt;
|-&lt;br /&gt;
| Lukkie || 1x || ja&lt;br /&gt;
|-&lt;br /&gt;
| Wilbert || nee || .&lt;br /&gt;
|-&lt;br /&gt;
| CH23 || nee || .&lt;br /&gt;
|-&lt;br /&gt;
| TeQ || nee || .&lt;br /&gt;
|-&lt;br /&gt;
| Kartoffel || nee&lt;br /&gt;
|-&lt;br /&gt;
| Ries || ja || .&lt;br /&gt;
|-&lt;br /&gt;
| Gori || nee || .&lt;br /&gt;
|-&lt;br /&gt;
| Dimi || nee || .&lt;br /&gt;
|-&lt;br /&gt;
| Muad-Dib || nee || .&lt;br /&gt;
|-&lt;br /&gt;
| florian || nee || .&lt;br /&gt;
|-&lt;br /&gt;
| Colomax + 1 || nee || .&lt;br /&gt;
|-&lt;br /&gt;
| FooBar || nee || .&lt;br /&gt;
|-&lt;br /&gt;
| - || - || .&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Inkoopactie voor een Meshcore Router op de space=&lt;br /&gt;
&lt;br /&gt;
We willen de https://heltec.org/project/meshtower/ MeshTower van Heltec. Er is al MeshCore firmware voor.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Bijschrift&lt;br /&gt;
|-&lt;br /&gt;
! Wie !! Hoeveel tientjes !! Betaald?&lt;br /&gt;
|-&lt;br /&gt;
| Bas || 2 || ja&lt;br /&gt;
|-&lt;br /&gt;
| CH23 || 2 || ja&lt;br /&gt;
|-&lt;br /&gt;
| Wilbert || 2 || ja&lt;br /&gt;
|-&lt;br /&gt;
| Crashjuh || 3 || ja&lt;br /&gt;
|-&lt;br /&gt;
| Elborro || 2 || ja&lt;br /&gt;
|-&lt;br /&gt;
| sting || 1 || ja&lt;br /&gt;
|-&lt;br /&gt;
| Colomax || 1 || ja&lt;br /&gt;
|-&lt;br /&gt;
| Wheeze_NL || 1 || ja&lt;br /&gt;
|-&lt;br /&gt;
| Boekenwuurm || 1 || nee&lt;br /&gt;
|-&lt;br /&gt;
| thomas || 1 || ja&lt;br /&gt;
|-&lt;br /&gt;
| jelle || 2 || ja&lt;br /&gt;
|-&lt;br /&gt;
| Lukkie || 2 || ja&lt;br /&gt;
|-&lt;br /&gt;
| cmpxchg || 1 || nee&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Voorbeeld || Voorbeeld || Voorbeeld&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Totaal: 200 euro van de 200 euro&lt;br /&gt;
&lt;br /&gt;
Wil je ook een MeshTower meebestellen of iets anders van HelTec? Dat kan, zet het hieronder jouw bestelling. Met meerdere MeshTowers zakt de prijs van 230 euro per stuk naar ongeveer 200!&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Bijschrift&lt;br /&gt;
|-&lt;br /&gt;
! Wie !! Wat !! Totaal ex verzenden in $ !! Totaal berekend door Bas incl verzenden !! Betaald?&lt;br /&gt;
|-&lt;br /&gt;
| RandomData (via Bas)|| 1x MeshTower|| .|| 200|| Ja&lt;br /&gt;
|- &lt;br /&gt;
| Bas || 1x Heltec V4 || .|| x || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Bart Jan (RandomData) || 1x MeshTower ||.||200||Ja&lt;br /&gt;
|-&lt;br /&gt;
| Lukkie || 1x MeshTower || .||200||Ja&lt;br /&gt;
|-&lt;br /&gt;
| BlackDragon || 1x Heltec V4 || 20 || 25 || ja&lt;br /&gt;
|-&lt;br /&gt;
| Wheeze_NL || 1x Heltec V4 || 20 || ?? || ja&lt;br /&gt;
|-&lt;br /&gt;
| HS Nijmegen via Bas || 1x MeshTower ||.||200||Ja&lt;br /&gt;
|-&lt;br /&gt;
| cmpxchg || 1x MeshTower ||.||200|| ja&lt;br /&gt;
|-&lt;br /&gt;
| Synq || 1x MeshTower, 1x V3||.||225||Ja&lt;br /&gt;
|-&lt;br /&gt;
| Elborro || 1x MeshTower ||.||200||Ja&lt;br /&gt;
|-&lt;br /&gt;
| Dimi || 1x MeshTower ||.||200||Ja&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De inkoopactie is gesloten. Alle hardware is besteld (9x MeshTower, 6x V3 en 3x V4).&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35405</id>
		<title>Its-g5</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35405"/>
		<updated>2026-07-13T09:02:58Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=ITS-G5&lt;br /&gt;
   |Picture=its-g5.png&lt;br /&gt;
   |Omschrijving=Receiving ITS-G5 signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[[File:its-g5-wireshark.png|thumb|right|alt=wireshark analysis]]&lt;br /&gt;
&lt;br /&gt;
This page is about investigating reception and processing of so-called C-ITS or ITS-G5 signals (802.11p) as used in the Netherlands, see also https://en.wikipedia.org/wiki/Vehicle-to-everything&lt;br /&gt;
These signals are exchanged between passenger cars, emergency vehicles, traffic lights and other traffic-related equipment.&lt;br /&gt;
&lt;br /&gt;
An ESP32-C5 development board is capable of receiving WiFi in the 5 GHz band and can receive/sniff these kinds of packets from live traffic.&lt;br /&gt;
&lt;br /&gt;
Stuff to investigate:&lt;br /&gt;
* Crowd-sourced live map of messages received: https://opentrafficmap.org/ Their wiki: https://wiki.opentrafficmap.org&lt;br /&gt;
* Source code for an ITS-G5 receiver https://github.com/pit711/v2x2map&lt;br /&gt;
* Simplest source code for Arduino-based sniffer: https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
&lt;br /&gt;
In the Netherlands, SPAT/MAPem messages from traffic lights are not transferred over wifi-p, but over UDAP.&lt;br /&gt;
You need credentials to access that data, it is not clear if it is feasible to hobbyist to access it.&lt;br /&gt;
Interesting project: https://github.com/idkmanLool9/Verkeerslicht&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
[[File:esp32-c5-sniffer.jpg|thumb|right|alt=esp32-c5-sniffer]]&lt;br /&gt;
&lt;br /&gt;
The design is:&lt;br /&gt;
* Use an esp32-c5 for sniffing 802.11p frames only&lt;br /&gt;
* Use an esp32-c3 for receiving sniffed frames from the esp32-c5, connect to WiFi and upload packets over MQTT&lt;br /&gt;
* The interface beteween the two boards is &#039;&#039;&#039;serial&#039;&#039;&#039;, this is simpler than SPI as used in other projects:&lt;br /&gt;
** Only three wires required: GND, +5V and serial DATA&lt;br /&gt;
** No hardware modification required (e.g. desolder capacitors on SPI wires of the esp32-c5)&lt;br /&gt;
** A serial interface is more universal, e.g. can be connected to an arbitrary linux SBC, to run a python bridge for example&lt;br /&gt;
** On the esp32-c5 use the same wires as the existing USB-UART bridge, so you can also receive packets over USB-serial&lt;br /&gt;
* Run a simple web server on the esp-c3:&lt;br /&gt;
** Configuration page with MQTT settings: protocol, host, port, user, pass&lt;br /&gt;
** Optional: show some nice stats: mqtt status, packet rate, last packet, packets per type&lt;br /&gt;
** Optional: run a very basic parser for e.g. CAM messages&lt;br /&gt;
* Power is provided to the esp32-c3, which then distributes power as raw 5V/GND to the esp32-c5. The esp32-c5 uses its own regulator to turn it into a stable internal supply voltage.&lt;br /&gt;
&lt;br /&gt;
Practical:&lt;br /&gt;
* The serial link runs over the USB-UART chip of the esp32-c5.&lt;br /&gt;
* A simple command processor runs on the other UART (the emulated USB serial port)&lt;br /&gt;
* On the esp32-c5 side, use pins GND, 5V, UART-TX for the ESP-ESP serial connection.&lt;br /&gt;
* The esp32-c3 and esp32-c5 share their 5V and GND power lines. Each board derives its own internal power supplies from this 5V.&lt;br /&gt;
* The serial link doesn&#039;t have to be very high speed, 115200 for example. We use a hardware UART on both sides of the serial link.&lt;br /&gt;
* Use https://registry.platformio.org/libraries/thomasfredericks/MicroSlip for framing packets over the serial port.&lt;br /&gt;
&lt;br /&gt;
=== opentraffic map interface ===&lt;br /&gt;
See https://github.com/MPW1412/openwrt-otm-bridge#wire-format-mimics-the-esp32-c5-firmware for the mqtt wire format.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/pit711/v2x2map/blob/main/firmware/main/mqtt.c&lt;br /&gt;
&lt;br /&gt;
In short: server = mqtts://cits1.opentrafficmap.org:8883 :&lt;br /&gt;
* no user name / password&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/status&#039; (online or offline), retained&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/info&#039; with a JSON string, like {&amp;quot;emac&amp;quot;:&amp;quot;xx:xx:xx:xx:xx:xx&amp;quot;,&amp;quot;ver&amp;quot;:&amp;quot;github.com/bertrik/its-g5-receiver-v0.0.1&amp;quot;,&amp;quot;hwv&amp;quot;:&amp;quot;esp32-c5-devkit-c1&amp;quot;}&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/packet&#039; for sniffed packets (raw, not JSON encoded)&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Sniffer ===&lt;br /&gt;
[[File:esp32-c5-devkitc-1.jpg|thumb|right|alt=esp32-c5]]&lt;br /&gt;
[[File:esp32-c3-supermini.jpg|thumb|right|alt=esp32-c3]]&lt;br /&gt;
&lt;br /&gt;
This project uses an ESP32-C5-devkitC-1 board for the sniffer part:&lt;br /&gt;
* Aliexpress product page https://nl.aliexpress.com/item/1005012416463528.html&lt;br /&gt;
* Espressif schematic https://dl.espressif.com/dl/schematics/SCH_ESP32-C5-DevkitC-1_V1.1_20240621.pdf . Actually my board is not exactly like this, the USB-UART is connected to pins GPIO11 (TX) and GPIO12 (RX), not GPIO25/GPIO24.&lt;br /&gt;
* Espressif devkit-c page: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c5/esp32-c5-devkitc-1/user_guide.html&lt;br /&gt;
&lt;br /&gt;
It has an onboard antenna. There are also other boards with an antenna connection, which allows using an external antenna. This may be better, I don&#039;t know yet.&lt;br /&gt;
&lt;br /&gt;
=== Bridge ===&lt;br /&gt;
An ESP32-C3 is used as the bridge part.&lt;br /&gt;
I used a &#039;supermini&#039; but apparently they have a design flaw causing them to run very hot:&lt;br /&gt;
* https://www.dailyduino.com/index.php/2026/01/20/the-spicy-esp32-c3-super-mini-when-2-boards-become-2-heaters/&lt;br /&gt;
&lt;br /&gt;
How to wire it up, what I did:&lt;br /&gt;
* Put both the esp32-c3-supermini board and the esp32-c5-devkit-c1 on a breadboard&lt;br /&gt;
* Use male-male dupont wires to connect:&lt;br /&gt;
** 5V to 5V, GND to GND, esp32-c5 TX to esp32-c3 RX&lt;br /&gt;
* Programmed the esp32-c5 with firmware&lt;br /&gt;
* Plug an USB-C cable into the esp32-c3, programmed it with firmware, now it&#039;s powering both the esp32-c3 and the esp32-c5&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Connections&lt;br /&gt;
|-&lt;br /&gt;
! ESP32-c5 !! ESP32-c3 !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| GND || GND || shared ground&lt;br /&gt;
|-&lt;br /&gt;
| 5V || 5V || raw power&lt;br /&gt;
|-&lt;br /&gt;
| U0TXD/GPIO11 || RX/GPIO20 || Data link&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See https://github.com/bertrik/its-g5-receiver&lt;br /&gt;
&lt;br /&gt;
This is heavily inspired by https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
but with a fixed size ring buffer instead of dynamic allocation.&lt;br /&gt;
&lt;br /&gt;
=== Compiling the firmware ===&lt;br /&gt;
Uses python and platformio, see the README.md in the source archive.&lt;br /&gt;
&lt;br /&gt;
Watch packets come in:&lt;br /&gt;
  pio device monitor&lt;br /&gt;
Packets are logged as a &#039;hexdump&#039;.&lt;br /&gt;
&lt;br /&gt;
The can be converted for wireshark, for example:&lt;br /&gt;
  text2pcap -l 105 message.txt message.pcap&lt;br /&gt;
Then viewed in wireshark:&lt;br /&gt;
  wireshark message.pcap&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35404</id>
		<title>Its-g5</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35404"/>
		<updated>2026-07-13T09:02:27Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=ITS-G5&lt;br /&gt;
   |Picture=its-g5.png&lt;br /&gt;
   |Omschrijving=Receiving ITS-G5 signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[[File:its-g5-wireshark.png|thumb|right|alt=wireshark analysis]]&lt;br /&gt;
&lt;br /&gt;
This page is about investigating reception and processing of so-called C-ITS or ITS-G5 signals (802.11p) as used in the Netherlands, see also https://en.wikipedia.org/wiki/Vehicle-to-everything&lt;br /&gt;
These signals are exchanged between passenger cars, emergency vehicles, traffic lights and other traffic-related equipment.&lt;br /&gt;
&lt;br /&gt;
An ESP32-C5 development board is capable of receiving WiFi in the 5 GHz band and can receive/sniff these kinds of packets from live traffic.&lt;br /&gt;
&lt;br /&gt;
Stuff to investigate:&lt;br /&gt;
* Crowd-sourced live map of messages received: https://opentrafficmap.org/ Their wiki: https://wiki.opentrafficmap.org&lt;br /&gt;
* Source code for an ITS-G5 receiver https://github.com/pit711/v2x2map&lt;br /&gt;
* Simplest source code for Arduino-based sniffer: https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
&lt;br /&gt;
In the Netherlands, SPAT/MAPem messages from traffic lights are not transferred over wifi-p, but over UDAP.&lt;br /&gt;
You need credentials to access that data, it is not clear if it is feasible to hobbyist to access it.&lt;br /&gt;
Interesting project: https://github.com/idkmanLool9/Verkeerslicht&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
[[File:esp32-c5-sniffer.jpg|thumb|right|alt=esp32-c5-sniffer]]&lt;br /&gt;
&lt;br /&gt;
The design is:&lt;br /&gt;
* Use an esp32-c5 for sniffing 802.11p frames only&lt;br /&gt;
* Use an esp32-c3 for receiving sniffed frames from the esp32-c5, connect to WiFi and upload packets over MQTT&lt;br /&gt;
* The interface beteween the two boards is &#039;&#039;&#039;serial&#039;&#039;&#039;, this is simpler than SPI as used in other projects:&lt;br /&gt;
** Only three wires required: GND, +5V and serial DATA&lt;br /&gt;
** No hardware modification required (e.g. desolder capacitors on SPI wires of the esp32-c5)&lt;br /&gt;
** A serial interface is more universal, e.g. can be connected to an arbitrary linux SBC, to run a python bridge for example&lt;br /&gt;
** On the esp32-c5 use the same wires as the existing USB-UART bridge, so you can also receive packets over USB-serial&lt;br /&gt;
* Run a simple web server on the esp-c3:&lt;br /&gt;
** Configuration page with MQTT settings: protocol, host, port, user, pass&lt;br /&gt;
** Optional: show some nice stats: mqtt status, packet rate, last packet, packets per type&lt;br /&gt;
** Optional: run a very basic parser for e.g. CAM messages&lt;br /&gt;
* Power is provided to the esp32-c3, which then distributes power as raw 5V/GND to the esp32-c5. The esp32-c5 uses its own regulator to turn it into a stable internal supply voltage.&lt;br /&gt;
&lt;br /&gt;
Practical:&lt;br /&gt;
* The serial link runs over the USB-UART chip of the esp32-c5.&lt;br /&gt;
* A simple command processor runs on the other UART (the emulated USB serial port)&lt;br /&gt;
* On the esp32-c5 side, use pins GND, 5V, UART-TX for the ESP-ESP serial connection.&lt;br /&gt;
* The esp32-c3 and esp32-c5 share their 5V and GND power lines. Each board derives its own internal power supplies from this 5V.&lt;br /&gt;
* The serial link doesn&#039;t have to be very high speed, 115200 for example. We use a hardware UART on both sides of the serial link.&lt;br /&gt;
* Use https://registry.platformio.org/libraries/thomasfredericks/MicroSlip for framing packets over the serial port.&lt;br /&gt;
&lt;br /&gt;
=== opentraffic map interface ===&lt;br /&gt;
See https://github.com/MPW1412/openwrt-otm-bridge#wire-format-mimics-the-esp32-c5-firmware for the mqtt wire format.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/pit711/v2x2map/blob/main/firmware/main/mqtt.c&lt;br /&gt;
&lt;br /&gt;
In short: server = mqtts://cits1.opentrafficmap.org:8883 :&lt;br /&gt;
* no user name / password&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/status&#039; (online or offline), retained&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/info&#039; with a JSON string, like {&amp;quot;emac&amp;quot;:&amp;quot;xx:xx:xx:xx:xx:xx&amp;quot;,&amp;quot;ver&amp;quot;:&amp;quot;github.com/bertrik/its-g5-receiver-v0.0.1&amp;quot;,&amp;quot;hwv&amp;quot;:&amp;quot;esp32-c5-devkit-c1&amp;quot;}&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/packet&#039; for sniffed packets (raw, not JSON encoded)&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:esp32-c5-devkitc-1.jpg|thumb|right|alt=esp32-c5]]&lt;br /&gt;
[[File:esp32-c3-supermini.jpg|thumb|right|alt=esp32-c3]]&lt;br /&gt;
&lt;br /&gt;
This project uses an ESP32-C5-devkitC-1 board for the sniffer part:&lt;br /&gt;
* Aliexpress product page https://nl.aliexpress.com/item/1005012416463528.html&lt;br /&gt;
* Espressif schematic https://dl.espressif.com/dl/schematics/SCH_ESP32-C5-DevkitC-1_V1.1_20240621.pdf . Actually my board is not exactly like this, the USB-UART is connected to pins GPIO11 (TX) and GPIO12 (RX), not GPIO25/GPIO24.&lt;br /&gt;
* Espressif devkit-c page: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c5/esp32-c5-devkitc-1/user_guide.html&lt;br /&gt;
&lt;br /&gt;
An ESP32-C3 is used as the bridge part.&lt;br /&gt;
I used a &#039;supermini&#039; but apparently they have a design flaw causing them to run very hot:&lt;br /&gt;
* https://www.dailyduino.com/index.php/2026/01/20/the-spicy-esp32-c3-super-mini-when-2-boards-become-2-heaters/&lt;br /&gt;
&lt;br /&gt;
It has an onboard antenna. There are also other boards with an antenna connection, which allows using an external antenna. This may be better, I don&#039;t know yet.&lt;br /&gt;
&lt;br /&gt;
How to wire it up, what I did:&lt;br /&gt;
* Put both the esp32-c3-supermini board and the esp32-c5-devkit-c1 on a breadboard&lt;br /&gt;
* Use male-male dupont wires to connect:&lt;br /&gt;
** 5V to 5V, GND to GND, esp32-c5 TX to esp32-c3 RX&lt;br /&gt;
* Programmed the esp32-c5 with firmware&lt;br /&gt;
* Plug an USB-C cable into the esp32-c3, programmed it with firmware, now it&#039;s powering both the esp32-c3 and the esp32-c5&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Connections&lt;br /&gt;
|-&lt;br /&gt;
! ESP32-c5 !! ESP32-c3 !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| GND || GND || shared ground&lt;br /&gt;
|-&lt;br /&gt;
| 5V || 5V || raw power&lt;br /&gt;
|-&lt;br /&gt;
| U0TXD/GPIO11 || RX/GPIO20 || Data link&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See https://github.com/bertrik/its-g5-receiver&lt;br /&gt;
&lt;br /&gt;
This is heavily inspired by https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
but with a fixed size ring buffer instead of dynamic allocation.&lt;br /&gt;
&lt;br /&gt;
=== Compiling the firmware ===&lt;br /&gt;
Uses python and platformio, see the README.md in the source archive.&lt;br /&gt;
&lt;br /&gt;
Watch packets come in:&lt;br /&gt;
  pio device monitor&lt;br /&gt;
Packets are logged as a &#039;hexdump&#039;.&lt;br /&gt;
&lt;br /&gt;
The can be converted for wireshark, for example:&lt;br /&gt;
  text2pcap -l 105 message.txt message.pcap&lt;br /&gt;
Then viewed in wireshark:&lt;br /&gt;
  wireshark message.pcap&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35403</id>
		<title>Its-g5</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35403"/>
		<updated>2026-07-13T09:02:14Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=ITS-G5&lt;br /&gt;
   |Picture=its-g5.png&lt;br /&gt;
   |Omschrijving=Receiving ITS-G5 signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[[File:its-g5-wireshark.png|thumb|right|alt=wireshark analysis]]&lt;br /&gt;
&lt;br /&gt;
This page is about investigating reception and processing of so-called C-ITS or ITS-G5 signals (802.11p) as used in the Netherlands, see also https://en.wikipedia.org/wiki/Vehicle-to-everything&lt;br /&gt;
These signals are exchanged between passenger cars, emergency vehicles, traffic lights and other traffic-related equipment.&lt;br /&gt;
&lt;br /&gt;
An ESP32-C5 development board is capable of receiving WiFi in the 5 GHz band and can receive/sniff these kinds of packets from live traffic.&lt;br /&gt;
&lt;br /&gt;
Stuff to investigate:&lt;br /&gt;
* Crowd-sourced live map of messages received: https://opentrafficmap.org/ Their wiki: https://wiki.opentrafficmap.org&lt;br /&gt;
* Source code for an ITS-G5 receiver https://github.com/pit711/v2x2map&lt;br /&gt;
* Simplest source code for Arduino-based sniffer: https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
&lt;br /&gt;
In the Netherlands, SPAT/MAPem messages from traffic lights are not transferred over wifi-p, but over UDAP.&lt;br /&gt;
You need credentials to access that data, it is not clear if it is feasible to hobbyist to access it.&lt;br /&gt;
Interesting project: https://github.com/idkmanLool9/Verkeerslicht&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
[[File:esp32-c5-sniffer.jpg|thumb|right|alt=esp32-c5-sniffer]]&lt;br /&gt;
&lt;br /&gt;
The design is:&lt;br /&gt;
* Use an esp32-c5 for sniffing 802.11p frames only&lt;br /&gt;
* Use an esp32-c3 for receiving sniffed frames from the esp32-c5, connect to WiFi and upload packets over MQTT&lt;br /&gt;
* The interface beteween the two boards is &#039;&#039;&#039;serial&#039;&#039;&#039;, this is simpler than SPI as used in other projects:&lt;br /&gt;
** Only three wires required: GND, +5V and serial DATA&lt;br /&gt;
** No hardware modification required (e.g. desolder capacitors on SPI wires of the esp32-c5)&lt;br /&gt;
** A serial interface is more universal, e.g. can be connected to an arbitrary linux SBC, to run a python bridge for example&lt;br /&gt;
** On the esp32-c5 use the same wires as the existing USB-UART bridge, so you can also receive packets over USB-serial&lt;br /&gt;
* Run a simple web server on the esp-c3:&lt;br /&gt;
** Configuration page with MQTT settings: protocol, host, port, user, pass&lt;br /&gt;
** Optional: show some nice stats: mqtt status, packet rate, last packet, packets per type&lt;br /&gt;
** Optional: run a very basic parser for e.g. CAM messages&lt;br /&gt;
* Power is provided to the esp32-c3, which then distributes power as raw 5V/GND to the esp32-c5. The esp32-c5 uses its own regulator to turn it into a stable internal supply voltage.&lt;br /&gt;
&lt;br /&gt;
Practical:&lt;br /&gt;
* The serial link runs over the USB-UART chip of the esp32-c5.&lt;br /&gt;
* A simple command processor runs on the other UART (the emulated USB serial port)&lt;br /&gt;
* On the esp32-c5 side, use pins GND, 5V, UART-TX for the ESP-ESP serial connection.&lt;br /&gt;
* The esp32-c3 and esp32-c5 share their 5V and GND power lines. Each board derives its own internal power supplies from this 5V.&lt;br /&gt;
* The serial link doesn&#039;t have to be very high speed, 115200 for example. We use a hardware UART on both sides of the serial link.&lt;br /&gt;
* Use https://registry.platformio.org/libraries/thomasfredericks/MicroSlip for framing packets over the serial port.&lt;br /&gt;
&lt;br /&gt;
=== opentraffic map interface ===&lt;br /&gt;
See https://github.com/MPW1412/openwrt-otm-bridge#wire-format-mimics-the-esp32-c5-firmware for the mqtt wire format.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/pit711/v2x2map/blob/main/firmware/main/mqtt.c&lt;br /&gt;
&lt;br /&gt;
In short: server = mqtts://cits1.opentrafficmap.org:8883 :&lt;br /&gt;
* no user name / password&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/status&#039; (online or offline), retained&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/info&#039; with a JSON string, like {&amp;quot;emac&amp;quot;:&amp;quot;xx:xx:xx:xx:xx:xx&amp;quot;,&amp;quot;ver&amp;quot;:&amp;quot;github.com/bertrik/its-g5-receiver-v0.0.1&amp;quot;,&amp;quot;hwv&amp;quot;:&amp;quot;esp32-c5-devkit-c1&amp;quot;}&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/packet&#039; for sniffed packets (raw, not JSON encoded)&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:esp32-c5-devkitc-1.jpg|thumb|right|alt=esp32-c5]]&lt;br /&gt;
[[File:esp32-c3-supermini.jpg|thumb|right|alt=esp32-c3]]&lt;br /&gt;
&lt;br /&gt;
This project uses an ESP32-C5-devkitC-1 board for the sniffer part:&lt;br /&gt;
* Aliexpress product page https://nl.aliexpress.com/item/1005012416463528.html&lt;br /&gt;
* Espressif schematic https://dl.espressif.com/dl/schematics/SCH_ESP32-C5-DevkitC-1_V1.1_20240621.pdf . Actually my board is not exactly like this, the USB-UART is connected to pins GPIO11 (TX) and GPIO12 (RX), not GPIO25/GPIO24.&lt;br /&gt;
* Espressif devkit-c page: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c5/esp32-c5-devkitc-1/user_guide.html&lt;br /&gt;
&lt;br /&gt;
An ESP32-C5 is used as the bridge part.&lt;br /&gt;
I used a &#039;supermini&#039; but apparently they have a design flaw causing them to run very hot:&lt;br /&gt;
* https://www.dailyduino.com/index.php/2026/01/20/the-spicy-esp32-c3-super-mini-when-2-boards-become-2-heaters/&lt;br /&gt;
&lt;br /&gt;
It has an onboard antenna. There are also other boards with an antenna connection, which allows using an external antenna. This may be better, I don&#039;t know yet.&lt;br /&gt;
&lt;br /&gt;
How to wire it up, what I did:&lt;br /&gt;
* Put both the esp32-c3-supermini board and the esp32-c5-devkit-c1 on a breadboard&lt;br /&gt;
* Use male-male dupont wires to connect:&lt;br /&gt;
** 5V to 5V, GND to GND, esp32-c5 TX to esp32-c3 RX&lt;br /&gt;
* Programmed the esp32-c5 with firmware&lt;br /&gt;
* Plug an USB-C cable into the esp32-c3, programmed it with firmware, now it&#039;s powering both the esp32-c3 and the esp32-c5&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Connections&lt;br /&gt;
|-&lt;br /&gt;
! ESP32-c5 !! ESP32-c3 !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| GND || GND || shared ground&lt;br /&gt;
|-&lt;br /&gt;
| 5V || 5V || raw power&lt;br /&gt;
|-&lt;br /&gt;
| U0TXD/GPIO11 || RX/GPIO20 || Data link&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See https://github.com/bertrik/its-g5-receiver&lt;br /&gt;
&lt;br /&gt;
This is heavily inspired by https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
but with a fixed size ring buffer instead of dynamic allocation.&lt;br /&gt;
&lt;br /&gt;
=== Compiling the firmware ===&lt;br /&gt;
Uses python and platformio, see the README.md in the source archive.&lt;br /&gt;
&lt;br /&gt;
Watch packets come in:&lt;br /&gt;
  pio device monitor&lt;br /&gt;
Packets are logged as a &#039;hexdump&#039;.&lt;br /&gt;
&lt;br /&gt;
The can be converted for wireshark, for example:&lt;br /&gt;
  text2pcap -l 105 message.txt message.pcap&lt;br /&gt;
Then viewed in wireshark:&lt;br /&gt;
  wireshark message.pcap&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35402</id>
		<title>Its-g5</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35402"/>
		<updated>2026-07-13T08:19:12Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Design */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=ITS-G5&lt;br /&gt;
   |Picture=its-g5.png&lt;br /&gt;
   |Omschrijving=Receiving ITS-G5 signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[[File:its-g5-wireshark.png|thumb|right|alt=wireshark analysis]]&lt;br /&gt;
&lt;br /&gt;
This page is about investigating reception and processing of so-called C-ITS or ITS-G5 signals (802.11p) as used in the Netherlands, see also https://en.wikipedia.org/wiki/Vehicle-to-everything&lt;br /&gt;
These signals are exchanged between passenger cars, emergency vehicles, traffic lights and other traffic-related equipment.&lt;br /&gt;
&lt;br /&gt;
An ESP32-C5 development board is capable of receiving WiFi in the 5 GHz band and can receive/sniff these kinds of packets from live traffic.&lt;br /&gt;
&lt;br /&gt;
Stuff to investigate:&lt;br /&gt;
* Crowd-sourced live map of messages received: https://opentrafficmap.org/ Their wiki: https://wiki.opentrafficmap.org&lt;br /&gt;
* Source code for an ITS-G5 receiver https://github.com/pit711/v2x2map&lt;br /&gt;
* Simplest source code for Arduino-based sniffer: https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
&lt;br /&gt;
In the Netherlands, SPAT/MAPem messages from traffic lights are not transferred over wifi-p, but over UDAP.&lt;br /&gt;
You need credentials to access that data, it is not clear if it is feasible to hobbyist to access it.&lt;br /&gt;
Interesting project: https://github.com/idkmanLool9/Verkeerslicht&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
[[File:esp32-c5-sniffer.jpg|thumb|right|alt=esp32-c5-sniffer]]&lt;br /&gt;
&lt;br /&gt;
The design is:&lt;br /&gt;
* Use an esp32-c5 for sniffing 802.11p frames only&lt;br /&gt;
* Use an esp32-c3 for receiving sniffed frames from the esp32-c5, connect to WiFi and upload packets over MQTT&lt;br /&gt;
* The interface beteween the two boards is &#039;&#039;&#039;serial&#039;&#039;&#039;, this is simpler than SPI as used in other projects:&lt;br /&gt;
** Only three wires required: GND, +5V and serial DATA&lt;br /&gt;
** No hardware modification required (e.g. desolder capacitors on SPI wires of the esp32-c5)&lt;br /&gt;
** A serial interface is more universal, e.g. can be connected to an arbitrary linux SBC, to run a python bridge for example&lt;br /&gt;
** On the esp32-c5 use the same wires as the existing USB-UART bridge, so you can also receive packets over USB-serial&lt;br /&gt;
* Run a simple web server on the esp-c3:&lt;br /&gt;
** Configuration page with MQTT settings: protocol, host, port, user, pass&lt;br /&gt;
** Optional: show some nice stats: mqtt status, packet rate, last packet, packets per type&lt;br /&gt;
** Optional: run a very basic parser for e.g. CAM messages&lt;br /&gt;
* Power is provided to the esp32-c3, which then distributes power as raw 5V/GND to the esp32-c5. The esp32-c5 uses its own regulator to turn it into a stable internal supply voltage.&lt;br /&gt;
&lt;br /&gt;
Practical:&lt;br /&gt;
* The serial link runs over the USB-UART chip of the esp32-c5.&lt;br /&gt;
* A simple command processor runs on the other UART (the emulated USB serial port)&lt;br /&gt;
* On the esp32-c5 side, use pins GND, 5V, UART-TX for the ESP-ESP serial connection.&lt;br /&gt;
* The esp32-c3 and esp32-c5 share their 5V and GND power lines. Each board derives its own internal power supplies from this 5V.&lt;br /&gt;
* The serial link doesn&#039;t have to be very high speed, 115200 for example. We use a hardware UART on both sides of the serial link.&lt;br /&gt;
* Use https://registry.platformio.org/libraries/thomasfredericks/MicroSlip for framing packets over the serial port.&lt;br /&gt;
&lt;br /&gt;
=== opentraffic map interface ===&lt;br /&gt;
See https://github.com/MPW1412/openwrt-otm-bridge#wire-format-mimics-the-esp32-c5-firmware for the mqtt wire format.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/pit711/v2x2map/blob/main/firmware/main/mqtt.c&lt;br /&gt;
&lt;br /&gt;
In short: server = mqtts://cits1.opentrafficmap.org:8883 :&lt;br /&gt;
* no user name / password&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/status&#039; (online or offline), retained&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/info&#039; with a JSON string, like {&amp;quot;emac&amp;quot;:&amp;quot;xx:xx:xx:xx:xx:xx&amp;quot;,&amp;quot;ver&amp;quot;:&amp;quot;github.com/bertrik/its-g5-receiver-v0.0.1&amp;quot;,&amp;quot;hwv&amp;quot;:&amp;quot;esp32-c5-devkit-c1&amp;quot;}&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/packet&#039; for sniffed packets (raw, not JSON encoded)&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:esp32-c5-devkitc-1.jpg|thumb|right|alt=esp32-c5]]&lt;br /&gt;
[[File:esp32-c3-supermini.jpg|thumb|right|alt=esp32-c3]]&lt;br /&gt;
&lt;br /&gt;
This project uses an ESP32-C5-devkitC-1 board:&lt;br /&gt;
* Aliexpress product page https://nl.aliexpress.com/item/1005012416463528.html&lt;br /&gt;
* Espressif schematic https://dl.espressif.com/dl/schematics/SCH_ESP32-C5-DevkitC-1_V1.1_20240621.pdf . Actually my board is not exactly like this, the USB-UART is connected to pins GPIO11 (TX) and GPIO12 (RX), not GPIO25/GPIO24.&lt;br /&gt;
* Espressif devkit-c page: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c5/esp32-c5-devkitc-1/user_guide.html&lt;br /&gt;
&lt;br /&gt;
It has an onboard antenna. There are also other boards with an antenna connection, which allows using an external antenna. This may be better, I don&#039;t know yet.&lt;br /&gt;
&lt;br /&gt;
How to wire it up, what I did:&lt;br /&gt;
* Put both the esp32-c3-supermini board and the esp32-c5-devkit-c1 on a breadboard&lt;br /&gt;
* Use male-male dupont wires to connect:&lt;br /&gt;
** 5V to 5V, GND to GND, esp32-c5 TX to esp32-c3 RX&lt;br /&gt;
* Programmed the esp32-c5 with firmware&lt;br /&gt;
* Plug an USB-C cable into the esp32-c3, programmed it with firmware, now it&#039;s powering both the esp32-c3 and the esp32-c5&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Connections&lt;br /&gt;
|-&lt;br /&gt;
! ESP32-c5 !! ESP32-c3 !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| GND || GND || shared ground&lt;br /&gt;
|-&lt;br /&gt;
| 5V || 5V || raw power&lt;br /&gt;
|-&lt;br /&gt;
| U0TXD/GPIO11 || RX/GPIO20 || Data link&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See https://github.com/bertrik/its-g5-receiver&lt;br /&gt;
&lt;br /&gt;
This is heavily inspired by https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
but with a fixed size ring buffer instead of dynamic allocation.&lt;br /&gt;
&lt;br /&gt;
=== Compiling the firmware ===&lt;br /&gt;
Uses python and platformio, see the README.md in the source archive.&lt;br /&gt;
&lt;br /&gt;
Watch packets come in:&lt;br /&gt;
  pio device monitor&lt;br /&gt;
Packets are logged as a &#039;hexdump&#039;.&lt;br /&gt;
&lt;br /&gt;
The can be converted for wireshark, for example:&lt;br /&gt;
  text2pcap -l 105 message.txt message.pcap&lt;br /&gt;
Then viewed in wireshark:&lt;br /&gt;
  wireshark message.pcap&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35376</id>
		<title>Its-g5</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35376"/>
		<updated>2026-07-07T09:09:13Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=ITS-G5&lt;br /&gt;
   |Picture=its-g5.png&lt;br /&gt;
   |Omschrijving=Receiving ITS-G5 signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[[File:its-g5-wireshark.png|thumb|right|alt=wireshark analysis]]&lt;br /&gt;
&lt;br /&gt;
This page is about investigating reception and processing of so-called C-ITS or ITS-G5 signals (802.11p) as used in the Netherlands, see also https://en.wikipedia.org/wiki/Vehicle-to-everything&lt;br /&gt;
These signals are exchanged between passenger cars, emergency vehicles, traffic lights and other traffic-related equipment.&lt;br /&gt;
&lt;br /&gt;
An ESP32-C5 development board is capable of receiving WiFi in the 5 GHz band and can receive/sniff these kinds of packets from live traffic.&lt;br /&gt;
&lt;br /&gt;
Stuff to investigate:&lt;br /&gt;
* Crowd-sourced live map of messages received: https://opentrafficmap.org/ Their wiki: https://wiki.opentrafficmap.org&lt;br /&gt;
* Source code for an ITS-G5 receiver https://github.com/pit711/v2x2map&lt;br /&gt;
* Simplest source code for Arduino-based sniffer: https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
&lt;br /&gt;
In the Netherlands, SPAT/MAPem messages from traffic lights are not transferred over wifi-p, but over UDAP.&lt;br /&gt;
You need credentials to access that data, it is not clear if it is feasible to hobbyist to access it.&lt;br /&gt;
Interesting project: https://github.com/idkmanLool9/Verkeerslicht&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
[[File:esp32-c5-sniffer.jpg|thumb|right|alt=esp32-c5-sniffer]]&lt;br /&gt;
&lt;br /&gt;
The design is:&lt;br /&gt;
* Use an esp32-c5 for sniffing 802.11p frames only&lt;br /&gt;
* Use an esp32-c3 for receiving sniffed frames from the esp32-c5, connect to WiFi and upload packets over MQTT&lt;br /&gt;
* The interface beteween the two boards is &#039;&#039;&#039;serial&#039;&#039;&#039;, this is simpler than SPI as used in other projects:&lt;br /&gt;
** Only three wires required: GND, +5V and serial DATA&lt;br /&gt;
** No hardware modification required (e.g. desolder capacitors on SPI wires of the esp32-c5)&lt;br /&gt;
** A serial interface is more universal, e.g. can be connected to an arbitrary linux SBC, to run a python bridge for example&lt;br /&gt;
** On the esp32-c5 use the same wires as the existing USB-UART bridge, so you can also receive packets over USB-serial&lt;br /&gt;
* Run a simple web server on the esp-c3:&lt;br /&gt;
** Configuration page with MQTT settings: protocol, host, port, user, pass&lt;br /&gt;
** Perhaps configure a keystore/certificate for secure mqtt (mqtts), if needed&lt;br /&gt;
** Optional: show some nice stats: mqtt status, packet rate, last packet, packets per type&lt;br /&gt;
** Optional: run a very basic parser for e.g. CAM messages&lt;br /&gt;
&lt;br /&gt;
Practical:&lt;br /&gt;
* The serial link runs over the USB-UART chip of the esp32-c5.&lt;br /&gt;
* A simple command processor runs on the other UART (the emulated USB serial port)&lt;br /&gt;
* On the esp32-c5 side, use pins GND, 5V, UART-TX for the ESP-ESP serial connection.&lt;br /&gt;
* The esp32-c3 and esp32-c5 share their 5V and GND power lines. Each board derives its own internal power supplies from this 5V.&lt;br /&gt;
* The serial link doesn&#039;t have to be very high speed, 115200 for example. We use a hardware UART on both sides of the serial link.&lt;br /&gt;
* Use https://registry.platformio.org/libraries/thomasfredericks/MicroSlip for framing packets over the serial port.&lt;br /&gt;
&lt;br /&gt;
=== opentraffic map interface ===&lt;br /&gt;
See https://github.com/MPW1412/openwrt-otm-bridge#wire-format-mimics-the-esp32-c5-firmware for the mqtt wire format.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/pit711/v2x2map/blob/main/firmware/main/mqtt.c&lt;br /&gt;
&lt;br /&gt;
In short: server = mqtts://cits1.opentrafficmap.org:8883 :&lt;br /&gt;
* no user name / password&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/status&#039; (online or offline), retained&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/info&#039; with a JSON string, like {&amp;quot;emac&amp;quot;:&amp;quot;xx:xx:xx:xx:xx:xx&amp;quot;,&amp;quot;ver&amp;quot;:&amp;quot;github.com/bertrik/its-g5-receiver-v0.0.1&amp;quot;,&amp;quot;hwv&amp;quot;:&amp;quot;esp32-c5-devkit-c1&amp;quot;}&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/packet&#039; for sniffed packets (raw, not JSON encoded)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:esp32-c5-devkitc-1.jpg|thumb|right|alt=esp32-c5]]&lt;br /&gt;
[[File:esp32-c3-supermini.jpg|thumb|right|alt=esp32-c3]]&lt;br /&gt;
&lt;br /&gt;
This project uses an ESP32-C5-devkitC-1 board:&lt;br /&gt;
* Aliexpress product page https://nl.aliexpress.com/item/1005012416463528.html&lt;br /&gt;
* Espressif schematic https://dl.espressif.com/dl/schematics/SCH_ESP32-C5-DevkitC-1_V1.1_20240621.pdf . Actually my board is not exactly like this, the USB-UART is connected to pins GPIO11 (TX) and GPIO12 (RX), not GPIO25/GPIO24.&lt;br /&gt;
* Espressif devkit-c page: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c5/esp32-c5-devkitc-1/user_guide.html&lt;br /&gt;
&lt;br /&gt;
It has an onboard antenna. There are also other boards with an antenna connection, which allows using an external antenna. This may be better, I don&#039;t know yet.&lt;br /&gt;
&lt;br /&gt;
How to wire it up, what I did:&lt;br /&gt;
* Put both the esp32-c3-supermini board and the esp32-c5-devkit-c1 on a breadboard&lt;br /&gt;
* Use male-male dupont wires to connect:&lt;br /&gt;
** 5V to 5V, GND to GND, esp32-c5 TX to esp32-c3 RX&lt;br /&gt;
* Programmed the esp32-c5 with firmware&lt;br /&gt;
* Plug an USB-C cable into the esp32-c3, programmed it with firmware, now it&#039;s powering both the esp32-c3 and the esp32-c5&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Connections&lt;br /&gt;
|-&lt;br /&gt;
! ESP32-c5 !! ESP32-c3 !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| GND || GND || shared ground&lt;br /&gt;
|-&lt;br /&gt;
| 5V || 5V || raw power&lt;br /&gt;
|-&lt;br /&gt;
| U0TXD/GPIO11 || RX/GPIO20 || Data link&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See https://github.com/bertrik/its-g5-receiver&lt;br /&gt;
&lt;br /&gt;
This is heavily inspired by https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
but with a fixed size ring buffer instead of dynamic allocation.&lt;br /&gt;
&lt;br /&gt;
=== Compiling the firmware ===&lt;br /&gt;
Uses python and platformio, see the README.md in the source archive.&lt;br /&gt;
&lt;br /&gt;
Watch packets come in:&lt;br /&gt;
  pio device monitor&lt;br /&gt;
Packets are logged as a &#039;hexdump&#039;.&lt;br /&gt;
&lt;br /&gt;
The can be converted for wireshark, for example:&lt;br /&gt;
  text2pcap -l 105 message.txt message.pcap&lt;br /&gt;
Then viewed in wireshark:&lt;br /&gt;
  wireshark message.pcap&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35375</id>
		<title>Its-g5</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35375"/>
		<updated>2026-07-06T09:17:36Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=ITS-G5&lt;br /&gt;
   |Picture=its-g5.png&lt;br /&gt;
   |Omschrijving=Receiving ITS-G5 signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[[File:its-g5-wireshark.png|thumb|right|alt=wireshark analysis]]&lt;br /&gt;
&lt;br /&gt;
This page is about investigating reception and processing of so-called C-ITS or ITS-G5 signals (802.11p) as used in the Netherlands, see also https://en.wikipedia.org/wiki/Vehicle-to-everything&lt;br /&gt;
These signals are exchanged between passenger cars, emergency vehicles, traffic lights and other traffic-related equipment.&lt;br /&gt;
&lt;br /&gt;
An ESP32-C5 development board is capable of receiving WiFi in the 5 GHz band and can receive/sniff these kinds of packets from live traffic.&lt;br /&gt;
&lt;br /&gt;
Stuff to investigate:&lt;br /&gt;
* Crowd-sourced live map of messages received: https://opentrafficmap.org/ Their wiki: https://wiki.opentrafficmap.org&lt;br /&gt;
* Source code for an ITS-G5 receiver https://github.com/pit711/v2x2map&lt;br /&gt;
* Simplest source code for Arduino-based sniffer: https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
&lt;br /&gt;
In the Netherlands, SPAT/MAPem messages from traffic lights are not transferred over wifi-p, but over UDAP.&lt;br /&gt;
You need credentials to access that data, it is not clear if it is feasible to hobbyist to access it.&lt;br /&gt;
Interesting project: https://github.com/idkmanLool9/Verkeerslicht&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
[[File:esp32-c5-sniffer.jpg|thumb|right|alt=esp32-c5-sniffer]]&lt;br /&gt;
&lt;br /&gt;
The design is:&lt;br /&gt;
* Use an esp32-c5 for sniffing 802.11p frames only&lt;br /&gt;
* Use an esp32-c3 for receiving sniffed frames from the esp32-c5, connect to WiFi and upload packets over MQTT&lt;br /&gt;
* The interface beteween the two boards is &#039;&#039;&#039;serial&#039;&#039;&#039;, this is simpler than SPI as used in other projects:&lt;br /&gt;
** Only three wires required: GND, +5V and serial DATA&lt;br /&gt;
** No hardware modification required (e.g. desolder capacitors on SPI wires of the esp32-c5)&lt;br /&gt;
** A serial interface is more universal, e.g. can be connected to an arbitrary linux SBC, to run a python bridge for example&lt;br /&gt;
** On the esp32-c5 use the same wires as the existing USB-UART bridge, so you can also receive packets over USB-serial&lt;br /&gt;
* Run a simple web server on the esp-c3:&lt;br /&gt;
** Configuration page with MQTT settings: protocol, host, port, user, pass&lt;br /&gt;
** Perhaps configure a keystore/certificate for secure mqtt (mqtts), if needed&lt;br /&gt;
** Optional: show some nice stats: mqtt status, packet rate, last packet, packets per type&lt;br /&gt;
** Optional: run a very basic parser for e.g. CAM messages&lt;br /&gt;
&lt;br /&gt;
Practical:&lt;br /&gt;
* The serial link runs over the USB-UART chip of the esp32-c5.&lt;br /&gt;
* A simple command processor runs on the other UART (the emulated USB serial port)&lt;br /&gt;
* On the esp32-c5 side, use pins GND, 5V, UART-TX for the ESP-ESP serial connection.&lt;br /&gt;
* The esp32-c3 and esp32-c5 share their 5V and GND power lines. Each board derives its own internal power supplies from this 5V.&lt;br /&gt;
* The serial link doesn&#039;t have to be very high speed, 115200 for example. We use a hardware UART on both sides of the serial link.&lt;br /&gt;
* Use https://registry.platformio.org/libraries/thomasfredericks/MicroSlip for framing packets over the serial port.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:esp32-c5-devkitc-1.jpg|thumb|right|alt=esp32-c5]]&lt;br /&gt;
[[File:esp32-c3-supermini.jpg|thumb|right|alt=esp32-c3]]&lt;br /&gt;
&lt;br /&gt;
This project uses an ESP32-C5-devkitC-1 board:&lt;br /&gt;
* Aliexpress product page https://nl.aliexpress.com/item/1005012416463528.html&lt;br /&gt;
* Espressif schematic https://dl.espressif.com/dl/schematics/SCH_ESP32-C5-DevkitC-1_V1.1_20240621.pdf . Actually my board is not exactly like this, the USB-UART is connected to pins GPIO11 (TX) and GPIO12 (RX), not GPIO25/GPIO24.&lt;br /&gt;
* Espressif devkit-c page: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c5/esp32-c5-devkitc-1/user_guide.html&lt;br /&gt;
&lt;br /&gt;
It has an onboard antenna. There are also other boards with an antenna connection, which allows using an external antenna. This may be better, I don&#039;t know yet.&lt;br /&gt;
&lt;br /&gt;
How to wire it up, what I did:&lt;br /&gt;
* Put both the esp32-c3-supermini board and the esp32-c5-devkit-c1 on a breadboard&lt;br /&gt;
* Use male-male dupont wires to connect:&lt;br /&gt;
** 5V to 5V, GND to GND, esp32-c5 TX to esp32-c3 RX&lt;br /&gt;
* Programmed the esp32-c5 with firmware&lt;br /&gt;
* Plug an USB-C cable into the esp32-c3, programmed it with firmware, now it&#039;s powering both the esp32-c3 and the esp32-c5&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Connections&lt;br /&gt;
|-&lt;br /&gt;
! ESP32-c5 !! ESP32-c3 !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| GND || GND || shared ground&lt;br /&gt;
|-&lt;br /&gt;
| 5V || 5V || raw power&lt;br /&gt;
|-&lt;br /&gt;
| U0TXD/GPIO11 || RX/GPIO20 || Data link&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See https://github.com/bertrik/its-g5-receiver&lt;br /&gt;
&lt;br /&gt;
This is heavily inspired by https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
but with a fixed size ring buffer instead of dynamic allocation.&lt;br /&gt;
&lt;br /&gt;
=== Compiling the firmware ===&lt;br /&gt;
Uses python and platformio, see the README.md in the source archive.&lt;br /&gt;
&lt;br /&gt;
Watch packets come in:&lt;br /&gt;
  pio device monitor&lt;br /&gt;
Packets are logged as a &#039;hexdump&#039;.&lt;br /&gt;
&lt;br /&gt;
The can be converted for wireshark, for example:&lt;br /&gt;
  text2pcap -l 105 message.txt message.pcap&lt;br /&gt;
Then viewed in wireshark:&lt;br /&gt;
  wireshark message.pcap&lt;br /&gt;
&lt;br /&gt;
=== opentraffic map interface ===&lt;br /&gt;
See https://github.com/MPW1412/openwrt-otm-bridge#wire-format-mimics-the-esp32-c5-firmware for the mqtt wire format.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/pit711/v2x2map/blob/main/firmware/main/mqtt.c&lt;br /&gt;
&lt;br /&gt;
In short: server = mqtts://cits1.opentrafficmap.org:8883 :&lt;br /&gt;
* no user name / password&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/status&#039; (online or offline), retained&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/info&#039; with a JSON string, like {&amp;quot;emac&amp;quot;:&amp;quot;xx:xx:xx:xx:xx:xx&amp;quot;,&amp;quot;ver&amp;quot;:&amp;quot;github.com/bertrik/its-g5-receiver-v0.0.1&amp;quot;,&amp;quot;hwv&amp;quot;:&amp;quot;esp32-c5-devkit-c1&amp;quot;}&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/packet&#039; for sniffed packets (raw, not JSON encoded)&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35373</id>
		<title>Its-g5</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35373"/>
		<updated>2026-07-05T09:13:47Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=ITS-G5&lt;br /&gt;
   |Picture=its-g5.png&lt;br /&gt;
   |Omschrijving=Receiving ITS-G5 signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[[File:its-g5-wireshark.png|thumb|right|alt=wireshark analysis]]&lt;br /&gt;
&lt;br /&gt;
This page is about investigating reception and processing of so-called C-ITS or ITS-G5 signals (802.11p) as used in the Netherlands, see also https://en.wikipedia.org/wiki/Vehicle-to-everything&lt;br /&gt;
These signals are exchanged between passenger cars, emergency vehicles, traffic lights and other traffic-related equipment.&lt;br /&gt;
&lt;br /&gt;
An ESP32-C5 development board is capable of receiving WiFi in the 5 GHz band and can receive/sniff these kinds of packets from live traffic.&lt;br /&gt;
&lt;br /&gt;
Stuff to investigate:&lt;br /&gt;
* Crowd-sourced live map of messages received: https://opentrafficmap.org/ Their wiki: https://wiki.opentrafficmap.org&lt;br /&gt;
* Source code for an ITS-G5 receiver https://github.com/pit711/v2x2map&lt;br /&gt;
* Simplest source code for Arduino-based sniffer: https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
&lt;br /&gt;
In the Netherlands, SPAT/MAPem messages from traffic lights are not transferred over wifi-p, but over UDAP.&lt;br /&gt;
You need credentials to access that data, it is not clear if it is feasible to hobbyist to access it.&lt;br /&gt;
Interesting project: https://github.com/idkmanLool9/Verkeerslicht&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
[[File:esp32-c5-sniffer.jpg|thumb|right|alt=esp32-c5-sniffer]]&lt;br /&gt;
&lt;br /&gt;
The design is:&lt;br /&gt;
* Use an esp32-c5 for sniffing 802.11p frames only&lt;br /&gt;
* Use an esp32-c3 for receiving sniffed frames from the esp32-c5, connect to WiFi and upload packets over MQTT&lt;br /&gt;
* The interface beteween the two boards is &#039;&#039;&#039;serial&#039;&#039;&#039;, this is simpler than SPI as used in other projects:&lt;br /&gt;
** Only three wires required: GND, +5V and serial DATA&lt;br /&gt;
** No hardware modification required (e.g. desolder capacitors on SPI wires of the esp32-c5)&lt;br /&gt;
** A serial interface is more universal, e.g. can be connected to an arbitrary linux SBC, to run a python bridge for example&lt;br /&gt;
** On the esp32-c5 use the same wires as the existing USB-UART bridge, so you can also receive packets over USB-serial&lt;br /&gt;
* Run a simple web server on the esp-c3:&lt;br /&gt;
** Configuration page with MQTT settings: protocol, host, port, user, pass&lt;br /&gt;
** Perhaps configure a keystore/certificate for secure mqtt (mqtts), if needed&lt;br /&gt;
** Optional: show some nice stats: mqtt status, packet rate, last packet, packets per type&lt;br /&gt;
** Optional: run a very basic parser for e.g. CAM messages&lt;br /&gt;
&lt;br /&gt;
Practical:&lt;br /&gt;
* The serial link runs over the USB-UART chip of the esp32-c5.&lt;br /&gt;
* A simple command processor runs on the other UART (the emulated USB serial port)&lt;br /&gt;
* On the esp32-c5 side, use pins GND, 5V, UART-TX for the ESP-ESP serial connection.&lt;br /&gt;
* The esp32-c3 and esp32-c5 share their 5V and GND power lines. Each board derives its own internal power supplies from this 5V.&lt;br /&gt;
* The serial link doesn&#039;t have to be very high speed, 115200 for example. We use a hardware UART on both sides of the serial link.&lt;br /&gt;
* Use https://registry.platformio.org/libraries/thomasfredericks/MicroSlip for framing packets over the serial port.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:esp32-c5-devkitc-1.jpg|thumb|right|alt=esp32-c5]]&lt;br /&gt;
[[File:esp32-c3-supermini.jpg|thumb|right|alt=esp32-c3]]&lt;br /&gt;
&lt;br /&gt;
I got an ESP32-C5-devkitC-1 board, and it worked for me:&lt;br /&gt;
* Aliexpress product page https://nl.aliexpress.com/item/1005012416463528.html&lt;br /&gt;
* Espressif schematic https://dl.espressif.com/dl/schematics/SCH_ESP32-C5-DevkitC-1_V1.1_20240621.pdf . Actually my board is not exactly like this, the USB-UART is connected to pins GPIO11 (TX) and GPIO12 (RX), not GPIO25/GPIO24.&lt;br /&gt;
* Espressif devkit-c page: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c5/esp32-c5-devkitc-1/user_guide.html&lt;br /&gt;
&lt;br /&gt;
It has an onboard antenna. There are also other boards with an antenna connection, which allows using an external antenna. This may be better, I don&#039;t know yet.&lt;br /&gt;
&lt;br /&gt;
How to wire it up, what I did:&lt;br /&gt;
* Put both the esp32-c3-supermini board and the esp32-c5-devkit-c1 on a breadboard&lt;br /&gt;
* Use male-male dupont wires to connect:&lt;br /&gt;
** 5V to 5V, GND to GND, esp32-c5 TX to esp32-c3 RX&lt;br /&gt;
* Programmed the esp32-c5 with firmware&lt;br /&gt;
* Plug an USB-C cable into the esp32-c3, programmed it with firmware, now it&#039;s powering both the esp32-c3 and the esp32-c5&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Connections&lt;br /&gt;
|-&lt;br /&gt;
! ESP32-c5 !! ESP32-c3 !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| GND || GND || shared ground&lt;br /&gt;
|-&lt;br /&gt;
| 5V || 5V || raw power&lt;br /&gt;
|-&lt;br /&gt;
| U0TXD/GPIO11 || RX/GPIO20 || Data link&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See https://github.com/bertrik/its-g5-receiver&lt;br /&gt;
&lt;br /&gt;
This is heavily inspired by https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
but with a fixed size ring buffer instead of dynamic allocation.&lt;br /&gt;
&lt;br /&gt;
=== Compiling the firmware ===&lt;br /&gt;
Uses python and platformio, see the README.md in the source archive.&lt;br /&gt;
&lt;br /&gt;
Watch packets come in:&lt;br /&gt;
  pio device monitor&lt;br /&gt;
Packets are logged as a &#039;hexdump&#039;.&lt;br /&gt;
&lt;br /&gt;
The can be converted for wireshark, for example:&lt;br /&gt;
  text2pcap -l 105 message.txt message.pcap&lt;br /&gt;
Then viewed in wireshark:&lt;br /&gt;
  wireshark message.pcap&lt;br /&gt;
&lt;br /&gt;
=== opentraffic map interface ===&lt;br /&gt;
See https://github.com/MPW1412/openwrt-otm-bridge#wire-format-mimics-the-esp32-c5-firmware for the mqtt wire format.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/pit711/v2x2map/blob/main/firmware/main/mqtt.c&lt;br /&gt;
&lt;br /&gt;
In short: server = mqtts://cits1.opentrafficmap.org:8883 :&lt;br /&gt;
* no user name / password&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/status&#039; (online or offline), retained&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/info&#039; with a JSON string, like {&amp;quot;emac&amp;quot;:&amp;quot;xx:xx:xx:xx:xx:xx&amp;quot;,&amp;quot;ver&amp;quot;:&amp;quot;github.com/bertrik/its-g5-receiver-v0.0.1&amp;quot;,&amp;quot;hwv&amp;quot;:&amp;quot;esp32-c5-devkit-c1&amp;quot;}&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/packet&#039; for sniffed packets (raw, not JSON encoded)&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Bestand:Its-g5.png&amp;diff=35365</id>
		<title>Bestand:Its-g5.png</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Bestand:Its-g5.png&amp;diff=35365"/>
		<updated>2026-07-04T14:10:44Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: Bertrik Sikken uploaded a new version of File:Its-g5.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35361</id>
		<title>Its-g5</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35361"/>
		<updated>2026-07-01T21:41:15Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=ITS-G5&lt;br /&gt;
   |Picture=its-g5.png&lt;br /&gt;
   |Omschrijving=Investigating ITS-G5 signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[[File:its-g5-wireshark.png|thumb|right|alt=wireshark analysis]]&lt;br /&gt;
&lt;br /&gt;
This page is about investigating reception and processing of so-called C-ITS or ITS-G5 signals (802.11p) as used in the Netherlands, see also https://en.wikipedia.org/wiki/Vehicle-to-everything&lt;br /&gt;
These signals are exchanged between passenger cars, emergency vehicles, traffic lights and other traffic-related equipment.&lt;br /&gt;
&lt;br /&gt;
An ESP32-C5 development board is capable of receiving WiFi in the 5 GHz band and can receive/sniff these kinds of packets from live traffic.&lt;br /&gt;
&lt;br /&gt;
Stuff to investigate:&lt;br /&gt;
* Source code for an ITS-G5 receiver https://github.com/pit711/v2x2map&lt;br /&gt;
* Crowd-sourced live map of messages received: https://opentrafficmap.org/&lt;br /&gt;
* Simplest source code for Arduino-based sniffer: https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
* How to contribute to opentrafficmap: https://wiki.opentrafficmap.org&lt;br /&gt;
&lt;br /&gt;
In the Netherlands, SPAT/MAPem messages from traffic lights are not transferred over wifi-p, but over UDAP.&lt;br /&gt;
You need credentials to access that data, it is not clear if it is feasible to hobbyist to access it.&lt;br /&gt;
Interesting project: https://github.com/idkmanLool9/Verkeerslicht&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
[[File:esp32-c5-sniffer.jpg|thumb|right|alt=esp32-c5-sniffer]]&lt;br /&gt;
&lt;br /&gt;
The design is:&lt;br /&gt;
* Use an esp32-c5 for sniffing 802.11p frames only&lt;br /&gt;
* Use an esp32-c3 (as an inexpensive jellybean part) for receiving sniffed frames from the esp32-c5, connect to WiFi and upload packets over MQTT&lt;br /&gt;
* The interface beteween the two boards is &#039;&#039;&#039;serial&#039;&#039;&#039;, this is simpler than SPI as used in other projects:&lt;br /&gt;
** Only three wires required: GND, +5V and serial DATA&lt;br /&gt;
** No need to desolder capacitors on SPI wires of the esp32-c5&lt;br /&gt;
** A serial interface is more universal, e.g. can be connected to an arbitrary linux SBC, to run a python bridge for example&lt;br /&gt;
** On the esp32-c5 use the same wires as the existing USB-UART bridge, so you can also receive packets over USB-serial&lt;br /&gt;
* Run a simple web server on the esp-c3:&lt;br /&gt;
** Configuration page with MQTT settings: host, port, user, pass, base topic&lt;br /&gt;
** Perhaps configure a keystore/certificate for secure mqtt (mqtts), if needed&lt;br /&gt;
** Optional: show some nice stats: mqtt status, packet rate, last packet, packets per type&lt;br /&gt;
** Optional: run a very basic parser for e.g. CAM messages&lt;br /&gt;
&lt;br /&gt;
Practical:&lt;br /&gt;
* The serial link runs over the USB-UART chip of the esp32-c5.&lt;br /&gt;
* A simple command processor runs on the other UART (the emulated USB serial port)&lt;br /&gt;
* On the esp32-c5 side, use pins GND, 5V, UART-TX for the ESP-ESP serial connection.&lt;br /&gt;
* The esp32-c3 and esp32-c5 share their 5V and GND power lines. Each board derives its own internal power supplies from this 5V.&lt;br /&gt;
* The serial link doesn&#039;t have to be very high speed, 115200 for example. We use a hardware UART on both sides of the serial link.&lt;br /&gt;
* Use https://registry.platformio.org/libraries/thomasfredericks/MicroSlip for framing packets over the serial port.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:esp32-c5-devkitc-1.jpg|thumb|right|alt=esp32-c5]]&lt;br /&gt;
[[File:esp32-c3-supermini.jpg|thumb|right|alt=esp32-c3]]&lt;br /&gt;
&lt;br /&gt;
I got an ESP32-C5-devkitC-1 board, and it worked for me:&lt;br /&gt;
* Aliexpress product page https://nl.aliexpress.com/item/1005012416463528.html&lt;br /&gt;
* Espressif schematic https://dl.espressif.com/dl/schematics/SCH_ESP32-C5-DevkitC-1_V1.1_20240621.pdf . Actually my board is not exactly like this, the USB-UART is connected to pins GPIO11 (TX) and GPIO12 (RX), not GPIO25/GPIO24.&lt;br /&gt;
* Espressif devkit-c page: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c5/esp32-c5-devkitc-1/user_guide.html&lt;br /&gt;
&lt;br /&gt;
It has an onboard antenna. There are also other boards with an antenna connection, which allows using an external antenna. This may be better, I don&#039;t know yet.&lt;br /&gt;
&lt;br /&gt;
How to wire it up, what I did:&lt;br /&gt;
* Put both the esp32-c3-supermini board and the esp32-c5-devkit-c1 on a breadboard&lt;br /&gt;
* Use male-male dupont wires to connect:&lt;br /&gt;
** 5V to 5V, GND to GND, esp32-c5 TX to esp32-c3 RX&lt;br /&gt;
* Programmed the esp32-c5 with firmware&lt;br /&gt;
* Plug an USB-C cable into the esp32-c3, programmed it with firmware, now it&#039;s powering both the esp32-c3 and the esp32-c5&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Connections&lt;br /&gt;
|-&lt;br /&gt;
! ESP32-c5 !! ESP32-c3 !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| GND || GND || shared ground&lt;br /&gt;
|-&lt;br /&gt;
| 5V || 5V || raw power&lt;br /&gt;
|-&lt;br /&gt;
| U0TXD/GPIO11 || RX/GPIO20 || Data link&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See https://github.com/bertrik/its-g5-receiver&lt;br /&gt;
&lt;br /&gt;
This is heavily inspired by https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
but with a fixed size ring buffer instead of dynamic allocation.&lt;br /&gt;
&lt;br /&gt;
=== Compiling the firmware ===&lt;br /&gt;
Uses python and platformio, see the README.md in the source archive.&lt;br /&gt;
&lt;br /&gt;
Watch packets come in:&lt;br /&gt;
  pio device monitor&lt;br /&gt;
Packets are logged as a &#039;hexdump&#039;.&lt;br /&gt;
&lt;br /&gt;
The can be converted for wireshark, for example:&lt;br /&gt;
  text2pcap -l 105 message.txt message.pcap&lt;br /&gt;
Then viewed in wireshark:&lt;br /&gt;
  wireshark message.pcap&lt;br /&gt;
&lt;br /&gt;
=== opentraffic map interface ===&lt;br /&gt;
See https://github.com/MPW1412/openwrt-otm-bridge#wire-format-mimics-the-esp32-c5-firmware for the mqtt wire format.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/pit711/v2x2map/blob/main/firmware/main/mqtt.c&lt;br /&gt;
&lt;br /&gt;
In short: server = mqtts://cits1.opentrafficmap.org:8883 :&lt;br /&gt;
* no user name / password&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/status&#039; (online or offline), retained&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/info&#039; with a JSON string, like {&amp;quot;emac&amp;quot;:&amp;quot;xx:xx:xx:xx:xx:xx&amp;quot;,&amp;quot;ver&amp;quot;:&amp;quot;github.com/bertrik/its-g5-receiver-v0.0.1&amp;quot;,&amp;quot;hwv&amp;quot;:&amp;quot;esp32-c5-devkit-c1&amp;quot;}&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/packet&#039; for sniffed packets (raw, not JSON encoded)&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35360</id>
		<title>Its-g5</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35360"/>
		<updated>2026-06-30T06:46:47Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Design */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=ITS-G5&lt;br /&gt;
   |Picture=its-g5.png&lt;br /&gt;
   |Omschrijving=Investigating ITS-G5 signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[[File:its-g5-wireshark.png|thumb|right|alt=wireshark analysis]]&lt;br /&gt;
&lt;br /&gt;
This page is about investigating reception and processing of so-called C-ITS or ITS-G5 signals (802.11p) as used in the Netherlands, see also https://en.wikipedia.org/wiki/Vehicle-to-everything&lt;br /&gt;
These signals are exchanged between passenger cars, emergency vehicles, traffic lights and other traffic-related equipment.&lt;br /&gt;
&lt;br /&gt;
An ESP32-C5 development board is capable of receiving WiFi in the 5 GHz band and can receive/sniff these kinds of packets from live traffic.&lt;br /&gt;
&lt;br /&gt;
Stuff to investigate:&lt;br /&gt;
* Source code for an ITS-G5 receiver https://github.com/pit711/v2x2map&lt;br /&gt;
* Crowd-sourced live map of messages received: https://opentrafficmap.org/&lt;br /&gt;
* Simplest source code for Arduino-based sniffer: https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
* How to contribute to opentrafficmap: https://wiki.opentrafficmap.org&lt;br /&gt;
&lt;br /&gt;
In the Netherlands, SPAT/MAPem messages from traffic lights are not transferred over wifi-p, but over UDAP.&lt;br /&gt;
You need credentials to access that data, it is not clear if it is feasible to hobbyist to access it.&lt;br /&gt;
Interesting project: https://github.com/idkmanLool9/Verkeerslicht&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
[[File:esp32-c5-sniffer.jpg|thumb|right|alt=esp32-c5-sniffer]]&lt;br /&gt;
&lt;br /&gt;
The design is:&lt;br /&gt;
* Use an esp32-c5 for sniffing 802.11p frames only&lt;br /&gt;
* Use an esp32-c3 (as an inexpensive jellybean part) for receiving sniffed frames from the esp32-c5, connect to WiFi and upload packets over MQTT&lt;br /&gt;
* The interface beteween the two boards is &#039;&#039;&#039;serial&#039;&#039;&#039;, this is simpler than SPI as used in other projects:&lt;br /&gt;
** Only three wires required: GND, +5V and serial DATA&lt;br /&gt;
** No need to desolder capacitors on SPI wires of the esp32-c5&lt;br /&gt;
** A serial interface is more universal, e.g. can be connected to an arbitrary linux SBC, to run a python bridge for example&lt;br /&gt;
** On the esp32-c5 use the same wires as the existing USB-UART bridge, so you can also receive packets over USB-serial&lt;br /&gt;
* Run a simple web server on the esp-c3:&lt;br /&gt;
** Configuration page with MQTT settings: host, port, user, pass, base topic&lt;br /&gt;
** Perhaps configure a keystore/certificate for secure mqtt (mqtts), if needed&lt;br /&gt;
** Optional: show some nice stats: mqtt status, packet rate, last packet, packets per type&lt;br /&gt;
** Optional: run a very basic parser for e.g. CAM messages&lt;br /&gt;
&lt;br /&gt;
Practical:&lt;br /&gt;
* The serial link runs over the USB-UART chip of the esp32-c5.&lt;br /&gt;
* A simple command processor runs on the other UART (the emulated USB serial port)&lt;br /&gt;
* On the esp32-c5 side, use pins GND, 5V, UART-TX for the ESP-ESP serial connection.&lt;br /&gt;
* The esp32-c3 and esp32-c5 share their 5V and GND power lines. Each board derives its own internal power supplies from this 5V.&lt;br /&gt;
* The serial link doesn&#039;t have to be very high speed, 115200 for example. We use a hardware UART on both sides of the serial link.&lt;br /&gt;
* Use https://registry.platformio.org/libraries/thomasfredericks/MicroSlip for framing packets over the serial port.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:esp32-c5-devkitc-1.jpg|thumb|right|alt=esp32-c5]]&lt;br /&gt;
[[File:esp32-c3-supermini.jpg|thumb|right|alt=esp32-c3]]&lt;br /&gt;
&lt;br /&gt;
I got this ESP-C5-devkitC-1 board, and it worked for me:&lt;br /&gt;
* Aliexpress product page https://nl.aliexpress.com/item/1005012416463528.html&lt;br /&gt;
* Espressif schematic https://dl.espressif.com/dl/schematics/SCH_ESP32-C5-DevkitC-1_V1.1_20240621.pdf . Actually my board is not exactly like this, the USB-UART is connected to pins GPIO11 (TX) and GPIO12 (RX), not GPIO25/GPIO24.&lt;br /&gt;
* Espressif devkit-c page: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c5/esp32-c5-devkitc-1/user_guide.html&lt;br /&gt;
&lt;br /&gt;
It has an onboard antenna. There are also other boards with an antenna connection, which allows using an external antenna. This may be better, I don&#039;t know yet.&lt;br /&gt;
&lt;br /&gt;
How to wire it up, what I did:&lt;br /&gt;
* Put both the esp32-c3-supermini board and the esp32-c5-devkit-c1 on a breadboard&lt;br /&gt;
* Use male-male dupont wires to connect:&lt;br /&gt;
** 5V to 5V, GND to GND, esp32-c5 TX to esp32-c3 RX&lt;br /&gt;
* Programmed the esp32-c5 with firmware&lt;br /&gt;
* Plug an USB-C cable into the esp32-c3, programmed it with firmware, now it&#039;s powering both the esp32-c3 and the esp32-c5&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Connections&lt;br /&gt;
|-&lt;br /&gt;
! ESP32-c5 !! ESP32-c3 !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| GND || GND || shared ground&lt;br /&gt;
|-&lt;br /&gt;
| 5V || 5V || raw power&lt;br /&gt;
|-&lt;br /&gt;
| U0TXD/GPIO11 || RX/GPIO20 || Data link&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See https://github.com/bertrik/its-g5-receiver&lt;br /&gt;
&lt;br /&gt;
This is heavily inspired by https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
but with a fixed size ring buffer instead of dynamic allocation.&lt;br /&gt;
&lt;br /&gt;
=== Compiling the firmware ===&lt;br /&gt;
Uses python and platformio, see the README.md in the source archive.&lt;br /&gt;
&lt;br /&gt;
Watch packets come in:&lt;br /&gt;
  pio device monitor&lt;br /&gt;
Packets are logged as a &#039;hexdump&#039;.&lt;br /&gt;
&lt;br /&gt;
The can be converted for wireshark, for example:&lt;br /&gt;
  text2pcap -l 105 message.txt message.pcap&lt;br /&gt;
Then viewed in wireshark:&lt;br /&gt;
  wireshark message.pcap&lt;br /&gt;
&lt;br /&gt;
=== opentraffic map interface ===&lt;br /&gt;
See https://github.com/MPW1412/openwrt-otm-bridge#wire-format-mimics-the-esp32-c5-firmware for the mqtt wire format.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/pit711/v2x2map/blob/main/firmware/main/mqtt.c&lt;br /&gt;
&lt;br /&gt;
In short: server = mqtts://cits1.opentrafficmap.org:8883 :&lt;br /&gt;
* no user name / password&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/status&#039; (online or offline), retained&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/info&#039; with a JSON string, like {&amp;quot;emac&amp;quot;:&amp;quot;xx:xx:xx:xx:xx:xx&amp;quot;,&amp;quot;ver&amp;quot;:&amp;quot;github.com/bertrik/its-g5-receiver-v0.0.1&amp;quot;,&amp;quot;hwv&amp;quot;:&amp;quot;esp32-c5-devkit-c1&amp;quot;}&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/packet&#039; for sniffed packets (raw, not JSON encoded)&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Bestand:Esp32-c5-sniffer.jpg&amp;diff=35359</id>
		<title>Bestand:Esp32-c5-sniffer.jpg</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Bestand:Esp32-c5-sniffer.jpg&amp;diff=35359"/>
		<updated>2026-06-29T20:06:31Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35358</id>
		<title>Its-g5</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35358"/>
		<updated>2026-06-29T20:06:13Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Design */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=ITS-G5&lt;br /&gt;
   |Picture=its-g5.png&lt;br /&gt;
   |Omschrijving=Investigating ITS-G5 signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[[File:its-g5-wireshark.png|thumb|right|alt=wireshark analysis]]&lt;br /&gt;
&lt;br /&gt;
This page is about investigating reception and processing of so-called C-ITS or ITS-G5 signals (802.11p) as used in the Netherlands, see also https://en.wikipedia.org/wiki/Vehicle-to-everything&lt;br /&gt;
These signals are exchanged between passenger cars, emergency vehicles, traffic lights and other traffic-related equipment.&lt;br /&gt;
&lt;br /&gt;
An ESP32-C5 development board is capable of receiving WiFi in the 5 GHz band and can receive/sniff these kinds of packets from live traffic.&lt;br /&gt;
&lt;br /&gt;
Stuff to investigate:&lt;br /&gt;
* Source code for an ITS-G5 receiver https://github.com/pit711/v2x2map&lt;br /&gt;
* Crowd-sourced live map of messages received: https://opentrafficmap.org/&lt;br /&gt;
* Simplest source code for Arduino-based sniffer: https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
* How to contribute to opentrafficmap: https://wiki.opentrafficmap.org&lt;br /&gt;
&lt;br /&gt;
In the Netherlands, SPAT/MAPem messages from traffic lights are not transferred over wifi-p, but over UDAP.&lt;br /&gt;
You need credentials to access that data, it is not clear if it is feasible to hobbyist to access it.&lt;br /&gt;
Interesting project: https://github.com/idkmanLool9/Verkeerslicht&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
[[File:esp32-c5-sniffer.jpg|thumb|right|alt=esp32-c5-sniffer]]&lt;br /&gt;
&lt;br /&gt;
The plan is:&lt;br /&gt;
* Use an esp32-c5 for sniffing 802.11p frames only&lt;br /&gt;
* Use an esp32-c3 (as an inexpensive jellybean part) for receiving sniffed frames from the esp32-c5, connect to WiFi and upload packets over MQTT&lt;br /&gt;
* The interface beteween the two boards is &#039;&#039;&#039;serial&#039;&#039;&#039;, this is simpler than SPI as used in other projects:&lt;br /&gt;
** Only three wires required: GND, +5V and serial DATA&lt;br /&gt;
** No need to desolder capacitors on SPI wires of the esp32-c5&lt;br /&gt;
** A serial interface is more universal, e.g. can be connected to an arbitrary linux SBC, to run a python bridge for example&lt;br /&gt;
** On the esp32-c5 use the same wires as the existing USB-UART bridge, so you can also receive packets over USB-serial&lt;br /&gt;
* Run a simple web server on the esp-c3:&lt;br /&gt;
** Configuration page with MQTT settings: host, port, user, pass, base topic&lt;br /&gt;
** Perhaps configure a keystore/certificate for secure mqtt (mqtts), if needed&lt;br /&gt;
** Optional: show some nice stats: mqtt status, packet rate, last packet, packets per type&lt;br /&gt;
** Optional: run a very basic parser for e.g. CAM messages&lt;br /&gt;
&lt;br /&gt;
Practical:&lt;br /&gt;
* The serial link runs over the USB-UART chip of the esp32-c5.&lt;br /&gt;
* A simple command processor runs on the other UART (the emulated USB serial port)&lt;br /&gt;
* On the esp32-c5 side, use pins GND, 5V, UART-TX for the ESP-ESP serial connection.&lt;br /&gt;
* The esp32-c3 and esp32-c5 share their 5V and GND power lines. Each board derives its own internal power supplies from this 5V.&lt;br /&gt;
* The serial link doesn&#039;t have to be very high speed, 115200 for example. We use a hardware UART on both sides of the serial link.&lt;br /&gt;
* Use https://registry.platformio.org/libraries/thomasfredericks/MicroSlip for framing packets over the serial port.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:esp32-c5-devkitc-1.jpg|thumb|right|alt=esp32-c5]]&lt;br /&gt;
[[File:esp32-c3-supermini.jpg|thumb|right|alt=esp32-c3]]&lt;br /&gt;
&lt;br /&gt;
I got this ESP-C5-devkitC-1 board, and it worked for me:&lt;br /&gt;
* Aliexpress product page https://nl.aliexpress.com/item/1005012416463528.html&lt;br /&gt;
* Espressif schematic https://dl.espressif.com/dl/schematics/SCH_ESP32-C5-DevkitC-1_V1.1_20240621.pdf . Actually my board is not exactly like this, the USB-UART is connected to pins GPIO11 (TX) and GPIO12 (RX), not GPIO25/GPIO24.&lt;br /&gt;
* Espressif devkit-c page: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c5/esp32-c5-devkitc-1/user_guide.html&lt;br /&gt;
&lt;br /&gt;
It has an onboard antenna. There are also other boards with an antenna connection, which allows using an external antenna. This may be better, I don&#039;t know yet.&lt;br /&gt;
&lt;br /&gt;
How to wire it up, what I did:&lt;br /&gt;
* Put both the esp32-c3-supermini board and the esp32-c5-devkit-c1 on a breadboard&lt;br /&gt;
* Use male-male dupont wires to connect:&lt;br /&gt;
** 5V to 5V, GND to GND, esp32-c5 TX to esp32-c3 RX&lt;br /&gt;
* Programmed the esp32-c5 with firmware&lt;br /&gt;
* Plug an USB-C cable into the esp32-c3, programmed it with firmware, now it&#039;s powering both the esp32-c3 and the esp32-c5&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Connections&lt;br /&gt;
|-&lt;br /&gt;
! ESP32-c5 !! ESP32-c3 !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| GND || GND || shared ground&lt;br /&gt;
|-&lt;br /&gt;
| 5V || 5V || raw power&lt;br /&gt;
|-&lt;br /&gt;
| U0TXD/GPIO11 || RX/GPIO20 || Data link&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See https://github.com/bertrik/its-g5-receiver&lt;br /&gt;
&lt;br /&gt;
This is heavily inspired by https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
but with a fixed size ring buffer instead of dynamic allocation.&lt;br /&gt;
&lt;br /&gt;
=== Compiling the firmware ===&lt;br /&gt;
Uses python and platformio, see the README.md in the source archive.&lt;br /&gt;
&lt;br /&gt;
Watch packets come in:&lt;br /&gt;
  pio device monitor&lt;br /&gt;
Packets are logged as a &#039;hexdump&#039;.&lt;br /&gt;
&lt;br /&gt;
The can be converted for wireshark, for example:&lt;br /&gt;
  text2pcap -l 105 message.txt message.pcap&lt;br /&gt;
Then viewed in wireshark:&lt;br /&gt;
  wireshark message.pcap&lt;br /&gt;
&lt;br /&gt;
=== opentraffic map interface ===&lt;br /&gt;
See https://github.com/MPW1412/openwrt-otm-bridge#wire-format-mimics-the-esp32-c5-firmware for the mqtt wire format.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/pit711/v2x2map/blob/main/firmware/main/mqtt.c&lt;br /&gt;
&lt;br /&gt;
In short: server = mqtts://cits1.opentrafficmap.org:8883 :&lt;br /&gt;
* no user name / password&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/status&#039; (online or offline), retained&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/info&#039; with a JSON string, like {&amp;quot;emac&amp;quot;:&amp;quot;xx:xx:xx:xx:xx:xx&amp;quot;,&amp;quot;ver&amp;quot;:&amp;quot;github.com/bertrik/its-g5-receiver-v0.0.1&amp;quot;,&amp;quot;hwv&amp;quot;:&amp;quot;esp32-c5-devkit-c1&amp;quot;}&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/packet&#039; for sniffed packets (raw, not JSON encoded)&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35357</id>
		<title>Its-g5</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35357"/>
		<updated>2026-06-29T06:54:58Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* opentraffic map interface */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=ITS-G5&lt;br /&gt;
   |Picture=its-g5.png&lt;br /&gt;
   |Omschrijving=Investigating ITS-G5 signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[[File:its-g5-wireshark.png|thumb|right|alt=wireshark analysis]]&lt;br /&gt;
&lt;br /&gt;
This page is about investigating reception and processing of so-called C-ITS or ITS-G5 signals (802.11p) as used in the Netherlands, see also https://en.wikipedia.org/wiki/Vehicle-to-everything&lt;br /&gt;
These signals are exchanged between passenger cars, emergency vehicles, traffic lights and other traffic-related equipment.&lt;br /&gt;
&lt;br /&gt;
An ESP32-C5 development board is capable of receiving WiFi in the 5 GHz band and can receive/sniff these kinds of packets from live traffic.&lt;br /&gt;
&lt;br /&gt;
Stuff to investigate:&lt;br /&gt;
* Source code for an ITS-G5 receiver https://github.com/pit711/v2x2map&lt;br /&gt;
* Crowd-sourced live map of messages received: https://opentrafficmap.org/&lt;br /&gt;
* Simplest source code for Arduino-based sniffer: https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
* How to contribute to opentrafficmap: https://wiki.opentrafficmap.org&lt;br /&gt;
&lt;br /&gt;
In the Netherlands, SPAT/MAPem messages from traffic lights are not transferred over wifi-p, but over UDAP.&lt;br /&gt;
You need credentials to access that data, it is not clear if it is feasible to hobbyist to access it.&lt;br /&gt;
Interesting project: https://github.com/idkmanLool9/Verkeerslicht&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is:&lt;br /&gt;
* Use an esp32-c5 for sniffing 802.11p frames only&lt;br /&gt;
* Use an esp32-c3 (as an inexpensive jellybean part) for receiving sniffed frames from the esp32-c5, connect to WiFi and upload packets over MQTT&lt;br /&gt;
* The interface beteween the two boards is &#039;&#039;&#039;serial&#039;&#039;&#039;, this is simpler than SPI as used in other projects:&lt;br /&gt;
** Only three wires required: GND, +5V and serial DATA&lt;br /&gt;
** No need to desolder capacitors on SPI wires of the esp32-c5&lt;br /&gt;
** A serial interface is more universal, e.g. can be connected to an arbitrary linux SBC, to run a python bridge for example&lt;br /&gt;
** On the esp32-c5 use the same wires as the existing USB-UART bridge, so you can also receive packets over USB-serial&lt;br /&gt;
* Run a simple web server on the esp-c3:&lt;br /&gt;
** Configuration page with MQTT settings: host, port, user, pass, base topic&lt;br /&gt;
** Perhaps configure a keystore/certificate for secure mqtt (mqtts), if needed&lt;br /&gt;
** Optional: show some nice stats: mqtt status, packet rate, last packet, packets per type&lt;br /&gt;
** Optional: run a very basic parser for e.g. CAM messages&lt;br /&gt;
&lt;br /&gt;
Practical:&lt;br /&gt;
* The serial link runs over the USB-UART chip of the esp32-c5.&lt;br /&gt;
* A simple command processor runs on the other UART (the emulated USB serial port)&lt;br /&gt;
* On the esp32-c5 side, use pins GND, 5V, UART-TX for the ESP-ESP serial connection.&lt;br /&gt;
* The esp32-c3 and esp32-c5 share their 5V and GND power lines. Each board derives its own internal power supplies from this 5V.&lt;br /&gt;
* The serial link doesn&#039;t have to be very high speed, 115200 for example. We use a hardware UART on both sides of the serial link.&lt;br /&gt;
* Use https://registry.platformio.org/libraries/thomasfredericks/MicroSlip for framing packets over the serial port.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:esp32-c5-devkitc-1.jpg|thumb|right|alt=esp32-c5]]&lt;br /&gt;
[[File:esp32-c3-supermini.jpg|thumb|right|alt=esp32-c3]]&lt;br /&gt;
&lt;br /&gt;
I got this ESP-C5-devkitC-1 board, and it worked for me:&lt;br /&gt;
* Aliexpress product page https://nl.aliexpress.com/item/1005012416463528.html&lt;br /&gt;
* Espressif schematic https://dl.espressif.com/dl/schematics/SCH_ESP32-C5-DevkitC-1_V1.1_20240621.pdf . Actually my board is not exactly like this, the USB-UART is connected to pins GPIO11 (TX) and GPIO12 (RX), not GPIO25/GPIO24.&lt;br /&gt;
* Espressif devkit-c page: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c5/esp32-c5-devkitc-1/user_guide.html&lt;br /&gt;
&lt;br /&gt;
It has an onboard antenna. There are also other boards with an antenna connection, which allows using an external antenna. This may be better, I don&#039;t know yet.&lt;br /&gt;
&lt;br /&gt;
How to wire it up, what I did:&lt;br /&gt;
* Put both the esp32-c3-supermini board and the esp32-c5-devkit-c1 on a breadboard&lt;br /&gt;
* Use male-male dupont wires to connect:&lt;br /&gt;
** 5V to 5V, GND to GND, esp32-c5 TX to esp32-c3 RX&lt;br /&gt;
* Programmed the esp32-c5 with firmware&lt;br /&gt;
* Plug an USB-C cable into the esp32-c3, programmed it with firmware, now it&#039;s powering both the esp32-c3 and the esp32-c5&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Connections&lt;br /&gt;
|-&lt;br /&gt;
! ESP32-c5 !! ESP32-c3 !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| GND || GND || shared ground&lt;br /&gt;
|-&lt;br /&gt;
| 5V || 5V || raw power&lt;br /&gt;
|-&lt;br /&gt;
| U0TXD/GPIO11 || RX/GPIO20 || Data link&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See https://github.com/bertrik/its-g5-receiver&lt;br /&gt;
&lt;br /&gt;
This is heavily inspired by https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
but with a fixed size ring buffer instead of dynamic allocation.&lt;br /&gt;
&lt;br /&gt;
=== Compiling the firmware ===&lt;br /&gt;
Uses python and platformio, see the README.md in the source archive.&lt;br /&gt;
&lt;br /&gt;
Watch packets come in:&lt;br /&gt;
  pio device monitor&lt;br /&gt;
Packets are logged as a &#039;hexdump&#039;.&lt;br /&gt;
&lt;br /&gt;
The can be converted for wireshark, for example:&lt;br /&gt;
  text2pcap -l 105 message.txt message.pcap&lt;br /&gt;
Then viewed in wireshark:&lt;br /&gt;
  wireshark message.pcap&lt;br /&gt;
&lt;br /&gt;
=== opentraffic map interface ===&lt;br /&gt;
See https://github.com/MPW1412/openwrt-otm-bridge#wire-format-mimics-the-esp32-c5-firmware for the mqtt wire format.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/pit711/v2x2map/blob/main/firmware/main/mqtt.c&lt;br /&gt;
&lt;br /&gt;
In short: server = mqtts://cits1.opentrafficmap.org:8883 :&lt;br /&gt;
* no user name / password&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/status&#039; (online or offline), retained&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/info&#039; with a JSON string, like {&amp;quot;emac&amp;quot;:&amp;quot;xx:xx:xx:xx:xx:xx&amp;quot;,&amp;quot;ver&amp;quot;:&amp;quot;github.com/bertrik/its-g5-receiver-v0.0.1&amp;quot;,&amp;quot;hwv&amp;quot;:&amp;quot;esp32-c5-devkit-c1&amp;quot;}&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/packet&#039; for sniffed packets (raw, not JSON encoded)&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35356</id>
		<title>Its-g5</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35356"/>
		<updated>2026-06-29T06:52:59Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=ITS-G5&lt;br /&gt;
   |Picture=its-g5.png&lt;br /&gt;
   |Omschrijving=Investigating ITS-G5 signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[[File:its-g5-wireshark.png|thumb|right|alt=wireshark analysis]]&lt;br /&gt;
&lt;br /&gt;
This page is about investigating reception and processing of so-called C-ITS or ITS-G5 signals (802.11p) as used in the Netherlands, see also https://en.wikipedia.org/wiki/Vehicle-to-everything&lt;br /&gt;
These signals are exchanged between passenger cars, emergency vehicles, traffic lights and other traffic-related equipment.&lt;br /&gt;
&lt;br /&gt;
An ESP32-C5 development board is capable of receiving WiFi in the 5 GHz band and can receive/sniff these kinds of packets from live traffic.&lt;br /&gt;
&lt;br /&gt;
Stuff to investigate:&lt;br /&gt;
* Source code for an ITS-G5 receiver https://github.com/pit711/v2x2map&lt;br /&gt;
* Crowd-sourced live map of messages received: https://opentrafficmap.org/&lt;br /&gt;
* Simplest source code for Arduino-based sniffer: https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
* How to contribute to opentrafficmap: https://wiki.opentrafficmap.org&lt;br /&gt;
&lt;br /&gt;
In the Netherlands, SPAT/MAPem messages from traffic lights are not transferred over wifi-p, but over UDAP.&lt;br /&gt;
You need credentials to access that data, it is not clear if it is feasible to hobbyist to access it.&lt;br /&gt;
Interesting project: https://github.com/idkmanLool9/Verkeerslicht&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is:&lt;br /&gt;
* Use an esp32-c5 for sniffing 802.11p frames only&lt;br /&gt;
* Use an esp32-c3 (as an inexpensive jellybean part) for receiving sniffed frames from the esp32-c5, connect to WiFi and upload packets over MQTT&lt;br /&gt;
* The interface beteween the two boards is &#039;&#039;&#039;serial&#039;&#039;&#039;, this is simpler than SPI as used in other projects:&lt;br /&gt;
** Only three wires required: GND, +5V and serial DATA&lt;br /&gt;
** No need to desolder capacitors on SPI wires of the esp32-c5&lt;br /&gt;
** A serial interface is more universal, e.g. can be connected to an arbitrary linux SBC, to run a python bridge for example&lt;br /&gt;
** On the esp32-c5 use the same wires as the existing USB-UART bridge, so you can also receive packets over USB-serial&lt;br /&gt;
* Run a simple web server on the esp-c3:&lt;br /&gt;
** Configuration page with MQTT settings: host, port, user, pass, base topic&lt;br /&gt;
** Perhaps configure a keystore/certificate for secure mqtt (mqtts), if needed&lt;br /&gt;
** Optional: show some nice stats: mqtt status, packet rate, last packet, packets per type&lt;br /&gt;
** Optional: run a very basic parser for e.g. CAM messages&lt;br /&gt;
&lt;br /&gt;
Practical:&lt;br /&gt;
* The serial link runs over the USB-UART chip of the esp32-c5.&lt;br /&gt;
* A simple command processor runs on the other UART (the emulated USB serial port)&lt;br /&gt;
* On the esp32-c5 side, use pins GND, 5V, UART-TX for the ESP-ESP serial connection.&lt;br /&gt;
* The esp32-c3 and esp32-c5 share their 5V and GND power lines. Each board derives its own internal power supplies from this 5V.&lt;br /&gt;
* The serial link doesn&#039;t have to be very high speed, 115200 for example. We use a hardware UART on both sides of the serial link.&lt;br /&gt;
* Use https://registry.platformio.org/libraries/thomasfredericks/MicroSlip for framing packets over the serial port.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:esp32-c5-devkitc-1.jpg|thumb|right|alt=esp32-c5]]&lt;br /&gt;
[[File:esp32-c3-supermini.jpg|thumb|right|alt=esp32-c3]]&lt;br /&gt;
&lt;br /&gt;
I got this ESP-C5-devkitC-1 board, and it worked for me:&lt;br /&gt;
* Aliexpress product page https://nl.aliexpress.com/item/1005012416463528.html&lt;br /&gt;
* Espressif schematic https://dl.espressif.com/dl/schematics/SCH_ESP32-C5-DevkitC-1_V1.1_20240621.pdf . Actually my board is not exactly like this, the USB-UART is connected to pins GPIO11 (TX) and GPIO12 (RX), not GPIO25/GPIO24.&lt;br /&gt;
* Espressif devkit-c page: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c5/esp32-c5-devkitc-1/user_guide.html&lt;br /&gt;
&lt;br /&gt;
It has an onboard antenna. There are also other boards with an antenna connection, which allows using an external antenna. This may be better, I don&#039;t know yet.&lt;br /&gt;
&lt;br /&gt;
How to wire it up, what I did:&lt;br /&gt;
* Put both the esp32-c3-supermini board and the esp32-c5-devkit-c1 on a breadboard&lt;br /&gt;
* Use male-male dupont wires to connect:&lt;br /&gt;
** 5V to 5V, GND to GND, esp32-c5 TX to esp32-c3 RX&lt;br /&gt;
* Programmed the esp32-c5 with firmware&lt;br /&gt;
* Plug an USB-C cable into the esp32-c3, programmed it with firmware, now it&#039;s powering both the esp32-c3 and the esp32-c5&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Connections&lt;br /&gt;
|-&lt;br /&gt;
! ESP32-c5 !! ESP32-c3 !! Remark&lt;br /&gt;
|-&lt;br /&gt;
| GND || GND || shared ground&lt;br /&gt;
|-&lt;br /&gt;
| 5V || 5V || raw power&lt;br /&gt;
|-&lt;br /&gt;
| U0TXD/GPIO11 || RX/GPIO20 || Data link&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See https://github.com/bertrik/its-g5-receiver&lt;br /&gt;
&lt;br /&gt;
This is heavily inspired by https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
but with a fixed size ring buffer instead of dynamic allocation.&lt;br /&gt;
&lt;br /&gt;
=== Compiling the firmware ===&lt;br /&gt;
Uses python and platformio, see the README.md in the source archive.&lt;br /&gt;
&lt;br /&gt;
Watch packets come in:&lt;br /&gt;
  pio device monitor&lt;br /&gt;
Packets are logged as a &#039;hexdump&#039;.&lt;br /&gt;
&lt;br /&gt;
The can be converted for wireshark, for example:&lt;br /&gt;
  text2pcap -l 105 message.txt message.pcap&lt;br /&gt;
Then viewed in wireshark:&lt;br /&gt;
  wireshark message.pcap&lt;br /&gt;
&lt;br /&gt;
=== opentraffic map interface ===&lt;br /&gt;
See https://github.com/MPW1412/openwrt-otm-bridge#wire-format-mimics-the-esp32-c5-firmware for the mqtt wire format.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/pit711/v2x2map/blob/main/firmware/main/mqtt.c&lt;br /&gt;
&lt;br /&gt;
In short: server = mqtts://cits1.opentrafficmap.org:8883 , no user/pass:&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/status&#039; (online or offline), retained&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/info&#039; with a JSON string&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/packet&#039; for sniffed packets (raw, not JSON encoded)&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35355</id>
		<title>Its-g5</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35355"/>
		<updated>2026-06-29T06:49:45Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=ITS-G5&lt;br /&gt;
   |Picture=its-g5.png&lt;br /&gt;
   |Omschrijving=Investigating ITS-G5 signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[[File:its-g5-wireshark.png|thumb|right|alt=wireshark analysis]]&lt;br /&gt;
&lt;br /&gt;
This page is about investigating reception and processing of so-called C-ITS or ITS-G5 signals (802.11p) as used in the Netherlands, see also https://en.wikipedia.org/wiki/Vehicle-to-everything&lt;br /&gt;
These signals are exchanged between passenger cars, emergency vehicles, traffic lights and other traffic-related equipment.&lt;br /&gt;
&lt;br /&gt;
An ESP32-C5 development board is capable of receiving WiFi in the 5 GHz band and can receive/sniff these kinds of packets from live traffic.&lt;br /&gt;
&lt;br /&gt;
Stuff to investigate:&lt;br /&gt;
* Source code for an ITS-G5 receiver https://github.com/pit711/v2x2map&lt;br /&gt;
* Crowd-sourced live map of messages received: https://opentrafficmap.org/&lt;br /&gt;
* Simplest source code for Arduino-based sniffer: https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
* How to contribute to opentrafficmap: https://wiki.opentrafficmap.org&lt;br /&gt;
&lt;br /&gt;
In the Netherlands, SPAT/MAPem messages from traffic lights are not transferred over wifi-p, but over UDAP.&lt;br /&gt;
You need credentials to access that data, it is not clear if it is feasible to hobbyist to access it.&lt;br /&gt;
Interesting project: https://github.com/idkmanLool9/Verkeerslicht&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is:&lt;br /&gt;
* Use an esp32-c5 for sniffing 802.11p frames only&lt;br /&gt;
* Use an esp32-c3 (as an inexpensive jellybean part) for receiving sniffed frames from the esp32-c5, connect to WiFi and upload packets over MQTT&lt;br /&gt;
* The interface beteween the two boards is &#039;&#039;&#039;serial&#039;&#039;&#039;, this is simpler than SPI as used in other projects:&lt;br /&gt;
** Only three wires required: GND, +5V and serial DATA&lt;br /&gt;
** No need to desolder capacitors on SPI wires of the esp32-c5&lt;br /&gt;
** A serial interface is more universal, e.g. can be connected to an arbitrary linux SBC, to run a python bridge for example&lt;br /&gt;
** On the esp32-c5 use the same wires as the existing USB-UART bridge, so you can also receive packets over USB-serial&lt;br /&gt;
* Run a simple web server on the esp-c3:&lt;br /&gt;
** Configuration page with MQTT settings: host, port, user, pass, base topic&lt;br /&gt;
** Perhaps configure a keystore/certificate for secure mqtt (mqtts), if needed&lt;br /&gt;
** Optional: show some nice stats: mqtt status, packet rate, last packet, packets per type&lt;br /&gt;
** Optional: run a very basic parser for e.g. CAM messages&lt;br /&gt;
&lt;br /&gt;
Practical:&lt;br /&gt;
* The serial link runs over the USB-UART chip of the esp32-c5.&lt;br /&gt;
* A simple command processor runs on the other UART (the emulated USB serial port)&lt;br /&gt;
* On the esp32-c5 side, use pins GND, 5V, UART-TX for the ESP-ESP serial connection.&lt;br /&gt;
* The esp32-c3 and esp32-c5 share their 5V and GND power lines. Each board derives its own internal power supplies from this 5V.&lt;br /&gt;
* The serial link doesn&#039;t have to be very high speed, 115200 for example. We use a hardware UART on both sides of the serial link.&lt;br /&gt;
* Use https://registry.platformio.org/libraries/thomasfredericks/MicroSlip for framing packets over the serial port.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:esp32-c5-devkitc-1.jpg|thumb|right|alt=esp32-c5]]&lt;br /&gt;
[[File:esp32-c3-supermini.jpg|thumb|right|alt=esp32-c3]]&lt;br /&gt;
&lt;br /&gt;
I got this ESP-C5-devkitC-1 board, and it worked for me:&lt;br /&gt;
* Aliexpress product page https://nl.aliexpress.com/item/1005012416463528.html&lt;br /&gt;
* Espressif schematic https://dl.espressif.com/dl/schematics/SCH_ESP32-C5-DevkitC-1_V1.1_20240621.pdf . Actually my board is not exactly like this, the USB-UART is connected to pins GPIO11 (TX) and GPIO12 (RX), not GPIO25/GPIO24.&lt;br /&gt;
* Espressif devkit-c page: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c5/esp32-c5-devkitc-1/user_guide.html&lt;br /&gt;
&lt;br /&gt;
It has an onboard antenna. There are also other boards with an antenna connection, which allows using an external antenna. This may be better, I don&#039;t know yet.&lt;br /&gt;
&lt;br /&gt;
How to wire it up, what I did:&lt;br /&gt;
* Put both the esp32-c3-supermini board and the esp32-c5-devkit-c1 on a breadboard&lt;br /&gt;
* Use male-male dupont wires to connect:&lt;br /&gt;
** 5V to 5V, GND to GND, esp32-c5 TX to esp32-c3 RX&lt;br /&gt;
* Programmed the esp32-c5 with firmware&lt;br /&gt;
* Plug an USB-C cable into the esp32-c3, programmed it with firmware, now it&#039;s powering both the esp32-c3 and the esp32-c5&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See https://github.com/bertrik/its-g5-receiver&lt;br /&gt;
&lt;br /&gt;
This is heavily inspired by https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
but with a fixed size ring buffer instead of dynamic allocation.&lt;br /&gt;
&lt;br /&gt;
=== Compiling the firmware ===&lt;br /&gt;
Uses python and platformio, see the README.md in the source archive.&lt;br /&gt;
&lt;br /&gt;
Watch packets come in:&lt;br /&gt;
  pio device monitor&lt;br /&gt;
Packets are logged as a &#039;hexdump&#039;.&lt;br /&gt;
&lt;br /&gt;
The can be converted for wireshark, for example:&lt;br /&gt;
  text2pcap -l 105 message.txt message.pcap&lt;br /&gt;
Then viewed in wireshark:&lt;br /&gt;
  wireshark message.pcap&lt;br /&gt;
&lt;br /&gt;
=== opentraffic map interface ===&lt;br /&gt;
See https://github.com/MPW1412/openwrt-otm-bridge#wire-format-mimics-the-esp32-c5-firmware for the mqtt wire format.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/pit711/v2x2map/blob/main/firmware/main/mqtt.c&lt;br /&gt;
&lt;br /&gt;
In short: server = mqtts://cits1.opentrafficmap.org:8883 , no user/pass:&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/status&#039; (online or offline), retained&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/info&#039; with a JSON string&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/packet&#039; for sniffed packets (raw, not JSON encoded)&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35354</id>
		<title>Its-g5</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35354"/>
		<updated>2026-06-28T21:18:20Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=ITS-G5&lt;br /&gt;
   |Picture=its-g5.png&lt;br /&gt;
   |Omschrijving=Investigating ITS-G5 signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[[File:its-g5-wireshark.png|thumb|right|alt=wireshark analysis]]&lt;br /&gt;
&lt;br /&gt;
This page is about investigating reception and processing of so-called C-ITS or ITS-G5 signals (802.11p) as used in the Netherlands, see also https://en.wikipedia.org/wiki/Vehicle-to-everything&lt;br /&gt;
These signals are exchanged between passenger cars, emergency vehicles, traffic lights and other traffic-related equipment.&lt;br /&gt;
&lt;br /&gt;
An ESP32-C5 development board is capable of receiving WiFi in the 5 GHz band and can receive/sniff these kinds of packets from live traffic.&lt;br /&gt;
&lt;br /&gt;
Stuff to investigate:&lt;br /&gt;
* Source code for an ITS-G5 receiver https://github.com/pit711/v2x2map&lt;br /&gt;
* Crowd-sourced live map of messages received: https://opentrafficmap.org/&lt;br /&gt;
* Simplest source code for Arduino-based sniffer: https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
* How to contribute to opentrafficmap: https://wiki.opentrafficmap.org&lt;br /&gt;
&lt;br /&gt;
In the Netherlands, SPAT/MAPem messages from traffic lights are not transferred over wifi-p, but over UDAP.&lt;br /&gt;
You need credentials to access that data, it is not clear if it is feasible to hobbyist to access it.&lt;br /&gt;
Interesting project: https://github.com/idkmanLool9/Verkeerslicht&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is:&lt;br /&gt;
* Use an esp32-c5 for sniffing 802.11p frames only&lt;br /&gt;
* Use an esp32-c3 (as an inexpensive jellybean part) for receiving sniffed frames from the esp32-c5, connect to WiFi and upload packets over MQTT&lt;br /&gt;
* The interface beteween the two boards is &#039;&#039;&#039;serial&#039;&#039;&#039;, this is simpler than SPI as used in other projects:&lt;br /&gt;
** Only three wires required: GND, +5V and serial DATA&lt;br /&gt;
** No need to desolder capacitors on SPI wires of the esp32-c5&lt;br /&gt;
** A serial interface is more universal, e.g. can be connected to an arbitrary linux SBC, to run a python bridge for example&lt;br /&gt;
** On the esp32-c5 use the same wires as the existing USB-UART bridge, so you can also receive packets over USB-serial&lt;br /&gt;
* Run a simple web server on the esp-c3:&lt;br /&gt;
** Configuration page with MQTT settings: host, port, user, pass, base topic&lt;br /&gt;
** Perhaps configure a keystore/certificate for secure mqtt (mqtts), if needed&lt;br /&gt;
** Optional: show some nice stats: mqtt status, packet rate, last packet, packets per type&lt;br /&gt;
** Optional: run a very basic parser for e.g. CAM messages&lt;br /&gt;
&lt;br /&gt;
Practical:&lt;br /&gt;
* The serial link runs over the USB-UART chip of the esp32-c5.&lt;br /&gt;
* A simple command processor runs on the other UART (the emulated USB serial port)&lt;br /&gt;
* On the esp32-c5 side, use pins GND, 5V, UART-TX for the ESP-ESP serial connection.&lt;br /&gt;
* The esp32-c3 and esp32-c5 share their 5V and GND power lines. Each board derives its own internal power supplies from this 5V.&lt;br /&gt;
* The serial link doesn&#039;t have to be very high speed, 115200 for example. We use a hardware UART on both sides of the serial link.&lt;br /&gt;
* Use https://registry.platformio.org/libraries/thomasfredericks/MicroSlip for framing packets over the serial port.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:esp32-c5-devkitc-1.jpg|thumb|right|alt=esp32-c5]]&lt;br /&gt;
[[File:esp32-c3-supermini.jpg|thumb|right|alt=esp32-c3]]&lt;br /&gt;
&lt;br /&gt;
I got this ESP-C5-devkitC-1 board, and it worked for me:&lt;br /&gt;
* Aliexpress product page https://nl.aliexpress.com/item/1005012416463528.html&lt;br /&gt;
* Espressif schematic https://dl.espressif.com/dl/schematics/SCH_ESP32-C5-DevkitC-1_V1.1_20240621.pdf . Actually my board is not exactly like this, the USB-UART is connected to pins GPIO11 (TX) and GPIO12 (RX), not GPIO25/GPIO24.&lt;br /&gt;
* Espressif devkit-c page: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c5/esp32-c5-devkitc-1/user_guide.html&lt;br /&gt;
&lt;br /&gt;
It has an onboard antenna. There are also other boards with an antenna connection, which allows using an external antenna. This may be better, I don&#039;t know yet.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See https://github.com/bertrik/its-g5-receiver&lt;br /&gt;
&lt;br /&gt;
This is heavily inspired by https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
but with a fixed size ring buffer instead of dynamic allocation.&lt;br /&gt;
&lt;br /&gt;
=== Compiling the firmware ===&lt;br /&gt;
Uses python and platformio, see the README.md in the source archive.&lt;br /&gt;
&lt;br /&gt;
Watch packets come in:&lt;br /&gt;
  pio device monitor&lt;br /&gt;
Packets are logged as a &#039;hexdump&#039;.&lt;br /&gt;
&lt;br /&gt;
The can be converted for wireshark, for example:&lt;br /&gt;
  text2pcap -l 105 message.txt message.pcap&lt;br /&gt;
Then viewed in wireshark:&lt;br /&gt;
  wireshark message.pcap&lt;br /&gt;
&lt;br /&gt;
=== opentraffic map interface ===&lt;br /&gt;
See https://github.com/MPW1412/openwrt-otm-bridge#wire-format-mimics-the-esp32-c5-firmware for the mqtt wire format.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/pit711/v2x2map/blob/main/firmware/main/mqtt.c&lt;br /&gt;
&lt;br /&gt;
In short: server = mqtts://cits1.opentrafficmap.org:8883 , no user/pass:&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/status&#039; (online or offline), retained&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/info&#039; with a JSON string&lt;br /&gt;
* topic &#039;its/&amp;lt;node&amp;gt;/packet&#039; for sniffed packets (raw, not JSON encoded)&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35351</id>
		<title>Its-g5</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35351"/>
		<updated>2026-06-25T08:13:59Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Design */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=ITS-G5&lt;br /&gt;
   |Picture=its-g5.png&lt;br /&gt;
   |Omschrijving=Investigating ITS-G5 signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[[File:its-g5-wireshark.png|thumb|right|alt=wireshark analysis]]&lt;br /&gt;
&lt;br /&gt;
This page is about investigating reception and processing of so-called C-ITS or ITS-G5 signals (802.11p) as used in the Netherlands, see also https://en.wikipedia.org/wiki/Vehicle-to-everything&lt;br /&gt;
These signals are exchanged between passenger cars, emergency vehicles, traffic lights and other traffic-related equipment.&lt;br /&gt;
&lt;br /&gt;
An ESP32-C5 development board is capable of receiving WiFi in the 5 GHz band and can receive/sniff these kinds of packets from live traffic.&lt;br /&gt;
&lt;br /&gt;
Stuff to investigate:&lt;br /&gt;
* Source code for an ITS-G5 receiver https://github.com/pit711/v2x2map&lt;br /&gt;
* Crowd-sourced live map of messages received: https://opentrafficmap.org/&lt;br /&gt;
* Simplest source code for Arduino-based sniffer: https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
* How to contribute to opentrafficmap: https://wiki.opentrafficmap.org&lt;br /&gt;
&lt;br /&gt;
In the Netherlands, SPAT/MAPem messages from traffic lights are not transferred over wifi-p, but over UDAP.&lt;br /&gt;
You need credentials to access that data, it is not clear if it is feasible to hobbyist to access it.&lt;br /&gt;
Interesting project: https://github.com/idkmanLool9/Verkeerslicht&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is:&lt;br /&gt;
* Use an esp32-c5 for sniffing 802.11p frames only&lt;br /&gt;
* Use an esp32-c3 (as an inexpensive jellybean part) for receiving sniffed frames from the esp32-c5, connect to WiFi and upload packets over MQTT&lt;br /&gt;
* The interface beteween the two boards is &#039;&#039;&#039;serial&#039;&#039;&#039;, this is simpler than SPI as used in other projects:&lt;br /&gt;
** Only three wires required: GND, +5V and serial DATA&lt;br /&gt;
** No need to desolder capacitors on SPI wires of the esp32-c5&lt;br /&gt;
** A serial interface is more universal, e.g. can be connected to an arbitrary linux SBC, to run a python bridge for example&lt;br /&gt;
** On the esp32-c5 use the same wires as the existing USB-UART bridge, so you can also receive packets over USB-serial&lt;br /&gt;
* Run a simple web server on the esp-c3:&lt;br /&gt;
** Configuration page with MQTT settings: host, port, user, pass, base topic&lt;br /&gt;
** Perhaps configure a keystore/certificate for secure mqtt (mqtts), if needed&lt;br /&gt;
** Optional: show some nice stats: mqtt status, packet rate, last packet, packets per type&lt;br /&gt;
** Optional: run a very basic parser for e.g. CAM messages&lt;br /&gt;
&lt;br /&gt;
Practical:&lt;br /&gt;
* The serial link runs over the USB-UART chip of the esp32-c5.&lt;br /&gt;
* A simple command processor runs on the other UART (the emulated USB serial port)&lt;br /&gt;
* On the esp32-c5 side, use pins GND, 5V, UART-TX for the ESP-ESP serial connection.&lt;br /&gt;
* The esp32-c3 and esp32-c5 share their 5V and GND power lines. Each board derives its own internal power supplies from this 5V.&lt;br /&gt;
* The serial link doesn&#039;t have to be very high speed, 115200 for example. We use a hardware UART on both sides of the serial link.&lt;br /&gt;
* Use https://registry.platformio.org/libraries/thomasfredericks/MicroSlip for framing packets over the serial port.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:esp32-c5-devkitc-1.jpg|thumb|right|alt=esp32-c5]]&lt;br /&gt;
[[File:esp32-c3-supermini.jpg|thumb|right|alt=esp32-c3]]&lt;br /&gt;
&lt;br /&gt;
I got this ESP-C5-devkitC-1 board, and it worked for me:&lt;br /&gt;
* Aliexpress product page https://nl.aliexpress.com/item/1005012416463528.html&lt;br /&gt;
* Espressif schematic https://dl.espressif.com/dl/schematics/SCH_ESP32-C5-DevkitC-1_V1.1_20240621.pdf . Actually my board is not exactly like this, the USB-UART is connected to pins GPIO11 (TX) and GPIO12 (RX), not GPIO25/GPIO24.&lt;br /&gt;
* Espressif devkit-c page: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c5/esp32-c5-devkitc-1/user_guide.html&lt;br /&gt;
&lt;br /&gt;
It has an onboard antenna. There are also other boards with an antenna connection, which allows using an external antenna. This may be better, I don&#039;t know yet.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See https://github.com/bertrik/its-g5-receiver&lt;br /&gt;
&lt;br /&gt;
=== Compiling the firmware ===&lt;br /&gt;
Uses python and platformio, see the README.md in the source archive.&lt;br /&gt;
&lt;br /&gt;
Watch packets come in:&lt;br /&gt;
  pio device monitor&lt;br /&gt;
Packets are logged as a &#039;hexdump&#039;.&lt;br /&gt;
&lt;br /&gt;
The can be converted for wireshark, for example:&lt;br /&gt;
  text2pcap -l 105 message.txt message.pcap&lt;br /&gt;
Then viewed in wireshark:&lt;br /&gt;
  wireshark message.pcap&lt;br /&gt;
&lt;br /&gt;
=== opentraffic map interface ===&lt;br /&gt;
See https://github.com/MPW1412/openwrt-otm-bridge#wire-format-mimics-the-esp32-c5-firmware for the mqtt wire format.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/pit711/v2x2map/blob/main/firmware/main/mqtt.c&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
	<entry>
		<id>https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35350</id>
		<title>Its-g5</title>
		<link rel="alternate" type="text/html" href="https://revspace.nl/wiki/index.php?title=Its-g5&amp;diff=35350"/>
		<updated>2026-06-25T08:03:05Z</updated>

		<summary type="html">&lt;p&gt;Bertrik Sikken: /* Compiling the firmware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
   |Name=ITS-G5&lt;br /&gt;
   |Picture=its-g5.png&lt;br /&gt;
   |Omschrijving=Investigating ITS-G5 signals&lt;br /&gt;
   |Status=In progress&lt;br /&gt;
   |Contact=bertrik&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
[[File:its-g5-wireshark.png|thumb|right|alt=wireshark analysis]]&lt;br /&gt;
&lt;br /&gt;
This page is about investigating reception and processing of so-called C-ITS or ITS-G5 signals (802.11p) as used in the Netherlands, see also https://en.wikipedia.org/wiki/Vehicle-to-everything&lt;br /&gt;
These signals are exchanged between passenger cars, emergency vehicles, traffic lights and other traffic-related equipment.&lt;br /&gt;
&lt;br /&gt;
An ESP32-C5 development board is capable of receiving WiFi in the 5 GHz band and can receive/sniff these kinds of packets from live traffic.&lt;br /&gt;
&lt;br /&gt;
Stuff to investigate:&lt;br /&gt;
* Source code for an ITS-G5 receiver https://github.com/pit711/v2x2map&lt;br /&gt;
* Crowd-sourced live map of messages received: https://opentrafficmap.org/&lt;br /&gt;
* Simplest source code for Arduino-based sniffer: https://git.devlol.org/jstsmthrgk/simple-its-g5-receiver-firmware&lt;br /&gt;
* How to contribute to opentrafficmap: https://wiki.opentrafficmap.org&lt;br /&gt;
&lt;br /&gt;
In the Netherlands, SPAT/MAPem messages from traffic lights are not transferred over wifi-p, but over UDAP.&lt;br /&gt;
You need credentials to access that data, it is not clear if it is feasible to hobbyist to access it.&lt;br /&gt;
Interesting project: https://github.com/idkmanLool9/Verkeerslicht&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
The plan is:&lt;br /&gt;
* Use an esp32-c5 for sniffing 802.11p frames only&lt;br /&gt;
* Use an esp32-c3 (as an inexpensive jellybean part) for receiving sniffed frames from the esp32-c5, connect to WiFi and upload packets over MQTT&lt;br /&gt;
* The interface beteween the two boards is &#039;&#039;&#039;serial&#039;&#039;&#039;, this is simpler than SPI as used in other projects:&lt;br /&gt;
** Only three wires required: GND, +5V and serial DATA&lt;br /&gt;
** No need to desolder capacitors on SPI wires of the esp32-c5&lt;br /&gt;
** A serial interface is more universal, e.g. can be connected to an arbitrary linux SBC, to run a python bridge for example&lt;br /&gt;
** On the esp32-c5 use the same wires as the existing USB-UART bridge, so you can also receive packets over USB-serial&lt;br /&gt;
* Run a simple web server on the esp-c3:&lt;br /&gt;
** Configuration page with MQTT settings: host, port, user, pass, base topic&lt;br /&gt;
** Perhaps configure a keystore/certificate for secure mqtt (mqtts), if needed&lt;br /&gt;
** Optional: show some nice stats: mqtt status, packet rate, last packet, packets per type&lt;br /&gt;
** Optional: run a very basic parser for e.g. CAM messages&lt;br /&gt;
&lt;br /&gt;
Practical:&lt;br /&gt;
* The serial link runs over the USB-UART chip of the esp32-c5.&lt;br /&gt;
* A simple command processor runs on the other UART (the emulated USB serial port)&lt;br /&gt;
* On the esp32-c5 side, use pins GND, 5V, GPIO-XX for the ESP-ESP serial connection. These pins are right next to each other on the esp32-c5-devkitc-1.&lt;br /&gt;
* The esp32-c3 and esp32-c5 have their 5V power lines connected together. Each board derives its own internal power supplies from this 5V.&lt;br /&gt;
* The serial link probably doesn&#039;t have to be very high speed, start with 115200 for example. We use a hardware UART on both sides for this.&lt;br /&gt;
* Use https://registry.platformio.org/libraries/thomasfredericks/MicroSlip for framing packets over the serial port.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[File:esp32-c5-devkitc-1.jpg|thumb|right|alt=esp32-c5]]&lt;br /&gt;
[[File:esp32-c3-supermini.jpg|thumb|right|alt=esp32-c3]]&lt;br /&gt;
&lt;br /&gt;
I got this ESP-C5-devkitC-1 board, and it worked for me:&lt;br /&gt;
* Aliexpress product page https://nl.aliexpress.com/item/1005012416463528.html&lt;br /&gt;
* Espressif schematic https://dl.espressif.com/dl/schematics/SCH_ESP32-C5-DevkitC-1_V1.1_20240621.pdf . Actually my board is not exactly like this, the USB-UART is connected to pins GPIO11 (TX) and GPIO12 (RX), not GPIO25/GPIO24.&lt;br /&gt;
* Espressif devkit-c page: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c5/esp32-c5-devkitc-1/user_guide.html&lt;br /&gt;
&lt;br /&gt;
It has an onboard antenna. There are also other boards with an antenna connection, which allows using an external antenna. This may be better, I don&#039;t know yet.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
See https://github.com/bertrik/its-g5-receiver&lt;br /&gt;
&lt;br /&gt;
=== Compiling the firmware ===&lt;br /&gt;
Uses python and platformio, see the README.md in the source archive.&lt;br /&gt;
&lt;br /&gt;
Watch packets come in:&lt;br /&gt;
  pio device monitor&lt;br /&gt;
Packets are logged as a &#039;hexdump&#039;.&lt;br /&gt;
&lt;br /&gt;
The can be converted for wireshark, for example:&lt;br /&gt;
  text2pcap -l 105 message.txt message.pcap&lt;br /&gt;
Then viewed in wireshark:&lt;br /&gt;
  wireshark message.pcap&lt;br /&gt;
&lt;br /&gt;
=== opentraffic map interface ===&lt;br /&gt;
See https://github.com/MPW1412/openwrt-otm-bridge#wire-format-mimics-the-esp32-c5-firmware for the mqtt wire format.&lt;br /&gt;
&lt;br /&gt;
See also https://github.com/pit711/v2x2map/blob/main/firmware/main/mqtt.c&lt;/div&gt;</summary>
		<author><name>Bertrik Sikken</name></author>
	</entry>
</feed>