Community
cancel
Showing results for 
Search instead for 
Did you mean: 
HScho2
Beginner
975 Views

Edison For Arduino w HX711 : wiring_digital-error: digitalRead

Jump to solution

so I have a script that runs perectly on the Arduino UNO. When I went to run it on Edison Arduino, It compiled fine but at run time it throws

wiring_digital-error: digitalRead: pin 3 out of range

Arduino Code is Here

# include

# include "HX711.h"

# define calibration_factor 4492.0

# define DOUT 3

# define CLK 2

int WEIGHTCOUNT = 1 ;

float TENWEIGHT[10];

float TENWEIGHTAVERAGE = 0.00;

float TENWEIGHTTOTAL = 0.0;

float LASTWEIGHT = 2;

HX711 scale(DOUT, CLK);

void setup() {

scale.set_scale(calibration_factor); //This value is obtained by using the SparkFun_HX711_Calibration sketch

scale.tare(); //Assuming there is no weight on the scale at start up, reset the scale to 0

Serial.println("Weight Readings:");

}

void loop() {

float b = scale.get_units() + 1;

if (b < 2 && b != 1) scale.tare();

int c = b/LASTWEIGHT;

if (b < 2 && c < .1) {

Serial.println("Scale Is Not Loaded");

delay(2000);

}

else

{

Serial.print("CALCULATING WEIGHT");

int var = 0;

while(var < 10){

TENWEIGHT[var] = scale.get_units();

delay(100) ;

var++;

}

for(int i = 0 ; i < 10 ; i++){

TENWEIGHTTOTAL = TENWEIGHTTOTAL+TENWEIGHT[i] ;

}

TENWEIGHTAVERAGE = TENWEIGHTTOTAL / 10 ;

// Serial.print("The Average Weight Is: ");

// Serial.print(scale.get_units(), 1); //scale.get_units() returns a float

float check = TENWEIGHTAVERAGE + 2 - LASTWEIGHT;

Serial.println(TENWEIGHTAVERAGE);

if (abs(check) < .5) {

Serial.print(TENWEIGHTAVERAGE);

Serial.print(" lbs"); //You can change this to kg but you'll need to refactor the calibration_factor

Serial.println();

Serial.println("PLEASE STEP OFF SCALE");

delay(30000);

}

LASTWEIGHT = TENWEIGHTAVERAGE + 2;

TENWEIGHTTOTAL = 0;

delay(1000);

}

}

AS there is no DigitalRead Called for in this , here is the hx711.h file

# ifndef HX711_h

# define HX711_h

//# if ARDUINO >= 100

# include "Arduino.h"

//# else

//# include "WProgram.h"

//# endif

class HX711

{

private:

byte PD_SCK; // Power Down and Serial Clock Input Pin

byte DOUT; // Serial Data Output Pin

byte GAIN; // amplification factor

long OFFSET; // used for tare weight

float SCALE; // used to return weight in grams, kg, ounces, whatever

public:

// define clock and data pin, channel, and gain factor

// channel selection is made by passing the appropriate gain: 128 or 64 for channel A, 32 for channel B

// gain: 128 or 64 for channel A; channel B works with 32 gain factor only

HX711(byte dout, byte pd_sck, byte gain = 128);

virtual ~HX711();

// check if HX711 is ready

// from the datasheet: When output data is not ready for retrieval, digital output pin DOUT is high. Serial clock

// input PD_SCK should be low. When DOUT goes to low, it indicates data is ready for retrieval.

bool is_ready();

// set the gain factor; takes effect only after a call to read()

// channel A can be set for a 128 or 64 gain; channel B has a fixed 32 gain

// depending on the parameter, the channel is also set to either A or B

void set_gain(byte gain = 128);

// waits for the chip to be ready and returns a reading

long read();

// returns an average reading; times = how many times to read

long read_average(byte times = 10);

// returns (read_average() - OFFSET), that is the current value without the tare weight; times = how many readings to do

double get_value(byte times = 1);

// returns get_value() divided by SCALE, that is the raw value divided by a value obtained via calibration

// times = how many readings to do

float get_units(byte times = 1);

// set the OFFSET value for tare weight; times = how many times to read the tare value

void tare(byte times = 10);

// set the SCALE value; this value is used to convert the raw data to "human readable" data (measure units)

void set_scale(float scale = 1.f);

// get the current SCALE

float get_scale();

// set OFFSET, the value that's subtracted from the actual reading (tare weight)

void set_offset(long offset = 0);

// get the current OFFSET

long get_offset();

// puts the chip into power down mode

void power_down();

// wakes up the chip after power down mode

void power_up();

};

# endif /* HX711_h */

and here is the .cpp file

# include

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

}

HX711::H...

0 Kudos
1 Solution
idata
Community Manager
113 Views

Hello TheCircleH,

 

 

The issue is not with the code itself but instead with the library hx711.h as it includes Arduino.h which is AVR dependent. Therefore this library is not compatible with Edison's x86 architecture.

 

 

If you would like to use the HX711 you will have to write your own library basing it on this one in order to make it compatible with Edison's architecture.

 

 

-Peter.

View solution in original post

1 Reply
idata
Community Manager
114 Views

Hello TheCircleH,

 

 

The issue is not with the code itself but instead with the library hx711.h as it includes Arduino.h which is AVR dependent. Therefore this library is not compatible with Edison's x86 architecture.

 

 

If you would like to use the HX711 you will have to write your own library basing it on this one in order to make it compatible with Edison's architecture.

 

 

-Peter.

View solution in original post

Reply