Forum: Mikrocontroller und Digitale Elektronik 1 Wire auf 2 GPIO pins


von Michael G. (michaellox)


Angehängte Dateien:

Lesenswert?

Guten Tag,

ich bin sehr neu hier und habe eine bitte an euch.

Ich habe mir eine Platine mit diversen ein und Ausgängen gebaut, wo ich 
auch per UDP alle Zustände zur Loxone übertragen kann.
Dies klappt soweit auch sehr gut. Auf der Platine sitzt ein Mega 2560 
Rev.3 mit Ethernet (W5100).

Bis jetzt ist das Programm so geschrieben, das ich auf Pin 38 die 1-Wire 
Sensoren scannen kann und diese per UDP senden lassen.

Dort ist meine bitte an euch, mir da unter die Arme zu greifen damit ich 
die 1-Wire Pins erweitern kann. Ziel ist es das ich an PIN 38 und am PIN 
39 jeweils 10 Sensoren scannen kann.

Das Script liegt im Anhang.

Ich hoffe das mir jemand helfen kann.

Danke im Voraus an euch.

von K. S. (the_yrr)


Lesenswert?

Michael G. schrieb:
> Dort ist meine bitte an euch, mir da unter die Arme zu greifen damit ich
> die 1-Wire Pins erweitern kann.

Onewire.h/.c lesen, verstehen und so umschreiben dass du zwei Instanzen 
erzeugen kannst. Zur Zeit ist ja gefühlt die hälfte deiner Konfiguration 
in globalen Variablen, das auch ändern. Dann zwei Instanzen mit 
unterschiedlichen Namen, jeweils die Funktionen mit den richtigen 
Parametern aufrufen statt globalen Variablen und fertig.

> Das Script liegt im Anhang.
wenn ich das so lese bekomm ich eine Mischung aus Übelkeit und 
Traurigkeit. Wenn schon alles Global und 3 Seiten defines in die Main 
dann wenigsten mit nem Kommentar was das ist. Aber das setzt voraus dass 
das nicht nur zusammenkopiert ist.

Nächstes mal das Script als .c und nicht als .txt

: Bearbeitet durch User
von Guest (Gast)


Lesenswert?

K. S. schrieb:
> wenn ich das so lese bekomm ich eine Mischung aus Übelkeit und
> Traurigkeit. Wenn schon alles Global und 3 Seiten defines in die Main
> dann wenigsten mit nem Kommentar was das ist. Aber das setzt voraus dass
> das nicht nur zusammenkopiert ist.

Ist doch Standard bei den meisten Arduino Usern. Sinnvolles 
programmieren lernt man da in der Regel nicht. Es ist ja auch für 
Künstler gemacht also muss auch der code ein Kunstwerk sein ?

von Peter D. (peda)


Lesenswert?

K. S. schrieb:
> Nächstes mal das Script als .c und nicht als .txt

.txt hat den Charme, das es sich bestenfalls max 10% der Leser 
anschauen.

von Michael G. (michaellox)


Lesenswert?

Guest schrieb:
> Ist doch Standard bei den meisten Arduino Usern. Sinnvolles
> programmieren lernt man da in der Regel nicht. Es ist ja auch für
> Künstler gemacht also muss auch der code ein Kunstwerk sein ?

ja da bin ich hier doch genau richtig. Ich als Künstler habe meine 
Platine sauber hinbekommen als Elektroniker aber meine Schwächen liegen 
in der Programmierung wo ich auf Künstler wie euch zurück greifen 
möchte.
Ein Künstler in Programmieren währe ja auch nicht hier im Forum 
unterwegs.

Die Programmierung habe ich aus dem Internet gefunden wo halt meine 
Bedingungen erfüllt wurden.
Ich habe dort Digitale sowie Analoge ein und Ausgänge. Des weiteren 
erkennt er automatisch die 1-Wire und sendend Sie per UDP an meine 
Loxone.


Danke noch mal für die ersten Hilfestellung an (the_yrr) 07.12.2019 
23:41.
Das ist für mich in der Richtung als nicht Künstler sehr schwer.

Wie gesagt. Es währe super wenn mir da jemand helfen könnte.

von chris (Gast)


Lesenswert?

Eigentlich würde nichts gegen copy-paste sprechen.
Alsow wieso nicht, auch weil die Modbus Register ja unterschiedliche 
Bereiche haben sollen und es sollte/müsste ja mit der alten 
SW/Registermap kompatibel bleiben.

von Michael G. (michaellox)


Lesenswert?

Hallo Chris,

ich habe mit copy-paste schon einiges versucht. Aber es kommt immer nur 
der erste 1-Wire Anschluss durch. Kannst du mir da noch ein bisschen 
helfen?

Danke!

von Chris (Gast)


Lesenswert?

Ja, kein Problem, sobald ich etwas Zeit vor dem PC habe. Mache aber nur 
copy/paste, austesten kann/möchte ich es nicht machen.

von Michael G. (michaellox)


Lesenswert?

Hallo Chris,

danke! Das austesten werde ich natürlich machen. Habe natürlich schon 3 
Platinen fertig und eine Mega 2560 R3 zum testen.

Gruß Michael

von Wolfgang (Gast)


Lesenswert?

Michael G. schrieb:
> Wie gesagt. Es währe super wenn mir da jemand helfen könnte.

Was fehlt dir denn noch? K. S. hat doch die Vorgehensweise schon 
beschrieben.

K. S. schrieb:
> Onewire.h/.c lesen, ...

von chris (Gast)


Angehängte Dateien:

Lesenswert?

Habe nun doch nicht nur copy/paste gemacht.
Die Modbus register müssen upgedated werden.
DS18x20 hätte nicht funktioniert.
Es fehlt der oneWireSubTimer.sleep(oneWireSubCycle) Aufruf.
Ansonsten ist die Zeit bei 11 bit 375ms . Wie soll das gehen wenn
die Resultate in 1ms abgeholt wird und anstelle der alten Werte laufende
ADC Werte im Scratchpad stehen?, aber vielleicht werden die Werte erst 
am
Schluss je nach Chip kopiert, dann hat man halt nur alte Werte.

Chris

von Michael G. (michaellox)


Lesenswert?

Hallo Chris,

danke erst mal für deine Bemühungen. Die Werte der OneWire sollen per 
UDP alle 5 Sekunden übertragen werden.
Ich kann nur sagen das die ADC Werte immer nur bei Veränderungen gesandt 
werden.

Habe den Sketch mal in IDE überprüfen lassen und dabei kam das 
Ergebniss:

exit status 1
cannot convert 'byte (*)[8] {aka unsigned char (*)[8]}' to 'byte* {aka 
unsigned char*}' for argument '2' to 'float dsreadtemp(OneWire, byte*)'

Was muss den beim oneWireSubTimer.sleep(oneWireSubCycle) Aufruf gemacht 
werden?

Sorry für die dummen Fragen! Bin halt in der Programmierung ein 
Grundschüler!

Danke!

von Chris (Gast)


Lesenswert?

State  3 dsreadtemp, 2Zeilen darunter sendMsg dsreadtemp das ist 
korrect. Einfach austauschen, raufcopieren und ersetzen.

Wegen sleep, das habe ich geändert. Man musste die Ds2384 .h .cc ansehen 
welche du verwendet zwecks timing. angenommen 400 MS x 11 sind 4.4 sec.
Wenn timer auf 5sec gesetzt ist, dann wird zwischen state 0 und State 1 
600ms gewartet.
Derzeit sind aber alle 2 timer auf 5sec. 5x12 in diesem Fall Bei 10 
Sensoren Ds2438. Es werden die detektierten Sensoren berechnet, sind 3 
detektiert sind es 3+1(ds18x20)+1(timer step0 bis 1)=5.
Ist aber timer 8 sec und subtimer 3 sec, bei 3x Sensoren sind es 12 sec 
+ 8 sec => 20 sec.
Wenn timer größer oder gleich subtimer x ds2438 +1 ist, dann ist timer 
das Intervall und subtimer das Delay zwischen den Messungen. Subtimer 
muss aber grössere oder gleich sein als die Zeit welche für update um 
ds2438 Gebraucht wird..
Man findet die lib src unter Dokumente/Arduino/libraries/DS4238/ oder 
wenn nicht da im Unterverzeichnis src.

von Michael G. (michaellox)


Lesenswert?

Hallo Chris,

ich habe alles eingestellt und konnte es hochladen.

Der SerialMonitor gibt mir aber diese Meldung raus und es kommt alles 
über UDP außer 1_wire. Dort kommen keine Daten.

Die ist ein Auszug aus dem SerialMonitor:

Ethernet ON
485 RTU ON
115200
 Bd, Tx Delay:
10
 ms, Timeout:
20
 ms
IP:
192
.
168
.
178
.
93
.

Address:
1
1-wire sensor unsupported:
028ff5b7473163a4
1-wire sensors found
1
:
1
1-wire sensor unsupported:
12877405f60079
1-wire sensors found
2
:
2
1-wire sensors:
2
0
Writing to relay 1 value 0
Writing to relay 2 value 0
Writing to relay 3 value 0


Währe es hilfreich diesen 1-Wire Sketch einzubauen?
Dort sind fast alle 1_Wire Möglichkeiten inbegriffen.
Kannst du dort mal drüber schauen?

https://www.youtube.com/watch?v=MCCQH0uvZGM

http://jirin.deso.cz/1-Wire_UDP_Gateway/

Danke!

von Einer K. (Gast)


Lesenswert?

Michael G. schrieb:
> das ich an PIN 38 und am PIN 39
1
OneWire ds[] {38,39};

PS:
Bitte keine txt Dateien.
Nimm die Endung ino.
Dann tuts auch der Code Präsentierer incl Syntax Erheller

von Michael G. (michaellox)


Angehängte Dateien:

Lesenswert?

Arduino Fanboy D. schrieb:
> PS:
> Bitte keine txt Dateien.
> Nimm die Endung ino.
> Dann tuts auch der Code Präsentierer incl Syntax Erheller

Hallo Fanboy,

hier ist mal die Ino Datei ohne die Änderungen von Chris.
Ich habe dein
1
OneWire ds[] {38,39};
mal eingefügt aber ohne Erfolg.

von Einer K. (Gast)


Lesenswert?

Michael G. schrieb:
> Ich habe dein
> OneWire ds[] {38,39};
> mal eingefügt aber ohne Erfolg.

Naja, du wolltest 2 Instanzen, und das sind sie, in einem Array.
Und ja, ein einfaches Einfügen ist alleine wenig hilfreich.

von chris (Gast)


Angehängte Dateien:

Lesenswert?

Damit sollte es gehen.

von Peter D. (peda)


Lesenswert?

Am einfachsten lassen sich mehrfache 1-wire Busse realisieren, wenn sie 
alle auf dem selben Port liegen. Man braucht ja nur 3 Grundfunktionen: 
pin_tristate, pin_low, pin_read.
Dazu legt man einfach eine Maskenvariable an, mit der der gesamt Port 
verknüpft wird. Der Pin, der in der Maske gesetzt ist, ist dann 
ausgewählt.

von Michael G. (michaellox)


Angehängte Dateien:

Lesenswert?

Hallo Chris,

leider hatte ich noch ein Fehler dabei gehabt.

Habe jetzt aus der Github was gefunden und bei mir eingetragen.

Dies funktioniert jetzt sehr gut. Dort kann man jetzt selber die Pins 
auch mit Anzahl eingeben.
Habe die .Ino mal Angehängt.

Danke trotzdem für deine Bemühungen.
Vielen Dank!!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.