#include <OneWire.h>#include <Stepper.h>#include <Wire.h>/*protokol:M - motor na jednu stranum - motor na druhou stranu--a - vypni FW1A - zapni FW1--b - vypni FW2B - zapni FW2--c - vypni FW3C - zapni FW3--i - inicializace: vypni vsechny FW, vytahni motor*/#define light0 0x44 // A0 = L (I2C light0)#define light1 0x45 // A0 = H (I2C light1)int lights[] = {light0, light1};#define LAMP1 13 // Callibration Lamp 1#define LAMP2 6 // Callibration Lamp 2int lamps[] = {LAMP1, LAMP2};#define FW1 7 // [PD7 - red] Slit Wheel 1-st from light#define FW2 8 // [PB0 - yellow] Grism Wheel 2-nd from light#define FW3 3 // [PD3 - blue] Filter Wheel 3-rd from lightint filters[] = {FW1, FW2, FW3};const int steps = 3500; // change this to fit the number of stepsconst int sspeed = 10; // max. 15 // stepper motor speed// initialize the stepper library on pins#define M1 9#define M2 10#define M3 11#define M4 12Stepper myStepper(steps, M1,M2,M3,M4);// DS18S20 Temperature chipOneWire ds(5); // 1-Wire pinbyte addr[2][8]; // 2x 1-Wire Addresschar serInString[100];int serInIndx = 0;int in1, in2;void motor (int arg){myStepper.setSpeed(1);myStepper.step(arg * 10);myStepper.setSpeed(sspeed);myStepper.step(arg * steps);digitalWrite(M1, LOW);digitalWrite(M2, LOW);digitalWrite(M3, LOW);digitalWrite(M4, LOW);}int light (int arg){int LSB = 0, MSB = 0; // data from light// Setup deviceWire.beginTransmission(lights[arg]);Wire.send(0x00); // command registerWire.send(0b11000001); // setup (eye light sensing; measurement range 2 [4000 lx])Wire.endTransmission(); // stop transmitting// Delay for measurement, maybe 100ms is enough, maybe notdelay(110);// LSBWire.beginTransmission(lights[arg]);Wire.send(0x01); // sends light0Wire.endTransmission(); // stop transmitting// Connect to device and request one byteWire.beginTransmission(lights[arg]);Wire.requestFrom(lights[arg], 1);LSB = Wire.receive();Wire.endTransmission();// MSBWire.beginTransmission(lights[arg]);Wire.send(0x02); // sends light0Wire.endTransmission(); // stop transmitting// Connect to device and request one byteWire.beginTransmission(lights[arg]);Wire.requestFrom(lights[arg], 1);MSB = Wire.receive();Wire.endTransmission(); // stop transmittingreturn ((MSB << 8) + LSB);}int temperature (int arg){int i, temp;byte data[12];if (OneWire::crc8 (addr[arg], 7) != addr[arg][7]){Serial.print("CRC is not valid!\n");return 0;}ds.reset();ds.select(addr[arg]);ds.write(0x44, 1); // start conversion, with parasite power on at the enddelay(800); // maybe 750ms is enough, maybe notds.reset();ds.select(addr[arg]);ds.write(0xBE); // Read Scratchpadfor ( i = 0; i < 9; i++) // we need 9 bytes{data[i] = ds.read();}temp = (data[1] << 8) + data[0]; //take the two bytes from the response relating to temperature// temp = temp >> 4; //divide by 16 to get pure celcius readoutreturn temp;}void inicializace (){// vysune se motormotor (1);// vsechny vystupy off// digitalWrite(LAMP1, LOW);// digitalWrite(LAMP2, LOW);digitalWrite(FW1, LOW);digitalWrite(FW2, LOW);digitalWrite(FW3, LOW);}void setup(){// pinMode(LAMP1, OUTPUT);// pinMode(LAMP2, OUTPUT);pinMode(FW1, OUTPUT);pinMode(FW2, OUTPUT);pinMode(FW3, OUTPUT);pinMode(6, OUTPUT);analogWrite(6, 250);// initialize the serial port:Serial.begin(9600);Wire.begin(); // join i2c bus// OneWireds.reset_search();if (!ds.search(addr[0])) // search for next thermometer{Serial.print ("1st thermometer error.");ds.reset_search();delay(250);return;}if (!ds.search(addr[1])) // search for next thermometer{Serial.print ("2nd thermometer error.");ds.reset_search();delay(250);return;}inicializace ();}void telemetrie (){Serial.print ("FW1=");Serial.print (digitalRead (filters[0]) ? '1' : '0');Serial.print (",FW2=");Serial.print (digitalRead (filters[1]) ? '1' : '0');Serial.print (",FW3=");Serial.print (digitalRead (filters[2]) ? '1' : '0');Serial.print (",T1=");Serial.print (temperature (0) >> 4);Serial.print (".");Serial.print (temperature (0) % 16);Serial.print (",T2=");Serial.print (temperature (1) >> 4);Serial.print (".");Serial.print (temperature (1) % 16);Serial.print (",L1=");Serial.print (light (0));Serial.print (",L2=");Serial.print (light (1));Serial.println ();}void readSerialString (){serInIndx=0;do{while(Serial.available()==0);serInString[serInIndx] = Serial.read();Serial.print(serInString[serInIndx]);serInIndx++;} while ((serInString[serInIndx-1]!='\n')&&(serInString[serInIndx-1]!='.'));Serial.print("\r\n=");}void loop(){// readSerialString();if (Serial.available()){switch (Serial.read()){case 'i': // inicializaceinicializace ();telemetrie ();break;case 'm':motor (-1);telemetrie ();break;case 'M':motor (1); // vysunutotelemetrie ();break;case 'A':digitalWrite(FW1, HIGH);telemetrie ();break;case 'a':digitalWrite(FW1, LOW);telemetrie ();break;case 'B':digitalWrite(FW2, HIGH);telemetrie ();break;case 'b':digitalWrite(FW2, LOW);telemetrie ();break;case 'C':digitalWrite(FW3, HIGH);telemetrie ();break;case 'c':digitalWrite(FW3, LOW);telemetrie ();break;default:break;}Serial.flush ();// /for (serInIndx = 100; serInIndx > 0; serInIndx--)// serInString[serInIndx] = ' ';}// delay(100);}