/*
  Software serial multple serial test
 
 Receives from the hardware serial, sends to software serial.
 Receives from software serial, sends to hardware serial.
 
 The circuit: 
 * RX is digital pin 10 (connect to TX of other device)
 * TX is digital pin 11 (connect to RX of other device)
 
 Note:
 Not all pins on the Mega and Mega 2560 support change interrupts, 
 so only the following can be used for RX: 
 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69
 
 Not all pins on the Leonardo support change interrupts, 
 so only the following can be used for RX: 
 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).
 
 created back in the mists of time
 modified 25 May 2012
 by Tom Igoe
 based on Mikal Hart's example
 
 This example code is in the public domain.
 
 */
#include <SoftwareSerial.h>
#include <math.h>

SoftwareSerial mySerial(8, 9); // RX, TX
//int interlockPin = 2;
//int interlockState = 2;
int flowDigiPin = 3;
int tempAnaPin = 0;
int humAnaPin = 1;
const double vRef = 5.06;
const double t_beta = 3413.0;
double t_offset = 11.34;
const double t_0C = 273.15;

void setup()  
{
  pinMode(flowDigiPin,INPUT);
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  Serial.println("Goodnight moon!");

  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
//  mySerial.println("Hello, world?");
}

void loop() // run over and over
{
//  delay(5000);
//      mySerial.write("SO1\r");
//  delay(5000);
//      mySerial.write("SO0\r");
      
      delay(1000);
      double tempV = analogRead(tempAnaPin)*vRef/1023.0;
      Serial.print("temp V:\t");
      Serial.print(tempV);
      Serial.println();
      Serial.println(tempFromV(2.732));
      Serial.println(tempFromV(3.016));
      Serial.println(tempFromV(3.088));
      Serial.println(tempFromV(3.188));
      double humV = analogRead(humAnaPin)*vRef/1023.0;
      Serial.print("humidity V:\t");
      Serial.print(humV);
      Serial.println();
      int flow = digitalRead(flowDigiPin);
      Serial.print("flow state:\t");
      if (flow==HIGH)
        Serial.print("low flow");
      else
        Serial.print("nominal flow");
      Serial.println();
      
      
      
  while (mySerial.available())
    Serial.write(mySerial.read());
  while (Serial.available())
    mySerial.write(Serial.read());

/*  int newState = digitalRead(interlockPin);
  if (newState!=interlockState) {
    if (newState==HIGH) {
      Serial.println("Interlock HIGH");
      mySerial.write("SO1\r");      
    } else {
      Serial.println("Interlock LOW");
      mySerial.write("SO0\r");      
    }
  }
  // else {
//          mySerial.println("no change");      
  //}
  interlockState = newState;
*/
}

double tempFromADC(int tempV)
{
  double lnV = log(tempV/(1023-tempV));
  return t_beta/(lnV+t_offset) - t_0C;
}

double tempFromV(double tempV)
{
  double lnV = log(tempV/(vRef-tempV));
  return t_beta/(lnV+t_offset) - t_0C;
}
