Sensors: HX711

From HiveTool
Revision as of 16:43, 20 May 2015 by Paul (talk | contribs) (Created page with " </nowiki> /* gurov was here, use this code, or don't, whatever, I don't care. If you see a giant bug with a billion legs, please let me know so it can be squashed gcc -o...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search



</nowiki> /*

gurov was here, use this code, or don't, whatever, I don't care. If you see a giant bug with a billion legs, please let me know so it can be squashed

gcc -o hx711wp hx711wp.c -lwiringPi

  • /
  1. include <stdint.h>
  2. include <sys/types.h>


  1. include <stdio.h>
  2. include <sched.h>
  3. include <string.h>
  4. include <stdlib.h>
  5. include <wiringPi.h>
  6. include "locking.h"


  1. define CLOCK_PIN 5
  2. define DATA_PIN 4
  3. define N_SAMPLES 64
  4. define SPREAD 10
  1. define SCK_ON (GPIO_SET0 = (1 << CLOCK_PIN))
  2. define SCK_OFF (GPIO_CLR0 = (1 << CLOCK_PIN))
  3. define DT_R (GPIO_IN0 & (1 << DATA_PIN))

void reset_converter(void); unsigned long read_cnt(long offset, int argc); void set_gain(int r); void setHighPri (void); int data_pin = DATA_PIN; int clock_pin = CLOCK_PIN;


void setHighPri (void) {

 struct sched_param sched ;
 memset (&sched, 0, sizeof(sched)) ;
 sched.sched_priority = 10 ;
 if (sched_setscheduler (0, SCHED_FIFO, &sched))
   printf ("Warning: Unable to set high priority\n") ;

}

static uint8_t sizecvt(const int read) {

   /* digitalRead() and friends from wiringpi are defined as returning a value
      < 256. However, they are returned as int() types. This is a safety function */
   if (read > 255 || read < 0)
   {
       printf("Invalid data from wiringPi library\n");
       exit(EXIT_FAILURE);
   }
   return (uint8_t)read;

}


void power_down_hx711() {

   digitalWrite(clock_pin, HIGH);

}

void setup_gpio() {

   pinMode(clock_pin, OUTPUT);
   pinMode(data_pin, INPUT);
   digitalWrite(clock_pin, LOW);

}


int main(int argc, char **argv) {

   int lockfd;
   int iPin = 0;
   int iErr = 0;
   char cMode = 'V';
   int iReturnCode = 0;


 int i, j;
 long tmp=0;
 long tmp_avg=0;
 long tmp_avg2;
 long offset=0;
 float filter_low, filter_high;
 float spread_percent = SPREAD / 100.0 /2.0;
 int b;
 int nsamples=N_SAMPLES;
 long samples[nsamples];
 if (argc == 2) {
  offset = atol(argv[1]);
 }
 if (argc == 4){
  clock_pin = atol(argv[1]);
  data_pin = atol(argv[2]);
  offset = atol(argv[3]);
 }

// lockfd = open_lockfile(LOCKFILE);

       iErr = wiringPiSetup ();
   if (iErr == -1)
       {
               if (cMode == 'V')
                       printf ("ERROR : Failed to init WiringPi %d\n", iErr);
       iReturnCode = -1;
       }
 setHighPri();
 setup_gpio();

// reset_converter();

 j=0;
 // get the dirty samples and average them
 for(i=0;i<nsamples;i++) {
// 	reset_converter();
//       reset_converter();
 	samples[i] = read_cnt(0, argc);
 	tmp_avg += samples[i];
 }
 tmp_avg = tmp_avg / nsamples;
 tmp_avg2 = 0;
 j=0;
 filter_low =  (float) tmp_avg * (1.0 - spread_percent);
 filter_high = (float) tmp_avg * (1.0 + spread_percent);

// printf("%d %d\n", (int) filter_low, (int) filter_high);

 for(i=0;i<nsamples;i++) {

if ((samples[i] < filter_high && samples[i] > filter_low) ||

           (samples[i] > filter_high && samples[i] < filter_low) ) {

tmp_avg2 += samples[i]; j++; }

 }
 if (j == 0) {
   printf("No data to consider\n");
   exit(255);
 }
 printf("%d\n", (tmp_avg2 / j) - offset);

// printf("average within %f percent: %d from %d samples, original: %d\n", spread_percent*100, (tmp_avg2 / j) - offset, j, tmp_avg - offset); // unpull_pins(); // restore_io(); // power_down_hx711(); }


void reset_converter(void) {

         digitalWrite(clock_pin, HIGH);
         delayMicroseconds(40);
         digitalWrite(clock_pin, LOW);
         delayMicroseconds(60);

}

void set_gain(int r) { int i;

// r = 0 - 128 gain ch a // r = 1 - 32 gain ch b // r = 2 - 63 gain ch a

       while( sizecvt(digitalRead(data_pin)) );

for (i=0;i<24+r;i++) {

         digitalWrite(clock_pin, HIGH);
         delayMicroseconds(1);
         digitalWrite(clock_pin, LOW);
         delayMicroseconds(1);

} }


unsigned long read_cnt(long offset, int argc) { long count; int i;


 count = 0;


 while( sizecvt(digitalRead(data_pin)) );
       digitalWrite(clock_pin, LOW);
       delayMicroseconds(.2);
 for(i=0;i<24	; i++) {
       digitalWrite(clock_pin, HIGH);
       delayMicroseconds(.2);
       count = count << 1;
       if ( sizecvt(digitalRead(data_pin)) > 0 )  { count++; }
       digitalWrite(clock_pin, LOW);
       delayMicroseconds(.2);
       }
       digitalWrite(clock_pin, HIGH);
       delayMicroseconds(.2);
       digitalWrite(clock_pin, LOW);
       delayMicroseconds(.2);

// count = ~0x1800000 & count; // count = ~0x800000 & count;


if (count & 0x800000) {

count |= (long) ~0xffffff;

}

// if things are broken this will show actual data


if (argc < 2 ) {

for (i=32;i;i--) {
  printf("%d ", ((count-offset) & ( 1 << i )) > 0 );
 }
 printf("n: %10d     -  ", count - offset);
 printf("\n"); 

}

 return (count - offset);

}


</nowiki>