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