Interfacing HX710 Differential ADC with Arduino
This page demonstrates how to read differential voltage from a HX710 ADC using Arduino. I recently obtained some pressure sensor boards from Amazon for less than $3 each under names like 6pcs 3.3-5V Digital Barometric Air Pressure Sensor Module Liquid Water Level Controller Board 0-40KPa that use this ADC. Several years ago I worked on a precision pressure meter project based on an I2C temperature and pressure sensor (MS5611), and now that I see new inexpensive SPI pressure sensor modules on the consumer market I’m interested to learn more about their capabilities.

Analog-to-Digital Converter IC
The ADC chip is easily identified as a HX710B 24-Bit Analog-to-Digital Converter (ADC) with Built-in Temperature Sensor. According to the datasheet it can be powered by a 3.3V or 5V supply, and the value it reports is the differential voltage between two input pins.

The datasheet indicates this device can be run from a 3.3V or 5V supply, it uses a built-in fixed-gain (128x) differential amplifier, and it can read up to 40 samples per second. The datasheet provides an example circuit demonstrating how this ADC can be used to measure weight from a scale sensor:

Pressure Sensor
To get a better idea of how this sensor works it would be helpful to locate its product number. I had a hunch it was beneath the part so I desoldered it, and indeed I found part identification information.

The pressure sensor is labeled as a PSG010S but unfortunately I struggled to find a quality datasheet for it. I did find some now-deleted images from an AliExpress listing showing the differences between the base model and the R and S variants. I found this PSG010R datasheet (curiously written in Comic Sans) indicating that maximum voltage is 5V and that the gauge pressure is 0 - 40KPa (0 - 5.8 PSI). This seems to be a fairly standard differential pressure sensor design using a pair of voltage dividers where the pressure is a function of the difference in voltage at the two mid-points (a Wheatstone bridge).

I used a multimeter to determine the resistor network inside this pressure sensor. Interestingly I found that pin 4 was not connected, which is opposite of many other designs I find online (where pin 5 is not connected). It is critically important to get this right if your goal is to design a PCB around this component. I guess connecting pins 1 & 6 and also 3 & 4 could be an option for covering all your bases? I also question if people are getting confused and reporting the mirror image pinout because they mistake the vent hole for the registration marker. Either way, I made the following diagram which I found helpful:

Update (2022-12-23): I received an email from somebody offering additional information about this component:
The PSG010 reports positive and negative pressures and can easily have its range shifted to almost double in one direction with almost none in the other. All that is needed is to lift the VCC or GND pin and insert a surface mount 75R ±15R under it. Lifting the ground side by 75R makes it double positive, while pushing the applied +V down makes it double negative (vacuum).
– bruceg
Read HX710B with Arduino
This code demonstrates how to measure HX710B values using Arduino and display the readings in the serial terminal sufficient to graph in real time using the serial plotter. The animated plot is what it looks like when I blow puffs of air on the sensor.

void setup() {
pinMode(2, INPUT); // Connect HX710 OUT to Arduino pin 2
pinMode(3, OUTPUT); // Connect HX710 SCK to Arduino pin 3
Serial.begin(9600);
}
void loop() {
// wait for the current reading to finish
while (digitalRead(2)) {}
// read 24 bits
long result = 0;
for (int i = 0; i < 24; i++) {
digitalWrite(3, HIGH);
digitalWrite(3, LOW);
result = result << 1;
if (digitalRead(2)) {
result++;
}
}
// get the 2s compliment
result = result ^ 0x800000;
// pulse the clock line 3 times to start the next pressure reading
for (char i = 0; i < 3; i++) {
digitalWrite(3, HIGH);
digitalWrite(3, LOW);
}
// display pressure
Serial.println(result);
}
Open-Source HX710B Libraries
Although some libraries are available which facilitate interacting with the HX710, here I engage with it discretely to convey each step of the conversion and measurement process. I found that many libraries use the 10 Hz mode by default, whereas I certainly prefer the 40 Hz mode. More frustratingly, code in many libraries refer to this as gain, which is incorrect. The datasheet indicates gain is fixed at 128 and cannot be changed in software.
Update (2022-12-23): I received an email explaining why people often use “gain” and “mode” when referring to the HX710:
The HX711 is similar to the HX710 but it has user selectable gain AND user selectable sample rates BUT only certain combinations are allowed, so setting mode WILL also select its matched gain value. The HX710 uses most of the same internals, but with just 3 modes - reading the Wheatstone Bridge always using 128 gain at 10 or 40Hz while swapping to Avolt (HX710A) or internal Temperature (HX710B) uses a lower gain and less digits. So for people familiar with the HX711 there is no ambiguity in mixing mode and gain.
– bruceg
Resources
-
Measuring Blood Pressure with HX711 - A blog post by Milos (milosrasic98)
-
Pressure Sensor Guide by T.K. HAREENDRAN - A similar write-up that goes into additional detail. They didn’t de-solder the pressure sensor to identify the component name, but there’s lots of good information on this page.
-
bogde/HX711 on GitHub - An Arduino library to interface the Avia Semiconductor HX711 24-Bit Analog-to-Digital Converter (ADC) for reading load cells / weight scales. Code on this page does not use this library, but others may find it helpful.
-
Differential pressure sensors - Article about the topic which includes a good example of an instrumentation amplifier.
-
Design tips for a resistive-bridge pressure sensor in industrial process-control systems - Texas Instruments application note
-
The Wheatstone Bridge by Michael Daily