/* 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 #define DISPLAY_BRIGHTNESS = 500; int one_wire = 2; int led = 13; int error = 0; int digit1 = 11; //PWM Display pin 1 int digit2 = 10; //PWM Display pin 2 int digit3 = 9; //PWM Display pin 6 int digit4 = 5; //PWM Display pin 8 int dot = 6;//7 int segA = A2; //Display pin 11 int segB = A0; //Display pin 9 int segC = 3; //Display pin 12 int segD = 8; //Display pin 3 int segE = 7; //Display pin 5 int segF = 4; //Display pin 14 int segG = A1; //Display pin 10 unsigned long last_temp; int temp = 0; 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; } void displayNumber(int toDisplay) { #define DIGIT_ON HIGH #define DIGIT_OFF LOW long beginTime = millis(); for(int digit = 4 ; digit > 0 ; digit--) { //Turn on a digit for a short amount of time switch(digit) { case 1: digitalWrite(digit1, DIGIT_ON); break; case 2: digitalWrite(digit2, DIGIT_ON); break; case 3: digitalWrite(digit3, DIGIT_ON); break; case 4: digitalWrite(digit4, DIGIT_ON); break; } //Turn on the right segments for this digit lightNumber(toDisplay % 10, digit==3); toDisplay /= 10; delayMicroseconds(DISPLAY_BRIGHTNESS); //Display this digit for a fraction of a second (between 1us and 5000us, 500 is pretty good) //Turn off all segments lightNumber(10,0); //Turn off all digits digitalWrite(digit1, DIGIT_OFF); digitalWrite(digit2, DIGIT_OFF); digitalWrite(digit3, DIGIT_OFF); digitalWrite(digit4, DIGIT_OFF); } while( (millis() - beginTime) < 10) ; //Wait for 20ms to pass before we paint the display again } //Given a number, turns on those segments //If number == 10, then turn off number void lightNumber(int numberToDisplay,int dot_act) { #define SEGMENT_ON LOW #define SEGMENT_OFF HIGH if (dot_act) { digitalWrite(dot, SEGMENT_ON); } else { digitalWrite(dot, SEGMENT_OFF); } switch (numberToDisplay){ case 0: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_ON); digitalWrite(segG, SEGMENT_OFF); break; case 1: digitalWrite(segA, SEGMENT_OFF); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_OFF); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF); digitalWrite(segG, SEGMENT_OFF); break; case 2: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_OFF); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_OFF); digitalWrite(segG, SEGMENT_ON); break; case 3: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF); digitalWrite(segG, SEGMENT_ON); break; case 4: digitalWrite(segA, SEGMENT_OFF); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_OFF); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_ON); digitalWrite(segG, SEGMENT_ON); break; case 5: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_OFF); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_ON); digitalWrite(segG, SEGMENT_ON); break; case 6: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_OFF); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_ON); digitalWrite(segG, SEGMENT_ON); break; case 7: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_OFF); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF); digitalWrite(segG, SEGMENT_OFF); break; case 8: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_ON); digitalWrite(segG, SEGMENT_ON); break; case 9: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_ON); digitalWrite(segG, SEGMENT_ON); break; case 10: digitalWrite(segA, SEGMENT_OFF); digitalWrite(segB, SEGMENT_OFF); digitalWrite(segC, SEGMENT_OFF); digitalWrite(segD, SEGMENT_OFF); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF); digitalWrite(segG, SEGMENT_OFF); break; } } // 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); pinMode(segA, OUTPUT); pinMode(segB, OUTPUT); pinMode(segC, OUTPUT); pinMode(segD, OUTPUT); pinMode(segE, OUTPUT); pinMode(segF, OUTPUT); pinMode(segG, OUTPUT); pinMode(digit1, OUTPUT); pinMode(digit2, OUTPUT); pinMode(digit3, OUTPUT); pinMode(digit4, OUTPUT); pinMode(dot, OUTPUT); last_temp = millis() + 5000; pinMode(13, OUTPUT); } // the loop routine runs over and over again forever: void loop() { if ((millis() - last_temp) >= 20000) { 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) { displayNumber(temp); } error = wait_1_wire(one_wire); displayNumber(temp); 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(); } displayNumber(temp); }