Skip to content

Week 09 - Input devices

## Individual Assignment This week, I worked with a 3-pin Load Cell and an HX711 amplifier. Since 3-pin sensors are half-bridges, I had to learn how to complete the circuit and calibrate the output to get real-world weight readings.

  1. Understanding the Components

3-Pin Load Cell: This is a strain gauge that changes resistance when bent. However, it only provides a "half-bridge" signal, which is too weak and incomplete for a microcontroller to read.

HX711 Amplifier: This is a 24-bit ADC (Analog-to-Digital Converter). It magnifies the tiny voltage changes from the load cell so the microcontroller can process them.

  1. Pinout & Wiring The HX711 expects a 4-pin full-bridge. To make the 3-pin sensor work, I created a custom pinout using two 1k resistors to complete the Wheatstone bridge.

Red Wire: Connected to E+ (Excitation +).

Black Wire: Connected to E- (Excitation -).

White Wire: Connected to A+ (Signal +).

Resistor Bridge: I soldered two 1k resistors in series between E+ and E-.

The point where they meet is connected to A-. 3. Calibration Process & Code Before getting the weight in grams, I had to find the Calibration Factor. I wrote a simple code to get the "Raw" value from the sensor while placing a known weight on it. Here is code for calibration

''''''''''''''''''''''''''''''''''''''''''

include #include "HX711.h"

// HX711 circuit wiring const int LOADCELL_DOUT_PIN = 12; const int LOADCELL_SCK_PIN = 13;

HX711 scale;

void setup() { Serial.begin(115200); scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN); }

void loop() {

if (scale.is_ready()) { scale.set_scale();
Serial.println("Tare... remove any weights from the scale."); delay(5000); scale.tare(); Serial.println("Tare done..."); Serial.print("Place a known weight on the scale..."); delay(5000); long reading = scale.get_units(10); Serial.print("Result: "); Serial.println(reading); } else { Serial.println("HX711 not found."); } delay(1000); }

''''''''''''''''''''''''''''''

  1. Calculating the Calibration Factor To convert the raw data into grams, I used this formula:

calibration factor = (reading)/(known weight)

For example, if the serial monitor showed 1700 for a 170g weight, my factor would be 1700 / 170 = 100.

  1. Final Implementation Code Once I had the factor, I updated the code to show the actual weight

''''''''''''''''''''''''''

include #include "HX711.h"

// HX711 circuit wiring const int LOADCELL_DOUT_PIN = 12; const int LOADCELL_SCK_PIN = 13;

HX711 scale;

void setup() { Serial.begin(115200); Serial.println("HX711 Demo"); Serial.println("Initializing the scale");

scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);

Serial.println("Before setting up the scale:"); Serial.print("read: \t\t"); Serial.println(scale.read()); // print a raw reading from the ADC

Serial.print("read average: \t\t"); Serial.println(scale.read_average(20)); // print the average of 20 readings from the ADC

Serial.print("get value: \t\t"); Serial.println(scale.get_value(5)); // print the average of 5 readings from the ADC minus the tare weight (not set yet)

Serial.print("get units: \t\t"); Serial.println(scale.get_units(5), 1); // print the average of 5 readings from the ADC minus tare weight (not set) divided // by the SCALE parameter (not set yet)

scale.set_scale(-478.507); //scale.set_scale(-471.497); // this value is obtained by calibrating the scale with known weights; see the README for details scale.tare(); // reset the scale to 0

Serial.println("After setting up the scale:");

Serial.print("read: \t\t"); Serial.println(scale.read()); // print a raw reading from the ADC

Serial.print("read average: \t\t"); Serial.println(scale.read_average(20)); // print the average of 20 readings from the ADC

Serial.print("get value: \t\t"); Serial.println(scale.get_value(5)); // print the average of 5 readings from the ADC minus the tare weight, set with tare()

Serial.print("get units: \t\t"); Serial.println(scale.get_units(5), 1); // print the average of 5 readings from the ADC minus tare weight, divided // by the SCALE parameter set with set_scale

Serial.println("Readings:"); }

void loop() { Serial.print("one reading:\t"); Serial.print(scale.get_units(), 1); Serial.print("\t| average:\t"); Serial.println(scale.get_units(10), 5);

scale.power_down(); // put the ADC in sleep mode delay(5000); scale.power_up(); }

'''''''''''''''''''''

  1. Conclusion By using a resistor-based Wheatstone bridge and a custom calibration factor, I successfully converted a simple 3-pin analog sensor into a high-precision digital scale. The system is now responsive and provides stable, real-time weight data.