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. ;[

A post was merged into an existing topic: ADS1231 driver library for AVR and beyond

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

Servus.
Sagt mal gibt es einen Grund für den ADS123x ADC?
Ich selber hatte versucht eine Wägezelle mit dem ADS1115, also einem 16bit ADC, an einem ESPEasy zu betreiben, da es für den ADS123x zZt. keine Unterstützung gibt (ESPEasy ADS1115).

Meine ersten Versuche in Richtung Wägezellen auslesen hatte ich auch – glaube es war sogar der ADS1115 – jedenfalls mit einem 16-bit ADC, den es auf einem breakout bei Adafruit gab, gemacht . Gründe für den waren sehr pragmatisch, der hatte dranlötbare Stifteleisten, den HX711 hatte ich aus welchen Gründen auch immer nicht auf dem Schirm und für SMD-Löten war der Respekt vor dieser Technik noch zu hoch. ;-)

16 bit hört sich erst mal viel an und in der Theorie meint man, es könne vielleicht reichen. Da er von minus bis plus alles messen kann und ein bit anzeigt, ob negativ oder positiv kann er nur 15 bit auflösen. Das finale Problem war aber dann der PGA mit nur x16, den HX711 und ADS1231 fahren wir heute mit x128, was wir auch brauchen bei einer Spannung von 2,0 mV, die die Wägezelle per V exitation liefert. D.h. wir hätten bei einem 5 V-System und einer 200 kg-Zelle bei Vollbeladung 10 mV maximal, die man nicht unverstärkt oder mit wenig Verstärkung gescheit auslesen kann.

1 Like

Ja, da hatte ich mir schon gedacht.
Ich selbst habe keinen ADS1231 hier, dass ich testen könnte ob der unter ESPeasy als 1115 laufen könnte… bzw man einen weitere Lib unter espeasy bauen müsste

… der Vollständigkeit halber.

Eigentlich ist der Name falsch und er sollte sie umbenennen in ADS1231

this library doens’t support reading from 2nd (3rd & 4th for ADS1234) differential input.

aber wir haben ja oben gesehen, dass das Auslesen der weiteren Kanäle sehr einfach nachzuimplementieren ist, wie bei einem ganz normalen MUX

[zur ciorceri-lib]

Ja… die von mir oben verlinkte lib von HamidSaffari macht einen besseren Eindruck und ist vollständiger: HamidSaffari/ ADS123X

2 Likes

Moin, um mal bei dem Thema ADS1232 weiter zu kommen habe ich mich mal den Beispielcode der Libary gewidmet.

Im Einsatz ist ein ESP32 DevKitC (Arduino) mit einem CMCU-1232 Breakout


AVDD liegt zusammen mit DVDD an 3V3, evtl könnte man da auch an VIN gehen.
Beschaltet ist das ganze wie laut Datenblatt angegeben. Die einzige Änderung die ich dort vorgenommen habe ist, das ich A0, Gain0 und Gain1 ebenfalls zum ESP geführt habe.

.Das lesen von Temp des ADS1232 unterstützt die Libary soweit ich auf die schnelle gesehen habe nicht. Es kommen aber auch relativ häufig (ca. alle 100-1000 Messungen) Lesefehler mit dieser Libary vor. Wenn ich mit scale.get_units(AIN1,value_avg,10,true); lese, wird der Mittelwert und kein Median von 10 Lesungen gebildet.

Vom Gefühl her hat der ADS1232 etwas weniger Rauschen als der HX711 das Auslesen der beiden Kanäle klapt soweit gut.

werde mich jetzt auch mal den anderen vorgeschlagenen Libarys widmen.Als nächste die beer-gauge/ADS1232.cpp at master · jeffkub/beer-gauge · GitHub

Edit: bei den Messfehler wahrend der ersten Messungen tippe ich Mal auf schlechten Kontakt auf dem Steckbrett. In der Nacht lief er ohne Ausreißer durch. Die Temperatur kann anscheinend auch gemessen werden Temp müsste dafür wie A1 beim ADS1234 angeschlossen werden. Der 3. Messkanal müsste dann die Temperatur ausspucken, Wenn ich das richtig verstanden habe.


Noch ein weiterer Treiber für Arduino.

3 Likes