#include <OneWire.h>
#include <Stepper.h>
#include <Wire.h>

#define address 0x44 // A0 = L (I2C address)

const int steps = 200; //3200;  // change this to fit the number of steps


// initialize the stepper library on pins 
Stepper myStepper(steps, 9,10,11,12);           

// DS18S20 Temperature chip 
OneWire  ds(1);  // 1-Wire
byte addr[8];    // Addres

void setup() 
{
  pinMode(13, OUTPUT);  // LED
  digitalWrite(13, LOW); // LED ON

  // initialize the serial port:
  Serial.begin(9600);

  // set the speed 
  myStepper.setSpeed(8);
  
  Wire.begin(); // join i2c bus (address optional for master)

  // search for DS
  if ( !ds.search(addr)) 
  {
    ds.reset_search();
    delay(250);
    return;
  }

  if ( OneWire::crc8( addr, 7) != addr[7]) 
  {
      Serial.print("CRC is not valid!\n");
      return;
  }

}


byte sense=0;

void loop() 
{
  byte i;
  byte present = 0;
  byte data[12];
  byte inByte;
  int dd=0;
    
  // if we get a valid byte
  if (Serial.available() > 0) 
  {
    // get incoming byte:
    inByte = Serial.read();
    Serial.print("Prijat znak: ");
    Serial.print( inByte, HEX);
    Serial.println();
  }
  
  if(sense)
  {
    digitalWrite(13, LOW); // blik
    // step one revolution  in one direction:
    Serial.println("clockwise");
    myStepper.step(steps);
    delay(50);
    digitalWrite(9, LOW);
    digitalWrite(10, LOW);
    digitalWrite(11, LOW);
    digitalWrite(12, LOW);
    delay(500);
    sense=0;
  }
  else
  {      
    digitalWrite(13, HIGH);  // blik
     // step one revolution in the other direction:
    Serial.println("counterclockwise");
    myStepper.step(-steps);
    delay(50);
    digitalWrite(9, LOW);
    digitalWrite(10, LOW);
    digitalWrite(11, LOW);
    digitalWrite(12, LOW);
    delay(500); 
    sense=1;
  }
  
  // 1-Wire bus
  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // start conversion
  delay(1000);     // maybe 750ms is enough, maybe not  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

  Serial.print("P=");
  Serial.print(present,HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) // we need 9 bytes
  {           
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print( OneWire::crc8( data, 8), HEX);
  Serial.println();            

  Serial.print("Light0: COMMAND=");

  // Setup device
  Wire.beginTransmission(address); 
  Wire.send(0x00);            // sends address
  Wire.send(0b11000001);      // setup (eye light sensing; measurement range 2 [4000 lx])
  Wire.endTransmission();     // stop transmitting

  // Delay for measurement
  digitalWrite(13, HIGH);   // set the LED on
  delay(500);
  digitalWrite(13, LOW);    // set the LED off
  delay(500);


  //  Connect to device and set register address
  Wire.beginTransmission(address); 
  Wire.send(0x00);            // sends address
  Wire.endTransmission();     // stop transmitting
  //  Connect to device and request one byte
  Wire.beginTransmission(address);
  Wire.requestFrom(address, 1);
  dd = Wire.receive();
  Wire.endTransmission();     // stop transmitting
  Serial.print(dd, HEX);

  Serial.print(" LSB=");
  //  Connect to device and set register address
  Wire.beginTransmission(address); 
  Wire.send(0x01);            // sends address
  Wire.endTransmission();     // stop transmitting
  //  Connect to device and request one byte
  Wire.beginTransmission(address);
  Wire.requestFrom(address, 1);
  dd = Wire.receive();
  Wire.endTransmission();     // stop transmitting
  Serial.print(dd, HEX);

  Serial.print(" MSB=");  
  //  Connect to device and set register address
  Wire.beginTransmission(address);
  Wire.send(0x02);            // sends address
  Wire.endTransmission();     // stop transmitting
  //  Connect to device and request one byte
  Wire.beginTransmission(address);
  Wire.requestFrom(address, 1);
  dd = Wire.receive();
  Wire.endTransmission();     // stop transmitting
  Serial.print(dd, HEX);

  Serial.print("\n");

}