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"); }