DS18b20 Sensoradresse überschreiben

Hallo Zusammen

Ich möchte mehrere Temperaturlogger mit jeweils 6 x DS18b20 Sensoren bauen. Dafür habe ich bei meinem Prototyp die Seriennummer/Werkadresse der Sensoren einzeln ausgelesen und frage die Sensoren darüber ab. Somit kann ich die gemessenen Werte eindeutig mit dem Sensor in Verbindung bringen. Das alles Funktioniert soweit einwandfrei.

Nun zu meinem Problem:

Da ich mehrere Logger in Betrieb nehmen möchte, benötige ich für jeden ein eigenes Programm mit den eindeutigen Adressen. Würde ich sonst das Programm X auf den Logger Y laden, kann dies meine Sensoren nicht auswerten. Grund: Falsche Adressen der Sensoren hinterlegt.

Gibt es eine Möglichkeit die Seriennummer der Sensoren dauerhaft zu Überschreiben? Somit könnte ich für jeden Logger die Adressen einmalig anpassen und daraufhin bei der Installation immer dasselbe Programm verwenden.

Besten Dank für eure Hilfe

kaegi92:
Gibt es eine Möglichkeit die Seriennummer der Sensoren dauerhaft zu Überschreiben?

Kurz: Nein.

Lang: Schau Dir das SetUserData und UserDataDemo an. Rob und Miles haben vieles vereinfacht.

Noch ein edit, da ich damit auch arbeite:

Wenn Du die Sensoren durchnummeriert hast, ist das ein kurzes Testprogramm

Kurz gesagt, verwende die ID der Sensoren und nicht die Adresse.
Dann passt ein Sketch für alle Projekte.

(deleted)

Vielen Dank für die schnellen Antworten

Noch einen kurzen Überblick zu der Verwendung des Loggers:
Ich möchte Heizungen ausmessen und dafür die Sensoren jeweils an der Vorlauf und Rücklauf Leitung anbringen. Anschliessend werden die Temperaturen im 15 min Intervall über einige Wochen aufgezeichnet. Demnach muss das Programm auch nicht super schnell laufen :stuck_out_tongue:

Ich muss sagen ich bin noch nicht so geübt mit dem Arduino, deshalb vielleicht jetzt auch einige Anfängerfragen.

Da die Adresse ja in Hex ist, könnte ich diese jeweils der "grösse" nach sortieren und aufsteigend die Sensor Nr. vergeben. Somit müssten die Sensoradressen immer in der selben Reihenfolge aufgelistet werden (solange diese nicht ersetzt werden). Anschliessend pro Logger die Sensoren richtig beschriften und die Zuordnung sollte immer gleich bleiben?

@HotSystems
Was ist genau der Unterschied zwischen ID und Adresse?

@Peter-CAD-HST
Der Aufbau ist mit einem adafruit Loggershield. Da werden die Daten mit dem Datum und Uhrzeit der RTC auf der SD-Karte in einem csv-File gespeichert. Anschliessen wird das csv-File über den PC heruntergeladen und die Daten ausgewertet.
Das ich das richtig verstehe:
Auf der SD-Karte eine weitere Datei anlegen mit den spezifischen Sensordaten. Die Adresse der Sensoren anschliessend von der SD-Karte lesen und darauf achten das die Datei bei dem Datendownload nicht gelöscht wird. :wink:

(deleted)

Noch einen kurzen Überblick zu der Verwendung des Loggers:
Ich möchte Heizungen ausmessen und dafür die Sensoren jeweils an der Vorlauf und Rücklauf Leitung anbringen. Anschliessend werden die Temperaturen im 15 min Intervall über einige Wochen aufgezeichnet.

Das erinnert mich an eins meiner Projekte....
Das schickt die Daten über nRF24L01+.

Aber, ob das über SD-Karte oder Funk geht, sollte egal sein.

CSV Dateien sind sehr gut geeignet.

Zeitstempel, SensorID, Wert;

Welcher Sensor an welchem Logger steckt, ist völlig egal, solange die Auswertung weiß, wann welcher Sensor wo im Einsatz war.
Die CSV Dateien aller Logger kann man einfach zusammenkopieren.

Es gibt eine library die die Sensoradressen intern ermittelt und nach aussen hin die Möglichkeit bietet
die Sensoren per Index-Nr. abzufragen. Sensor nr. 0 Sensor Nr 1 Sensor nr 2 usw. Das heißt man muss die diese auf dem Chip eingebrannte und deshalb niemals änderbare Seriennummer überhaupt nicht mehr hardcodiert in den Sketch programmieren. Sondern arbeitet mit den Indexnummern. Jetzt könntest du entweder die Sensoren auf eine bestimmte Art der Größe nach sortieren. Der Vorlauf hat immer die kleinere Nummer der Rücklauf die größere oder du hast eine setup-funktion: beide Sensoren geben Temperaturen aus du erwärmst dann den Vorlauftemperatursensor dann wird ja zum Beispiel angezeigt Sensor mit Indexnr. 2 hat höhren Temperatur und dann speichern Vorlauf-Sensor hat Index-Nr. 2

hier das entsprechende Demoprogramm

//Einbinden der Bibliotheken 
#include <OneWire.h>
#include <DallasTemperature.h>

const byte OneWire_Pin = 3;

OneWire oneWire(OneWire_Pin); //IO-Pin an dem der OneWire-Bus angeschlossen ist

// Übergabe der OnewWire Referenz zum kommunizieren mit dem Sensor.
DallasTemperature sensors(&oneWire);

int sensorCount;

const int BlinkPeriod    = 1000;  
unsigned long BlinkTimer = 0;
boolean LED_Status = false;

unsigned long OneWireTimer    = 0;
  
float Temp [3] = {11.1, 22.2, 33.3}; 


void setup(void) 
{
  Serial.begin(115200);
  Serial.println("Setup start");
  Serial.println("");

  sensors.begin(); //Starten der Kommunikation mit dem Sensor
  sensorCount = sensors.getDS18Count(); //Lesen der Anzahl der angeschlossenen Temperatursensoren.
  
  pinMode(LED_BUILTIN, OUTPUT); 
  BlinkTimer      = millis();  
  OneWireTimer    = millis();

  
  Serial.println("setup finished");
  Serial.println("");
  Serial.println("");
}


void loop() 
{
  StatusLED_Blinken();

  if ( (millis() - OneWireTimer) > 2000)
  {
    OneWireTimer = millis();
    Read_DS18B20_Sensors();
  }
    
}


void StatusLED_Blinken() // -----------------------------------------------
{
  if ( (millis() - BlinkTimer) > (BlinkPeriod)) 
  {
    BlinkTimer = millis(); 
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN) );   
  }    
} 


void printValue(float value, String text) // ----------------------------------
{
  Serial.print(value);
  Serial.println(text);
} 


void Read_DS18B20_Sensors() // ------------------------------------------------
{
  sensors.requestTemperatures();  // Temperaturen abfragen

 //Ausgabe aller Werte der angeschlossenen Temperatursensoren.
 for(int i = 0; i < sensorCount; i++)
 {
  Serial.print(i); 
  Serial.print(". Temperatur :"); 
  Temp[i] = sensors.getTempCByIndex(i);
  printValue(Temp[i], "°C");
 }
  
  Serial.println();  
}

viele Grüße Stefan

kaegi92:
....
@HotSystems
Was ist genau der Unterschied zwischen ID und Adresse?
.....

Die ID des Sensors ist unabhängig von der jeweiligen festen Adresse.
Diese ID richtet sich z.B. nach der Reihenfolge, wie ich diese ins System aufnehme.

Die Adresse ist dem Sensor zugeordnet.

HotSystems:
Die ID des Sensors ist unabhängig von der jeweiligen festen Adresse.
Diese ID richtet sich z.B. nach der Reihenfolge, wie ich diese ins System aufnehme.

Die Adresse ist dem Sensor zugeordnet.

Ganz so ist es nicht. Wie Du die Sensoren aufnimmst, ist vollkommen egal.
Die ID kannst Du nur beeinflussen, wenn Du alle Adressen kennst. Die Reihenfolge der ID's richtet sich nach der Reihenfolge der Adressen.

Wenn ein Sensor ausfällt, musst Du sicherstellen, das der Ersatz / die Adresse auch dahin passt, wo der vorherige war.
Bei mehrfacher Anwendung ist bei jedem Einbau darauf zu achten, das es irgendwie passt.
Ja, bei zwei Sensoren gibt es nur mehr oder weniger - bei 3 oder mehr wird es schon anstrengender.

Mit Nutzung von UserData wird sowohl die Frage nach ID als auch Adresse vollkommen überflüssig.
Fällt der Sensor aus, bekommt der Ersatz das selbe UserData - egal was da für eine Addresse / ID beim Austausch anfällt, geht das Stück Software weiter wie bisher.

Man sollte sich aber dann im setup einmalig in der Initialisierung eine Korrespondenztabelle Adresse - UserID anlegen, da der Zugriff über Adresse/Index schneller ist, als jedes Mal die UserID auszulesen.

Gruß Tommy

Tommy56:
Man sollte sich aber dann im setup einmalig in der Initialisierung eine Korrespondenztabelle Adresse - UserID anlegen

Danke für die Erinnerung; Ich behaupte sogar - nach meinen Erfahrungen die ich ja bereits geteilt habe - das eine solche Tabelle zwingendes MUSS ist, wenn nicht nur Temperatur gemessen wird.

DS18B20 messen nur Temperatur :wink:

Sie ist notwendig, wenn Du mit individuellen UserID arbeitest, sonst nicht.

Gruß Tommy

my_xy_projekt:
Ganz so ist es nicht. Wie Du die Sensoren aufnimmst, ist vollkommen egal.
......

Na dann habe ich bei meinem Test bisher Glück gehabt. :wink: