// Lamps controller
#define VERSION "$Revision: 3653 $"
#include <OneWire.h>
#include <EEPROM.h>
#define LAG 400 // dellay in ms between lamp relay switching
// Triacs
int t1 = 2; // PD2 - trafo for gas lamps
int t2 = 3; // PD3 - relay for switching between lamps
int t3 = 4; // PD4 - halogen lamp
int t4 = 5; // PD5 - focuser
int t5 = 6; // PD6 - COLORES
int t6 = 7; // PD7
int t7 = 8; // PB0
int t8 = 9; // PB1
// DS18S20 Temperature chip
OneWire ds(12); // PB4 1-Wire pin (needs pull-up to Vcc)
byte addr[8]; // Thermometer address
int n; // Counter
char state; // State of Gas Lamps
char deleni16[16]={'0','1','1','2','3','3','4','4','5','6','6','7','7','8','9','9'};
void info () // Print an information string
{
Serial.print("Lamps Controller ");
Serial.println(VERSION);
Serial.println("Commands: abcdefghABCDEFGHiRS");
Serial.println("t1=a t2=b ... t8=h");
Serial.println("a = OFF t1 / A = ON t1");
Serial.println("i = info");
Serial.println("R = reset");
Serial.println("S = store to EEPROM");
}
int temperature () // Read temperature from Dallas
{
int i, temp;
byte data[12];
if (OneWire::crc8 (addr, 7) != addr[7])
{
Serial.print("CRC is not valid!\n");
return 0;
}
ds.reset();
ds.select(addr);
ds.write(0x44, 1); // start conversion, with parasite power on at the end
delay(800); // maybe 750ms is enough, maybe not
ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for ( 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 readout
return temp;
}
void pstatus() // Print status to serial line
{
int t; // Temperature
t=temperature(); // Read temperature
Serial.print (t >> 4);
Serial.print (".");
Serial.print (deleni16[t & 0xf]);
Serial.print (' ');
for (n=1;n<=8;n++)
{
if(digitalRead(n+1))
{
Serial.print((char)('a'+n-1));
}
else
{
Serial.print((char)('A'+n-1));
}
}
Serial.print(' ');
for (n=1;n<=8;n++)
{
if(EEPROM.read(n))
{
Serial.print((char)('a'+n-1));
}
else
{
Serial.print((char)('A'+n-1));
}
}
Serial.println();
}
// the setup routine runs once when you press reset:
void setup()
{
// initialize the digital pin as an output and switch off
digitalWrite(t1, HIGH);
digitalWrite(t2, HIGH);
digitalWrite(t3, HIGH);
digitalWrite(t4, HIGH);
digitalWrite(t5, HIGH);
digitalWrite(t6, HIGH);
digitalWrite(t7, HIGH);
digitalWrite(t8, HIGH);
pinMode(t1, OUTPUT);
pinMode(t2, OUTPUT);
pinMode(t3, OUTPUT);
pinMode(t4, OUTPUT);
pinMode(t5, OUTPUT);
pinMode(t6, OUTPUT);
pinMode(t7, OUTPUT);
pinMode(t8, OUTPUT);
state = 'a';
// initialize the serial port
Serial.begin(9600);
Serial.println();
Serial.println("Cvak.");
// OneWire init
ds.reset_search();
if (!ds.search(addr)) // search for next thermometer
{
Serial.println("Thermometer error.");
ds.reset_search();
delay(250);
return;
}
for (n=1;n<=8;n++)
{
digitalWrite(n+1,EEPROM.read(n)); // Read saved states from EEPROM
}
Serial.println("Hmmm....");
info();
pstatus();
}
// the loop routine runs over and over again forever:
void loop()
{
byte inByte; // Character from serial line
if (Serial.available() > 0) // wait for a char
{
// get incoming byte:
inByte = Serial.read();
switch (inByte)
{
case 'A': // Gas Lamp 1 ON
if (state != 'A')
{
digitalWrite(t1, HIGH);
delay(LAG);
digitalWrite(t2, LOW);
delay(LAG);
digitalWrite(t1, LOW);
state = 'A';
}
break;
case 'B': // Gas Lamp 2 ON
if (state != 'B')
{
digitalWrite(t1, HIGH);
delay(LAG);
digitalWrite(t2, HIGH);
delay(LAG);
digitalWrite(t1, LOW);
state = 'B';
}
break;
case 'a': // Gas Lamp 1 OFF
digitalWrite(t1, HIGH);
delay(LAG);
digitalWrite(t2, HIGH);
state = 'a';
break;
case 'b': // Gas Lamp 2 OFF
digitalWrite(t1, HIGH);
delay(LAG);
digitalWrite(t2, HIGH);
state = 'b';
break;
case 'i': // Print Info
info();
break;
case 'R': // Reset
asm volatile (" jmp 0");
break;
case 'S': // Save states to EEPROM
for (n=1;n<=8;n++)
{
EEPROM.write(n,digitalRead(n+1));
}
break;
}
if ( (inByte >= 'c') and (inByte <= 'h')) // Switch OFF other triacs
{
digitalWrite(inByte-'a'+2,HIGH);
}
if ( (inByte >= 'C') and (inByte <= 'H')) // Switch ON other triacs
{
digitalWrite(inByte-'A'+2, LOW);
}
pstatus(); // Print states
}
}