Rev 2090 Rev 2091
1 #include <OneWire.h> 1 #include <OneWire.h>
2 #include <Stepper.h> 2 #include <Stepper.h>
3 #include <Wire.h> 3 #include <Wire.h>
4   4  
5 /* 5 /*
6   6  
7 protokol: 7 protokol:
8   8  
9 M - motor na jednu stranu 9 M - motor na jednu stranu
10 m - motor na druhou stranu 10 m - motor na druhou stranu
11 -- 11 --
12 a - vypni FW1 12 a - vypni FW1
13 A - zapni FW1 13 A - zapni FW1
14 -- 14 --
15 b - vypni FW2 15 b - vypni FW2
16 B - zapni FW2 16 B - zapni FW2
17 -- 17 --
18 c - vypni FW3 18 c - vypni FW3
19 C - zapni FW3 19 C - zapni FW3
20 -- 20 --
21 i - inicializace: vypni vsechny FW, vytahni motor 21 i - inicializace: vypni vsechny FW, vytahni motor
22   22  
23 */ 23 */
24   24  
25 #define light0 0x44 // A0 = L (I2C light0) 25 #define light0 0x44 // A0 = L (I2C light0)
26 #define light1 0x45 // A0 = H (I2C light1) 26 #define light1 0x45 // A0 = H (I2C light1)
27   27  
28 int lights[] = {light0, light1}; 28 int lights[] = {light0, light1};
29   29  
30 #define LAMP1 13 // Callibration Lamp 1 30 #define LAMP1 13 // Callibration Lamp 1
31 #define LAMP2 6 // Callibration Lamp 2 31 #define LAMP2 6 // Callibration Lamp 2
32   32  
33 int lamps[] = {LAMP1, LAMP2}; 33 int lamps[] = {LAMP1, LAMP2};
34   34  
35 #define FW1 7 // [PD7 - red] Slit Wheel 1-st from light 35 #define FW1 7 // [PD7 - red] Slit Wheel 1-st from light
36 #define FW2 8 // [PB0 - yellow] Grism Wheel 2-nd from light 36 #define FW2 8 // [PB0 - yellow] Grism Wheel 2-nd from light
37 #define FW3 3 // [PD3 - blue] Filter Wheel 3-rd from light 37 #define FW3 3 // [PD3 - blue] Filter Wheel 3-rd from light
38   38  
39 int filters[] = {FW1, FW2, FW3}; 39 int filters[] = {FW1, FW2, FW3};
40   40  
41 const int steps = 3500; // change this to fit the number of steps 41 const int steps = 3500; // change this to fit the number of steps
42 const int sspeed = 10; // max. 15 // stepper motor speed 42 const int sspeed = 10; // max. 15 // stepper motor speed
43   43  
44 // initialize the stepper library on pins 44 // initialize the stepper library on pins
45 #define M1 9 45 #define M1 9
46 #define M2 10 46 #define M2 10
47 #define M3 11 47 #define M3 11
48 #define M4 12 48 #define M4 12
49 Stepper myStepper(steps, M1,M2,M3,M4); 49 Stepper myStepper(steps, M1,M2,M3,M4);
50   50  
51 // DS18S20 Temperature chip 51 // DS18S20 Temperature chip
52 OneWire ds(5); // 1-Wire pin 52 OneWire ds(5); // 1-Wire pin
53 byte addr[2][8]; // 2x 1-Wire Address 53 byte addr[2][8]; // 2x 1-Wire Address
54   54  
55 char serInString[100]; 55 char serInString[100];
56 int serInIndx = 0; 56 int serInIndx = 0;
57 int in1, in2; 57 int in1, in2;
58   58  
59 void motor (int arg) 59 void motor (int arg)
60 { 60 {
61 myStepper.setSpeed(1); 61 myStepper.setSpeed(1);
62 myStepper.step(arg * 10); 62 myStepper.step(arg * 10);
63 myStepper.setSpeed(sspeed); 63 myStepper.setSpeed(sspeed);
64 myStepper.step(arg * steps); 64 myStepper.step(arg * steps);
65 digitalWrite(M1, LOW); 65 digitalWrite(M1, LOW);
66 digitalWrite(M2, LOW); 66 digitalWrite(M2, LOW);
67 digitalWrite(M3, LOW); 67 digitalWrite(M3, LOW);
68 digitalWrite(M4, LOW); 68 digitalWrite(M4, LOW);
69 } 69 }
70   70  
71 int light (int arg) 71 int light (int arg)
72 { 72 {
73 int LSB = 0, MSB = 0; // data from light 73 int LSB = 0, MSB = 0; // data from light
74 74
75 // Setup device 75 // Setup device
76 Wire.beginTransmission(lights[arg]); 76 Wire.beginTransmission(lights[arg]);
77 Wire.send(0x00); // command register 77 Wire.send(0x00); // command register
78 Wire.send(0b11000001); // setup (eye light sensing; measurement range 2 [4000 lx]) 78 Wire.send(0b11000001); // setup (eye light sensing; measurement range 2 [4000 lx])
79 Wire.endTransmission(); // stop transmitting 79 Wire.endTransmission(); // stop transmitting
80   80  
81 // Delay for measurement, maybe 100ms is enough, maybe not 81 // Delay for measurement, maybe 100ms is enough, maybe not
82 delay(110); 82 delay(110);
83   83  
84 // LSB 84 // LSB
85 Wire.beginTransmission(lights[arg]); 85 Wire.beginTransmission(lights[arg]);
86 Wire.send(0x01); // sends light0 86 Wire.send(0x01); // sends light0
87 Wire.endTransmission(); // stop transmitting 87 Wire.endTransmission(); // stop transmitting
88 // Connect to device and request one byte 88 // Connect to device and request one byte
89 Wire.beginTransmission(lights[arg]); 89 Wire.beginTransmission(lights[arg]);
90 Wire.requestFrom(lights[arg], 1); 90 Wire.requestFrom(lights[arg], 1);
91 LSB = Wire.receive(); 91 LSB = Wire.receive();
92 Wire.endTransmission(); 92 Wire.endTransmission();
93 93
94 // MSB 94 // MSB
95 Wire.beginTransmission(lights[arg]); 95 Wire.beginTransmission(lights[arg]);
96 Wire.send(0x02); // sends light0 96 Wire.send(0x02); // sends light0
97 Wire.endTransmission(); // stop transmitting 97 Wire.endTransmission(); // stop transmitting
98 // Connect to device and request one byte 98 // Connect to device and request one byte
99 Wire.beginTransmission(lights[arg]); 99 Wire.beginTransmission(lights[arg]);
100 Wire.requestFrom(lights[arg], 1); 100 Wire.requestFrom(lights[arg], 1);
101 MSB = Wire.receive(); 101 MSB = Wire.receive();
102 Wire.endTransmission(); // stop transmitting 102 Wire.endTransmission(); // stop transmitting
103 103
104 return ((MSB << 8) + LSB); 104 return ((MSB << 8) + LSB);
105 } 105 }
106   106  
107 int temperature (int arg) 107 int temperature (int arg)
108 { 108 {
109 int i, temp; 109 int i, temp;
110 byte data[12]; 110 byte data[12];
111 111
112 if (OneWire::crc8 (addr[arg], 7) != addr[arg][7]) 112 if (OneWire::crc8 (addr[arg], 7) != addr[arg][7])
113 { 113 {
114 Serial.print("CRC is not valid!\n"); 114 Serial.print("CRC is not valid!\n");
115 return 0; 115 return 0;
116 } 116 }
117 117
118 ds.reset(); 118 ds.reset();
119 ds.select(addr[arg]); 119 ds.select(addr[arg]);
120 ds.write(0x44, 1); // start conversion, with parasite power on at the end 120 ds.write(0x44, 1); // start conversion, with parasite power on at the end
121 121
122 delay(800); // maybe 750ms is enough, maybe not 122 delay(800); // maybe 750ms is enough, maybe not
123 123
124 ds.reset(); 124 ds.reset();
125 ds.select(addr[arg]); 125 ds.select(addr[arg]);
126 ds.write(0xBE); // Read Scratchpad 126 ds.write(0xBE); // Read Scratchpad
127 127
128 for ( i = 0; i < 9; i++) // we need 9 bytes 128 for ( i = 0; i < 9; i++) // we need 9 bytes
129 { 129 {
130 data[i] = ds.read(); 130 data[i] = ds.read();
131 } 131 }
132 132
133 temp = (data[1] << 8) + data[0]; //take the two bytes from the response relating to temperature 133 temp = (data[1] << 8) + data[0]; //take the two bytes from the response relating to temperature
134 // temp = temp >> 4; //divide by 16 to get pure celcius readout 134 // temp = temp >> 4; //divide by 16 to get pure celcius readout
135 135
136 return temp; 136 return temp;
137 } 137 }
138   138  
139 void inicializace () 139 void inicializace ()
140 { 140 {
141 // vysune se motor 141 // vysune se motor
142 motor (1); 142 motor (1);
143 // vsechny vystupy off 143 // vsechny vystupy off
144 // digitalWrite(LAMP1, LOW); 144 // digitalWrite(LAMP1, LOW);
145 // digitalWrite(LAMP2, LOW); 145 // digitalWrite(LAMP2, LOW);
146 digitalWrite(FW1, LOW); 146 digitalWrite(FW1, LOW);
147 digitalWrite(FW2, LOW); 147 digitalWrite(FW2, LOW);
148 digitalWrite(FW3, LOW); 148 digitalWrite(FW3, LOW);
149 } 149 }
150   150  
151 void setup() 151 void setup()
152 { 152 {
153 // pinMode(LAMP1, OUTPUT); 153 // pinMode(LAMP1, OUTPUT);
154 // pinMode(LAMP2, OUTPUT); 154 // pinMode(LAMP2, OUTPUT);
155 pinMode(FW1, OUTPUT); 155 pinMode(FW1, OUTPUT);
156 pinMode(FW2, OUTPUT); 156 pinMode(FW2, OUTPUT);
157 pinMode(FW3, OUTPUT); 157 pinMode(FW3, OUTPUT);
158   158  
159 pinMode(6, OUTPUT); 159 pinMode(6, OUTPUT);
160 analogWrite(6, 250); 160 analogWrite(6, 250);
161 161
162 // initialize the serial port: 162 // initialize the serial port:
163 Serial.begin(9600); 163 Serial.begin(9600);
164 164
165 Wire.begin(); // join i2c bus 165 Wire.begin(); // join i2c bus
166 166
167 // OneWire 167 // OneWire
168 ds.reset_search(); 168 ds.reset_search();
169 if (!ds.search(addr[0])) // search for next thermometer 169 if (!ds.search(addr[0])) // search for next thermometer
170 { 170 {
171 Serial.print ("1st thermometer error."); 171 Serial.print ("1st thermometer error.");
172 ds.reset_search(); 172 ds.reset_search();
173 delay(250); 173 delay(250);
174 return; 174 return;
175 } 175 }
176 if (!ds.search(addr[1])) // search for next thermometer 176 if (!ds.search(addr[1])) // search for next thermometer
177 { 177 {
178 Serial.print ("2nd thermometer error."); 178 Serial.print ("2nd thermometer error.");
179 ds.reset_search(); 179 ds.reset_search();
180 delay(250); 180 delay(250);
181 return; 181 return;
182 } 182 }
183 183
184 inicializace (); 184 inicializace ();
185 } 185 }
186   186  
187 void telemetrie () 187 void telemetrie ()
188 { 188 {
189 Serial.print ("FW1="); 189 Serial.print ("FW1=");
190 Serial.print (digitalRead (filters[0]) ? '1' : '0'); 190 Serial.print (digitalRead (filters[0]) ? '1' : '0');
191 Serial.print (",FW2="); 191 Serial.print (",FW2=");
192 Serial.print (digitalRead (filters[1]) ? '1' : '0'); 192 Serial.print (digitalRead (filters[1]) ? '1' : '0');
193 Serial.print (",FW3="); 193 Serial.print (",FW3=");
194 Serial.print (digitalRead (filters[2]) ? '1' : '0'); 194 Serial.print (digitalRead (filters[2]) ? '1' : '0');
195 Serial.print (",T1="); 195 Serial.print (",T1=");
196 Serial.print (temperature (0) >> 4); 196 Serial.print (temperature (0) >> 4);
197 Serial.print ("."); 197 Serial.print (".");
198 Serial.print (temperature (0) % 16); 198 Serial.print (temperature (0) % 16);
199 Serial.print (",T2="); 199 Serial.print (",T2=");
200 Serial.print (temperature (1) >> 4); 200 Serial.print (temperature (1) >> 4);
201 Serial.print ("."); 201 Serial.print (".");
202 Serial.print (temperature (1) % 16); 202 Serial.print (temperature (1) % 16);
203 Serial.print (",L1="); 203 Serial.print (",L1=");
204 Serial.print (light (0)); 204 Serial.print (light (0));
205 Serial.print (",L2="); 205 Serial.print (",L2=");
206 Serial.print (light (1)); 206 Serial.print (light (1));
207 Serial.println (); 207 Serial.println ();
208 } 208 }
209   209  
210 void readSerialString () 210 void readSerialString ()
211 { 211 {
212 serInIndx=0; 212 serInIndx=0;
213 do 213 do
214 { 214 {
215 while(Serial.available()==0); 215 while(Serial.available()==0);
216 serInString[serInIndx] = Serial.read(); 216 serInString[serInIndx] = Serial.read();
217 Serial.print(serInString[serInIndx]); 217 Serial.print(serInString[serInIndx]);
218 serInIndx++; 218 serInIndx++;
219 } while ((serInString[serInIndx-1]!='\n')&&(serInString[serInIndx-1]!='.')); 219 } while ((serInString[serInIndx-1]!='\n')&&(serInString[serInIndx-1]!='.'));
220 Serial.print("\r\n="); 220 Serial.print("\r\n=");
221 } 221 }
222   222  
223 void loop() 223 void loop()
224 { 224 {
225 // readSerialString(); 225 // readSerialString();
226 226
227 if (Serial.available()) 227 if (Serial.available())
228 { 228 {
229 switch (Serial.read()) 229 switch (Serial.read())
230 { 230 {
231 case 'i': // inicializace 231 case 'i': // inicializace
232 inicializace (); 232 inicializace ();
233 telemetrie (); -  
234 break; 233 break;
235 case 'm': 234 case 'm':
236 motor (-1); 235 motor (-1);
237 telemetrie (); -  
238 break; 236 break;
239 case 'M': 237 case 'M':
240 motor (1); // vysunuto 238 motor (1); // vysunuto
241 telemetrie (); -  
242 break; 239 break;
243 case 'A': 240 case 'A':
244 digitalWrite(FW1, HIGH); 241 digitalWrite(FW1, HIGH);
245 telemetrie (); -  
246 break; 242 break;
247 case 'a': 243 case 'a':
248 digitalWrite(FW1, LOW); 244 digitalWrite(FW1, LOW);
249 telemetrie (); -  
250 break; 245 break;
251 case 'B': 246 case 'B':
252 digitalWrite(FW2, HIGH); 247 digitalWrite(FW2, HIGH);
253 telemetrie (); -  
254 break; 248 break;
255 case 'b': 249 case 'b':
256 digitalWrite(FW2, LOW); 250 digitalWrite(FW2, LOW);
257 telemetrie (); -  
258 break; 251 break;
259 case 'C': 252 case 'C':
260 digitalWrite(FW3, HIGH); 253 digitalWrite(FW3, HIGH);
261 telemetrie (); -  
262 break; 254 break;
263 case 'c': 255 case 'c':
264 digitalWrite(FW3, LOW); 256 digitalWrite(FW3, LOW);
265 telemetrie (); -  
266 break; -  
267 default: -  
268 break; 257 break;
269 } 258 }
-   259 telemetrie ();
270 Serial.flush (); 260 Serial.flush ();
271 // /for (serInIndx = 100; serInIndx > 0; serInIndx--) 261 // /for (serInIndx = 100; serInIndx > 0; serInIndx--)
272 // serInString[serInIndx] = ' '; 262 // serInString[serInIndx] = ' ';
273 } 263 }
274 264
275 // delay(100); 265 // delay(100);
276 } 266 }