m5stack / M5Stack

M5Stack Arduino Library
MIT License
1.19k stars 425 forks source link

Problem with scale kit HX711 by M5Stack #287

Closed filipedias1994 closed 2 years ago

filipedias1994 commented 2 years ago

Hi!

I purchased this scale kit:

image

I don't have any M5 display, so I'm connecting the DAT, CLK, 5V and GND pins directly to the ESP32 and printing the cell value to the Arduino IDE's Serial Monitor.

It turns out that if I connect the 4 load cells, the result of get_units() is always "nan", and if I leave only one of the cells connected, it returns a "considerable" value, but I can't calibrate it. The values ​​are very unrealistic. I don't know what could be wrong, can this kit work with just one of the cells? Could someone with more experience tell me why it shows "nan" when I connect the 4 cells?

The code I'm using is the basic library example, with calibration modifications:

#include "HX711.h"

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

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, 128);

   calibrate();

  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);

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

void calibrate(){
  scale.set_scale();
  scale.tare();

  Serial.println("Add know weight");
  int userInput = -123;
  String inputString = "";
  while(userInput == -123){
    while(Serial.available() > 0){
      int inputChar = Serial.read();
      if(isDigit(inputChar)){
        inputString += (char)inputChar;
      }
      if(inputChar == '\n'){
        userInput = inputString.toInt();
      }
    }
  }

  float calReading= scale.get_units(10);
  Serial.println("Cal Reading");
  Serial.println(calReading);
  Serial.print("Calibration: ");
  Serial.println(calReading/userInput);
  scale.set_scale(calReading/userInput);

}

I thank you in advance for the help.

Tinyu-Zhao commented 2 years ago

Are you connected to the correct IO pins, I just tested the sample program is no problem