Porsche 718 Cayman CAN BUS Track Day Data

Porsche 718 Clubsport
Porsche 718 Clubsport

Part two begins with a 76MB data log from a 10 minute drive around Circuit Of The Americas to lunch. There is an incredible amount of data zipping around your cars network every second. With the laptop connected to USB2CAN serial port and SavvyCAN on the laptop, constant logging was set. From this starting point I could begin to reverse engineer and test each of the PID’s I discovered. If you missed how I did that, checkout part one.

  • Over at the OpenDBC project, there is a Volkswagen dbc (vw_mqb_2010.dbc) that turned out to be quite helpful! The next steps were:
    • Decoding German to English – Example: “Laengsbeschleunigung” == Longitudinal acceleration
    • Getting very excited when I found “Lenkradwinkel” == Steering Wheel Angle
    • Looking closely at units and looking for data by searching for “KiloMeters” and “Unit_Bar”
    • Graphing the data out to make sure it was correct.
    • Not finding the data in the same location as the VW, but closely watching the data in Flow View for signs.
      • Example: PID 262 has all the wheel speeds for the VW. When looking at PID 259 on the Porsche; I found the 4 rows of 12 bit data.
    • Test, and repeat!

The “Flow View” in SavvyCAN is a good place to start to analyze the data packet. It gives you a basic idea of how the data is moving, and which bits are changing. An important note about the way SavvyCAN saves logs; It saves them with a negative time in microseconds (It’s UNIX time) but it’s “subtracted”. This was really causing SavvyCAN to struggle for me when I loaded logs. None of the graphs were working correctly, and the playback wasn’t graphing the data. I wrote a quick Python script to subtract the time (minus a minus equals a plus) so that it was in order of microseconds. I’m using “SavvyCAN-Windows_x64” compiled for windows version 213, so you might not have this issue.

import pandas as pd
df = pd.read_csv("YOUR_718_Drive.csv")

#Show data so that you know it's working
print(df.head(3)) #prints 3 heading rows
print(df['Time Stamp'].dtype)

#Grab the first timestamp from your file and add it here:
df['Time Stamp'] += 1723750632962509

df.to_csv("YOUR_718_Drive_timestamp.csv", index=False)


The to-do list was all of the data that the AiM SOLO and MoTeC kids get for their Porsche GT4 Clubsport cars: Accelerator Pedal, Air Temp, Boost Pressure, Brake Pressure, Clutch Position, Coolant Temp, Engine Speed, Vehicle Speed, Lateral Acceleration, Longitudinal Acceleration, Intake Air Temp, Odometer, Oil Pressure, Oil Temp, Steering Angle, Steering Speed, Wheel Speed (FL, FR, RL, RR), Yaw Rate.

Next up was getting that data to a track day logger. I was super excited to discover that a product I already owned had the ability to capture CAN BUS data to my phone. During my discovery for this, I came across a project for the Toyota GR86 / Subaru BRZ that tapped into the CAN BUS like I did, and uses a OBDLink LX connected to a feature of RaceChrono to log CAN BUS messages on your phone. I wired up an OBD2 splitter that I could inject the CAN data into my OBDLink in a similar fashion.

The last step was adding and converting the units + math for each of the PID’s. RaceChrono has a guide to handle all of the units here.

Checkout how BTR Justin and the BTR Garage got this all working on their Toyota GR86!

Another drive and I confirmed I had access to everything. From Oil Pressure to Individual Wheel Speeds. This is NOT data from my laptop, this is data from the OBDLink LX Bluetooth sending CAN messages to RaceChrono Pro on my phone, and then later exported as a CSV. Viewing the data with MegaLogViewer HD here – because it can just take whatever CSV you can throw at it!

Here’s about 40 hours of work reverse engineering the German CAN BUS of the 718. If you use this DBC – please tip your hat to planetkris.com! – Kris

BU_: 718
BO_ 134 Steering: 8 718
  SG_ LWI_Steering_angle : 16|13@1+ (0.1,0) [0|800] "Unit_DegreOfArc" 718
  SG_ LWI_Steering_Speed : 31|9@1+ (5,0) [0|2500] "Unit_DegreOfArcPerSecon" 718
BO_ 257 ESP_02: 8 718
  SG_ ESP_Yaw_Rate : 40|14@1+ (0.01,0) [0|163.82] "Unit_DegreOfArcPerSecon" 718
  SG_ ESP_Lateral_accel : 16|8@1+ (0.01,-1.27) [-1.27|1.27] "Unit_ForceOfGravi" 718
  SG_ ESP_Longitudinal_adj : 24|10@1+ (0.03125,-16) [-16|15.90625] "Unit_MeterPerSeconSquar" 718

BO_ 259 ABS: 8 718
  SG_ Wheel_Speed_FL : 16|12@1+ (0.103,0) [0|325.12] "Unit_KiloMeterPerHou" 718
  SG_ Wheel_Speed_FR : 28|12@1+ (0.103,0) [0|325.12] "Unit_KiloMeterPerHou" 718
  SG_ Wheel_Speed_RL : 40|12@1+ (0.103,0) [0|325.12] "Unit_KiloMeterPerHou" 718
  SG_ Wheel_Speed_RR : 52|12@1+ (0.103,0) [0|325.12] "Unit_KiloMeterPerHou" 718

BO_ 260 Transmission: 8 718
  SG_ EPB_Clutch_Pedal : 32|8@1+ (0.4,-10) [8|92] "Unit_PerCent" 718

BO_ 261 Throttle: 8 718
  SG_ Throttle_Position : 48|8@1+ (0.4,0) [0|1] "Unit_PerCent" 718
  SG_ Throttle_RPM : 16|16@1+ (0.25,0) [0|10000] "RPM" 718

BO_ 262 Brakes: 8 718
  SG_ Brake_PressureSig352 : 16|10@1+ (0.3,-30) [-30|276.6] "Unit_Bar" 718
  SG_ Brake_Light : 26|1@1+ (1,1) [0|1] "On Off" 718

BO_ 263 Motor: 8 718
  SG_ MO_Oil_Pressure : 16|8@1+ (0.04,0) [0|10] "Unit_Bar" 718
  SG_ MO_Motor_Speed : 24|12@1+ (3,0) [0|12282] "Unit_MinutInver" 718
  SG_ MO_Boost_Pressure : 39|9@1+ (0.01,0) [0|5.1] "Unit_Bar" 718

BO_ 779 Speed: 8 718
  SG_ KBI_displayed_speed : 48|10@1+ (0.32,0) [0|325.12] "Unit_KiloMeterPerHour" 718

BO_ 1600 Temps: 8 718
  SG_ Oil : 16|8@1+ (1,-60) [0|1] "Degrees C" 718
  SG_ Coolant : 24|8@1+ (1,-75) [0|1] "Degrees C" 718
  SG_ Intake_Temp : 8|8@1+ (0.75,-48) [-48|141.75] "Unit_DegreCelsi" 718

BO_ 1714 Diagnose_01: 8 718
  SG_ KBI_Odometer_K : 8|20@1+ (1,0) [0|1048573] "Unit_KiloMeter" 718
  SG_ UH_Year : 28|7@1+ (1,2000) [2000|2127] "Unit_Year" 718
  SG_ UH_Month : 35|4@1+ (1,0) [1|12] "Unit_Month" 718
  SG_ UH_Day : 39|5@1+ (1,0) [1|31] "Unit_Day" 718
  SG_ UH_Hour : 44|5@1+ (1,0) [0|23] "Unit_Hours" 718
  SG_ UH_Minute : 49|6@1+ (1,0) [0|59] "Unit_Minut" 718
  SG_ UH_Second : 55|6@1+ (1,0) [0|59] "Unit_Secon" 718

BO_ 1719 Fuel: 8 718
  SG_ KBI_Contents_Tank : 40|7@1+ (1,0) [0|125] "Unit_Liter" 718
  SG_ KBI_Outside_Temp : 56|8@1+ (0.5,-50) [-50|75] "Unit_DegreCelsi" 718

Fun Fact: The odometer is only stored as a 20 bit number. This maxes out at 1,048,574 kilometers or ~651,553.7 miles. I expect the data would roll over, just like a physical odometer hitting 999,999.9 on a mechanical tens counter. Your mileage may vary!

  • Updated Codes for RaceChrono Pro
    • Here are the PID’s I use and their equations
  • Brake Pressure (Reported in Bar needs kPa)
    • PID 262 (bitsToUintLe(raw,16,10)*0.3-30)*100
  • Clutch Position (0-100%)
    • PID 260 (bitsToUintLe(raw,32,8)*0.4)-10
  • Coolant Temp (Reported in °C)
    • PID 1600 bitsToUintLe(raw,24,8)-75
  • Engine RPM
    • PID 261 bitsToUintLe(raw,16,16)*0.25
  • Engine Oil Pressure (Reported in Bar needs kPa)
    • PID 263 (bitsToUintLe(raw,16,8)*0.04)*100
  • Engine Oil Temp (Reported in °C)
    • PID 1600 bitsToUintLe(raw,16,8)-60
  • Fuel Level (Reported in liters)
    • PID 1719 bitsToUintLe(raw,40,7)
  • Intake Temp (Reported in °C)
    • PID 1600 (bitsToUintLe(raw,8,8)*0.75)-48
  • Manifold Pressure (Reported in Bar needs kPa)
    • PID 263 (bitsToUintLe(raw,39,9)*0.01)*100
  • Speed (Reported in KpH needs m/s)
    • PID 779 (bitsToUintLe(raw,48,10)*0.32)/3.6
  • Steering Angle (Degrees)
    • PID 134 bitsToUintLe(raw,16,13)*0.1
  • Temperature (Reported in °C)
    • PID 1719 (bitsToUintLe(raw,56,8)*0.5)-50
  • Throttle Position (0-100%)
    • PID 261 bitsToUintLe(raw,48,8)*0.4
  • Wheel Speeds (Reported in KpH needs m/s)
    • PID 259
    • FL (bitsToUintLe(raw,16,12)*0.103)/3.6
    • FR (bitsToUintLe(raw,28,12)*0.103)/3.6
    • RL (bitsToUintLe(raw,40,12)*0.103)/3.6
    • RR (bitsToUintLe(raw,52,12)*0.103)/3.6
  • Manual Transmission Gear (0 stopped; 1-6 gear; 13 reverse; 14 not engaged) NEW!
    • PID 129 bitsToUintLe(raw,49,4)
  • PDK Transmission Gear (1-7 gear; 8 reverse) NEW!
    • PID = 258 bitsToUInt(raw,28,4)

Unlocking the Porsche 718 CAN BUS

Porsche 718 CAN BUSThis is going to be the first in a series of posts that cover CAN BUS discovery on my 2018 Porsche Cayman. The goal of this project is to unlock all of the hidden CAN PID’s (and ultimately build a DBC file and repo for them). Ultimately unlocking all of the cars sensors for use in logging during track days. Brake pressure, Oil pressure, TPMS (tire temp + pressure), Tire rotation speed, ABS / TCS activation, Steering wheel degrees, etc, etc. All exciting data points that we’d love to get access to.

I was interested in capturing track day data from the OBD, and I discovered that the CAN BUS that is accessible through the OBD2 port on the 718 has basically NO DATA available on it. This connection comes from the CAN BUS Gateway and my guess is none of the data is provided to it without a manufacturer coded scan tool. Example: Porsche dealer tool message to the gateway – “Hey give me this data from the CAN-BUS here is my special code” and the gateway responds with that data. Great for keeping that info locked away, not helpful for accessing it.

This led me to try and wire up a direct connection to the internal CAN DRIVE line. This line is the Brown/Black (CAN HIGH) Brown/Brown (CAN LOW) set on the 981 / 982. You’ll notice in the picture to the right, that there are in fact 2 pairs of these same colors. One of them is the (useless to us) one that goes to the OBD2 connector. I was able to obtain circuit diagrams for the Porsche CAN Gateway and the Diagnostic port. Using the process of elimination. You want the pair (Brown/Black) going to the gateway (PIN 16) , NOT the pair going to the Diagnostic (OBD2) port. I was able to put a Ohm meter continuity check in PIN 6 of the OBD2 port and rule out one of the two sets. I very carefully spliced into it with the correct sized twisted wire. Wrapped and soldered a connection. Ready to test!

Reverse Engineering

What got me started down this path was this video by Dan Dulac on Reverse Engineering his R8/Huracan Powertrain. This series is a great watch, and what you’ll need to understand the next steps.

SETUP:SavvyCAN

  • You have a Porsche 718 (982) Cayman / Boxster 2017-2024 S GTS T
    • The 718 GT4 may have different CAN wiring
    • This may also work on the 981 Cayman / Boxster 2012-2016 as the body wiring harness is the same, but the CAN messages may differ
  • You have a PC running Windows 10+
  • You have a copy of SavvyCAN for Windows
  • You have a SavvyCAN compatible USB2CAN dongle
  • You have tapped into the correct CAN DRIVE BUS wired to the gateway.
  • DO THIS AT YOUR OWN RISK – Damaging the wires to the CAN BUS is basically like cutting / tapping an Ethernet cord in your companies network closet. If you have no experience with electronic hardware, just don’t.
  • Triple check you have CAN HIGH (Brown/Black) and CAN LOW (Brown/Brown) connected correctly.
  • Make sure you twist your wires, keep their length to a minimum, and do not terminate with a 120Ohm resistor.
    • For some ESP 32, RaspPi, and Arduino CAN modules – you may have to solder to remove the 120Ohm.
    • Remove the jumper (or don’t install it) on your USB2CAN dongle. This is the same as disabling the resistor.
  • Connect everything up – Turn the ignition to ON – you don’t need to start the vehicle.

 

Go to Connection Settings and Add a new connection. For the USB2CAN converter you will select QT SerialBus Device (PeakCAN) and the port should automatically show usb(X) if it’s plugged in and the drivers are running. Software for the PU2CANFD here.

The CAN DRIVE BUS operates at a Speed of 500000. Enable the bus and you should immediately see data start to stream in the main window.
I started to methodically go through and identify ID’s. The throttle information looks to be on 0x105 (261) and the braking  info on 1×106 (262). This lines up with a VW DBC I downloaded. I still believe that a Porsche DBC exists that has most of what I’m looking for. If you HAVE that DBC, or you’re interested in helping the community brute force figure out all the PID’s, please leave a comment, or hit me up over at the 718 Forums. (user webkris)

BO_ 261 ThrottlePosition: 0 718Cayman
SG_ ThrottlePosition : 48|8@1+ (0.4,0) [0|1] “” 718Cayman
BO_ 262 BrakePressure: 0 718Cayman
SG_ BrakePressure : 16|8@1+ (1,-99) [0|100] “” 718Cayman

 

YouTube shortcodes not working WordPress

Does your WordPress site show THIS:

Instead of your embedded video?
Well, instead of an AI generated 10 page article describing how you need to load a special 3rd party paid plugin that will fix nothing… You just need to re-enable it with Jetpack:

Find this setting under Jetpack > Writing > Composing > Compose using shortcodes to embed media from popular sites

Hopefully someone will find this, find this useful, and fix their WordPress short code issue where it’s not working because JetPack toggled this feature off. This is the sound of me screaming in digital.

Pie-Stop for Pi-Hole


Just setup a pi-hole for DNS filtering. I subscribed to a bunch of block lists and then subsequently prevented Christine from loading a site on her work laptop. Seeing as how the network admin is not always home to take care of issues like this, I wanted a way for anyone in the house to disable filtering for ~5 min. There are many, many, many IoT button tutorials out there, with lots of different hardware, so this post will cover light details, please use it for inspiration.

If you haven’t done any work with the ESP-01S modules – these are the tiny 2 GPIO pin ESP8266 boards that have 8-pins, deep sleep mode, and can run off a 3.6V Lithium 18650 for months. I highly suggest getting a “code burner” board from the Jungle Site. This just makes de-bug and programming with Arduino IDE quality of life 1000% better.

The code required is going to change, and I’m not maintaining C# for this one, but it works like so: You need to connect to your WiFi, it needs to send a web GET request to your pi-hole, and then it needs to go into deep sleep. Something like: “http.begin(wifiClient, “http://your_pie_ip:80/admin/api.php?disable=300&auth=”);” and then “ESP.deepSleep(0);” This means the device is always powered and runs the code on startup.

The button is tied to the reset pin like this. I had to find a NO (Normally Open) e-stop button to get this to work. There are tutorials out there on how to switch this for a NC (Normally Closed) e-stop in case a transistor is easier / cheaper to get. I whipped up a 3D enclosure to hold all of this and posted it over on Printables.com. Lots of other models there if this one doesn’t satisfy your needs. Printed the bottom in clear PETG.

  • 3D Printed Enclosure
  • ESP-01 Code Burner
  • ESP-01S or regular ESP8266 module
  • E-Stop button (Normally Open)
  • Lithium Battery Charger Module
  • 18650 battery + holder
  • Wire + 10K Ohm resistor

 

The Common Tool Set

Quick post to chat about tools: As a collector of them, and as a maker and hacker, I find that I have boxes of very specific tools for very specific applications. I have wood working tools; Mechanics tools for working on cars; Plumbing tools; Car electrical specific tools; Soldering and circuit board electrical; Watch repair; Sewing; etc. It’s nice to have a single box of tools that you can haul out for a very specific need. To say: “Here is everything I need for THIS job.” It’s very satisfying.

This helps tame the garage, workshop, and study. You no longer have a big shelf filled up with everything from a circular saw to AA brass tweezers. You can put the pipe cutter, flux, and fittings away in a box marked “PLUMBING” until needed. You don’t have to dig through a pile of electrical crimpers to get the coaxial ones you need for AV work.

Sometimes though, projects require a common tool set. I went to hang a picture in my office and I had 5 hammers to choose from. I fixed the fan in our bedroom and I had to go into 3 different places to get a set of wire strippers, a long screwdriver, a pair of pliers, and some super glue. I found myself leaving my watch repair box open all the time for access to a good pair of tweezers and a loupe. My electronics box is more like a remote soldering station and I found I would also leave it open on the counter for access to 2 long screwdrivers, a pair of flush cutters, and a pair of wire strippers.

“I leave this open on the counter all the time for 3 tools,” I thought. Then I looked at the watch repair box, also open for access to 2 or 3 tools. 90% of the time I go into the garage it’s to get a pair of pliers or a screw driver. “Yeah, I can fix this.”

Here is my common tool set. This represents the tools I use 90% of the time. Put one together for yourself and stop 15 trips to 3 places to finish a project. I on-purpose didn’t put links, because I don’t want to update them, and I don’t monetize this site. Take that as an honest recommendation.

  • Sharpies (regular / fine)
  • Leatherman Style PS
  • AA Tweezers (and small tools)
  • Wera Kraftform Kompakt (screw driver with bits)
  • CRKT Drifter (folding knife)
  • EXTECH EX330 Multi-meter (with box of extras)
  • 1lb Brass Hammer
  • Wiha precision screwdrivers
  • AA LED Flashlight
  • Klein Tools Scissors
  • Wire strippers
  • Flush cutters
  • KNIPEX Cobra self locking pliers

It’s okay to shower with your dive watch.

ESP 01 + BMP280 Dead bug

There’s a fable I once heard on a forum…Reddit – or was it YouTube? – about not showering with your watch. Obviously we’re talking about a water “resistant” watch – with a “dive rating” of 30 meters or more. It goes something like: “The water pressure from the shower falling a few feet is enough to push past the seals.” Similar, I’ve also heard that while swimming: “The pressure created when you swing your arms under the water can also push a watch past its water resistant rating.” This sounds like it might have some truth to it, but we have to get a better idea of the forces acting on (and inside) your watch. Forty years ago manufacturers could say “water proof” on the dial, but that implies that water (or atmosphere) will never get into the case. Nowadays, watches have synthetic seals, are pressure tested at the factory, and are sporting ever higher depth ratings. Yet, to not mislead customers, can only say “Water Resistant”. BUT REALLY?! A 300m dive watch can’t handle a shower? Is this a myth? What’s really going on inside?

About a month ago I was working with an ESP-01 (ESP8266) board on another project and it was on my work bench next to a watch I was working on. At only 25mm long, I thought: “I wonder if this could fit into a watch case? I wonder if they make a really small pressure sensor?” A google search later and I had a BMP280 breakout from Adafruit on its way to me. This is a super accurate barometric pressure sensor that measures in Pascals. It is literally designed to help GPS calculate altitude. For reference 6,985 Pascal is equal to 1.0 Pound (of force) per Square Inch (psi) OR 1.0 lbs/in².

Can you calculate altitude with a pressure sensor? Yep! Our atmosphere doesn’t have a steady density everywhere on the planet. It changes with the weather, temperature, and how high above the ground you are relative to sea level. If you go up in altitude, there is less pressure. If you know the pressure at sea level, and the temperature, you can accurately tell your elevation. In my testing, the atmosphere at my house registered around 14.4 psi – can you figure out my elevation? Here’s a handy calculator for those wanting to learn even more about atmospheric pressure. Even with an less precise measurement like psi – you can calculate I’m around 570 feet above sea level.

Powering the ESP-01: While possible with some expensive super capacitors, the WiFi module draws too much amperage to start up with a coin cell battery. If I wanted some energy density, I was going to need a tiny LiPo battery. Adafruit to the rescue again with this 150mAh (19.75mm x 26.02mm x 3.8mm) Lithium Ion Polymer Battery.

My first build was hasty. After testing I knew I needed pull up resistors on everything to get I2C working. The 1/2 watt resistors I had were just too big to get the device into a watch case. I prototyped it all on a bread board before ordering some SMD resistors. I “dead bug” soldered 4x 3.3k/ohm resistors and my two 330 ohm 1/4 watt resistors had enough space hanging off one side of the board and sensor. For reference SCK = SCL AND SDI = SDA when looking at the BMP280.

Now that I had all the parts, the battery on top of the sensor, on top of the ESP-01 the height was pushing close to 9mm. I was initially trying to squeeze this into a Seiko SKX007 dive watch case, but even with a domed sapphire I only had around 7.5mm in height available. “We’re going to need a bigger boat  -err submarine.” Not to harp on a cliche’ stereotype, but the first manufacturer of giant dive watches that came to mind was Invicta. Don’t worry, I didn’t gut one, I found a “Grand Diver” at 46mm with no movement on eBay for $25. 🙂 Even with an external thickness of 16mm there’s only about 10mm to work with inside. The back tapers, and the crystals* are about 2mm thick each. (*Bonus diplay caseback! 😀 ) This watch lists a 300m (1000ft) dive rating. Meaning, you could slip past 60m of depth as a recreational diver and fall prey to hypoxia before water would ever push past the seals of this watch, let alone crack the crystal. 😉

Ready to dive Captain!

It was at this point I was glad this sensor package included temperature. ACROBOTIC’s video on getting sensor data from the ESP8266 and his corresponding websockets Arduino code available on GitHub made the software side (my least favorite part) pretty easy. After digging into chart.js I was actually able to add a second line graph to report temp and pressure. Testing js code INSIDE the Arduino IDE is pretty impossible, so I used jsfiddle.net to work out any syntax [programmer errors] before copying it to the IDE and flashing it to the ESP8266.

Let’s get testing!

  • First big surprise: Closing the caseback with the crown in, increased the pressure inside the case as much as 0.3 psi! That caseback and the gasket worked as a diaphragm when threaded closed.
  • Nice surprise: With this setup, I was able to detect when the crown was threaded in. This tiny 3mm cylinder of air, pushed in a few mm, was able to slightly raise the pressure in the watch.
  • How Accurate? In one instance, when pressure and temp were steady, I was able to detect that my Air Conditioning had come on. Pressurizing the air in the room slightly and thus inside the case with the crown out.
  • My tests were all done around 70F degrees ambient temp, and 14.4 psi of atmospheric pressure. The sensor measures in Celsius and Pascals – which were converted into sloppier “North American” measurements. Still accurate but less precise. 😐
  • Why precision doesn’t matter here: It takes a LOT of force to blow out a crystal or squeeze past a seal. 100 Pa won’t make a difference, 1 psi might (6.9 kPa). These are temp and pressure measurements that Americans use every day, so it’s easier to understand the effects. Consider 100m of depth is equal to 142psi and 300m of depth is a whopping 427psi.

Oh yeah, temperature affects pressure.

When I first got this prototype together, I didn’t have the temp sensor reporting. I noticed immediately that, just sitting on the desk, the pressure was rising in the case. First a few hundredths of a psi, and then almost half a psi (0.5) in a few minutes. It was increasing continuously. The only explanation for this must be that the wifi package with cpu and battery was getting hot. The only way to show this, was to report temperature along with pressure. Sure enough, my hypothesis was correct; as the electronics warmed up, the pressure went up.

Shockingly cold!


Plunging the watch with sensor package into a cup of ice water yielded some interesting results. Right off the bat the pressure plummeted, and in 32F (0C) ice water, the pressure reduced to as low as 13psi. As low pressure here is a vacuum; -1.4 psi of pressure was now sucking on those seals from inside the case. Outside temperature changes make a big difference on the pressure recorded inside the watch. Warming the watch up to 100F increased the internal pressure by as much as 3psi!

Recreational Diving

This is a pressure vessel that will safely hold 100psi of air pressure. It will help us to simulate 70m of depth into the ocean. For those interested, here is the depth calculation. 70m is 10m past where recreational divers would go, so this is a decent real world test of watch water resistance.

Pressurized, only a 0.3psi change is recorded inside! Yes, 100psi is attempting to sink into the watch, but the seals; crystals; crown; and watch case are preventing this from happening. The seals and crystals are squeezing in ever so slightly, resulting in the 0.3psi increase in pressure inside the watch. This is exactly how “dry” pressure testers work. Check out this Hodinkee article – Under Pressure: A Look At Rolex Water Resistance Testing

“The dome is sealed shut and air pressure inside the chamber is increased to the desired level, up to 10 bar, which is equivalent to about 100 meters of water pressure. As the air pressure increases, any leaks in the case will allow air to infiltrate the watch itself and deflect the crystal upwards slightly. The probe that is resting on the crystal detects this deflection and transmits a digital readout on the front of the machine, both in micrometers of deflection and a simple “Pass” or “Fail” verdict based on set criteria that differ depending on crystal type.”

Time for a shower…

Close enough to strip paint…

This is my gas powered 2800psi pressure washer way too close to a 300m dive watch. I’m using the white nozzle here to simulate a proper soak. I was only able to change the pressure inside the watch 0.14psi or about half of our 70m dive of 0.3psi. If water was somehow able to seep into the case we would have seen a much higher change in pressure, and the pressure wouldn’t revert back to where it was when we stopped hitting it with the spray. If taking more than 2000psi of shower to the case is like diving 35m, then I’m sure that your 50psi home shower will not hurt your dive watch. 😐

I tried to simulate pressure from taking an actual shower, and pressure from swinging my arm in a tub of shallow water – but nothing registered. I was excited to film some footage at the lake, but besides temperature, I couldn’t detect a pressure change at all. For reference here; 1m (3ft) of water is only 1.42psi, which is a lot less than 2000. 😉

If your seals are bad, your watch isn’t water proof… Don’t blame the shower.

Just as 100psi is kept out of the watch, -1.4psi to 3.0psi is kept inside. If your seals are bad, it will be catastrophic to jump into freezing cold water. The pressure inside the watch will fall with temperature, and actually suck water in.

I would argue that taking a shower with a watch that has bad seals is actually a tiny bit better than jumping into a cold pool. The watch warms up slightly with your hot shower and air is pushed out. Until it isn’t…

If you find yourself in this panic situation (wearing a questionably sealed vintage watch in the shower by accident). Immediately take the watch off and dry it thoroughly. Then place it in another room where it’s cool and dry. As I showed, when the watch cools off from the shower, the pressure inside will reduce and could suck in atmosphere. You don’t want this to happen in the 90% humidity from the bathroom.

But I take cold showers, and I like to ski.

Arguably problematic is opening your watch up (unscrewing your crown) at altitude. If you’re at 10.5psi of atmosphere (9,000ft) and you head back to sea level (assuming temp on your wrist remains the same) you could have a -4psi vacuum inside the case now. Jumping into the cold shower could reduce that even more. Is that the pressure combination that pushes the seals past their limit? This now seems much more plausible than “the water hitting the case did it.”

  • Myth busted. Go back to showering with your dive watch if you want.
  • Make sure your crown is screwed in all the way. Check it before water activities.
  • Probably should avoid setting the time in extreme environments.
  • These are purpose built tool watches. The moment you second guess their ability, they become jewelry. 🙁
  • Have a watch older than 10 years that would be a shame if water got into it? Get the seals replaced and get it pressure tested.

Video: