Das 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>“