HX711 Library compilation error

Hi, I tam trying to run the sample code from the hx711 library from GitHub (error and code below) and I receive the following error. Please help.


Arduino: 1.6.7 (Windows 10), Board: "Intel® Edison"

< >

C:\Users\Dummy36\Documents\Arduino\libraries\HX711-master\HX711.cpp:48:45: error: 'shiftIn' was not declared in this scope

data[2] = shiftIn(DOUT, PD_SCK, MSBFIRST);

^

Using library HX711-master in folder: C:\Users\Nikhil\Documents\Arduino\libraries\HX711-master (legacy)
exit status 1
Error compiling.

Sample Code as below

#include "HX711.h"

//HX711.DOUT - pin #A1
//HX711.PD_SCK - pin #A0

HX711 scale(A1, A0); // parameter "gain" is ommited; the default value 128 is used by the library

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

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

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

Hi,
Welcome to the forum.

Please read the first post in any forum entitled how to use this forum.
http://forum.arduino.cc/index.php/topic,148850.0.html
then look down to item #7 about how to post your code.
It will be formatted in a scrolling window that makes it easier to read.

Tom........ :slight_smile:

I tried... same error for shiftin().. I don't know if it is supported..

Try this code

/* Testprogram for personvekt med HX711 - ADC-konverter for veiesensor
 *  https://cdn.sparkfun.com/datasheets/Sensors/ForceFlex/hx711_english.pdf
 *  Seriell interface med spesielle funksjoner (ikke standard SPI)
 *
 *  Dette programeksempelet viser to ulike måter å lese dataene fra ADC'en
 *  k.n.  2016
*/

// definerer datapinne (dat) og power-down/klokkepinne (pd_clk)
#define  dat	  A0  // bruker pinne A0 og A1. Kan være uansett I/O-pinne !
#define  pd_clk	A1  // Du kan endre disse til å passe DITT oppsett.

long verdi, adjust = 400000; // verdien fra sensoren med null belastning på vekta
/* 'adjust'-verdien kan ordnes 'automatisk' ved power on..!!
 *  Det kan gjøres ved  å kalle funksjonen "setTara" 
 *  ..og bruke denne verdien som justerings-tall
 *
 */
// ved test med kjent vekt og avlest verdi for denne kan vi finne:
unsigned int scale_kg = 21740; // skaleringsfaktor for kg. Må kalibreres med kjent vekt
float vekt;  // lagrer den endelige vekta

void setup()
{
  Serial.begin(9600);
  // sett opp kommunikasjonslinjer
  pinMode(dat, INPUT);
  pinMode(pd_clk, OUTPUT);
  setTara(); 
}
/*******************************************************/
long readScale(int antall=10) // leser råverdier fra HX711, 
     // vedien 10 er defalult (som vil gjelde hvis vi kaller denne UTEN parameter.
/*******************************************************/
{
  long totalt=0, verdi;
   for (byte j = 0; j < antall; j++)
  {
    verdi = 0;
    while (digitalRead(dat) == HIGH) {} ; // kun vent.. se datablad for data-linjen
    for (byte i = 0; i < 24; i++) // les inn 24 bit til 'verdi'
    {
      digitalWrite(pd_clk, HIGH); // send puls på klokkepinnen
      digitalWrite(pd_clk, LOW);
      // før vi leser inn et bit, må de 'gamle' bit'ene forskyves én plass til venstre
      verdi = verdi << 1;
      verdi += digitalRead(dat); // legg til 0 eller 1
      // send den 25. pulsen.. sjekk databladet for HX711
    }
    totalt += verdi;
    digitalWrite(pd_clk, HIGH);
    digitalWrite(pd_clk, LOW);
  }
  return totalt/antall ;
}
/*******************************************************/
void setTara() // leser råverdi fra HX711, returnerer gjennomsnittet.
/*******************************************************/
{
  adjust = readScale(50); // setter justeringsfaktor slik at vekta nullstilles
  //gjør mange avlesinger - HER: ta snittet av 50 avlesinger
}

void loop()
{
  /*
    Alternativ metode for å hente vektdata er å bruke "shiftIn" .. tre ganger
    som dette:
    a2=shiftIn(dat,pd_clk,MSBFIRST);
    a1=shiftIn(dat,pd_clk,MSBFIRST);
    a0=shiftIn(dat,pd_clk,MSBFIRST);
    // send den 25. klokkepulsen. Brukes til å bestemme gain=128
    digitalWrite(pd_clk,HIGH);
    digitalWrite(pd_clk,LOW);
    // sett sammen de tre bytene til en long (kan også løses med en "union")
    verdi = long(a2)*65536 + long(a1)*256 + a0; // 
  */
  Serial.print ("Vekt -->  ");
  verdi = readScale(); // hent verdien fra HX711 (ADC'en) (KAN endre antall med parameter) 
  //Serial.print(verdi, BIN); Serial.print("  "); // til debugging. Fjern denne setninga
  verdi -= adjust; // tara-justering / balansering
  vekt = (float(verdi)/scale_kg); // skalér til ønsket vektenhet, tving flyttallsdivisjon!
  Serial.println(vekt, 2); // skriv med tre desimaler. bør endres ??
  Serial.println("kg"); // skriv med tre desimaler. bør endres ??
  delay(500);
}

I don't know if it is supported..

Try compiling for a different board. If the error goes away, then the shiftIn() function is not supported for the Edison.

Add the following in your hx711.cpp just below #include

uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder) {
uint8_t value = 0;
uint8_t i;

for (i = 0; i < 8; ++i) {
digitalWrite(clockPin, HIGH);
if (bitOrder == LSBFIRST)
value |= digitalRead(dataPin) << i;
else
value |= digitalRead(dataPin) << (7 - i);
digitalWrite(clockPin, LOW);
}
return value;
}