Arduiono Auswertung der ADC0-3 als jeweils einzelne Variable des ADS1115

Hallo zusammen,
ich sammele gerade mit dem ADS1115 Erfahrungen und es klappt soweit ganz gut.
Ich habe paar Libs ausprobiert, mit RAW Daten oder Volt, etc.

An dieser Lib bin ich "hängengeblieben" , habe aber ein echtes Verständnissproblem.
Ich würde gerne jeden ADC Kanal als einzelne Variable haben.
Also Voltage0, Voltage1,Voltage3, Voltage4.

Irgendwie liest der alle ein ( denke wegen dem "Mux" und gibt sie seqeuntiell aus.
( das is so meine Wortwahl und Interpretation)

Ich habe viel Probiert und umgestellt aber ich bekomme es nicht hin , das ich
jeden ADC als einzelne Variable nach dem messen habe.

Hier der Code wo ansich funktioniert, aber die 4 ADC nicht einzeln greifbar macht.

#include<ADS1115_WE.h> 
#include<Wire.h>
#define I2C_ADDRESS 0x48

/* There are several ways to create your ADS1115_WE object:
 * ADS1115_WE adc = ADS1115_WE()             -> uses Wire / I2C Address = 0x48
 * ADS1115_WE adc = ADS1115_WE(I2C_ADDRESS)  -> uses Wire / I2C_ADDRESS
 * ADS1115_WE adc = ADS1115_WE(&wire2)       -> uses the TwoWire object wire2 / I2C_ADDRESS
 * ADS1115_WE adc = ADS1115_WE(&wire2, I2C_ADDRESS) -> all together
 * Successfully tested with two I2C busses on an ESP32
 */
ADS1115_WE adc = ADS1115_WE(I2C_ADDRESS);

void setup() {
  Wire.begin();
  Serial.begin(9600);
  if(!adc.init()){
    Serial.println("ADS1115 not connected!");
  }

  /* Set the voltage range of the ADC to adjust the gain
   * Please note that you must not apply more than VDD + 0.3V to the input pins!
   * 
   * ADS1115_RANGE_6144  ->  +/- 6144 mV
   * ADS1115_RANGE_4096  ->  +/- 4096 mV
   * ADS1115_RANGE_2048  ->  +/- 2048 mV (default)
   * ADS1115_RANGE_1024  ->  +/- 1024 mV
   * ADS1115_RANGE_0512  ->  +/- 512 mV
   * ADS1115_RANGE_0256  ->  +/- 256 mV
   */
  adc.setVoltageRange_mV(ADS1115_RANGE_6144); //comment line/change parameter to change range

  /* Set the inputs to be compared
   *  
   *  ADS1115_COMP_0_1    ->  compares 0 with 1 (default)
   *  ADS1115_COMP_0_3    ->  compares 0 with 3
   *  ADS1115_COMP_1_3    ->  compares 1 with 3
   *  ADS1115_COMP_2_3    ->  compares 2 with 3
   *  ADS1115_COMP_0_GND  ->  compares 0 with GND
   *  ADS1115_COMP_1_GND  ->  compares 1 with GND
   *  ADS1115_COMP_2_GND  ->  compares 2 with GND
   *  ADS1115_COMP_3_GND  ->  compares 3 with GND
   */
  adc.setCompareChannels(ADS1115_COMP_0_GND); //comment line/change parameter to change channel

  /* Set number of conversions after which the alert pin asserts
   * - or you can disable the alert 
   *  
   *  ADS1115_ASSERT_AFTER_1  -> after 1 conversion
   *  ADS1115_ASSERT_AFTER_2  -> after 2 conversions
   *  ADS1115_ASSERT_AFTER_4  -> after 4 conversions
   *  ADS1115_DISABLE_ALERT   -> disable comparator / alert pin (default) 
   */
  //adc.setAlertPinMode(ADS1115_ASSERT_AFTER_1); //uncomment if you want to change the default

  /* Set the conversion rate in SPS (samples per second)
   * Options should be self-explaining: 
   * 
   *  ADS1115_8_SPS 
   *  ADS1115_16_SPS  
   *  ADS1115_32_SPS 
   *  ADS1115_64_SPS  
   *  ADS1115_128_SPS (default)
   *  ADS1115_250_SPS 
   *  ADS1115_475_SPS 
   *  ADS1115_860_SPS 
   */
  // adc.setConvRate(ADS1115_8_SPS); //uncomment if you want to change the default

  /* Set continuous or single shot mode:
   * 
   *  ADS1115_CONTINUOUS  ->  continuous mode
   *  ADS1115_SINGLE     ->  single shot mode (default)
   */
  adc.setMeasureMode(ADS1115_CONTINUOUS); //comment line/change parameter to change mode

   /* Choose maximum limit or maximum and minimum alert limit (window) in Volt - alert pin will 
   *  assert when measured values are beyond the maximum limit or outside the window 
   *  Upper limit first: setAlertLimit_V(MODE, maximum, minimum)
   *  In max limit mode the minimum value is the limit where the alert pin assertion will be  
   *  cleared (if not latched)  
   * 
   *  ADS1115_MAX_LIMIT
   *  ADS1115_WINDOW
   * 
   */
  //adc.setAlertModeAndLimit_V(ADS1115_MAX_LIMIT, 3.0, 1.5); //uncomment if you want to change the default
  
  /* Enable or disable latch. If latch is enabled the alert pin will assert until the
   * conversion register is read (getResult functions). If disabled the alert pin assertion will be
   * cleared with next value within limits. 
   *  
   *  ADS1115_LATCH_DISABLED (default)
   *  ADS1115_LATCH_ENABLED
   */
  //adc.setAlertLatch(ADS1115_LATCH_ENABLED); //uncomment if you want to change the default

  /* Sets the alert pin polarity if active:
   *  
   * ADS1115_ACT_LOW  ->  active low (default)   
   * ADS1115_ACT_HIGH ->  active high
   */
  //adc.setAlertPol(ADS1115_ACT_LOW); //uncomment if you want to change the default
 
  /* With this function the alert pin will assert, when a conversion is ready.
   * In order to deactivate, use the setAlertLimit_V function  
   */
  //adc.setAlertPinToConversionReady(); //uncomment if you want to change the default

  Serial.println("ADS1115 Example Sketch - Continuous Mode");
  Serial.println("All values in volts");
  Serial.println();
}

  /* If you change the compare channels you can immediately read values from the conversion 
   * register, although they might belong to the former channel if no precautions are taken. 
   * It takes about the time needed for two conversions to get the correct data. In single 
   * shot mode you can use the isBusy() function to wait for data from the new channel. This 
   * does not work in continuous mode. 
   * To solve this issue the library adds a delay after change of channels if you are in contunuous
   * mode. The length of the delay is adjusted to the conversion rate. But be aware that the output 
   * rate will be much lower that the conversion rate if you change channels frequently. 
   */

void loop() {
  float voltage = 0.0;

  Serial.print("0: ");
  voltage = readChannel(ADS1115_COMP_0_GND);
  Serial.print(voltage);

  Serial.print(",   1: ");
  voltage = readChannel(ADS1115_COMP_1_GND);
  Serial.print(voltage);
  
  Serial.print(",   2: ");
  voltage = readChannel(ADS1115_COMP_2_GND);
  Serial.print(voltage);

  Serial.print(",   3: ");
  voltage = readChannel(ADS1115_COMP_3_GND);
  Serial.println(voltage);

  delay(1000);
}

float readChannel(ADS1115_MUX channel) {
  float voltage = 0.0;
  adc.setCompareChannels(channel);
  voltage = adc.getResult_V(); // alternative: getResult_mV for Millivolt
  return voltage;

Hallo,
was soll mir das sagen?

Arduiono AUswertuns als einzelne Variable des ADS1115

Du versucht ja nicht mal jedem Wert seine eigene Variable zu geben. Sondern verwendest eine mehrmals

..habe versucht, weis aber nicht wie... Ein Vorschlag von dir wie es gehen könnte ?
Der Code ist das Original Sample.
Alles was ich bisher als einzele versucht habe , ging nicht.

Deswegen als Basis , der Originalcode der erstmal "funktioniert".
Als Grundlage sozusagen :slight_smile:

ich bin zwar nicht Serenifly, antworte aber mal trotzdem mit einem Beispiel...

  float voltage0 = 0.0;
  float voltage1 = 0.0;

  Serial.print("0: ");
  voltage0 = readChannel(ADS1115_COMP_0_GND);
  Serial.print(voltage0);

  Serial.print(",   1: ");
  voltage1 = readChannel(ADS1115_COMP_1_GND);
  Serial.print(voltage1);

Ich würde den int-ADC-Wert speichern und das in einem Array :wink:

Das durchnummerieren von Variablen ist meist eine Dumme Idee.
Dagegen wurden Arrays erfunden.

Hallo,
ja ich gebe euch recht ,
Arrays sind eine feine Sache.
Dennoch möchte ich hier gerne die 4 ADC jeweils einzeln haben.
Nur weil das eine nicht eght , möchte ich jetzt nichta uf Array gehen.
Ich will ja lernen und verstehen.

In dem Code Beispiel, hab ich eure Tips probiert. Leider ohne Erfolg.
Ohne das Skript hinter der Void Loop geht gar nichts.
Ich verstehe auch nicht wo und wie die 4 wirklich "ausgelesen und jeweils dann verteiltet werden.

Mit Array füllen usw. hatte ich schon Erfahrung, dies sieht hier alles anders aus.
Egal was ich probiere... nichts klappt.

Viellcieht hat einer von euch eine Idee, wie ich an
ADC0-4 einzelen drankomme , ohne Array.

Dies hier z.b.: liest ohne unten gar nichts aus.

voltage0 = readChannel(ADS1115_COMP_0_GND);
voltage1 = readChannel(ADS1115_COMP_1_GND);
etc....

Also irgendwie muss unten hinter der void loop das ganze gemacht werden.
So meine Vermutung.

hier sollte ich es aufbröseln :slight_smile:

float readChannel(ADS1115_MUX channel) {
  float voltage = 0.0;
  adc.setCompareChannels(channel);
  voltage = adc.getResult_V(); // alternative: getResult_mV for Millivolt
  return voltage;

LG
Rainer

Das "Skript" ist eine Funktion.
Diese Funktion bekommt als Übergabewert den auszulesenden Channel und gibt den errechneten Wert in Voltage zurück.

#include<ADS1115_WE.h>
#include<Wire.h>
#define I2C_ADDRESS 0x48

/* There are several ways to create your ADS1115_WE object:
   ADS1115_WE adc = ADS1115_WE()             -> uses Wire / I2C Address = 0x48
   ADS1115_WE adc = ADS1115_WE(I2C_ADDRESS)  -> uses Wire / I2C_ADDRESS
   ADS1115_WE adc = ADS1115_WE(&wire2)       -> uses the TwoWire object wire2 / I2C_ADDRESS
   ADS1115_WE adc = ADS1115_WE(&wire2, I2C_ADDRESS) -> all together
   Successfully tested with two I2C busses on an ESP32
*/
ADS1115_WE adc = ADS1115_WE(I2C_ADDRESS);

void setup()
{
  Wire.begin();
  Serial.begin(9600);
  if (!adc.init())
  {
    Serial.println("ADS1115 not connected!");
  }
  /* Set the voltage range of the ADC to adjust the gain
     Please note that you must not apply more than VDD + 0.3V to the input pins!

     ADS1115_RANGE_6144  ->  +/- 6144 mV
     ADS1115_RANGE_4096  ->  +/- 4096 mV
     ADS1115_RANGE_2048  ->  +/- 2048 mV (default)
     ADS1115_RANGE_1024  ->  +/- 1024 mV
     ADS1115_RANGE_0512  ->  +/- 512 mV
     ADS1115_RANGE_0256  ->  +/- 256 mV
  */
  adc.setVoltageRange_mV(ADS1115_RANGE_6144); //comment line/change parameter to change range
  /* Set the inputs to be compared

      ADS1115_COMP_0_1    ->  compares 0 with 1 (default)
      ADS1115_COMP_0_3    ->  compares 0 with 3
      ADS1115_COMP_1_3    ->  compares 1 with 3
      ADS1115_COMP_2_3    ->  compares 2 with 3
      ADS1115_COMP_0_GND  ->  compares 0 with GND
      ADS1115_COMP_1_GND  ->  compares 1 with GND
      ADS1115_COMP_2_GND  ->  compares 2 with GND
      ADS1115_COMP_3_GND  ->  compares 3 with GND
  */
  adc.setCompareChannels(ADS1115_COMP_0_GND); //comment line/change parameter to change channel
  /* Set number of conversions after which the alert pin asserts
     - or you can disable the alert

      ADS1115_ASSERT_AFTER_1  -> after 1 conversion
      ADS1115_ASSERT_AFTER_2  -> after 2 conversions
      ADS1115_ASSERT_AFTER_4  -> after 4 conversions
      ADS1115_DISABLE_ALERT   -> disable comparator / alert pin (default)
  */
  //adc.setAlertPinMode(ADS1115_ASSERT_AFTER_1); //uncomment if you want to change the default
  /* Set the conversion rate in SPS (samples per second)
     Options should be self-explaining:

      ADS1115_8_SPS
      ADS1115_16_SPS
      ADS1115_32_SPS
      ADS1115_64_SPS
      ADS1115_128_SPS (default)
      ADS1115_250_SPS
      ADS1115_475_SPS
      ADS1115_860_SPS
  */
  // adc.setConvRate(ADS1115_8_SPS); //uncomment if you want to change the default
  /* Set continuous or single shot mode:

      ADS1115_CONTINUOUS  ->  continuous mode
      ADS1115_SINGLE     ->  single shot mode (default)
  */
  adc.setMeasureMode(ADS1115_CONTINUOUS); //comment line/change parameter to change mode
  /* Choose maximum limit or maximum and minimum alert limit (window) in Volt - alert pin will
     assert when measured values are beyond the maximum limit or outside the window
     Upper limit first: setAlertLimit_V(MODE, maximum, minimum)
     In max limit mode the minimum value is the limit where the alert pin assertion will be
     cleared (if not latched)

     ADS1115_MAX_LIMIT
     ADS1115_WINDOW

  */
  //adc.setAlertModeAndLimit_V(ADS1115_MAX_LIMIT, 3.0, 1.5); //uncomment if you want to change the default
  /* Enable or disable latch. If latch is enabled the alert pin will assert until the
     conversion register is read (getResult functions). If disabled the alert pin assertion will be
     cleared with next value within limits.

      ADS1115_LATCH_DISABLED (default)
      ADS1115_LATCH_ENABLED
  */
  //adc.setAlertLatch(ADS1115_LATCH_ENABLED); //uncomment if you want to change the default
  /* Sets the alert pin polarity if active:

     ADS1115_ACT_LOW  ->  active low (default)
     ADS1115_ACT_HIGH ->  active high
  */
  //adc.setAlertPol(ADS1115_ACT_LOW); //uncomment if you want to change the default
  /* With this function the alert pin will assert, when a conversion is ready.
     In order to deactivate, use the setAlertLimit_V function
  */
  //adc.setAlertPinToConversionReady(); //uncomment if you want to change the default
  Serial.println("ADS1115 Example Sketch - Continuous Mode");
  Serial.println("All values in volts");
  Serial.println();
}

/* If you change the compare channels you can immediately read values from the conversion
   register, although they might belong to the former channel if no precautions are taken.
   It takes about the time needed for two conversions to get the correct data. In single
   shot mode you can use the isBusy() function to wait for data from the new channel. This
   does not work in continuous mode.
   To solve this issue the library adds a delay after change of channels if you are in contunuous
   mode. The length of the delay is adjusted to the conversion rate. But be aware that the output
   rate will be much lower that the conversion rate if you change channels frequently.
*/
int channelVoltage[4] = 0;

void loop()
{
  float voltage = 0.0;
  enum
  Serial.print("0: ");
  voltage = readChannel(ADS1115_COMP_0_GND);
  Serial.print(voltage);
  Serial.print(",   1: ");
  voltage = readChannel(ADS1115_COMP_1_GND);
  Serial.print(voltage);
  Serial.print(",   2: ");
  voltage = readChannel(ADS1115_COMP_2_GND);
  Serial.print(voltage);
  Serial.print(",   3: ");
  voltage = readChannel(ADS1115_COMP_3_GND);
  Serial.println(voltage);
  delay(500);
  for (b = 0; b <= 3; b++;)
  {Serial.println(channelVoltage[b]);}
  delay(1000);
}

float readChannel(ADS1115_MUX channel)
{
  float voltage = 0.0;
  adc.setCompareChannels(channel);
  voltage = adc.getResult_V(); // alternative: getResult_mV for Millivolt
  switch (channel)
  {
    case  ADS1115_COMP_0_GND:
      channelVoltage[0] = voltage;
      break;
    case  ADS1115_COMP_1_GND:
      channelVoltage[1] = voltage;
      break;
    case  ADS1115_COMP_2_GND:
      channelVoltage[2] = voltage;
      break;
    case  ADS1115_COMP_3_GND:
      channelVoltage[3] = voltage;
      break;
      return voltage;
  }
}

Testweise - ich kanns nicht mal kompilieren, weil lib nicht installiert...

Was ist das Problem bei einem Array?
voltage[1]
voltage[2]
...
voltage1
voltage2

ok Du mußt 2 Klammern mehr schreiben.

Grüße Uwe

Wenn das, was du misst nicht 4 Spannungen sind, sondern eigentlich physikalisch völlig verschiedene Dinge, würde ich da auch einzelne Variable, aber nicht mit solchen Namen wie voltage1, voltage2 usw. empfehlen, und die Umrechnung auch gleich individuell machen

Ich hatte den ADS1115 Sensor auch gerade beim Testen dran. Und ich habe mal testweise zum Kanal 0 noch den Kanal 1 ausgelesen und einzeln am Display dargestellt. Das kann man locker auf weitere 2 Kanäle erweitern.

Die Deklarationen sind sogar schon auf 4 Kanäle geschrieben. Muss nur noch das Programm erweitert werden.

Franz

Hallo Franz,
ja ich sehe, dort sind es einzele Variablen. Danke , der Link ist gut.
Ist aber eine andere Lib. Wäre ja egal.

Ich will trotzdem versuchen , dies hier noch zu lösen.

Notiz am Rande:
Warum sich über die Namen der 4 Variablen Gedanken gemacht und daran gestört wird,
Aber gut, Sie sollen dann ab sofort heißen: Hund , Katze Maus1, Maus 2 , dies für ADC 0-3.

Spass beiseite.

Also das der unterste Teil des Skripts eine Funktion zur Umrechung ist , ist schon ein wertvoller Hinweis. Danke .

Ich muss nochmal anderst schreiben und fragen :slight_smile:
Also ich verstehe an dem Originbal Scriptr nicht, welche Zeile, welches Commando jetzt genau den Wert ausliest.
Ohne die "Funktion " am Ende geht gar nicht nichts und ich dachte

readChannel(ADS1115_COMP_0_GND);

nur dies liest die Rohwerte aus. Dem ist nicht so.

Ich verstehe auch die Funktion und die Rückgabe nicht.
Was macht das "MUX" ... MUX vielleicht multiplexen , vielleicht alle Sensoren?!

Also, ihr seht... ich verstehe es nicht und würde es aber gerne.

Wenn ich jetzt die Rohwerte von Hund , Katze Maus1, Maus 2 , dies für ADC 0-3.
haben möchte, ohne Umrechung der Funktion.

Was würde dann an Code im Script übrigbleiben.
Oder wie sieht das Script aus um die Variablen einzeln zu lesen ?

@ my xy project... Ich danke dir... werde es testen....

Grüsse und Danke an alle die mir hier helfen, auch wenn ich bischen
arg dabei auf dem Schlauch stehe.

Rainer

Hallo Franz 54
, ich habe die Lib von Dir im Link probiert.
Ist genau das wie ich es brauche und auch verstehe.
Daaaaaaankre Dir !
Jetzt habe ich was wo funktioniet :slight_smile: und nun muss ich das andere noich verstehen.
Gruss Rainer

Richtig.
Die Werte sind durch eine Folge von Abläufen ermittelt.
Dafür gibt es einige Methoden, die in der lib bereits vorgegeben sind und Du musst Dich nicht zu Fuß durchhangeln.
Du hast in Deinem Sketch von Wolle ja noch oben alle Kommentare drin.
Das, was Du da nicht findest, steht dann in den Sourcen ADS1115_WE.h und ADS1115_WE.cpp
Da musst Du Dich reinlesen. Was wozu da ist, musst Du Dir selbst erarbeiten, weil Du sonst nur ratest.
Wenn Du dann etwas nicht weisst, ggfls. bei wolle auf der Seite seine Beschreibung lesen und wenn es dann noch immer klemmt hier wieder fragen.

Im Übrigen in meinem Sketch:

int channelVoltage[4] = 0;

geht in die Hose, wenn Du die nachkommastellen brauchst, muss es

float channelVoltage[4] = 0;

heissen.

Ja, da gebe ich dir recht, das werde ich so machen...
Ich danke Euch für eure Hilfe, so machts es Spass...
Ich sehe ich muss noch viel lernen und vestehen aber es ist schön zu lesen, das
mann immer wieder hier fragen kann :wink:

Danke Euch , ich schließe den Topic dann jetzt.
Rainer