diff --git a/Makefile b/Makefile
index 057495815c5939f7004d4f1ca1e7120c1956a6ab..b744a84c63de21c2abc9d5c4e2869d90724e4f9b 100644
--- a/Makefile
+++ b/Makefile
@@ -13,23 +13,34 @@
 
 MMCU=attiny44
 F_CPU = 20000000
-CFLAGS=-mmcu=$(MMCU) -Wall -Os -DF_CPU=$(F_CPU)
+CFLAGS=-mmcu=$(MMCU) -Wall -Os -DF_CPU=$(F_CPU) \
+	-I external/OneWire \
+	-I /usr/share/arduino/hardware/arduino/cores/arduino
 #PROGRAMMER = atmelice_isp
 PROGRAMMER = usbtiny
 
-%.hex: %.out
+%.hex: %.elf
 	avr-objcopy -O ihex $< $@;\
 	avr-size --mcu=$(MMCU) --format=avr $@
- 
-%.out: %.c
-	avr-gcc $(CFLAGS) -I./ -o $@ $<
- 
+
+#%.o: %.c
+#	avr-g++ $(CFLAGS) -I./ -o $@ $<
+
 program_%: %.hex
 	avrdude -p t44 -P usb -c $(PROGRAMMER) -U flash:w:$<
 
+external/OneWire/OneWire.o: external/OneWire/OneWire.cpp external/OneWire/OneWire.h
+	avr-g++ -c $(CFLAGS) -I./ -o $@ $<
+
+button_serial.o: button_serial.c external/OneWire/OneWire.h
+	avr-g++ -c $(CFLAGS) -I./ -o $@ $<
+
+button_serial.elf: button_serial.o OneWire.o
+	avr-g++ $(CFLAGS) -o $@ $^
+
 .PHONY: default
-default: program_button_serial
+#default: program_button_serial
+default: button_serial.hex
 
 program-fuses:
 	avrdude -p t44 -P usb -c $(PROGRAMMER) -U lfuse:w:0x5E:m
-
diff --git a/button_serial.c b/button_serial.c
index a8550503768203d30030895bdd38011d379f6644..f1547a4612b46b7a2639b96c1244a82dce224aa1 100644
--- a/button_serial.c
+++ b/button_serial.c
@@ -16,6 +16,8 @@
 #include <util/delay.h>
 #include <avr/pgmspace.h>
 
+#include "OneWire.h"
+
 #define output(directions,pin) (directions |= pin) // set port direction for output
 #define set(port,pin) (port |= pin) // set port pin
 #define clear(port,pin) (port &= (~pin)) // clear port pin
@@ -25,6 +27,7 @@
 #define bit_delay() _delay_us(bit_delay_time) // RS232 bit delay
 #define half_bit_delay() _delay_us(bit_delay_time/2) // RS232 half bit delay
 #define char_delay() _delay_ms(10) // char delay
+#define delay(duration) _delay_ms(duration); // drop-in replacement for Arduino delay
 
 #define serial_port PORTA
 #define serial_direction DDRA
@@ -50,44 +53,44 @@ void put_char(volatile unsigned char *port, unsigned char pin, char txchar) {
     // unrolled loop to write data bits
     //
     if bit_test(txchar,0)
-        set(*port,pin);
+    set(*port,pin);
     else
-        clear(*port,pin);
+    clear(*port,pin);
     bit_delay();
     if bit_test(txchar,1)
-        set(*port,pin);
+    set(*port,pin);
     else
-        clear(*port,pin);
+    clear(*port,pin);
     bit_delay();
     if bit_test(txchar,2)
-        set(*port,pin);
+    set(*port,pin);
     else
-        clear(*port,pin);
+    clear(*port,pin);
     bit_delay();
     if bit_test(txchar,3)
-        set(*port,pin);
+    set(*port,pin);
     else
-        clear(*port,pin);
+    clear(*port,pin);
     bit_delay();
     if bit_test(txchar,4)
-        set(*port,pin);
+    set(*port,pin);
     else
-        clear(*port,pin);
+    clear(*port,pin);
     bit_delay();
     if bit_test(txchar,5)
-        set(*port,pin);
+    set(*port,pin);
     else
-        clear(*port,pin);
+    clear(*port,pin);
     bit_delay();
     if bit_test(txchar,6)
-        set(*port,pin);
+    set(*port,pin);
     else
-        clear(*port,pin);
+    clear(*port,pin);
     bit_delay();
     if bit_test(txchar,7)
-        set(*port,pin);
+    set(*port,pin);
     else
-        clear(*port,pin);
+    clear(*port,pin);
     bit_delay();
     //
     // stop bit
@@ -112,6 +115,112 @@ 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) {
+//    Serial.begin(9600);
+//}
+
+void loop(void) {
+    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
+    }
+    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");
+}
+
 int main(void) {
     // Set clock divider to 1.
     CLKPR = (1 << CLKPCE);
@@ -135,12 +244,12 @@ int main(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');
         }
-        _delay_us(10000);
+        //_delay_us(10000);
+        loop();
     }
 }
-