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