Licht messen – I2C Bus mit mehreren Teilnehmern

Nach all den Prototypen auf Lochraster, die allesamt mit I2C funktionieren, baue ich doch einmal ein Messgerät, das diese verschiedenen Ausgaben nutzt. Ein einfacher Sensor ist ein Lichtsensor mit einem LDR, also einem lichtabhängigem Widerstand. Der eingelesene Wert wird dann auf verschiedenen I2C Ausgabemodulen angezeigt.

Die Hardware
– Als Controller ein Arduino UNO
– Ein Lichtsensor Modul
– Ein LCD Anzeigemodul
– Ein 8-LED Reihe Anzeigemodul
– Ein 7-Segment Anzeigemodul
– Ein Bargraph Anzeigemodul
– Eine Verteilerplatine für die I2C Module

Der Aufbau
Neben dem einfachen Lichtsensor verwende ich einige meiner bisher selbst aufgebauten Ausgabemodule für den I2C Bus. Dafür muss für jedes Modul die I2C Adresse angepasst werden. Je Modul eine andere Adresse. Das ergibt folgende Adressenliste:

#define I2C_LCD_DISPLAY 0x27
#define I2C_LED_DISPLAY 0x26
#define I2C_SEG_DISPLAY 0x25
#define I2C_BARGRAPH_DISPLAY 0x60

Damit ist jedes Modul individuell ansprechbar. Damit alle I2C Module problemlos angeschlossen werden können, habe ich noch eine kleine Verteilerplatine zusammengelötet.


Arduino und alle Module

Die Software
Jedes Mess- und Ausgabemodul hat auch sein eigenes Softwaremodul. Die I2C Adressen bekommen einen eigenen Header. Dann wird einfach gemessen und der Messwert auf 0% bis 99% umgerechnet. Der berechnete Wert wird dann ausgegeben.

Der Sketch
Helligkeit-Messen

Ergebnis
Die Ausgaben auf den einzelnen Modulen funktionieren einwandfrei. Obwohl die I2C Zuleitungen relativ lang und ungeschirmt sind. Mit der Kappe von einem Filzstift kann ich den Sensor abdecken und damit die Funktion testen.

Erweiterung
Hierfür ersetze ich den Arduino internen Analog-Digital Wandler durch einen externen, der über I2C angesteuert und ausgelesen wird.

Die erweiterte Hardware
– Ein I2C ADC ADS1115

Die erweiterte Software
Die neue I2C Adresse wird folgendermassen eingefügt:

#define I2C_SENSOR_ADC 0x48

Und das Modul für den LDR Sensor wird dafür etwas umgebaut. Der neue Messwert wird aus dem ADS1115 ausgelesen und wieder in Prozent umgerechnet. Die Standardeinstellung in der Bibliothek ist die Adresse 0x48. Der Standardmessbereich für die Singleended Messung reicht von -6,144 Volt bis +6,144 Volt und wird mit 16bit aufgelöst. Das entspricht Messwerten von 0 bis 65535. Ich messe nur von 0 Volt bis 5 Volt, das ergibt Messwerte von 0 bis 26666. Da der Widerstand vom LDR nicht auf Null sinkt, komme ich also nie ganz auf die 100 Prozent. Ein Versuch die Software für den Digispark zu kompilieren misslingt leider. Der Compiler meldet: Der Sketch verwendet 6598 Bytes (109%) des Programmspeicherplatzes. Das Maximum sind 6012 Bytes.

Der erweiterte Sketch
Helligkeit-Messen-erweitert

Ergebnis der Erweiterung
Auch mit dem externen AD Wandler funktioniert die Schaltung wie gehabt. Die gesamte Schaltung arbeitet damit ausschließlich über den I2C Bus. Eine Umsetzung auf den kleineren Digispark, der ebenfalls I2C unterstützt, scheitert leider am Programmspeicherplatz.

Links

LDR Definition
https://de.wikipedia.org/wiki/Fotowiderstand

LDR Anwendung
https://maker.pro/arduino/tutorial/how-to-use-an-ldr-sensor-with-arduino

I2C Bus Spezifikation
https://www.i2c-bus.org

LCD Anzeigemodul
Digispark mit LCD 2×16 Zeichen

8-LED Anzeigemodul
LED Ausgabe am I2C Portexpander

7-Segment Anzeigemodul
Siebensegment Anzeige am I2C Portexpander

Bargraph Anzeigemodul
Leuchtbalkenanzeige mit I2C

I2C ADC – ADS1115 Datasheet

Klicke, um auf ads1115.pdf zuzugreifen

I2C ADC – ADS1115 Bibliothek
https://github.com/adafruit/Adafruit_ADS1X15

I2C ADC – ADS1115 Beschreibung

Klicke, um auf adafruit-4-channel-adc-breakouts.pdf zuzugreifen

Veröffentlicht von

Jürgen

Ich bin Software Ingenieur und habe meine Schwerpunkte in allen Aktivitäten, die zur Software Entwicklung gehören. Am längsten bin ich als Software Entwickler von Embedded Software in C tätig.