Temperatur messen – DS18(S)20

DS18S20Das messen der Temperatur mit einem DS18S20 ist sehr einfach da er die Temperatur digital per 1-Wire sendet.

Hier ein Schaltplan der einen DS18(S)20 ansteuert bzw. ausliest und seine Daten per RS232 und am LC-Display ausgibt.

Im moment nur als PDF – ein Bild folgt.
Atmega328-DS18S20-MAX232

 

 

Da ich es mit dem Arduino-Framework gemacht habe hier der Code aka Sketch:

#include <LiquidCrystal.h>
#include <OneWire.h>

LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
OneWire  ds(9);

void setup(void)
{
	Serial.begin(19200);
	lcd.begin(16, 2);
	lcd.print("Temperatur");
	delay(1000);
}

void loop(void)
{
	byte i=0,t=0;
	byte present = 0;
	byte type_s=1;
	byte data[12];
	byte addr[8];
	float celsius;
	float grad[16];
	int z=0;
	int tr;

	while ( ds.search(addr))
	{
		ds.reset();
		ds.select(addr);
		ds.write(0x44);

		delay(100);
		present = ds.reset();
		ds.select(addr);
		ds.write(0xBE);

		for ( i = 0; i < 9; i++)
		{
			data[i] = ds.read();
		}

		tr = data[0];
		if (data[1] > 0x80)
		{
			tr = !tr + 1;
			tr = tr * -1;
		}
		int cpc = data[7];
		int cr = data[6];

		tr = tr >> 1;

		celsius=tr - (float)0.25 + (cpc - cr)/(float)cpc;
		grad[t]=celsius;

		z=0;
		while(z < sizeof(addr))
		{
			Serial.print(addr[z],HEX);
			z++;
		}
			Serial.print(";");
			Serial.print(celsius);
			Serial.println();
			t++;
	}

	unsigned int tmp=0;
	for(i=0;i<t;i++)
	{
		if(i==0)
		{
			tmp=1;
			lcd.clear();
			lcd.setCursor(0, 0);
		}
		if(i==1)
		{
			lcd.setCursor(0,1);
		}
		lcd.print("Sensor: ");
		lcd.print(tmp);
		lcd.print(" ");
		lcd.print(grad[i]);
		lcd.print(" C");
		tmp++;
	}

	ds.reset_search();
	delay(800);
}

 

Die Ausgabe auf der RS232 ist im Format „<SensorID>;<Temperatur><\nl>“