// #define LED_PIN 3
// void setup() {
//   pinMode(LED_PIN, OUTPUT);
//   Serial.begin(115200);
// }
// void loop() {
//   static int cnt;
//   Serial.println(cnt++);
//   digitalWrite(LED_PIN, HIGH);
//   delay(1000);
//   digitalWrite(LED_PIN, LOW);
//   delay(1000);
// }
#include <OneWire.h>
OneWire  ds(10);  // on pin 10
void setup(void) {
  Serial.begin(115200);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  digitalWrite(2, HIGH);
}
void loop(void) {
  static bool cycle;
  // static int cnt;
  // byte i;
  // byte present = 0;
  // byte data[12];
  uint8_t scratch[9];       
  byte addr[8] = {0x9F, 0x9D, 0x87, 0x67, 0x99, 0xC4, 0xF7, 0x07};
  
  digitalWrite(3, cycle ? HIGH : LOW);
  cycle = !cycle;
  Serial.println(cycle ? "." : "+");
  delay(5);
  // return;
  if ( !ds.search(addr)) {
    Serial.print("No more addresses.\n");
    ds.reset_search();
    return;
  }
  Serial.print("found device!\n");
  ds.reset_search();
  delay(1);
  Serial.print(millis()); Serial.print(" resetting device before write\n");
  ds.reset();
  delay(2);
  Serial.print(millis()); Serial.print(" skipping device\n");
  ds.skip();
  delay(3);
// ds.select(addr);
  Serial.print(millis()); Serial.print(" writing scratchpad.\n");
  ds.write(0x4E);         
  ds.write(0x37);         
  ds.write(0x89);         
  ds.write(0x13);         
  delay(1);
  Serial.print(millis()); Serial.print(" resetting device before read\n");
  ds.reset();
  Serial.print(millis()); Serial.print(" skipping device\n");
  ds.skip();
  delay(1);
  Serial.print(millis()); Serial.print(" reading scratchpad.\n");
  ds.write(0xBE);         
  for (int i=0; i<9;i++){
    uint8_t b = ds.read();
    Serial.print("read byte "); Serial.print(1); Serial.print(", received: "); Serial.println(b,HEX);
  }
  Serial.print(millis());  Serial.print(" reading scratchpad done.\n");
  delay(1);
  Serial.print(millis()); Serial.print(" resetting device before read\n");
  ds.reset();
  Serial.print(millis()); Serial.print(" reading rom.\n");
  ds.write(0x33);  
  uint8_t rom[8];       
  for (int i=0; i<8;i++){
    uint8_t b = ds.read();
    Serial.print("read rom byte "); Serial.print(1); Serial.print(", received: "); Serial.println(b,HEX);
  }
  bool match = memcmp(rom, addr, 8);
  Serial.print(millis());  Serial.print(" reading done done. addr match: "); Serial.println(match);
  Serial.print(millis()); Serial.print(" writing scratchpad.\n");
  ds.write(0x4E);         
  ds.write(0x73);         
  ds.write(0x54);         
  ds.write(0x87);         
  delay(1);
  Serial.print(millis()); Serial.print(" resetting device before select & convert\n");
  ds.reset();
  Serial.print(millis()); Serial.print(" selecting rom.\n");
  ds.select(addr);
  Serial.print(millis()); Serial.print(" converting.\n");
  ds.write(0x44);  
  Serial.print(millis()); Serial.print(" converted.\n");
  delay(1);
  Serial.print(millis()); Serial.print(" resetting device before select & read\n");
  ds.reset();
  Serial.print(millis()); Serial.print(" selecting rom.\n");
  ds.select(addr);
  Serial.print(millis()); Serial.print(" reading scratchpad.\n");
  ds.write(0xBE);  
  for (int i=0; i<9;i++){
    uint8_t b = ds.read();
    Serial.print("read rom byte "); Serial.print(1); Serial.print(", received: "); Serial.println(b,HEX);
  }
  delay(1);
  Serial.print(millis()); Serial.print(" resetting device before select & copy scratch pad\n");
  ds.reset();
  Serial.print(millis()); Serial.print(" selecting rom.\n");
  ds.select(addr);
  Serial.print(millis()); Serial.print(" copying scratchpad.\n");
  ds.write(0x48);  
  Serial.print(millis()); Serial.print(" resetting device before select & recall pad\n");
  ds.reset();
  ds.skip();
  ds.write(0xB8);  
  bool bit = ds.read_bit();
  Serial.print(millis());  Serial.print(" recall done: "); Serial.println(bit);
  Serial.print(millis()); Serial.print(" resetting device before select & read after recall\n");
  ds.reset();
  ds.skip();
  ds.write(0xBE);  
  for (int i=0; i<9;i++){
    uint8_t b = ds.read();
    Serial.print("read rom byte "); Serial.print(1); Serial.print(", received: "); Serial.println(b,HEX);
  }
  Serial.println("===================");
  delay(5000);
}