D18S20 - schwankende Werte

Hallo!

Ich habe mein erstes Projekt gestartet also Arduino Anfänger: Einen Außen-Termperatursensor.

Ich bin schon recht weit gekommen, mein Außensensor liefert brav Daten, ich kann sie wireless empfangen (Module von Jeelabs). Empfangen werden die Daten von einem Arduino Uno.

Angeschlossen sind ein 2 Zeilen LCD + HopeRF + D18S20.

Grundsätzlich funktioniert alles wunderbar, eines jedoch ist recht störend:
Bei meinem Außensensor sowie meinen Innentemperatur Sensor (beide D18S20 von Reichelt) läuft manchmal die Temperatur in die Irre:
Aktuallisierung alle 30 sekunden:
20,02
20,02
19,80
...
10,4 <-- komplett falsch
10,5
02,2 <-- geht ein paar minuten so
....
19,8 <-- jetzt wieder richtig
20,2
....
Ich habe einen gekauften Temperaturfühler als Referenz, über eine geraume Zeit stimmen die Daten +/- 1 Grad. Dann aber stimmen kurzfristig (können auch Minuten sein) die Daten überhaupt nicht, 10 Grad oder mehr Fehler, und dann kriegt er sich von alleine wieder ein.

Implementierung des 1-Wire Interface ist die Standard Implementierung von dieser Webseite. Der Effekt tritt auch auf, wenn ich die Temperatur einfach in Serial.println schreibe.

Das ganze Setup ist über ein Steckbrett verkabelt. Das Ding steht auf einem Kästchen, sonst keine elektrischen Geräte oder Wärmeerzeuger in der Nähe.

Im Netz konnte ich soweit keine Information über so ein Verhalten finden. Das ist ja ein Digitaler Sensor, entweder er geht, oder nicht, würde ich meinen. Was da auf einmal so eine Abweichung erzeugen kann??? Bin schon soweit, dass ich eine Intelegenz in die Software nehme, die Temperaturänderungen aprupt um 0,5 Grad einfach rausfiltern, aber das ist ja nicht die Idee eines Sensors...

Vielleicht habt ihr eine Idee?

Danke!
lg,
Thomas

Wenn der Sensor zuwenig Energie erhält, dann gibt er Null Grad zurück.
Versuche mal den Pull-Up Widerstand zu reduzieren und betreibe ihm wenn möglich im 3 Leitungsmodus, damit die Datenleitung nicht auch noch die Energie liefern muss.

Hallo zwanzinger,

ich würde erstmal die Funktion des Sensors mit einem Programm unter Exemples, Dallas Temperature (z.B. Tester) probieren.
Wenn da alles geht, dann liegt es nicht am Sensor.

Schönen Sonntag wünscht

Kalli

Hi,

wie hast Du den Sensor montiert? Kann evtl. Feuchtigkeit, Windzug an die Stelle kommen? Hast Du den Referenzsensor direkt daneben aufgebaut?

Springende Werte kenne ich von externen Einflüssen, also elektrisch, oder physikalisch... (kleines Beispiel war ein Orgelpfeifeneffekt, der bei einer bestimmten Windrichtung und Stärke den Sensor um + - 10° abweichen ließ, und nicht die 2000m3 Scheiße im Turm der Messung.. (Faulturm, Kläranlage))

Greetz, Linpo

Hallo,

Danke für die Kommentare.
Ich werde in jeden Fall eine möglichst einfache Testschaltung basteln, mit simplen Code, und dann das Problem noch einmal nachstellen.

Ich habe meinen Temperatursensor aussen in einem Plastikgehäuse montiert, den D18S20 nach aussen über ein Kabel geführt (drähte angelötet, an die Platine mit Steckverbinder montiert). Also habe ich natürlich Wind etc. Dachte mir dadurch wird der Fühler genauer, da er ja unmittelbarer in der Außenluft ist - ist wohl ein Trugschluss :slight_smile:

Ich werd den mal in das Gehäuse hineingeben, vielleicht wird das dann besser.

Innen ist das aber etwas anderes, da muss es einen anderen Grund geben.
Ich hab den Referenzsensor gleich daneben (auch aussen der Fall).

lg,
Thomas

Wie hast Du ihn verdrahtet? 2-Draht oder 3-Draht-Modus? Welchen Pull-Up-Widerstand hast Du an der Datenleitung?

Mir ist bereits vieles klarer:
Offenbar gibt es gewaltige Unterschiede zwischen D18S20, D18B20 und DS1820
Nur D18S20 und D18B20 haben 12-bit auflösung, der DS1820 von Conrad aber nur 9-bit

Hab mir das jetzt noch mal auf der Webseite angesehen: tatsächlich steht dort eine auflösung von 0.5 grad drauf. Auch auf den Sensor steht DS1820...

Selbst Schuld.

Das war mein Code:

char buffer[10];
OneWire ds(10);

typedef struct {
	byte data1;
	byte data2;
	byte unknown[4];
	byte countRemain;
	byte countPerCelsius;
	byte unknown2[2];
} scratchpad; 
scratchpad *sp;


void setup() {
	Serial.begin(57600);
}

float precise = -1;
float lessPrecise = -1;

float readTemp2Ways() {
	/* 1st option */
        byte i;
	byte present = 0;
	byte data[9];
	byte addr[8];

	while ( !ds.search(addr) || OneWire::crc8( addr, 7) != addr[7]) {
		ds.reset_search();
	}

	ds.reset();
	ds.select(addr);
	ds.write(0x44,1); // start conversion, with parasite power on at the end
	delay(1000);     // maybe 750ms is enough, maybe not we might do a ds.depower() here, but the reset will take care of it.
	ds.reset();
	ds.select(addr);    
	ds.write(0xBE); // Read Scratchpad

	for ( i = 0; i < 9; i++) { // we need 9 bytes
		data[i] = ds.read();
	}
	sp = reinterpret_cast<scratchpad*>(data) ;
	
	sp->data1 = sp->data1 >> 1; //drop bit 0
	//calculate the temperature based on this formula :
	//TEMPERATURE = TEMP READ - 0.25 + (COUNT PER Celsius Degree - COUNT REMAIN)
	// (COUNT PER Celsius Degree)
	precise = sp->data1 - (float)0.25 + (sp->countRemain - sp->countPerCelsius)/(float) sp->countRemain;
	
	/* second option */
	int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
	char buf[20];
	
	LowByte = data[0];
	HighByte = data[1];
	TReading = (HighByte << 8) + LowByte;
	SignBit = TReading & 0x8000;  // test most sig bit
	if (SignBit) // negative
	{
		TReading = (TReading ^ 0xffff) + 1; // 2's comp
	}
	Tc_100 = (TReading*100/2);    

	Whole = Tc_100 / 50;  // separate off the whole and fractional portions
	Fract = Tc_100 % 100;

	sprintf(buf, "%c%d.%d degree C     ",SignBit ? '-' : '+', Whole, Fract < 10 ? 0 : Fract);
	Serial.println(buf);
	
}

void loop() {
	
	readTemp2Ways();
	
	dtostrf(precise, 2, 5, buffer);
	Serial.print("precise ");
	Serial.println(buffer);
	delay(1000);
}

Die 1. einfache Variante funktioniert "rock solid", die andere springt. Manchmal sind beide Werte "plausibel", aber das ist reiner Zufall.

Wieder was gelernt. Kann man den D18B20 überhaupt vernünftig in AT/DE beziehen? Fand mit kurzem Suchen keinen Shop damit.

In jeden Fall danke für die guten Tips und für das zuhören :slight_smile:

lg,
Thomas

Nicht das S hinter dem D beim Suchen vergessen, die Sensoren heißen immer noch DS1820 (den du ja nicht willst), DS18B20 (gibts bei Watterott) und DS18S20 (z.B. bei Reichelt)

http://www.watterott.com/de/DS18B20
http://www.reichelt.de/ICs-CA-ISD-/DS-18S20/3/index.html?;ACTION=3;LA=446;ARTICLE=7207

Wie hast du den Sensor verbunden?