Mehrere DS18x20 auf langen Leitungen über 2 oder mehr Pins angeschlossen

Ich komme aus der BASCOM Ecke und habe beschlossen, auf Arduino zu wechseln. Ich habe produktive Systeme am Laufen mit 14 und mehr DS18x20 Sensoren auf langen ( 50m) Leitungen. Nach anfänglich erheblichen Problemen mit Stabilität habe ich auf der elektronischen Seite folgende Massnahmen zur Stabilisierung gemacht: Die Sensoren sind über twistet Pair Kabel verhängt. Wobei 1 Paar Null und 1 Paar Power und Signal belegt sind. Alle Anschlüsse sind verlötet und nicht verschraubt. Die Stromversorgung des AVR ist mit einem LM317 regelbar und interessanterweise konnte ich so die Spannung wählen mit der besten Stabilität. Bascom erlaubt den Anschluss der Sensoren an 2 Pins. Das hat auch nochmals sehr geholfen. Pro Leitung habe ich max 12 Sensoren seit mehreren Jahren stabil am laufen. Jetzt würde ich gerne auf Arduino wechseln, aber ich sehe den Weg noch nicht ob oder wie man das verteilt auf mehrere Pins programmiert. Habe die aktuellste Version von Paul Stoffregen von letztem Monat angeschaut aber sehe hier keine Lösung für mein Problem!

Jetzt würde ich gerne auf Arduino wechseln, aber ich sehe den Weg noch nicht ob oder wie man das verteilt auf mehrere Pins programmiert. Habe die aktuellste Version von Paul Stoffregen von letztem Monat angeschaut aber sehe hier keine Lösung für mein Problem!

Wo genau liegt das Problem? Du kannst sie doch auch am Arduino an mehreren Pins anschliessen und für jeden Pin ein OneWire-Objekt instanzieren. Du kannst das sogar auf 4 oder noch mehr Pins verteilen, wenn Du Lust hast.

ich habe insgesamt 4 Bus-Leitungen angeschlossen
hier mal die ersten 3 als beispiel:

#define SolarBus_PIN 24 ← Bus 1 (Kabel 1) an Pin 24
#define PufferBus_PIN 26 ← Bus 2 (Kabel 2) an Pin 26
#define MischerBus_PIN 28 ← Bus 3 (…) an 28

OneWire SolarBus(SolarBus_PIN);
OneWire PufferBus(PufferBus_PIN);
OneWire MischerBus(MischerBus_PIN);

DallasTemperature SolarSensoren(&SolarBus);
DallasTemperature PufferSensoren(&PufferBus);
DallasTemperature MischerSensoren(&MischerBus);

Die Sensoren-Adressen habe ich im code hinterlegt, dadurch läßt sich jeder Sensor geziehlt auswerten

DeviceAddress Puffer_1_Oben = { 0x28, 0x21, 0x07, 0x24, 0x03, 0x0, 0x0, 0x54 };
DeviceAddress Puffer_1_Mitte = { 0x28, 0x19, 0x1F, 0x28, 0x03, 0x0, 0x0, 0x48 };
DeviceAddress HeizkreisRuecklauf = { 0x28, 0x60, 0x2F, 0x24, 0x3, 0x0, 0x0, 0xD0 };
DeviceAddress Aussen = {0x28, 0x93, 0x8B, 0x27, 0x3, 0x0, 0x0, 0x5F };

nun die funktion zum temperatur auslesen

void check_Temperaturen()
{
SolarSensoren.requestTemperatures();
MischerSensoren.requestTemperatures();
PufferSensoren.requestTemperatures();

Aktuell_Puffer1Oben = int(PufferSensoren.getTempC(Puffer_1_Oben)); ← mir reichen int werte, sonst wird das zuviel für meine mega

Aktuell_Heizkreis_Ruecklauf = int(MischerSensoren.getTempC(HeizkreisRuecklauf)); ← hier ein beispiel für die abfrage eines anderen busses
Aktuell_Aussen = int(SolarSensoren.getTempC(Aussen)); ← hier ein beispiel für die abfrage eines anderen busses
}

am anfang die include’s nicht vergessen
#include <OneWire.h>
#include <DallasTemperature.h>

das war es - die drei leitungen für die sensoren sind VC / Data / GND
zwischen VC + Data noch widerstand(pullup glaub ich) löten und fertig.

das ganze ist teil meiner mischersteuerung für die heizung - funktioniert seit dezember.
wenn du patch kabel benutzt, pass auf das es nicht knickt - kabelbruch hatte ich für meinen geschmack zu häufig - hab die kabel aber auch leider nicht selbst verlegt.

gruss mattes

Vielen Dank, das geht ja wie der Blitz! Wo das Problem liegt? Am Mangel an Erfahrung im Umgang mit Arduino und C++. Aber Eure schnelle und konkrete Antworten machen mir sehr Mut, hier weiter zu fahren und meine Erfahrungen zu sammeln.

Hallo sunnests,

Willkommen hier im Forum.

Da ich was ähnliches vorhabe (“nur” 15m und nur 1 Sensor aber dafür ungeschirmtes Stromkabel), bin ich mal neugierig, wie Du das stabil hinbekommen hast. Verwendest Du 2 Adern oder 3, um die DS18x20 Sensoren anzuschließen? In meinen Tests war die Variante mit extra 5V Ader wesentlich stabiler, als die 2-Ader-Variante. Welchen Pullup nimmst Du? In einem 2-Ader-Test mit 15m 2 adrigem Kabel konnte ich mit 2kOhm gute Ergebnisse erreichen.
Mit welcher Spannung hattest Du die besten Ergebnisse? Ist da die Versorgungsspannung der DS18x20 gemeint?

Die Erfahrung, dass Steckverbindungen recht unzuverlässig sind, habe ich auch gesammelt und inzwischen 2 Minimal-Arduinos (ähnlich http://arduino.cc/en/Main/Standalone) auf Lochraster-Platinen gelötet. Da hängen die DS18x20 dran und funken ihre Daten via 433 MHz-Modul ins Haus.

Als Lib setze ich die von Bastelitis.de » Temperaturen messen mit dem Arduino ein - mit einer kleinen Anpassung für den DS18B20.

Viele Grüße,
Michael.

c++ ist es leider nicht ganz, aber meine zeit als softwareentwickler ist ausserdem schon seit guten 9 jahren geschichte - passiert halt, wenn man das nicht studiert hat.

konkrete antwort? ich stand zufällig vor 8 monaten vor dem selben problem - keine erfahrung, von c mal abgesehen - und hab mich durchgekämpft. das ergebnis funktioniert relativ gut - von ein paar problemen aufgrund meiner löttalente mal abgesehen. die mischer laufen wie sie sollen - kann man noch verbessern, aber die bude ist so warm wie sie sein soll und das ist momentan das wichtigste. erweiterungen kommen noch - solarthermie, wärmemengenzähler und noch einiges mehr ist geplant. verbesserungen - reedkontakte an diversen stellen, um endpunkte bzw. verschleissfreie schalter zu ermöglichen.

zu deinem projekt:

wenn du die sensorendaten speichern willst, überleg dir gut, wieviel arbeitsspeicher du für die sensoren benötigst. ggf. musst du die einzelnen busleitungen der reihe nach abfragen und die werte sofort speichern. bei mir dauert ein programm zyklus ca. 1-2 sekunden - sensordaten speichert man in dem tempo aber kaum ab. delay usw. hält den arduino an, dann läuft er nicht weiter. ich benutze eine RTC und habe die möglichkeit, verschiedenen funktionen unterschiedlich lang zu überspringen. bsp: mischer 1 fährt 3 sekunden, dann 10 sekunden pause. mischer 2 fährt 3 sekunden, dann 10 sekunden pause. das ganze "gleichzeitig" mit delay würde erst mischer 1 arbeiten und der arduino 3 sekunden warten, nach 3 sekunden würde der mischer aufhören und der arduino 10 sekunden warten. in der zwischenzeit würde der programmteil für mischer 2 nicht abgearbeitet werden.

RTC hat aussdem den vorteil, das du damit einen zeitschaltuhr basteln kannst - zeitgesteuert verbraucher ein/aus schalten.

die arduino's kannst du auch netzwerkfähig machen, z.b um die daten in eine datenbank schreiben.

'string' bzw. text kommt bei den arduino's nicht so gut - also keine langen texte für einträge benutzen.

willst du ausserdem etwas in abhängigkeit der sensorwerte schalten, schau dir das beispiel mit dem ULN2003 an, da kannste printrelais oder schütze anschliessen und steuern.

bei mir kommt es manchmal vor, das ein sensor -127° meldet (denke das liegt am kabel) - das solltest du abfangen/einkalkulieren falls du etwas steuern willst.

Ha, das gefällt mir. Ein richtig lebendiges Forum. Mit aktiven Leuten und soweit ich bis jetzt gelesen habe ohne Polemik und Zynismus. So sollte es sein.

Nun nochmals zu meinem Projekt. Wie ich eingangs geschrieben habe komme ich aus der Bascom Ecke und habe mehrere Systeme bereits am laufen mit vielen Sensoren, DS1307, Relais, Mosfet's mit PWM, Thyristoren und PWM. Gesteuert werden komplexe Heizungsanlagen mit thermischen Solarpanels ( bis 40m2 ) mit bis zu 5 Heizkreisläufen gemischt mit Bodenheizung und Zentralheizung und Stückholzfeuerung. Über die Relais werden Ventile geregelt, über die Thyristoren werden die Pumpen geregelt (ZC) usw Das alles läuft jetzt über ein AVR ATMega32 in Bascom prima.

Wieso wechsle ich auf Arduino bezw C? Weil ich den Raspberry entdeckt habe und in der Kombination mit diesem Teil die Internet-Anbindung mit responsiven Templates realisieren will. Sowohl zur Darstellung der aktuellen Werte wie auch zur Eingabe von Steuerparameter, Zeitabgleich aus Zeitserver mit DS1307, Erfassen und Auswerten der Wetterprognosen zum Vorschlagen des Einheizverhaltens des Kunden und zur Auswertung der Leistung der Anlage! Das heisst, dass ich auch die Daten im Raspberry abspeichern will. Bin schon lange am nutzen von Linux und so bietet sich das an! Ich nehme an dass die Verbindung Arduino Raspberry sich hier am schnellsten abwickeln wird und da will ich dabei sein.

Jetzt noch zur Elektronik der DS18x20: ja die werden bei mir alle mit 5 Volt gespiesen, also nicht parasitär! Das ist eindeutig stabiler und schneller! Die genaue Spannung habe ich nicht gemessen, aber es sind nur wenige zehntel Volt die eine Rolle spielen. Das war mehr eine Zufallsentdeckung. Ich hatte Probleme mit der Wärmeentwicklung der 7805 und bin daher auf LM317 umgestiegen. Die hab ich natürlich regelbar bestückt. Als es wieder Lesefehler gab ( sensor nicht erkannt) hab ich aus Intuition mit der Spannung etwas gespielt und plötzlich lief es stabil. Das war reproduzierbar. Ich denke, es hängt auch mit der Leitungslänge und der Anzahl Sensoren zusammen. Hab die genaue Spannung gar nicht gemessen. Werde ich nachholen wenn ich wieder vor der Anlage stehe ( 300km weit weg im sonnigen Engadin) Als Widerstand hab ich 1.2 k eingesetzt.

beim Raspberry war mir die lieferzeit zu lange - habs pandaboard bestellt und mir den kram mit SPI anbindung gespart.

ich baue lieber darauf, das ich die arduino's ins LAN eingebunden bekomme.

so lassen sich jetzt schon relais übers LAN ein und ausschalten.(sketch findet man im netz)

ob ich das nun via laptop, handy oder skript mache, ist dabei den arduino's egal und sobald ich die daten auf dem server habe, gehts weiter - email, datenbank, website, sms usw. lässt sich alles schnell erledigen, überwachen bzw. später erweitern.

entfernte arduino's steuern? kein problem, netzwerkverbindungen lassen sich tunneln.

achtet man nicht auf sicherheit, haben kommende hackergenerationen neue spielwiesen ;)