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.


- 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.
- 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);
}
''''''''''''''''''''''''''''''
- 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.
- 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(); }
'''''''''''''''''''''
- 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.
