A quickly put-together post on the relationships between common electrochemical reference electrode potentials and the vacuum potential, with a proposed algorithm for converting between them.

Reference electrode potentials

Equilibrium potentials at \SI{25}{\degreeCelsius} for some commonly used reference electrodes. Reproduced from (Roberge, 2008).
Equilibrium potentials at \(\SI{25}{\degreeCelsius}\) for some commonly used reference electrodes. Reproduced from (Roberge, 2008).
Graphical comparison of some common reference electrode potential scales. Of course, the scales are going the wrong way (we like negative to be up). (Roberge, 2008, p. 67)
Graphical comparison of some common reference electrode potential scales. Of course, the scales are going “the wrong way” (we like negative to be up). (Roberge, 2008, p. 67)
Standard potentials of silver-silver chloride and calomel electrodes at various electrolyte concentrations and temperatures. Reproduced from (Sawyer, Sobkowiak, & Roberts, 1995, p. 192).
Standard potentials of silver-silver chloride and calomel electrodes at various electrolyte concentrations and temperatures. Reproduced from (Sawyer, Sobkowiak, & Roberts, 1995, p. 192).

Standard hydrogen electrode

The SHE contribution to the cell potential is by convention zero at all temperatures. (Inzelt, Lewenstam, & Scholz, 2013, p. 77)

The expression “normal hydrogen electrode” (NHE) is not a synonym for SHE, in fact, the NHE is the historical standard (due to Nernst in 1889) defined as a metal in contact with a solution saturated with hydrogen gas at 1 atm partial pressure and containing \(\SI{1}{\mol\per\cubic\dm}\) sulfuric acid. (Inzelt, Lewenstam, & Scholz, 2013, p. 77) The NHE is thus experimentally realisable.

In contrast, the SHE is an ideal device and cannot be rigorously realised experimentally. For practical realisation the standard potential of the hydrogen electrode is not measured at standard conditions but recalculated to \(\ce{H+}\) at unit activity and \(\SI{10E5}{\pascal}\). These electrodes are often called reversible hydrogen electrodes (RHE).

(Inzelt, Lewenstam, & Scholz, 2013)

Calomel electrode

  • Decimolar (decinormal) calomel electrode, \(c_\ce{KCl}=\SI{0.1}{\mol\per\litre}\), \(E = \SI{0.3337}{\volt}\).
  • Molar (normal) calomel electrode, \(c_\ce{KCl}=\SI{1}{\mol\per\litre}\), \(E = \SI{0.2801}{\volt}\).
  • Saturated calomel electrode (SCE), \(c_\ce{KCl}\approx\SI{4.2}{\mol\per\litre}\), \(E = \SI{0.2412}{\volt}\).

All potential values above at \(\SI{25}{\degreeCelsius}\) and taken from (Bagotsky, 2006, p. 194). Because of solubility changes, SCE has a large temperature coefficient (\(\SI{0.65}{\mV\per\kelvin}\)). The potentials of calomel electrodes can be reproduced to \(\SI{+-0.1}{\mV}\).

Calomel electrodes are unstable much above \(\SI{50}{\degreeCelsius}\) owing to the disproportionation reaction \(\ce{Hg2Cl2 -> Hg(liq) + HgCl2}\). (eDAQ wiki)

(Marcus, 1980) reports \(E^\circ_{\ce{Hg/Hg2Cl2}} = \SI{0.26818+-0.00002}{\volt}\) at \(\SI{298.15}{\kelvin}\) (\(a_{\ce{Cl^-}} = 1\)).

Silver-silver chloride electrode

\(E^0 = \SI{0.2224}{\volt}\) at \(\SI{25}{\degreeCelsius}\) (\(a_{\ce{Cl-}}=1\)). (Bagotsky, 2006, pp. 195 Inzelt2013)

The standard potential of the Ag/AgCl electrode has been reported at temperatures exceeding \(\SI{100}{\degreeCelsius}\).

The absolute potential scale

Conversion of relative reference electrode potentials into electronic energies for aqueous systems. Reproduced from (Trasatti, 1986).
Conversion of relative reference electrode potentials into electronic energies for aqueous systems. Reproduced from (Trasatti, 1986).

(Trasatti, 1986) shows a calculation of the absolute potential of SHE in water and recommends the following conversion:

\begin{equation} E^\circ(\ce{H+}/\ce{H2})^{\ce{H2O}}\text{(abs)} = \SI{4.44+-0.02}{\volt}\quad\mathrm{at}~\SI{298.15}{\kelvin} \end{equation}

It is to be noted that the uncertainty in the knowledge of \(E^\circ(\ce{H+}/\ce{H2})\text{(abs)}\) (\(\SI{+-20}{\mV}\)) by far exceeds the accuracy of most measurements of electrode potentials. Therefore, any convenience in the use of the absolute potential scale is confined to the specific cases when calculations of electronic energy levels are needed.

(Trasatti, 1986)

I did a quick scan of all papers that cite (Trasatti, 1986), and found no more recent recommendation on the relation between SHE and AVS. For now we will stick with Trasatti’s value.

The precise relation between the potential of a free electron in vacuum (absolute vacuum scale) and the conventional standard hydrogen electrode scale for aqueous solutions is still debated. (Inzelt, Lewenstam, & Scholz, 2013)


  • “mercury-containing REs (calomel or mercury–mercuric oxide) are inappropriate for measurements in conjunction with platinum electrodes, since the mercury ions readily poison platinum surfaces.” (Bagotsky, 2006, p. 195)
    If this is a rule, we break it quite often.

Convert any scale to SHE (implemented in R)

I built on code I wrote a few years ago, that could convert to/from both electrochemical and electronic scales, but had no way of handling different electrolyte concentrations of electrochemical reference electrodes. I decided to rewrite a new implementation from scratch, that could handle different electrolyte concentrations as well as temperatures.

So, based on literature data (mostly presented above), I put together the following functions. Presented with commentary below. Available as part of my package of commonly used functions on github.

The core is a function that has most of the literature data hard-coded, and returns this data as a tidy dataframe when requested.

potentials.as.SHE() %>%
   group_by(electrode, electrolyte) %>% 
   arrange(SHE) %>% 
   # return first and last row (if any) within each group
   filter(row_number() %in% c(1, n())) %>% 
   arrange(electrode, SHE)
## # A tibble: 11 x 9
## # Groups:   electrode, electrolyte [8]
##    electrode electrolyte conc.num conc.string    temp     SHE   sid
##        <chr>       <chr>    <dbl>       <chr>   <dbl>   <dbl> <chr>
##  1   AgCl/Ag     KCl(aq)      4.2   saturated   40.00  0.1840     2
##  2   AgCl/Ag     KCl(aq)      3.5 3.5M at 25C   10.00  0.2150     1
##  3   AgCl/Ag    NaCl(aq)      5.9   saturated   25.00  0.2630     9
##  4       AVS                   NA               25.00 -4.4400     7
##  5 Hg2Cl2/Hg     KCl(aq)      4.2   saturated   40.00  0.2340     6
##  6 Hg2Cl2/Hg     KCl(aq)      0.1 0.1M at 25C   25.00  0.3360     3
##  7        Li                  1.0 1.0M at 25C   25.00 -3.0401    10
##  8        Mg                  1.0 1.0M at 25C   25.00 -2.3720    12
##  9        Na                  1.0 1.0M at 25C   25.00 -2.7100    11
## 10       SHE                   NA             -273.15  0.0000     8
## 11       SHE                   NA              580.00  0.0000     8
## # ... with 2 more variables: reference <chr>, dEdT <dbl>

This function is primarily made up of a dataframe that contains all the data (an extract of this dataframe is shown above). This dataframe was constructed with the philosophy of one observation per row in mind (also called tidy data), which makes for some redundancies, but it does make further data analysis easier.

View the latest version on Github (scroll down to the function potentials.as.SHE).

More data can easily be added by adding more rows.

Some of the the columns of this dataframe warrant some explanation.
potentials$electrode is the name of the reference electrode, as defined by the function RefCanonicalName (see below).
potentials$conc.string was added so that the user (me) won’t have to remember the saturation concentration for various salts in solution. And for those unsaturated electrolytes it was a good place to put information on the temperature where the concentration was defined. Saturation does not depend on temperature, but the concentration of an unsaturated solution (expressed as amount/volume) does depend on temperature due to liquid expansion.

Temperature and concentration values need no further explanation.
potentials$setid is mainly for housekeeping - a simple way to keep track of the datasets in the dataframe (allows us to avoid having to resort to advanced matching against several parameters to later identify a particular set).

Note that no conversion happens in the potentials.as.SHE function above. It just returns data. It is one of two support functions, the other is for handling the many names each electrode system has.

View the latest version of the function RefCanonicalName on Github.

So this means the user can enter something like vacuum scale or Ag/AgCl (or a vector of such names) and this function will transparently convert that to a standardised form of the name (if everything works as expected).

And finally, what about the function that actually does the conversion of potentials between the different scales? It takes the following arguments: the potential value (in volt), the scale (for the original scale, that you want to convert from), and optional arguments for concentration and temperature (set to saturated and RT by default). The last argument expects the dataframe generated by potentials.as.SHE.

This way, all three of these functions are reasonably modular, and each one does a fairly well-defined job.

View the latest version of the function as.SHE on Github.

It may look complicated, but this function is really only taking care of three things:

  • concentration may be a number or a character string, which means we need to compare it to the appropriate column in the dataset,
  • the temperature requested by the user may coincide with a datapoint in the dataset (in that case we just return that potential), otherwise we interpolate (by linear regression) based on the existing data,
  • and for the final calculation of potential in SHE scale, we need to handle electronic (vacuum) and electrochemical scales separately because they go in opposite directions (this is handled by the ifelse(df$vacuum[p], ...) call.

The current implementation requires concentration to match an existing value. A functionality that could (perhaps even should) be added is the ability to interpolate concentrations in the same way as temperature (unless the change in potential with changing concentration deviates strongly from linearity).

Plotting the dataset

ggplot(potentials.as.SHE() %>% 
          filter(electrolyte == "KCl(aq)")) +
   facet_wrap(~ electrode, ncol = 2) +
   geom_line(aes(x = temp, y = SHE, colour = conc.string)) +
   geom_point(aes(x = temp, y = SHE, colour =  conc.string)) +
   geom_text_repel(data = subset(potentials.as.SHE(), electrode != "AVS" & temp == 30),
                   aes(y = SHE, x = temp, label = conc.string, colour = conc.string),
                   point.padding = unit(0.25, 'lines'),
                   # hide the line connecting datapoint and label
                   segment.color = "transparent") +
   scale_y_reverse() +
   labs(x = expression("T/"*degree*C), # "T/C",
        y = "E/V vs SHE") +
   theme(legend.position = "none")
plot of chunk 161124-reference-electrodes-KCl
Electrode potentials vs SHE for the two reference electrodes in the dataset using \(\ce{KCl(aq)}\) electrolyte (each panel shows one reference electrode, each line shows a different electrolyte concentration). Just to demonstrate the usability of the dataset.


  1. Roberge, P. R. (2008). Corrosion Engineering Principles and Practice. Corrosion Engineering (p. 770). https://doi.org/10.1036/0071482431

  2. Sawyer, D. T., Sobkowiak, A., & Roberts, J. L. (1995). Electrochemistry for chemists (second). John Wiley & Sons, Inc.

  3. Inzelt, G., Lewenstam, A., & Scholz, F. (Eds.). (2013). Handbook of Reference Electrodes. Berlin, Heidelberg: Springer Berlin Heidelberg. https://doi.org/10.1007/978-3-642-36188-3

  4. Bagotsky, V. S. (2006). Fundamentals of electrochemistry (2nd ed.). Wiley-Interscience.

  5. Marcus, Y. (1980). Compilation and Evaluation of Solubility Data in the Mercury (I) Chloride-Water System. Journal of Physical and Chemical Reference Data, 9(4), 1307. https://doi.org/10.1063/1.555633

  6. Trasatti, S. (1986). The absolute electrode potential: an explanatory note (Recommendations 1986). Pure and Applied Chemistry, 58(7), 955–966. https://doi.org/10.1351/pac198658070955



## R version 3.4.3 (2017-11-30)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 16.04.3 LTS
## Matrix products: default
## BLAS: /usr/lib/libblas/libblas.so.3.6.0
## LAPACK: /usr/lib/lapack/liblapack.so.3.6.0
## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=sv_SE.UTF-8        LC_COLLATE=en_US.UTF-8    
##  [5] LC_MONETARY=sv_SE.UTF-8    LC_MESSAGES=en_US.UTF-8   
##  [7] LC_PAPER=sv_SE.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  base     
## other attached packages:
## [1] bindrcpp_0.2      common_0.0.0.9008 magrittr_1.5      dplyr_0.7.4      
## [5] ggrepel_0.7.0     ggplot2_2.2.1     knitr_1.17       
## loaded via a namespace (and not attached):
##  [1] Rcpp_0.12.13     bindr_0.1        munsell_0.4.3    colorspace_1.3-2
##  [5] R6_2.2.2         rlang_0.1.2      stringr_1.2.0    highr_0.6       
##  [9] plyr_1.8.4       tools_3.4.3      grid_3.4.3       gtable_0.2.0    
## [13] lazyeval_0.2.0   assertthat_0.2.0 tibble_1.3.4     glue_1.1.1      
## [17] evaluate_0.10.1  labeling_0.3     stringi_1.1.5    compiler_3.4.3  
## [21] methods_3.4.3    scales_0.5.0     pkgconfig_2.0.1