The VATT Thermal System is controlled by an Arduino Mega board located in the mirror cell. It is connected to 7 analog AD 590K thermal sensors. Four of these sensors are located on the telescope struts and 3 are in the mirror cell. The Arduino board communicates with vatttel through an RS-232 serial port. vatttel (TCS) requests the thermal information from each thermal sensor over the serial port by sending a 't' followed a carriage return '\r'. The arduino board then sends a string of white space separated temperatures.
The thermal daughter board is a circuit board that sits on top of the arduino board. It has 1 serial port 2 mux chips and 3 Phoenix Connectors. Each Mux chip has four channels to handle the analog signal coming from the 7 thermal sensors.
| Mux Channel | GUI Name | Wire Label | Phoenix Connector | Signal Wire Color | 
|---|---|---|---|---|
| 00 | Mirror Temp | T1 | P9 | White | 
| 01 | Mirror Air Temp | T0 | P9 | Red | 
| 02 | Mirror Temp | T2 | P9 | Red | 
| 03 | Air Temp | T3 | P10 | Red | 
| 10 | Strut Temp | T4 | P10 | White | 
| 11 | Strut Temp | T5 | P10 | Red | 
| 11 | Air Temp | T6 | P11 | White | 
Firmware as of 9-3-2014
#include <Wire.h>
#include <Adafruit_ADS1015.h>
#define NCHAN 8//Number of channels.
#define AVGCNTS 100.0//Number of values to average over
#define MV_PER_KEL 10.0 //Resistor value
#define KEL2CEL -272.1
#define MV_PER_CNT 0.188
#define KELS_PER_CNT MV_PER_CNT/MV_PER_KEL
/*This is the firmware that resides on the Arduino mMega 
VATT Thermal system board. It reads in temperatures from
seven analog sensors located on the VATT Telescope. When 
Querried with a 't\r' via its serial port  it returns a string 
of 7 white space seperated temperatures followed by a '\n'
The order of the sensor data located in the return string is as follows:
MIRROR_TEMP MIRROR_AIR_TEMP MIRROR_TEMP AIR_TEMP STRUT_TEMP STRUT_TEMP AIR_TEMP
For more information on the VATT thermal system please go to this website:
https://soweb.as.arizona.edu/~tscopewiki/doku.php?id=vatt:mirror_cell_thermal_reader
Author Scott Swindell
Date 9-3-2014
*/
Adafruit_ADS1115 ads1( 0x48 );  //first mux chip
Adafruit_ADS1115 ads2( 0x49 );  //Second mux chip
char inChar;//The charactre read in from the serial port. 
char lastInChar;
long adc_sum[NCHAN];//keeps a sum of the temperature readings for averaging
int16_t adc[NCHAN];//Stores averaged temperature readings
int inVal;
int val13;//For toggling pin 13
short sum_iter = 1;//keeps count of how many we have summed
//Offsets. Most of this is counter-acting the hard coded offsets in
//vatttel
float temp_offsets[NCHAN] = {0.4, 2.7, 0.4, -1.5, 3.3, 3.3, -1.5, 0.0};
void setup(void) 
{
  val13 = HIGH;
  pinMode(13, OUTPUT);
  digitalWrite( 13, val13 );
  //Serial.begin(9600);
  Serial3.begin(9600);
  
 /* Serial.println("Hello!");
  
  Serial.println("Getting single-ended readings from AIN0..3");
  Serial.println("ADC Range: +/- 6.144V (1 bit = 3mV/ADS1015, 0.1875mV/ADS1115)");*/
  
  // The ADC input range (or gain) can be changed via the following
  // functions, but be careful never to exceed VDD +0.3V max, or to
  // exceed the upper and lower limits if you adjust the input range!
  // Setting these values incorrectly may destroy your ADC!
  //                                                                ADS1015  ADS1115
  //                                                                -------  -------
   ads1.setGain(GAIN_TWOTHIRDS);  // 2/3x gain +/- 6.144V  1 bit = 3mV      0.1875mV (default)
   ads2.setGain(GAIN_TWOTHIRDS);
  // ads.setGain(GAIN_ONE);        // 1x gain   +/- 4.096V  1 bit = 2mV      0.125mV
  // ads.setGain(GAIN_TWO);        // 2x gain   +/- 2.048V  1 bit = 1mV      0.0625mV
  // ads.setGain(GAIN_FOUR);       // 4x gain   +/- 1.024V  1 bit = 0.5mV    0.03125mV
  // ads.setGain(GAIN_EIGHT);      // 8x gain   +/- 0.512V  1 bit = 0.25mV   0.015625mV
  // ads.setGain(GAIN_SIXTEEN);    // 16x gain  +/- 0.256V  1 bit = 0.125mV  0.0078125mV
  //ads2.setGain(GAIN_TWOTHIRDS); //
  ads1.begin();
  ads2.begin();
  
  
  
}
void loop(void) 
{
  /*In the arduino loop function we do the reading of the 
   *analogue temp sensors and keep a sum of each channel
   *After ACGCNTS number of loops we average the last previous data and 
   *store it in the adc array. 
   */
  //read first mux chip and sum it with last previous readings
  for (short channel_num=0; channel_num<( 4 ); channel_num++)
  {  
    inVal = ads1.readADC_SingleEnded( channel_num );
    adc_sum[channel_num] = inVal  + adc_sum[channel_num];
    
   
      
  }
  //read the second mux chip and average it with last reading
  for (short channel_num=0; channel_num<( 4 ); channel_num++)
  {
     inVal = ads2.readADC_SingleEnded( channel_num );
     adc_sum[channel_num + 4] = inVal + adc_sum[channel_num+4]; 
     
     //delay(10);
     //if( channel_num+4 == 6 ){ Serial.println(inVal); }
  }
  
  if (sum_iter == AVGCNTS)
  {
    for( short channel_num=0; channel_num<NCHAN; channel_num++ )
    {
      //Now lets do the averaging
      adc[channel_num] = adc_sum[channel_num]/AVGCNTS;
       
      adc_sum[channel_num] = 0;
      sum_iter = 1;
    } 
     
  }
  else
  {
    sum_iter++;
  }
  
  
   
}
/*commented out for now but may be used later.
 *If it works it is a bit more sophisticated
 *than the serialEvent3 below it. 
void serialEvent3()
{
  while ( Serial3.available() )
  {
    
    while(inChar != '\n' && inChar != '\r')
    {//read until a carriage return or new line.
      lastInChar = inChar;
      inChar = (char) Serial3.read();
    }
    if(lastInChar == 't')
    {//Did a  't' come before the carriage return?
      delay(500);//Do we need a delay?
      printTemps( adc );
      lastInChar = '\0';
      toggle13();   
    }
    inChar = '\0';    
  }
}*/
void serialEvent3()
{
  /*this function is called anytime serial port 3
  gets data.  */
  while ( Serial3.available() )
  {
    inChar = Serial3.read();
    //As soon as we get a carriage
    //return a 't\r' assuming because
    //vatttel is expecting an echo
    //Then proc  
    //serial port with printTemps
    //function.
    if( inChar == '\r' )
    {
      toggle13();//toggle the light for debug  
      //Serial3.print('t\r');
      //vatttel expects an echo.
      printTemps( adc );
      
      printTemps( adc );
      
        
    }
  }
}
/*
*Name: printTemps
*args: tempArr (list of average temperatures from the adc )
*Decsr: Prints white space seperated temperatures from the 
*  VATT mirror cell sensors to the Serial port which is connected
*  vatttel
*Author: Scott Swindell
*/
void printTemps( int16_t tempArr[NCHAN] )
{
  char charBuff[10];
  String strBuff;
  float temp_celsius;
  //There are NCHAN channels but we are only using 7 of them. 
  for( short i=0; i<NCHAN-1; i++ )
  {//add 7 used channels to the string (NCHAN-1)
    temp_celsius = ( tempArr[i]*MV_PER_CNT + temp_offsets[i] )/MV_PER_KEL + KEL2CEL;
    dtostrf( temp_celsius, 3, 1,  charBuff );//convert float to string 
    strBuff = strBuff +  charBuff + ' ';//Build string of temperatures as String type
    
  }
  strBuff.trim();//Remove trailing whitespace
  strBuff = strBuff + '\n';//add new line
  Serial3.print( strBuff );//Send off the data!
  //Serial3.print("1.0 2.0 3.0 4.0 5.0 6.0 7.0\n");
  
}
/*Name: Toggle13
 *args: N/A
 *Descr:  toggles pin 13 between high and low 
 *  (and therefore an LED) on the arduino board
 *  this is very usefull for debugging
 *Author: Scott Swindell
 *
 */
void toggle13()
{
  if( val13 == HIGH )
  {
    val13 = LOW;
    digitalWrite( 13, val13 );
  }
  else
  {
    val13 = HIGH;
    digitalWrite( 13, val13 );
  }
  
}