onewire-lib mit höherwertigen Funktionen

Hallo,

ich bin gerade dabei mit onewire-Sensoren eine Temperatursteuerung zu programmieren.
Ich benutze dazu die onewire-lib von Jim Studt. Was mir daran überhaupt nicht gefällt ist das die ROM-IDs der onewire-slaves in einem Byte-Array gespeichert werden.

Diese Bytearrays lassen sich nur sehr umständlich in If-Bedingungen benutzen.

Deshalb bin ich auf der Suche nach einer anderen onewire-Library die

1.) GUT dokumentiert ist

2.) DIe ROM-IDs in einer leichter weiterzuverarbeitenden Form speichert (string oder unsigned 64 bit)

3.) Höherwertige Funktionen beinhalten

Damit meine ich die library SELBST liefert schon folgende Funktionalität

Scanne Onewire-Bus und ermittle die Anzahl der Slaves (Der DS18S20-slaves)

Gib ROM-ID als String oder unsigned 64bit Wert zurück

Lese Temperaturwert von slave mit ROM-ID xy aus
Die ROM-ID kann dabei im gleichen Format wie bei der Funktion "Gib ROM-ID aus" übergeben werden.

Also wenn die eine Funktion die ROM-ID als string zurück gibt kann ich diesen String zum Ansprechen des Slaves an alle anderen Funktionen übergeben.

Oder

wenn die eine Funktion die ROM-ID als unsigned 64bit zurück gibt kann ich diesen unsigned 64bit-Wert zum Ansprechen des Slaves an alle anderen Funktionen übergeben.

Kennt jemand so eine Lib oder hat sich einen Satz Funktionen die das machen programmiert?

viele Grüße

Stefan

Diese Bytearrays lassen sich nur sehr umständlich in If-Bedingungen benutzen.

memcmp() ist zu kompliziert?

Lese Temperaturwert von slave mit ROM-ID

OneWire ist unabhängig davon um welchen Sensor-Typ es sich handelt. Das kann also nicht von der OneWire Library selbst abgehandelt werden

Für die gängigen OneWire Temperatur Sensoren gibt es das:

Mit der kannst du die Temperatur nach der Position am Bus (Index) oder mit der Adresse auslesen. Siehe Header Datei

Du kannst die Bytearrays auch mit memcmp vergleichen.

Gruß Tommy

Hi

Mein Weg: (ich nehme an, Deine Temperatur-Sensoren sind DS18B20)

  • User-Bytes missbrauchen, dort eine eindeutige ID eintragen
    (hat auch den Vorteil, nach Tod des Sensor kann ein Anderer Dessen Platz einnehmen, wenn nur das User-Byte passt)
    Dann den 1-wire Bus nach dem nächsten Sensor durchsuchen - Temperatur und User-Byte auslesen.
    IMMER nur 'den nächsten Sensor suchen' - bzw. am Ende per Reset wieder vorne anfangen.

So bekommst Du alle Sensoren, Die irgendwie ansprechbar sind und durch die selber eingestellte ID in den User-Bytes ist Dir bekannt, welcher Sensor Das nun ist - egal, welche ID Dieser nun eingebrannt hat.

MfG

Hallo,

erst einmal vielen Dank für die schnellen Antworten.

memcmp() hört sich an wie Speicherinhalt vergleichen.
Wenn ich jetzt aus der Arduino-IDE die Referenz aufrufe steht da nix zu memcmp().

Die die geantwortet haben, können mir wahrscheinlich auch beantworten wo ich eine Erklärung mit den Syntax-Details zum Befehl memcmp() finde.

Ich möchte an der Stelle neben dem Lob an die User einmal Kritik loswerden: Wenn ich das richtig verstanden habe ist Arduino mal angetreten um es Leuten die nicht Programmierer-Oberfreaks sind es einfacher zu machen Microcontroller zu benutzen. Davon kann mittlwerweile keine Rede mehr sein. libs installieren auf Versionen achten usw. usf. Mein Aktueller Bezug: Der Befehl memcmp() ist in der Online-Referenz nicht aufgelistet. Tja und wenn ich memcmp() in die Suchfunktion dieser Website eingebe dann bekommt man natürlich Fundstellen ohne Ende von irgendwelchen Spezialproblemen.

Die Library von Miles Burton habe ich gefunden und mir angeschaut. Die liefert zusätzlich Funktionen.
Es gibt auch eine Menge Beispiele die hochgeladen sind und trotzdem ist meine Einschätzung bis ich die zu 80% verstanden habe (Zeitaufwand geschätzt 20-30 Stunden) habe ich in der selben Zeit selbst eine programmiert die ich dann zu 100% verstehe.

Jetzt mache ich eine nicht ganz ernst gemeinte Aufforderung. Wenn mir jetzt jemand in einer halben Stunde
eine entsprechend gut dokumentierte Lib die die am Thread-Anfang beschriebene Funktionalität aufweist programmieren kann wäre ich demjenigen sehr dankbar und ich schlage ihn zum Code-Gott des Jahres 2019 vor.

Aber das ist eine unverschämte Aufforderung und deswegen nehme ich sie gleich wieder zurück.

Hilfreich und wenig aufwendig wäre ein Link der memcmp() mit mehreren Beispielen die detaillierte Kommentare enthalten erklärt.

viele Grüße

Stefan

memcmp() hört sich an wie Speicherinhalt vergleichen.
Wenn ich jetzt aus der Arduino-IDE die Referenz aufrufe steht da nix zu memcmp().

Arduino verwendet C++ und damit auch du.
Die Arduinoreferenz zeigt hauptsächlich die die Arduino Erweiterungen/Komfortfunktionen.

Und memcmp() steckt in der verwendeten AVR Lib-C
Also schau in diese Referenz

Wenn ich jetzt aus der Arduino-IDE die Referenz aufrufe steht da nix zu memcmp().

Die Arduino IDE ist nur eine API. Keine Programmiersprache. Die wird in C++ programmiert, mit GCC als Compiler. Das Ziel war Dinge für Anfänger zu vereinfachen, aber indem man Dinge versteckt und verschleiert macht man auch einige Sachen sehr viel komplizierter als sie sein müssten. Die Arduino Software ist jedenfalls ist nur ein Teil von dem was tatsächlich möglich ist. Tatsächlich basiert das auf dem hier:
https://www.nongnu.org/avr-libc/user-manual/modules.html
Siehe string.h und stdlib.h

Außerdem kannst du normale C++ Dinge verwenden, mit Ausnahme der Standard Template Library.

Die die geantwortet haben, können mir wahrscheinlich auch beantworten wo ich eine Erklärung mit den Syntax-Details zum Befehl memcmp() finde.

Das ist kein Befehl sondern eine Standard C Funktion. Abgesehen von dem Link oben musst du sowas nur in Google eingeben. Dann findest du zum Beispiel auch die C++ Referenz:
http://www.cplusplus.com/reference/cstring/memcmp/?kw=memcmp
Das ist auch die erste die man findet wenn man nach "memcmp" sucht

Wenn mir jetzt jemand in einer halben Stunde eine entsprechend gut dokumentierte Lib

Diese Library ist sehr gut dokumentiert und hat gute Beispiele dabei. Du bist jetzt an der Stelle wo das Arduino Projekt mit seinem Selbstanspruch etwas scheitert. Es ist zwar für Anfänger gedacht, aber ohne Programmierkenntnisse und etwas Grundwissen geht es dann doch nicht.

Wenn man nämlich genug Wissen hat kann man nur an den Funktionen und den Beispielen herausfinden wie eine Bibliothek arbeitet. Die Namen der Funktionen und deren Parameter verraten oft schon wie man sie verwenden muss.
Die Beispiele liefern dann oft einen Zusammenhang. Bei der DallasTemperature wird eigentlich alles gezeigt. Adressen auslesen. Benutzerdaten schreiben und lesen. Sensoren auslesen entweder einzeln, mehrere, nach Adressen oder Indizes. Blockierend oder nicht-blockierend. Da ist wirklich alles dabei was man normal braucht

StefanL38:
Hilfreich und wenig aufwendig wäre ein Link der memcmp() mit mehreren Beispielen die detaillierte Kommentare enthalten erklärt.

Etwas Eigeninitiative wäre nicht schädlich oder ist Deine Suchmaschine defekt?

Man kann den Arduino immer noch mit wenigen Programmierkenntnissen verwenden, bleibt dann aber an einem bestimmten Level hängen. Das war allerdings schon immer so.
Egal in welchem Bereich: Wenn man mehr haben will, bleibt nur lernen oder bezahlen.
Wir sind hier eher für lernen.

Gruß Tommy