Code für ADS1232 oder ADS1234

Hat eigentlich jemand code-Schnipsel für die ‘Größeren’ (-2 und -4) ? Das einzige, was ich im Moment finde, sind leider nur stubs - beide repos sind praktisch leer:

Dieser hier ist für einen MSP430 und daher auch nicht direkt verwendbar:

Für den ADS1232 und ADS1234 sollte das easy peasy sein, da häng einfach ein Mux davor, der im IC integriert ist und einen bzw. zwei pins von TI spendiert bekommen hat.

Wenn ich als Basis mal unseren node-gprs-http.ino nehme und mir die Wägezellen-Zeilen rauspicke muss man noch etwas blinki-blinki-Code dazuschreiben um die Mux-Pins zu schalten - Details zu den Mux-Pins gibts auf S.7 des Datenblatts zum ADS1232/4:

Die beiden Mux pins sind mit A1 und A0 gekennzeichnet, pysikalisch ist es pin 8 auf dem ADS1232 und die beiden pins 7 und 8 auf dem ADS1234

Die channels werden dann so angesprochen

Mux Select Input pins:
A1  A0  Channel
---------------
 0   0   AIN1
 0   1   AIN2
 1   0   AIN3
 1   1   AIN4

Das hier ist jetzt recht ausführlich, kann in der main loop noch schöner geschachtelt werden, ist nicht getestet! aber so als Idee:

/*
  Open Hive | ADS1234 (untested!!)
  --------------------------------
  sensors:  | Scale

  pins hard coded
  ---------------
  D14 D15 D16  Data, SCL, Power - ADS1231
  D17          (optional) Power load cell and ADS1231
  D2 D3        Mux pins A0, A1
*/

// -------------------------+------
// variables you can modify | START
// -------------------------+------

// ** load cell characteristic
// ---------------------------

// define here individual values for the used load cell
// this is not type specific! even load cells of the same type /
// model have individual characteristics
//
// - ZeroOffset is the raw sensor value for "0 kg"
//   write down the sensor value of the scale with no load and
//   adjust it here
// - KgDivider is the raw sensor value for a 1 kg weight load
//   add a load with known weight in kg to the scale, note the
//   sesor value, calculate the value for a 1 kg load and adjust
//   it here
const long loadCellZeroOffset = 38623;
// const long loadCellKgDivider  = 22053;
// 1/2 value for single side measurement, so that 1 kg is displayed as 2 kg
const long loadCellKgDivider  = 11026;

// -------------------------+----
// variables you can modify | END
// -------------------------+----

const int loadCellMuxA0 = 2;
const int loadCellMuxA1 = 3;

// libraries

// load cell
#include <ADS1231.h>
ADS1231 loadCell;  // create ADS1231 object

// weight
char weightChar[9];  // should handle +-xxx.xxx and null terminator


void setup () {
  // debug 
  Serial.begin(9600);
 
  // weight / ADS1231
  // pin definition: SCL 15, Data 14, Power 16
  loadCell.attach(15,14,16);
  // power pin load cell and ADS1231: pin 17
  pinMode(17, OUTPUT);
  
  // set mux pins as output
  pinMode(loadCellMuxA0, OUTPUT);
  pinMode(loadCellMuxA1, OUTPUT);
}


// functions for devices
// ---------------------

// weight
#ifdef isScale
  void getWeight() {
    // power ADS1231 and load cell
    digitalWrite(17, HIGH);
    loadCell.power(HIGH);

    delay(2);  // wait for stabilization

    // ADS1231 ready?
    while (!loadCell.check()) {
      loadCell.check();
    }

    // read raw data input of ADS1231
    long weightSensorValue = loadCell.readData();

    // switch off ADS1231 and load cell
    loadCell.power(LOW);
    digitalWrite(17, LOW);

    // calculate weight in kg
    float weightKg = ((float)weightSensorValue - (float)loadCellZeroOffset) / (float)loadCellKgDivider;

    // Write to char array
    dtostrf(weightKg, 8, 3, weightChar);
  }


// Main program
// ------------

void loop () {
  // for ADS1232/4 with 2 load cells 
  // set load cell AIN1
  digitalWrite(loadCellMuxA0, 0); 
  digitalWrite(loadCellMuxA1, 0); 

  // perhaps we need here some delay to wait for stabilization 
  delay(50);  // value has to be tested 
  
  // get weight 
  getWeight();

  // output weight
  Serial.print("weight load cell 1 (AIN1): ");
  Serial.print(weightChar);
  Serial.println(); 

  
  // set load cell AIN2
  digitalWrite(loadCellMuxA0, 0); 
  digitalWrite(loadCellMuxA1, 1); 

  // perhaps we need here some delay to wait for stabilization 
  delay(50);  // value has to be tested 
  
  // get weight 
  getWeight();

  // output weight
  Serial.print("weight load cell 2 (AIN2): ");
  Serial.print(weightChar);
  Serial.println(); 


  
  // additional for ADS1234 with 4 load cells 
  // set load cell AIN3
  digitalWrite(loadCellMuxA0, 1); 
  digitalWrite(loadCellMuxA1, 0); 

  // perhaps we need here some delay to wait for stabilization 
  delay(50);  // value has to be tested 
  
  // get weight 
  getWeight();

  // output weight
  Serial.print("weight load cell 3 (AIN3): ");
  Serial.print(weightChar);
  Serial.println(); 

  
  // set load cell AIN4
  digitalWrite(loadCellMuxA0, 1); 
  digitalWrite(loadCellMuxA1, 1); 
  
  // perhaps we need here some delay to wait for stabilization 
  delay(50);  // value has to be tested 
  
  // get weight 
  getWeight();

  // output weight
  Serial.print("weight load cell 4 (AIN4): ");
  Serial.print(weightChar);
  Serial.println(); 
  
  delay(30 * 1000);  // wait 30 seconds 
  Serial.println();  
}

Bei ersterem Repository …

… findet sich im “test” branch folgende Datei:

Bei zweiterem …

… ist es natürlich schon doof, dass sich dort nur leere Dateien finden. ;[

Danke @clemens für den Code! Das wäre natürlich toll, wenn wir das in die Bibliothek eingebaut kriegen würden. Entweder in die “ADS1231 library” von “aerowind”, die wir derzeit verwenden und die ursprünglich aus dem Arduino Forum kommt, oder in eine der Alternativen, wenn wir die mal unter die Lupe nehmen wollen würden:

Ich habe noch eine weitere Bibliothek entdeckt. Wenn die funktioniert, wäre das toll: Es findet sich nämlich ein “channel” Parameter im Konstruktor:

void ADS1232::init(Gain gain, Speed speed, Channel channel)

Auch ansonsten sieht der Code recht aufgeräumt aus: Ich würde ihn favorisieren, wenn er alles hergibt, was wir brauchen. Wer kann das mal testen?

P.S.: Wenn das Schema in etwa gleich bleibt, sollte es evtl. nicht zu schwer sein, die Bibliothek so zu erweitern, dass sie auch die vier Kanäle eines ADS1234 auslesen kann.



Ja - die ist sehr schön: die verwendet auch den TEMP input, das ist gewissermaßen der A1 der MUX, zu deutsch: diese lib müßte man sehr leicht an den ASD1234 angepaßt bekommen. Gut gefunden, @Andreas !

@mois. Vorher muß die Verkabelung natürlich noch stehen, aber das Thema code für den ADS1234 sieht damit schon mal entspannter aus, trotz aller absehbar nötigen Anpassungen von ADS1232 auf 1234.

Ich hab fast alle Teile zusammen, fehlen noch die Wägezellen, dann kann ich mit meinem ADS1234 mal beginnen zu testen. Aber da ich völliger Anfänger bin wird es etwas dauern :-)

da jetzt meine anlage wieder läuft, packe ich dieses hier thema gerade wieder ausm, um das existierende waagengestell endlich in betrieb zu nehmen.
hier noch ein fundstück, das uns vielleicht auch weiterhilft, obwohl ich noch nicht so ganz weiß wie. da hat einer vier ads1234 auf eine platine gepackt und sein problem, die lösung dafür und schaltplan, eagle-files und code mit hochgeladen. Problem mit TI ADS 1234 -> bit24-17 immer 0x00 oder 0xFF HILFE! :) - Mikrocontroller.net

Zum weiteren Vorgehen:
(Ich fänd es ein lohnendes Experiment, gleich Dateien an passender Stelle im Repository anzulegen, um dort gemeinsam zu entwickeln. (Gibts schon alles, siehe mein Update unten))
Ich hab jetzt hier mal zusammengetragen, womit ich anfangen würde.

@clemens, @Juergen(?), @petekmet(?) : Toll wärs, da wir ja jetzt schon mindestens drei Wägegestellprototypen [1, 2, 3] haben, wenn wir uns zur Entwicklung von library und sketch auch auf ein einfaches Hardware-Set einigen könnten. Mein Vorschlag (Update 24.2.: nachdem ich meine Teilekiste sortiert habe, revidiere ich mein Hardware-Set):

  • HX711 auf Breakout (statt ADS1234),
  • vier Wägezellen,
  • ESP8266 Huzzah (statt Arduino Uno),
  • Netzwerk über WLAN (statt Ethernet).

Das revidierte Hardware-Set hat den Vorteil, dass Schaltplan und Firmware schon vorbildlich dokumentiert vorliegen [1], [2]. Das wäre erstmal die Inbetriebnahme der 4 Sensoren parallel geschaltet an einem Kanal (ebenfalls schon ausführlich diskutiert). @clemens hat recht: Erst Wenn das nicht zufriedenstellend läuft, steht die Entwicklung von Code für den ADS1234 an, der jeder Wägezelle einen eigenen Kanal gönnt.

Ich wäre auch bereit, mich zu treffen und das zusammen anzugehen. Für mich wäre das, selbst wenns mehrere Treffen werden, zeit-ökonomischer als mein isoliertes Try&Error-Verfahren. Bin eben kein Coder.

Oder ist das zu viel Vereinheitlichungs-Terror und wir veröffentlichen immer wieder unsere Zwischenergebnisse und Probleme? Geht natürlich auch. Ging ja so auch immer in der Vergangenheit.

[1] Open Hive WiFi Solar / Adafruit HUZZAH
[2] arduino/node-gprs-http at master · hiveeyes/arduino · GitHub

1 Like

Danke dass Du das nach Vorne bringst und Nägel mit Köpfen machst. Und natürlich, dass Du Dich (vorerst) für diesen Treibercode entschieden hast: Von der Robust- und Kompaktheit her macht er für uns von Ferne betrachtet den besten Eindruck (siehe oben), hoffentlich klappt es mit der Inbetriebnahme genauso gut.

Grundsätzlich gerne beides. Ich persönlich bin erst ab dem 10. März wieder im Lande, stehe aber danach gerne im Rahmen von einem oder mehrerer Treffen für den Codingteil zur Verfügung, wenn Ihr Euch dabei um die elektrischen Dinge kümmert ;].

Clemens und ich wollten ohnehin auch schonmal endlich(!) gemeinsam an der Open Hive Firmware weiterarbeiten, vielleicht passt das gut zusammen.

Falls Ihr bis dahin schon selbst alles erschließen konntet, umso besser ;] - viel Erfolg!

Yeah!:

Der Kandidat sieht sehr gut aus:

Library for reading from Texas Instruments ADS1232 and ADS1234 MultiChannel 24-bit ADC For Bridge Sensors. with all the features mentioned in the datasheet like Offset-Calibrating and Temperature Sensor (ADS1232) reading. Offset calibration can minimize Input Offset Error errors to the level of noise at any temperature.

based on these great libraries:
HX711: by bodge -> GitHub - bogde/HX711: An Arduino library to interface the Avia Semiconductor HX711 24-Bit Analog-to-Digital Converter (ADC) for Weight Scales.
ADS1232: by Jeffrey M. Kubascik -> beer-gauge/firmware/beer-gauge at master · jeffkub/beer-gauge · GitHub

2 Likes