Hx711, Atmega328, i2c problems? All values ZERO

Hi all,

So I'm using a SparkFun 7-Segment Serial Display but with custom firmware, not using it as a peripheral display. I want to display mass from the hx711 on the built-in display using the SevSeg library. This part works fine, I have not added the code here yet.

My problem with the sparkfun chip (Atmega328) is, I only receive a Zero value from the hx711 for all values. I know of ground issues with the hx711 chip, I've soldered ground to E- anyway, and get the right voltages from the load cell.

I don't have any issues with load cells and hx711 chips, I've got two of each which works fine if I run my code on an Atmega2560. No change in any wiring either, just a change of i2c pins and external battery for hx711 (5volt) grounded with board which is connected via ftdi (3.3volt).

I've used the code below for the Atmega2560, which works fine.

/**
 *
 * HX711 library for Arduino - example file
 * https://github.com/bogde/HX711
 *
 * MIT License
 * (c) 2018 Bogdan Necula
 *
**/
#include "HX711.h"


// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 20;
const int LOADCELL_SCK_PIN = 21;


HX711 scale;

void setup() {
  Serial.begin(9600);
  Serial.println("HX711 Demo");

  Serial.println("Initializing the scale");

  // Initialize library with data output pin, clock input pin and gain factor.
  // Channel selection is made by passing the appropriate gain:
  // - With a gain factor of 64 or 128, channel A is selected
  // - With a gain factor of 32, channel B is selected
  // By omitting the gain factor parameter, the library
  // default "128" (Channel A) is used here.
  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(2280.f);    // 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), 1);

  	
  delay(500);
  
}

COMS:

AND NOW... If I use the exact code with the Sparkfun serial segment display, change the pins to work and select the board and com port:

// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 27;
const int LOADCELL_SCK_PIN = 28;

This happens:


All Zeros!

I've seen this problem with the hx711 and Arduino Uno (Atmega328) before:

Could there be an issue with the code and atmega328?

It is very weird to use the I2C pins of the Arduino Mega 2560 for the HX711. Any other pins would be okay, but why the I2C pins ?

Now you have selected pin 27 and 28 for a ATmega328P ?
The Arduino Uno has pin 0...13, so where do pin number 27 and 28 come from ?

All the examples use normal pins: https://github.com/bogde/HX711/tree/master/examples

This is the pinmapping for the DIP package, but you can still use it: https://docs.arduino.cc/hacking/hardware/PinMapping168.
Look at the pin numbers in red, there are no pin 27 and 28.

If you want to use the I2C bus, then they are at A4 and A5. But please don't use those for the HX711. Use normal digital pins if possible.
If you are never going to use SDA and SCL for the I2C bus, then you can use them (but I'm not happy with it).

Option 1

const int LOADCELL_DOUT_PIN = SDA;
const int LOADCELL_SCK_PIN = SCL;

Option 2

const int LOADCELL_DOUT_PIN = A4;
const int LOADCELL_SCK_PIN = A5;

I never ever thought it would have made a difference to change those pins! I thought the pins stay the same no matter which designation you use, thanks for clearing that up, now I'll post to the other thread :sweat_smile:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.