NodeMCU & ADS1115

In diesem Artikel möchte ich zeigen, wie man einen ADS1115 dazu benutzt, mehrere Analoge Komponenten über einen Digitalen Pin, in dem Fall des NodeMCUs, auszulesen. Von Haus aus besitzt der Node einen Analogen Pin, A0. Doch je nach Projekt ist dies schlicht und ergreifend zu wenig. Hier kommt der ADS1115 in Spiel. Diese Kleine Platine ist ein Analog-zu-Digital Wandler mit einer Auflösung von 16 Bit. Des weiteren besitzt der ADS ein I2C-Interface, mit dem es möglich ist, bis zu vier analoge Kanäle anzusteuern. Sprich, man kann, bis zu vier analoge Komponenten betreiben. Zusätzlich besteht die Möglichkeit, die I2C-Adresse, zu ändern. Diese Adresse identifiziert den ADS eindeutig. Dies kann über das stecken von Brücken bewerkställigt werden. Doch dazu später mehr. Angesteuert wird er mit einer Spannung zwischen 2V und 5V, was meiner Meinung nach eine gute Spanne ist. Da der NodeMCU benutzt wird, um den ADS zu speisen, muss sicher sein, dass eine Solche Spannung gegeben ist. Er besitzt einen Spannungs-Pin der 3,3V liefert. Somit sind wir auf der sicheren Seite. Der ADS1115 wird zusammen mit eine Pin-Leiste von 10 Pins geliefert. Bevor begonnen werden kann muss die Leiste noch auf die Platine gelötet werden.

I2C Bus System

Nun möchte ich eine kleine Erklärung zu dem I2C oder auch Inter-IC Bus abgeben. Es wurde erfunden, um mehrere Schaltkreise mit einander zu verbinden. IC steht für Integrated Circuits). Ursprünglich wurde dieses System von Phillips entwickelt. Ziel war hierbei ein Master-Slave Bus System für geringe Datenraten. Doch worauf ich eigentlich raus wollte, dass dieses System über zwei Leitungen basiert. Einmal SCL und SDA.

SCL: Diese Leitung gibt quasi den Takt an. Sie transportiert das Taktsignal, welches für die Synchronisation der unterschiedlichen Geräte, benutzt wird.

SDA: Hier werden die eigentlichen Daten gesendet. Die Datenbits können empfangen und gesendet werden.

Adressierung im Bus-System

Als nächstes möchte ich die Adressierung mit Hilfe des ADDR Pins ansprechen. Es können vier unterschiedliche Adressen vergeben werden. Heißt man könnte vier ADS1115 in einem Bus laugen lassen. Es ist also möglich vier ADS1115 an einen NodeMCU zu hängen. Hierzu kann der ADDR Pin mit einem der Pins GND, VDD, SDA oder SCL gebrückt werden. In folgender Tabelle kann man eine Liste der Pins und die zugehörigen Adressen, dargestellt im Binären Zahlensystem, einsehen.

Pin VerbundungAdresse
GND1001000
VDD1001001
SDA1001010
SCL1001011

Alarm Funktion

Dann gibt es da noch den ALRT Pin, welcher für den Komparator-Modus zuständig ist. Es kann eine Eingangsspannung mit einem Schwellwert verglichen werden und einen Alarm provozieren, sobald der Schwellwert überschritten wirt. Mithilfe eines digitalen Eingangs-Pin können die Daten gelesen werden.

Pin Kurzbeschreibung

PinBeschreibung
VDDPlus Pol, zwischen 2V und 5V
GNDMinus Pol, oder auch Masse
SCL (Serial Clock)Taktsignal
SDA (Serial Data)Daten
ADDRAdressierungs-Pin
ALRTAlarm Pin
A0 – A3Analoger Eingang von A0 bis A3

Verkabelungsschema

Hier ist die Verkabelung beider Komponenten nochmal bildlich dargestellt. Natürlich fehlt hier jetzt noch eine Komponente, die an einen Analogen Anschluss des ADS1115 angeschlossen ist.

Software

Zum programmieren wird, für gewöhnlich, die Arduino Software benutzt. Diese findet man auf der Arduino-Seite kostenlos zum Download angeboten. Als nächstes muss noch die Bibliothek Adafruit ADS1x15 in der IDE installiert werden, um innerhalb der Programmes die Analogen Pins auszulesen. Ein Beispielprogramm kann wie immer unter Datei => Beispiele => Adafruit ADS1x15 => singleended gefunden werden. Weiter unten ist der Quelltext in angepasster Form zu finden.
Im Kopf des Quelltextes wird ein Instanz des Objektes Adafruit_ADS1115 erzeugt. Unterstützt wird der ADS1115 und ADS1015.
In der Setup Methode ist die Baudrate auf 115200 geändert worden. An dieser Stelle kann man zusätzlich noch die Verstärkung anpassen. Dies wird mit Hilfe der Methode setGain gemacht. Wenn kein Wert gesetzt wird, wird 2/3 Gain als Standardwert gesetzt. Dabei wird im Bereich bis zu einer Spannung von 6,144V gelesen, wobei, in diesem Fall, 1 Bit 0,1875mV entspricht.
Vorsicht, im schlimmsten Fall, kann der ADS, kaputt gehen.
Folgende Tabelle zeigt die Spannungsbereiche, welche gesetzt werden können.

KonstanteVerstärkung
(gain)
Messbereich(ADS1015)
1 Bit =
(ADS1115)
1 Bit =
GAIN_TWOTHIRDS2/3x6.144V3mV0.1875mV
GAIN_ONE1x4.096V2mV0.125mV
GAIN_TWO2x2.048V1mV0.0625mV
GAIN_FOUR4x1.024V0.5mV0.03125mV
GAIN_EIGHT8x0.512V0.25mV0.015625mV
GAIN_SIXTEEN16x0.256V0.125mV0.0078125mV

Innerhalb der loop Methode werden alle vier Werte des ADS eingelesen und in die Konsole geschrieben. Wenn man aus dem gelesenen Wert die Spannung errechnen will, kann man das in dem man den Messwert mit der Volt zahl, die einem Bit entspricht, multiplizieren. Hier wäre das <Messwert> * 0,1875.

#include <Wire.h>
#include <Adafruit_ADS1015.h>

Adafruit_ADS1115 ads;  /* Use this for the 16-bit version */
// Adafruit_ADS1015 ads;     /* Use this for the 12-bit version */

void setup(void) 
{
  Serial.begin(115200);

  Serial.println("Getting single-ended readings from AIN0..3");
  Serial.println("ADC Range: +/- 6.144V (1 bit = 3mV/ADS1015, 0.1875mV/ADS1115)");
  
  // The ADC input range (or gain) can be changed via the following
  // functions, but be careful never to exceed VDD +0.3V max, or to
  // exceed the upper and lower limits if you adjust the input range!
  // Setting these values incorrectly may destroy your ADC!
  //                                                                ADS1015  ADS1115
  //                                                                -------  -------
  // ads.setGain(GAIN_TWOTHIRDS);  // 2/3x gain +/- 6.144V  1 bit = 3mV      0.1875mV (default)
  // ads.setGain(GAIN_ONE);        // 1x gain   +/- 4.096V  1 bit = 2mV      0.125mV
  // ads.setGain(GAIN_TWO);        // 2x gain   +/- 2.048V  1 bit = 1mV      0.0625mV
  // ads.setGain(GAIN_FOUR);       // 4x gain   +/- 1.024V  1 bit = 0.5mV    0.03125mV
  // ads.setGain(GAIN_EIGHT);      // 8x gain   +/- 0.512V  1 bit = 0.25mV   0.015625mV
  // ads.setGain(GAIN_SIXTEEN);    // 16x gain  +/- 0.256V  1 bit = 0.125mV  0.0078125mV
  
  ads.begin();
}

void loop(void) 
{
  int16_t adc0, adc1, adc2, adc3;

  adc0 = ads.readADC_SingleEnded(0);
  adc1 = ads.readADC_SingleEnded(1);
  adc2 = ads.readADC_SingleEnded(2);
  adc3 = ads.readADC_SingleEnded(3);
  Serial.print("AIN0: "); Serial.println(adc0);
  Serial.print("AIN1: "); Serial.println(adc1);
  Serial.print("AIN2: "); Serial.println(adc2);
  Serial.print("AIN3: "); Serial.println(adc3);
  Serial.println(" ");
  
  delay(1000);
}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert