diff --git a/strandstring/strandstring.pde b/strandstring/strandstring.pde
index ce8a96b009c0ac2205f1300c274686eeec511517..d859236bce23a6c2551d81a235d2fe03e699127f 100644
--- a/strandstring/strandstring.pde
+++ b/strandstring/strandstring.pde
@@ -115,6 +115,8 @@ void put_string(volatile unsigned char *port, unsigned char pin, char *str) {
     } while (str[index] != 0);
 }
 
+OneWire  ds(11);  // on pin 10 (a 4.7K resistor is necessary)
+
 void setup(void) {
     // Set clock divider to 1.
     CLKPR = (1 << CLKPCE);
@@ -134,15 +136,112 @@ void setup(void) {
     PORTA |= button_pin;
 }
 
-void loop() {
-    // Turn on the LED when the button is pressed.
+
+void loop(void) {
     if (PINA & button_pin) {
         // Turn off the LED.
         PORTB &= ~led_pin;
-        put_char(&serial_port, serial_pin_out, '0');
+        //put_char(&serial_port, serial_pin_out, '0');
     } else {
         PORTB |= led_pin;
-        put_char(&serial_port, serial_pin_out, '1');
+        //put_char(&serial_port, serial_pin_out, '1');
+    }
+
+    byte i;
+    byte present = 0;
+    byte type_s;
+    byte data[12];
+    byte addr[8];
+    float celsius, fahrenheit;
+
+    if ( !ds.search(addr)) {
+        put_string(&serial_port, serial_pin_out, "No more addresses.");
+        ds.reset_search();
+        delay(250);
+        return;
+    }
+
+    //Serial.print("ROM =");
+    put_string(&serial_port, serial_pin_out, "ROM=");
+    for( i = 0; i < 8; i++) {
+        put_char(&serial_port, serial_pin_out, ' ');
+        //Serial.print(addr[i], HEX);
+        put_string(&serial_port, serial_pin_out, "xxx");
+        //put_string(&serial_port, serial_pin_out, addr[i])
+    }
+
+    if (OneWire::crc8(addr, 7) != addr[7]) {
+        put_string(&serial_port, serial_pin_out, "CRC is not valid!");
+        return;
+    }
+    //Serial.println();
+
+    // the first ROM byte indicates which chip
+    switch (addr[0]) {
+        case 0x10:
+        put_string(&serial_port, serial_pin_out, "  Chip = DS18S20");  // or old DS1820
+        type_s = 1;
+        break;
+        case 0x28:
+        put_string(&serial_port, serial_pin_out, "  Chip = DS18B20");
+        type_s = 0;
+        break;
+        case 0x22:
+        put_string(&serial_port, serial_pin_out, "  Chip = DS1822");
+        type_s = 0;
+        break;
+        default:
+        put_string(&serial_port, serial_pin_out, "Device is not a DS18x20 family device.");
+        return;
+    }
+
+    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.
+
+    present = ds.reset();
+    ds.select(addr);
+    ds.write(0xBE);         // Read Scratchpad
+
+    put_string(&serial_port, serial_pin_out, "  Data = ");
+    put_string(&serial_port, serial_pin_out, "xxx");
+    //put_string(&serial_port, serial_pin_out, present, HEX);
+    put_string(&serial_port, serial_pin_out, " ");
+    for ( i = 0; i < 9; i++) {           // we need 9 bytes
+        data[i] = ds.read();
+        //Serial.print(data[i], HEX);
+        put_string(&serial_port, serial_pin_out, " thing");
+    }
+    put_string(&serial_port, serial_pin_out, " CRC=");
+    //put_string(&serial_port, serial_pin_out, OneWire::crc8(data, 8), HEX);
+
+    // Convert the data to actual temperature
+    // because the result is a 16 bit signed integer, it should
+    // be stored to an "int16_t" type, which is always 16 bits
+    // even when compiled on a 32 bit processor.
+    int16_t raw = (data[1] << 8) | data[0];
+    if (type_s) {
+        raw = raw << 3; // 9 bit resolution default
+        if (data[7] == 0x10) {
+            // "count remain" gives full 12 bit resolution
+            raw = (raw & 0xFFF0) + 12 - data[6];
+        }
+    } else {
+        byte cfg = (data[4] & 0x60);
+        // at lower res, the low bits are undefined, so let's zero them
+        if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
+        else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
+        else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
+        //// default is 12 bit resolution, 750 ms conversion time
     }
-    _delay_us(10000);
+    celsius = (float)raw / 16.0;
+    fahrenheit = celsius * 1.8 + 32.0;
+    put_string(&serial_port, serial_pin_out, "  Temperature = ");
+    //put_string(&serial_port, serial_pin_out, celsius);
+    put_string(&serial_port, serial_pin_out, " Celsius, ");
+    //put_string(&serial_port, serial_pin_out, fahrenheit);
+    put_string(&serial_port, serial_pin_out, " Fahrenheit");
 }