/* Blink Turns on an LED on for one second, then off for one second, repeatedly. This example code is in the public domain. */ #define SEARCH_ROM_CMD 0xF0 #define READ_ROM_CMD 0x33 #define MATCH_ROM_CMD 0x55 #define SKIP_ROM_CMD 0xCC #define ALARM_SEARCH_CMD 0xEC #define CONVERT_CMD 0x44 #define WRITE_SCRATCHPAD_CMD 0x4E #define READ_SCRATCHPAD_CMD 0xBE #define COPY_SCRATCHPAD_CMD 0x48 #define RECALL_E2_CMD 0xB8 #define READ_POWER_SUPPLY_CMD 0xB4 int one_wire = 2; unsigned long last_temp; int temp = 0; int led = 13; int error; void report_error() { digitalWrite(led, HIGH); } int write_1_wire(int bus, unsigned char data) { unsigned char tmp = data; for (int i = 0; i < 8; i++) { pinMode(bus, OUTPUT); if ((tmp & 0x1) == 1) { // Write 1 digitalWrite(bus, LOW); delayMicroseconds(3); pinMode(bus, INPUT); } else { digitalWrite(bus, LOW); } delayMicroseconds(60); pinMode(bus, INPUT); tmp = tmp >> 1; } return 1; } int read_1_wire(int bus, unsigned char *data) { unsigned char tmp = 0, tmp_bus; int time_start, time_stop; for (int i = 0; i < 8; i++) { pinMode(bus, OUTPUT); digitalWrite(bus, LOW); delayMicroseconds(1); pinMode(bus, INPUT); tmp_bus = digitalRead(bus); if (tmp_bus == HIGH) { tmp = tmp | (1 << i); } delayMicroseconds(50); } *data = tmp; return 1; } // 1-wire init transaction int init_1_wire(int bus) { unsigned long read_time = 0, active = 0; pinMode(bus, OUTPUT); digitalWrite(bus, LOW); delayMicroseconds(500); pinMode(bus, INPUT); read_time=micros(); while((micros()-read_time) < 500) { if (digitalRead(bus) == LOW) { active = 1; } } if (active == 0) { Serial.print("No pulse sensed\r\n"); report_error(); return -1; } return 1; } int rom_1_wire_single(int bus) { unsigned char dev_id[8]; if (write_1_wire(bus,SKIP_ROM_CMD) == -1) { report_error(); return -1; } #if 0 for (int i = 0; i < 8; i++) { if(read_1_wire(bus, &dev_id[i]) == -1) { report_error(); return -1; } } for (int i = 0; i < 8; i++) { Serial.print("ID : "); Serial.print(dev_id[i], HEX); Serial.print("\r\n"); } #endif return 1; } int wait_1_wire(int bus) { int tmp = LOW; while (1){ pinMode(bus, OUTPUT); digitalWrite(bus, LOW); delayMicroseconds(1); pinMode(bus, INPUT); tmp = digitalRead(bus); if (tmp == HIGH) { break; } delayMicroseconds(60); } return 1; } // the setup routine runs once when you press reset: void setup() { // initialize the digital pin as an output. pinMode(led, OUTPUT); pinMode(one_wire, INPUT); Serial.begin(9600); last_temp = millis() + 5000; pinMode(13, OUTPUT); } // the loop routine runs over and over again forever: void loop() { if ((millis() - last_temp) >= 2000) { unsigned char scratch[9]; unsigned int tmp_int, tmp_dec; error = init_1_wire(one_wire); error = rom_1_wire_single(one_wire); error = write_1_wire(one_wire, CONVERT_CMD); last_temp = millis(); while ((millis() - last_temp) < 1000); error = wait_1_wire(one_wire); error = init_1_wire(one_wire); error = rom_1_wire_single(one_wire); error = write_1_wire(one_wire,READ_SCRATCHPAD_CMD); for (int i = 0; i < 9; i++) { read_1_wire(one_wire, &scratch[i]); } tmp_int = scratch[1]; tmp_int <<= 8; tmp_int |= scratch[0]; tmp_int >>= 4; tmp_dec = 0; if (scratch[0] & 0x8) { tmp_dec+=5000; } if (scratch[0] & 0x4) { tmp_dec+=2500; } if (scratch[0] & 0x2) { tmp_dec+=1250; } if (scratch[0] & 0x1) { tmp_dec+=625; } tmp_dec = tmp_dec / 1000; temp = tmp_int * 10 +tmp_dec; last_temp = millis(); } Serial.print("Temperature : "); Serial.print(temp); Serial.println("°C"); }