I2C AD-Wandler ADS1115 von Texas Instruments

Begonnen von schlawiano, 31 Mai 2016, 11:55:31

Vorheriges Thema - Nächstes Thema

Prof. Dr. Peter Henning

Pardon, wenn ich das so direkt sage: Ein Modul pro Eingang ist einfach ein unsinniger Overhead.

Als Beispiel kann ich das Modul OWAD anführen: Auch darin kann man für jeden Eingang des 4-fach ADC diverse Dinge konfigurieren, ohne dass wesentliche Strukturen wie Hashes etc. mehrfach angelegt werden.

LG

pah

Per

Aktuell bekomme ich noch nichtmal unter Python sinnvolle Werte, von FHEM bin ich also noch weit entfernt...

schlawiano

@Per

ZitatSind sie nicht, sie unterscheiden sich u.a. in der Auflösung (111x = 16 bit, 101x = 12 bit), das sollte aber zu beherrschen sein.
Das denke ich auch.

ZitatDas eine schließt das andere nicht aus. Erst definierst du einen Master und danach darauf basierend die Eingänge. Musst "nur" :D die Syntax anpassen und die define/set... dem entsprechenden Modul-Teil zuordnen.
Ich ahne, wo die Reise hingehen soll. Gibt es ein Beispiel Modul , wo das schon umgesetzt wurde ?

@pah

ZitatOverhead
Ja da gebe ich Ihnen recht. Zumindest seitens der Programmierung. Das sollte aber den Anwender nicht stören.
Ich habe mir mal angeschaut wie OWAD das handhabt. Die Idee mit den dynamischen Attributen ist gut.
Trotzdem gefällt mir meine Variante doch besser, was die Transparenz bei den Einstellungen betrifft (gerade was per Default eingestellt ist).
Ich weiß nicht, ob man OWAD pro Eingang auch Timer setzen kann. Das war mir eben wichtig.

In Summe, wenn ich darüber nachdenke, was es an Wünschen und der Forderungen gibt, wäre ein Neubau eines Moduls durchaus sinnvoll.
Da wären andere Entwickler gefragt. Zeitlich bin ich gerade sehr eingespannt.

Prof. Dr. Peter Henning

ZitatDas sollte aber den Anwender nicht stören

Aber doch, das genau ist der Kern ! Es ist (als FHEM-Installation) ziemlich unwartbar, für jeden Eingang eine eigene Modulinstanz mit defines etc. zu haben.

LG

pah

Joshibaer

So ich habe folgendes Problem.
Die aktuellen Module sind im FHEM Verzeichniss eingefügt und der unten stehenden Code befindet sich in der fhem.cfg.

define I2C_IO RPII2C 1
#IODev für I2C definieren

define myADS1115 I2C_ADS1115 0x48 # I2C-Adresse des ADS1115
attr myADS1115 IODev I2C_IO  # z.B. vom TYP RPII2C
attr myADS1115 verbose 5


define myADS1115_AI I2C_ADS1115_AI myADS1115
attr myADS1115_AI Threshold_Low_Voltage 1
attr myADS1115_AI interval 1 # in Minuten


Leider bekomme ich immer die Fehlermeldung

myADS1115: unknown IODev I2C_IO # z.B. vom TYP RPII2C specified myADS1115_AI: Wrong poll intervall defined. interval must be a number > 0

Das Gerät wird per i2cdetect 1 auf der Adresse 0x48 gefunden. Auf dem Buss befinden sich noch 4 Andere I2C Geräte , die problemlos funktionieren.

Was muss ich ändern , damit die Fehlermeldung nichtmehr erscheint ?

Danke im vorraus.

Joshibaer

Ok die Fehlermeldungen sind jetzt weg , aber ich bekomme leider noch keine Werte . Im STATE stehen immernoch  ???

B4unty

Ich habe mir ein ADS1115 zugelegt und möchte darüber Druck messen die Schaltung wollte ich wie im Anhang aufbauen nur ohne Display ist dieses dann das passende Modul für fhem?

Joshibaer

Von der Beschaltung her ist es richtig.
Ich habe leider den AD-Wandler nicht in FHEM einbinden können.
Der Umweg über den ESP8266 ist auch nicht zufriedenstellend.
Der Wert ist immer am schwanken und nicht stabile. Ich habe aber nochnicht die Fehlerquelle lokalisieren können.
Ich benutze den Gleichen Drucksensor wie auf dem Bild abgebildet.

B4unty

Ich habe so einen Sensor allerdings nicht als 200psi sondern 60psi muss ich den außer das Modul noch etwas installieren? Ich meine in der Anleitung die ich gefunden habe wird der ja ausgewertet ohne fhem.

B4unty

Ich habe mal eine frage jetzt mit volgendem pyton script kann ich mir den druck anzeigen lassen wie müsste ich das verändern bzw das modul anpassen um den druck in Fhem zu sehen?
import time

import Adafruit_ADS1x15
adc = Adafruit_ADS1x15.ADS1115(address=0x48, busnum=1)

# Gain = 2/3 for reading voltages from 0 to 6.144V.
# See table 3 in ADS1115 datasheet
GAIN = 2/3

# Main loop.
while 1:
    value = [0]
    # Read ADC channel 0
    value[0] = adc.read_adc(0, gain=GAIN)
    # Ratio of 15 bit value to max volts determines volts
    volts = value[0] / 32767.0 * 6.144
    # Tests shows linear relationship between psi & voltage:
    psi = 13 * volts - 5
    # Bar conversion
    bar = psi * 0.0689475729
   
    print("{0:0.3f}V [{1}]".format(volts, value[0]))
    print("\n{0:0.0f} psi {1:0.1f} bar".format(psi, bar))

für eure hilfe schon mal vorab besten dank

JoergS

Hallo,
Ich habe versucht, die ADS1115 Module zu verwenden.
Ich habe beide Module in /opt/fhem/FHEM kopiert und Nutzerrechte angepasst.
-rw-rw-rw-  1 fhem dialout  14580 Mai  1 12:19 52_I2C_ADS1115_AI.pm
-rw-rw-rw-  1 fhem dialout  21551 Mai  1 12:19 52_I2C_ADS1115.pm


Wenn ich die Funktion aus FHEM aufrufen will, kommt folgende Meldung
Cannot load module I2C_ADS1115

FHEM Log
2018.05.01 14:06:09 1 : reload: Error:Modul 52_I2C_ADS1115 deactivated: Can't use 'defined(%hash)' (Maybe you should just omit the defined()?) at ./FHEM/52_I2C_ADS1115.pm line 172.
2018.05.01 14:06:09 0 : Can't use 'defined(%hash)' (Maybe you should just omit the defined()?) at ./FHEM/52_I2C_ADS1115.pm line 172.


Was mache ich falsch?
Danke and Gruß



setstate

Zitat von: schlawiano am 22 Juni 2016, 00:02:35
Generell gibt es 2 Module

I2C_ADS1115 ist die Steuerung des Sensors

Hier landen vom Eingang oder Eingängen die Befehle, diese werden der Reihe nach ausgeführt (Qeue)
Nur er schreibt und liest vom I2C-Bus

Daher muss er auch wie ein anderes I2C-Gerät definiert werden

define myADS1115 I2C_ADS1115 0x48 # I2C-Adresse des ADS1115
attr myADS1115 IODev raspBerryBus # z.B. vom TYP RPII2C
attr myADS1115 verbose 5



I2C_ADS1115_AI ist der Eingang bzw. Eingangsdifferenz


Per Define legt man des zugehörige Sensor - Modul fest.

z.B.
define myADS1115_AI I2C_ADS1115_AI myADS1115
attr myADS1115_AI Threshold_Low_Voltage 3
attr myADS1115_AI interval 5 # in Minuten



kleiner Tipp, um stundenlange Fehlersuche zu vermeiden:

der Kommentar: "z.B. vom TYP RPII2C" bedeutet:

man muss mit dem Attribute IODev ein vorhandenes FHEM I2C-Device angeben. Wenn man das noch nicht hat, muss es erst noch angelegt werden:

define I2C_Dev RPII2C 1

dann erst kann man es hier nutzen:

attr myADS1115 IODev I2C_Dev

rieders

Hallo

Ich kann das ads1115 Device nicht anlegen.
Ich bekomme diese Fehlermeldung Cannot load module I2C_ADS1115.

Die 2 Dateien habe ich in Fhem reingemacht.

Vielleicht kann mir jemand helfen


Grüße André

Gruby

#43
Hallo zusammen,

hier das gleiche Problem. Das fhem.log zeigt folgendes:

2018.10.03 14:21:34 1: reload: Error:Modul 52_I2C_ADS1115 deactivated:
Can't use 'defined(%hash)' (Maybe you should just omit the defined()?) at ./FHEM/52_I2C_ADS1115.pm line 172.

2018.10.03 14:21:34 0: Can't use 'defined(%hash)' (Maybe you should just omit the defined()?) at ./FHEM/52_I2C_ADS1115.pm line 172.

2018.10.03 14:35:13 1: PERL WARNING: Subroutine I2C_ADS1115_Initialize redefined at ./FHEM/52_I2C_ADS1115.pm line 110.
2018.10.03 14:35:13 1: PERL WARNING: Subroutine IC2_ADS1115_ReadValues redefined at ./FHEM/52_I2C_ADS1115.pm line 127.
2018.10.03 14:35:13 1: reload: Error:Modul 52_I2C_ADS1115 deactivated:
Can't use 'defined(%hash)' (Maybe you should just omit the defined()?) at ./FHEM/52_I2C_ADS1115.pm line 172.

Hat jemand einen Tip was man dagegen machen kann?

Viele Grüße

Gruby

Adimarantis

#44
Zitat von: Gruby am 03 Oktober 2018, 14:46:44
Can't use 'defined(%hash)' (Maybe you should just omit the defined()?) at ./FHEM/52_I2C_ADS1115.pm line 172.

Hier muss wohl statt
if (!defined(%current))
besser
if (!keys %current)
geschrieben werden, da neuere Perl Versionen das anmeckern.

Nachdem der Code anscheinend schon länger nicht mehr gepflegt wird habe ich mit meinen eher bescheidenen PERL und FHEM Kenntnissen ein paar Anpassungen gemacht:
- Warnings behoben
- Zeichendreher in den Namen korrigiert
- PT1000 Temperaturmessung eingebaut

define myI2CDev RPII2C 1
define ADS1115 I2C_ADS1115 72
attr ADS1115 IODev myI2CDev
define pt1000 I2C_ADS1115_AI ADS1115
attr PT1000Factor 1000


Der PT1000Factor aktiviert meine Änderungen. Der PT1000 wird über einen Spannungsteiler angeschlossen. Der Sensor wird an GND und AIN angeschlossen und dann kommt ein 1K Widerstand zwischen AIN und 3.3V.
Da diese Schaltung sehr empfindlich auf kleinste Abweichungen des Widerstands reagiert, definiert man mit PT1000Factor den tatsächlichen Wert des Spannungsteilerwiderstands. Durch kleinere Anpassungen kann man dann auch noch kalibrieren.
In diesem Modus (PT1000Factor>0) stehen weitere Readings zur Verfügung. In state schreibe ich eine Zusammenfassung der Werte.
Readings
resistance     1090.2                   2018-12-25 12:44:21
state          T:23.1 R:1090.2 V:1.748  2018-12-25 12:44:21
temperature    23.1                     2018-12-25 12:44:21
voltage        1.748                    2018-12-25 12:44:21


Man könnte das Modul so auch zur generischen Widerstandsmessung einsetzen und die Temperaturangabe ignorieren.

Gruß
Jörg


Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)