Rev Author Line No. Line
3636 kakl 1 // Lamps controller
3494 kakl 2  
3637 kakl 3 #include <OneWire.h>
4  
3636 kakl 5 #define LAG 400 // dellay in ms between lamp relay switching
3494 kakl 6  
3637 kakl 7 // Triacs
3636 kakl 8 int t1 = 2; // PD2 - trafo for gas lamps
9 int t2 = 3; // PD3 - relay for switching between lamps
10 int t3 = 4; // PD4 - halogen lamp
11 int t4 = 5; // PD5 - focuser
12 int t5 = 6; // PD6
13 int t6 = 7; // PD7
14 int t7 = 8; // PB0
15 int t8 = 9; // PB1
16  
3637 kakl 17 // DS18S20 Temperature chip
18 OneWire ds(12); // PB4 1-Wire pin (needs pull-up to Vcc)
19 byte addr[8]; // Thermometer address
3636 kakl 20  
3637 kakl 21 int n; // Counter
22 char state; // State of Gas Lamps
3494 kakl 23  
3637 kakl 24 char deleni16[16]={'0','1','1','2','3','3','4','4','5','6','6','7','7','8','9','9'};
25  
26 int temperature ()
27 {
28 int i, temp;
29 byte data[12];
30  
31 if (OneWire::crc8 (addr, 7) != addr[7])
32 {
33 Serial.print("CRC is not valid!\n");
34 return 0;
35 }
36  
37 ds.reset();
38 ds.select(addr);
39 ds.write(0x44, 1); // start conversion, with parasite power on at the end
40  
41 delay(800); // maybe 750ms is enough, maybe not
42  
43 ds.reset();
44 ds.select(addr);
45 ds.write(0xBE); // Read Scratchpad
46  
47 for ( i = 0; i < 9; i++) // we need 9 bytes
48 {
49 data[i] = ds.read();
50 }
51  
52 temp = (data[1] << 8) + data[0]; //take the two bytes from the response relating to temperature
53 // temp = temp >> 4; //divide by 16 to get pure celcius readout
54  
55 return temp;
56 }
57  
3494 kakl 58 // the setup routine runs once when you press reset:
59 void setup()
60 {
61 // initialize the digital pin as an output and switch off
3636 kakl 62 digitalWrite(t1, HIGH);
63 digitalWrite(t2, HIGH);
64 digitalWrite(t3, HIGH);
65 digitalWrite(t4, HIGH);
66 digitalWrite(t5, HIGH);
67 digitalWrite(t6, HIGH);
68 digitalWrite(t7, HIGH);
69 digitalWrite(t8, HIGH);
70 pinMode(t1, OUTPUT);
71 pinMode(t2, OUTPUT);
72 pinMode(t3, OUTPUT);
73 pinMode(t4, OUTPUT);
74 pinMode(t5, OUTPUT);
75 pinMode(t6, OUTPUT);
76 pinMode(t7, OUTPUT);
77 pinMode(t8, OUTPUT);
78 state = 'a';
3494 kakl 79  
80 // initialize the serial port
81 Serial.begin(9600);
3637 kakl 82 Serial.println();
83 Serial.println("Cvak.");
84  
85 // OneWire init
86 ds.reset_search();
87 if (!ds.search(addr)) // search for next thermometer
88 {
89 Serial.println("Thermometer error.");
90 ds.reset_search();
91 delay(250);
92 return;
93 }
94  
95 Serial.println("Hmmm....");
3494 kakl 96 }
97  
98 // the loop routine runs over and over again forever:
99 void loop()
100 {
3637 kakl 101 byte inByte; // Character from serial line
102 int t; // Temperature
3494 kakl 103  
104 if (Serial.available() > 0) // wait for a char
105 {
106 // get incoming byte:
107 inByte = Serial.read();
3636 kakl 108  
3494 kakl 109 switch (inByte)
110 {
3636 kakl 111  
112 case 'A': // Gas Lamp 1 ON
113 if (state != 'A')
3494 kakl 114 {
3636 kakl 115 digitalWrite(t1, HIGH);
3494 kakl 116 delay(LAG);
3636 kakl 117 digitalWrite(t2, LOW);
3494 kakl 118 delay(LAG);
3636 kakl 119 digitalWrite(t1, LOW);
120 state = 'A';
3494 kakl 121 }
122 break;
123  
3636 kakl 124 case 'B': // Gas Lamp 2 ON
125 if (state != 'B')
3494 kakl 126 {
3636 kakl 127 digitalWrite(t1, HIGH);
3494 kakl 128 delay(LAG);
3636 kakl 129 digitalWrite(t2, HIGH);
3494 kakl 130 delay(LAG);
3636 kakl 131 digitalWrite(t1, LOW);
132 state = 'B';
3494 kakl 133 }
134 break;
3636 kakl 135  
136 case 'a': // Gas Lamp 1 OFF
137 digitalWrite(t1, HIGH);
3494 kakl 138 delay(LAG);
3636 kakl 139 digitalWrite(t2, HIGH);
140 state = 'a';
3494 kakl 141 break;
3636 kakl 142  
143 case 'b': // Gas Lamp 2 OFF
144 digitalWrite(t1, HIGH);
145 delay(LAG);
146 digitalWrite(t2, HIGH);
147 state = 'b';
148 break;
149 }
150  
151 if ( (inByte >= 'c') and (inByte <= 'h')) // Switch OFF other triacs
152 {
153 digitalWrite(inByte-'a'+2,HIGH);
154 }
155  
156 if ( (inByte >= 'C') and (inByte <= 'H')) // Switch ON other triacs
157 {
158 digitalWrite(inByte-'A'+2, LOW);
159 }
160  
3637 kakl 161 // Send status to serial line
162 t=temperature(); // Read temperature
163 Serial.print (t >> 4);
164 Serial.print (".");
165 Serial.print (deleni16[t & 0xf]);
166 Serial.print (' ');
167 for (n=1;n<=8;n++)
3636 kakl 168 {
3637 kakl 169 if(digitalRead(n+1))
170 {
171 Serial.print('t');
172 }
173 else
174 {
175 Serial.print('T');
176 }
3636 kakl 177 Serial.print(n, DEC);
178 Serial.print(' ');
179 }
180 Serial.println();
181  
3494 kakl 182 }
3636 kakl 183 }