Vernier Shield Hookup Guide
Example 1 - AutoID Arduino
The team at Vernier have helped us with creating a couple simple Arduino sketches that automatically query either the Analog or the Digital ports of the Arduino and report back the sensor identification and standard calibration data.
Vernier has created a wealth of examples hosted on github. Upload these sketches to your arduino device, and open up a Serial Monitor to view the data coming back to your computer.
AutoID Analog Sensors
This sketch is designed to automatically query the sensors connected to the two analog ports on the Vernier shield. After the AutoID, it prints the sensor information to the Serial Monitor and starts logging (calibrated) data to the screen. Written into this script are the default calibration constants used with Vernier's sensors.
This will, most likely, be the only Arduino sketch you need for most of your sensors.
As it is written, the data is collected once per second. Change the value of the variable TimeBetweenReadings to change the rate of the data collection.
Upload the VernierAnalogAutoID
sketch to your Arduino.
/* VernierAnalogAutoID (v 2013.12) Reads the information to AutoID a Vernier BTA sensor with digital AutoID, and resistor ID sensors including Vernier Stainless Steel Temperature Probe (TMP-BTA). It should read the +/-10 volt Voltage Probe correctly also. This version does all tests for resistorID sensors first, then turns on the I2C clock and tests for digital autoID sensors.) Note that this sketch handles multiple pages of sensor calibrations. When used with the SparkFun Vernier Interface Shield, this program will AutoID two different sensors on BTA1 and BTA2. With homemade, breadboard connections, it will work with only one sensor. After the AutoID: Assuming Vernier analog (BTA) Sensors are connected to the BTA connectors, this sketch displays the time and sensor readings on the Serial Monitor. As written, the readings will be displayed every second. Change the variable TimeBetweenReadings to change the rate. See www.vernier.com/arduino for more information. */ //#define PLX_DAQ // uncomment this line if using PLX_DAQ for data collection. unsigned int BAUD_RATE = 9600; // set data rate for Serial monitor to be the fastest possible. int dataRate = 60; // set # of samples per second. int duration = 15000; // set the data collection duration in milliseconds // default value is set to 5 seconds or 5000 milliseconds char delimiter = '\t'; // Variables used in the code for calculations unsigned long timeRef; // reference for starting time unsigned long timeInterval; unsigned long ReadingNumber; // index for data counter void setup() { pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT_PULLUP); pinMode(muxlsb, OUTPUT); // multiplexer pins for AutoID pinMode(muxmsb, OUTPUT); // multiplexer pins for AutoID timeInterval = 1000 / dataRate; { delimiter = ','; BAUD_RATE = 56000; // max speed for PLX_DAQ that matches with Arduino's data rates } Serial.begin(BAUD_RATE); digitalWrite(ledPin, LOW); device = 0x50; // I2C Address for sensors - used for calibration data Serial.println(""); // Read BTA1 Sensor digitalWrite(muxlsb, LOW); //set multiplexer for BTA1 digitalWrite(muxmsb, LOW); BTAResistorSensorID(0); // Read BTA2 Sensor digitalWrite(muxlsb, HIGH); //set multiplexer for BTA2 digitalWrite(muxmsb, LOW); BTAResistorSensorID(1); Wire.begin(); //start I2C communication // Read BTA1 Sensor digitalWrite(muxlsb, LOW); //set multiplexer for BTA1 digitalWrite(muxmsb, LOW); if (SensorNumber[0] == 0) DigitalSensorID(0); // if no resistorID, check for digital ID // Read BTA2 Sensor digitalWrite(muxlsb, HIGH); //set multiplexer for BTA2 digitalWrite(muxmsb, LOW); if (SensorNumber[1] == 0) DigitalSensorID(1); // if no resistorID, check for digital ID PrintSensorInfo(0);// this line can be commented out if you do not need all this info!!! PrintSensorInfo(1);// this line can be commented out if you do not need all this info PrintHeaderInfo(); ReadingNumber = 0; timeRef = millis(); } void loop() { int Count[2]; //reading from 0 to 5 volt input int AltCount[2] ;//reading from -10 to +10V input float Voltage[2]; float SensorReading[2]; unsigned long currTime; currTime = millis(); if ((currTime - timeRef) <= (duration)) // controls the duration of the data collection { if (currTime >= ReadingNumber * timeInterval + timeRef) // controls so only runs once per timeInterval { digitalWrite(ledPin, HIGH); //turn on LED { Serial.print("DATA,"); } Serial.print((currTime - timeRef) / 1000.0, 3); for (int Channel = 0; Channel <= 1; Channel++) { Serial.print(delimiter); //tab character if (Name[Channel] == "Voltage +/- 10V") { AltCount[0] = analogRead(A1); //read both +/- 110 volt lines AltCount[1] = analogRead(A3); // convert from count to raw voltage if using 10 volt range: Voltage[Channel] = AltCount[Channel] / 1023.0 * 5.0 ; } else { Count[0] = analogRead(A0); //read both analog lines Count[1] = analogRead(A2); // convert from count to raw voltage on 0 to 5 range: Voltage[Channel] = Count[Channel] / 1023.0 * 5.0; } SensorReading[Channel] = Intercept[Channel] + Voltage[Channel] * Slope[Channel]; //special calibration for thermistor temperture probe: if (SensorNumber[Channel] == 10) SensorReading[Channel] = Thermistor(Count[Channel]); Serial.print(SensorReading[Channel], 3); } // end of going through the channels Serial.println(" "); digitalWrite(ledPin, LOW);// LED on D13 flashes once per readng ReadingNumber++; } } else { digitalWrite(ledPin, LOW); PrintHeaderInfo(); // reset counters and timeRef digitalWrite(ledPin, HIGH); ReadingNumber = 0; timeRef = millis(); } } // end void BTAResistorSensorID(int Channel) { Name[Channel] = ""; // clear name string ShortName[Channel] = ""; // clear name string SensorNumber[Channel] = 0; delay (10); int CountID = analogRead(A5); VoltageID[Channel] = CountID / 1023.0 * VCC;// convert from count to voltage if (VoltageID[Channel] > 0.86 & VoltageID[Channel] < 0.95) SensorNumber[Channel] = 1; if (VoltageID[Channel] > 3.80 & VoltageID[Channel] < 3.88) SensorNumber[Channel] = 2; // Voltage +/-10 V if (VoltageID[Channel] > 1.92 & VoltageID[Channel] < 2.13) SensorNumber[Channel] = 3; if (VoltageID[Channel] > 1.18 & VoltageID[Channel] < 1.30) SensorNumber[Channel] = 4; if (VoltageID[Channel] > 3.27 & VoltageID[Channel] < 3.68) SensorNumber[Channel] = 5; if (VoltageID[Channel] > 4.64 & VoltageID[Channel] < 4.73) SensorNumber[Channel] = 8; //Differential Voltage if (VoltageID[Channel] > 4.73 & VoltageID[Channel] < 4.83) SensorNumber[Channel] = 9; //Current if (VoltageID[Channel] > 2.38 & VoltageID[Channel] < 2.63) SensorNumber[Channel] = 10; //Stainless Steel or Surface Temperature Probe if (VoltageID[Channel] > 2.85 & VoltageID[Channel] < 3.15) SensorNumber[Channel] = 11; if (VoltageID[Channel] > 1.52 & VoltageID[Channel] < 1.68) SensorNumber[Channel] = 12; //TILT if (VoltageID[Channel] > 0.43 & VoltageID[Channel] < 0.48) SensorNumber[Channel] = 13; if (VoltageID[Channel] > 4.08 & VoltageID[Channel] < 4.16) SensorNumber[Channel] = 14; if (VoltageID[Channel] > 0.62 & VoltageID[Channel] < 0.68) SensorNumber[Channel] = 15; if (VoltageID[Channel] > 4.32 & VoltageID[Channel] < 4.40) SensorNumber[Channel] = 17; if (VoltageID[Channel] > 4.50 & VoltageID[Channel] < 4.59) SensorNumber[Channel] = 18; //Oxygen switch (SensorNumber[Channel]) { case 1: Name[Channel] = "Thermocouple" ; Units[Channel] = "Deg C " ; ShortName[Channel] = "TC"; Slope[Channel] = -2.45455; Intercept[Channel] = 6.2115; Page[Channel] = 1;; //calibration storage p (1,2, or 3) CalEquationType[Channel] = 1; break; case 2: Name[Channel] = "Voltage +/- 10V" ; //!!! do not change this name or you will mess up the code of the loop Units[Channel] = "V" ; ShortName[Channel] = "Voltage10"; Slope[Channel] = 4; //note correction for Sparkfun circuit done in calculation of Voltage!! Intercept[Channel] = -10; Page[Channel] = 1;; //calibration storage page CalEquationType[Channel] = 1; break; case 3: Name[Channel] = "Current" ; Units[Channel] = "Amps" ; ShortName[Channel] = "Current"; Slope[Channel] = -2.665; Intercept[Channel] = 6.325; Page[Channel] = 1;; //calibration storage page CalEquationType[Channel] = 1; break; case 4: Name[Channel] = "Resistance" ; Units[Channel] = "Ohms" ; ShortName[Channel] = "Diff V"; Slope[Channel] = -2.5; Intercept[Channel] = 6.25; Page[Channel] = 1;; //calibration storage page CalEquationType[Channel] = 1; break; case 8: Name[Channel] = "Diff Voltage" ; Units[Channel] = "V" ; ShortName[Channel] = "Diff V"; Slope[Channel] = -2.5; Intercept[Channel] = 6.25; Page[Channel] = 1;; //calibration storage page CalEquationType[Channel] = 1; break; case 9: Name[Channel] = "Current" ; Units[Channel] = "Amp" ; ShortName[Channel] = "I"; Slope[Channel] = 1; Intercept[Channel] = 0; Page[Channel] = 1;; //calibration storage page CalEquationType[Channel] = 1; break; case 10: Name[Channel] = "Temperature" ; Units[Channel] = "Deg C" ; ShortName[Channel] = "Temp"; Slope[Channel] = 1; Intercept[Channel] = 0; Page[Channel] = 1;; //calibration storage page CalEquationType[Channel] = 1; break; case 11: Name[Channel] = "Temperature" ; Units[Channel] = "Deg C" ; ShortName[Channel] = "Temp"; Slope[Channel] = 1; Intercept[Channel] = 0; Page[Channel] = 1;; //calibration storage page CalEquationType[Channel] = 1; break; case 12: Name[Channel] = "TI Light" ; Units[Channel] = "relative" ; ShortName[Channel] = "TI Light"; Slope[Channel] = 1; Intercept[Channel] = 0; Page[Channel] = 1;; //calibration storage page CalEquationType[Channel] = 1; break; case 13: Name[Channel] = "Exercise Heart Rate" ; Units[Channel] = "V" ; ShortName[Channel] = "Ex HR"; Slope[Channel] = 1; Intercept[Channel] = 0; Page[Channel] = 1;; //calibration storage page CalEquationType[Channel] = 1; break; case 14: Name[Channel] = "Voltage" ; Units[Channel] = "V" ; ShortName[Channel] = "Volts"; Slope[Channel] = 1; Intercept[Channel] = 0; Page[Channel] = 1;; //calibration storage page CalEquationType[Channel] = 1; break; case 15: Name[Channel] = "EKG" ; Units[Channel] = "V" ; ShortName[Channel] = "EKG"; Slope[Channel] = 1; Intercept[Channel] = 0; Page[Channel] = 1;; //calibration storage page CalEquationType[Channel] = 1; break; case 17: Name[Channel] = "Carbon Dioxide" ; Units[Channel] = "ppm" ; ShortName[Channel] = "CO2"; Slope[Channel] = 1; Intercept[Channel] = 0; Page[Channel] = 1;; //calibration storage page CalEquationType[Channel] = 1; break; case 18: Name[Channel] = "Oxygen" ; Units[Channel] = "%" ; ShortName[Channel] = "O2"; Slope[Channel] = 1; Intercept[Channel] = 0; Page[Channel] = 1;; //calibration storage page CalEquationType[Channel] = 1; break; default: Name[Channel] = "nothing on BTA" ; SensorNumber[Channel] = 0; // Units[Channel] = "" ; ShortName[Channel] = ""; Slope[Channel] = 1; Intercept[Channel] = 0; Page[Channel] = 1;; //calibration storage page CalEquationType[Channel] = 1; break; } // end of switch case } //end of BTA resistor check void DigitalSensorID(int Channel) { int i; int x; // check for digital ID sensor: for (i = 0; i < 128; i++) // clear our digital ID sensor data { sensordata[i] = 0; } //Now check for Digital AutoID sensor: Wire.begin(); // join i2c bus (address optional for master) !!! //Reading device first time... ; Wire.beginTransmission(device); // Now we're going to read it back Wire.write(0x0); // Sending address 0, so it knows where we'll want Wire.endTransmission(); // to read from x = Wire.requestFrom(device, 32); // Start new transmission and keep reading for 128 bytes i = 1; Serial.print("Wire Request In: "); Serial.println(x); while (x > 1) { x = Wire.available(); char c = Wire.read(); // Read a byte and write it out to the Serial port sensordata [i] = c; i++; } //Reading device second time... ; Wire.beginTransmission(device); // Now we're going to read it back Wire.write(0x20); // Sending address 0, so it knows where we'll want Wire.endTransmission(); // to read from x = Wire.requestFrom(device, 32); // Start new transmission and keep reading for 128 bytes i = 1; while (x > 1) { x = Wire.available(); char c = Wire.read(); // Read a byte and write it out to the Serial port sensordata [i + 32] = c; i++; } //Reading device third time... ; Wire.beginTransmission(device); // Now we're going to read it back Wire.write(0x40); // Sending address 0, so it knows where we'll want Wire.endTransmission(); // to read from x = Wire.requestFrom(device, 32); // Start new transmission and keep reading for 128 bytes i = 1; while (x > 1) { x = Wire.available(); char c = Wire.read(); // Read a byte and write it out to the Serial port sensordata [i + 64] = c; i++; } //Reading device a forth time... ; Wire.beginTransmission(device); // Now we're going to read it back Wire.write(0x60); // Sending address 0, so it knows where we'll want Wire.endTransmission(); // to read from x = Wire.requestFrom(device, 32); // Start new transmission and keep reading for 128 bytes i = 1; while (x > 1) { x = Wire.available(); char c = Wire.read(); // Read a byte and write it out to the Serial port sensordata [i + 96] = c; i++; } // Print out array: // remove *'s to get this display for diagnostics Serial.println("array: "); for (i = 1; i <= 128; i++) { Serial.print (i); Serial.print ("\t "); Serial.print(sensordata[i], DEC); Serial.print ("\t "); Serial.println(char(sensordata[i])); } //****************************************************************** //Determine sensor number: // VoltageID[Channel]=-1;// indicated resistor ID not used SensorNumber[Channel] = sensordata[2]; //Determine the sensor name: Name[Channel] = ""; for (i = 0; i < 20; i++) { char c = sensordata[i + 9]; // 9 byte offset Name[Channel] += c; } Name[Channel] += '\0'; //add terminating character //Determine the short name: ShortName[Channel] = ""; for (i = 0; i < 12; i++) { char c = sensordata[i + 29]; // 29 byte offset ShortName[Channel] += c; } ShortName[Channel] += '\0'; //add terminating character //Determine the calibration equation type: CalEquationType[Channel] = sensordata[57]; //Determines the calibration page: Page[Channel] = sensordata[70]; // the code below uses the calibration page set: // Intercept starts at 71 for page 1, 90 for p2, and 109 for p3 //Determines intercept: for (i = 0; i < 4; i++) { floatbyte[i] = sensordata[i + 71 + (Page[Channel]) * 19]; } float j = *(float*) &floatbyte; Intercept[Channel] = j; //Determines slope: // slope starts at 75 for page 1, 94 for p2, and 113 for p3 for (i = 0; i < 4; i++) { floatbyte[i] = sensordata[i + 75 + (Page[Channel]) * 19]; } float y = *(float*) &floatbyte; Slope[Channel] = y; //Determines the units: // the cryptic code in the next line just uses the // correct bytes, depending on the page selected. // units start at 83 for page 1, 102 for p2, and 121 for p3 for (i = 0; i < 7; i++) { char c = sensordata[83 + i + (Page[Channel]) * 19]; Units[Channel] += c; } Units[Channel] += '\0'; //add terminating character } //end of checking for digital ID sensor void PrintHeaderInfo() { Serial.println(); Serial.println("**************************************************"); Serial.println("* Push the D12 button to start collection. *"); Serial.println("* Use reset button to reset / stop *"); Serial.println("**************************************************"); while (digitalRead(buttonPin) == HIGH) { // holding loop until the button goes low. } Serial.println("Vernier Format 2"); Serial.println("Sensor Readings taken using Ardunio"); Serial.println("Data Set"); { Serial.println("CLEARDATA"); Serial.print("LABEL,"); } Serial.print("Time"); for (int chan = 0; chan <= 1; chan++) { Serial.print(delimiter); //tab character //print sensor name: Serial.print (ShortName[chan]); } Serial.println(""); Serial.print("seconds"); for (int chan = 0; chan <= 1; chan++) { Serial.print("\t"); //tab character //print sensor name: Serial.print (Units[chan]); } Serial.println (""); } void PrintSensorInfo(int Channel) { // print out information about sensor: //(This code is commented out, but add it for more feedback) Serial.println(" "); Serial.print("BTA Connector "); Serial.println(Channel); Serial.print("sensor ID number: "); Serial.println(SensorNumber[Channel]); Serial.print("ID voltage level: "); Serial.println(VoltageID[Channel]); Serial.print("sensor name: "); Serial.println (Name[Channel]); Serial.print("sensor short name: "); Serial.println (ShortName[Channel]); Serial.print("calibration page: "); Serial.println(Page[Channel]); Serial.print("calibration equation type: "); Serial.println(CalEquationType[Channel]); Serial.print("intercept: "); Serial.println (Intercept[Channel]); Serial.print("slope "); Serial. println(Slope[Channel]); Serial.print("units: "); Serial.println (Units[Channel]); }// end of PrintSensorInfo float Thermistor(int Raw) //This function calculates temperature from ADC count { /* Inputs ADC count from Thermistor and outputs Temperature in Celsius * requires: include <math.h> * There is a huge amount of information on the web about using thermistors with the Arduino. * Here we are concerned about using the Vernier Stainless Steel Temperature Probe TMP-BTA and the * Vernier Surface Temperature Probe STS-BTA, but the general principles are easy to extend to other * thermistors. * This version utilizes the Steinhart-Hart Thermistor Equation: * Temperature in Kelvin = 1 / {A + B[ln(R)] + C[ln(R)]3} * for the themistor in the Vernier TMP-BTA probe: * A =0.00102119 , B = 0.000222468 and C = 1.33342E-7 * Using these values should get agreement within 1 degree C to the same probe used with one * of the Vernier interfaces * * Schematic: * [Ground] -- [thermistor] -------- | -- [15,000 ohm bridge resistor] --[Vcc (5v)] * | * Analog Pin 0 * For the circuit above: * Resistance = ( Count*RawADC /(1024-Count)) */ long Resistance; float Resistor = 15000; //bridge resistor // the measured resistance of your particular bridge resistor in //the Vernier BTA-ELV this is a precision 15K resisitor float Temp; // Dual-Purpose variable to save space. Resistance = ( Resistor * Raw / (1024 - Raw)); Temp = log(Resistance); // Saving the Log(resistance) so not to calculate it 4 times later Temp = 1 / (0.00102119 + (0.000222468 * Temp) + (0.000000133342 * Temp * Temp * Temp)); Temp = Temp - 273.15; // Convert Kelvin to Celsius return Temp; // Return the Temperature }
Once your code is uploaded, open the serial terminal in the IDE and see the output.
AutoID Digital Sensors
This sketch queries the digital sensors connected to the Vernier Shield and prints out the information to the Serial Monitor. Because each digital sensor is unique, this sketch does not start logging data or printing out results. It will, however, suggest the name of the Vernier Arduino sketch to use. You can find these on the Vernier github repository.
Upload the VernierDigitalAutoID
sketch to your Arduino.
/* VernierDigitalAutoID (v 2013.12) Reads the information to AutoID a Vernier BTD sensor with resistor ID. When used with the SparkFun Vernier Interface Shield, this program will AutoID two different sensors on BTD1 and BTD2. With homemade, breadboard connections, it will work with only one sensor. After the AutoID, assuming Vernier analog (BTD) Sensors are connected to the BTD connectors, this sketch displays the name of the sensor and the units. This sketch does not read data because there are several different types of readings that can be done with digital sensors (distance measurements, radiation counts, photogate timing, etc). Instead, this sketch will name the Vernier Arduino sketch to use to read that sensor. For example, if you connect a Motion Detector, it will suggest the VernierMotionDetector program. See www.vernier.com/arduino for more information. */ int ReadingNumber; int Channel; //BTA (Channel 1 or 2) or BTD connector (Channel 3 or 4) float VoltageID[5]; int led =13; int SensorNumber[5]; //integer indicating sensor number' String Name[5]; String ShortName[5]; String Units[5]; float Intercept[5]; float Slope[5]; int Page[5]; int (CalEquationType[5]); float VCC= 5.00;// "5 volt" power supply voltage used in resistor ID section void setup() { int muxlsb = 10; //low byte of multiplexer int muxmsb = 11; //high byte of multiplexer Serial.begin(9600); pinMode(led, OUTPUT); //LED on SparkFun Vernier Shield digitalWrite(led, LOW); pinMode(muxlsb, OUTPUT); pinMode(muxmsb, OUTPUT); Serial.println(""); //Read BTD1 Sensor: digitalWrite(muxlsb, LOW); //set multiplexer for BTD1 digitalWrite(muxmsb, HIGH); Channel=3; BTDResistorSensorID(Channel); PrintSensorInfo();// this line can be commented out if you do not need all this info !!! //Read BTD2 Sensor digitalWrite(muxlsb, HIGH); //set multiplexer for BTD2 digitalWrite(muxmsb, HIGH); Channel=4; BTDResistorSensorID(Channel); PrintSensorInfo();// this line can be commented out if you do not need all this info !!! } void loop() { } void BTDResistorSensorID(int Channel) { Name[Channel]="";// clear name string ShortName[Channel]="";// clear name string SensorNumber[Channel] = 0; delay (10); int CountID = analogRead(A5); VoltageID[Channel] = CountID / 1024.0 * VCC;// convert from count to voltage if (VoltageID[Channel]>3.27 & VoltageID[Channel]<3.61) SensorNumber[Channel] = 2; //Motion Detector if (VoltageID[Channel]>4.45 & VoltageID[Channel]<4.46) SensorNumber[Channel] = 3; //motion not used if (VoltageID[Channel]>3.80 & VoltageID[Channel]<3.88) SensorNumber[Channel] = 4; //photogate if (VoltageID[Channel]>4.08 & VoltageID[Channel]<4.16) SensorNumber[Channel] = 5; //Drop Counter if (VoltageID[Channel]>4.32 & VoltageID[Channel]<4.40) SensorNumber[Channel] = 6; //rotary if (VoltageID[Channel]>4.50 & VoltageID[Channel]<4.59) SensorNumber[Channel] = 7;//Radiation Monitor if (VoltageID[Channel]>4.45 & VoltageID[Channel]<4.46) SensorNumber[Channel] = 8; //DCU - 1st generation if (VoltageID[Channel]>1.52 & VoltageID[Channel]<1.68) SensorNumber[Channel] = 9; //DCU - 2nd generation if (VoltageID[Channel]>1.18 & VoltageID[Channel]<1.30) SensorNumber[Channel] = 10; //Polarimeter if (VoltageID[Channel]>0.86 & VoltageID[Channel]<0.95) SensorNumber[Channel] = 11; //Projectile Launcher if (VoltageID[Channel]>0.62 & VoltageID[Channel]<0.68) SensorNumber[Channel] = 12; //Linear Translator for DAK if (VoltageID[Channel]>0.43 & VoltageID[Channel]<0.48) SensorNumber[Channel] = 13; //Motion Encoder if (VoltageID[Channel]>4.64 & VoltageID[Channel]<4.73) SensorNumber[Channel] = 14; // possible digital sensor switch (SensorNumber[Channel]) { case 2: Name[Channel] = "Motion - Position" ; Units[Channel] = "Use VernierMotionDetector" ; ShortName[Channel] = "Position"; Slope[Channel]=1; Intercept[Channel]=0; Page[Channel] = 1;; //calibration storage page CalEquationType[Channel]=1; break; case 3: Name[Channel] = "Motion -NU" ; Units[Channel] = "not used" ; ShortName[Channel] = "Motion -NU"; Slope[Channel]=1; Intercept[Channel]=0; Page[Channel] = 1;; //calibration storage page CalEquationType[Channel]=1; break; case 4: Name[Channel] = "Photogate" ; Units[Channel] = "Use VernierPhotogate" ; ShortName[Channel] = "PG"; Slope[Channel]=1; Intercept[Channel]=0; Page[Channel] = 1;; //calibration storage page CalEquationType[Channel]=1; break; case 5: Name[Channel] = "Drop Counter" ; Units[Channel] = "Use VernierCount" ; ShortName[Channel] = "Drop Count"; Slope[Channel]=1; Intercept[Channel]=0; Page[Channel] = 1;; //calibration storage page CalEquationType[Channel]=1; break; case 6: Name[Channel] = "Rotary Motion" ; Units[Channel] = "Use VernierRotary" ; ShortName[Channel] = "Rotary"; Slope[Channel]=1; Intercept[Channel]=0; Page[Channel] = 1;; //calibration storage page CalEquationType[Channel]=1; break; case 7: Name[Channel] = "Radiation Monitor" ; Units[Channel] = "Use Count" ; ShortName[Channel] = "VernierRadiation"; Slope[Channel]=1; Intercept[Channel]=0; Page[Channel] = 1;; //calibration storage page CalEquationType[Channel]=1; break; case 8: Name[Channel] = "DCU - 1st gen" ; Units[Channel] = "Use VernierDCU" ; ShortName[Channel] = "DCU -1"; Slope[Channel]=1; Intercept[Channel]=0; Page[Channel] = 1;; //calibration storage page CalEquationType[Channel]=1; break; case 9: Name[Channel] = "DCU - 2nd gen" ; Units[Channel] = "Use VernierDCU" ; ShortName[Channel] = "DCU-2"; Slope[Channel]=1; Intercept[Channel]=0; Page[Channel] = 1;; //calibration storage page CalEquationType[Channel]=1; break; case 10: Name[Channel] = "Polarimeter" ; Units[Channel] = "-----" ; ShortName[Channel] = "Polarimeter"; Slope[Channel]=1; Intercept[Channel]=0; Page[Channel] = 1;; //calibration storage page CalEquationType[Channel]=1; break; case 11: Name[Channel] = "Projectile Launcher" ; Units[Channel] = "Use VernierPhotogate" ; ShortName[Channel] = "Proj Time"; Slope[Channel]=1; Intercept[Channel]=0; Page[Channel] = 1;; //calibration storage page CalEquationType[Channel]=1; break; case 12: Name[Channel] = "DAK distance" ; Units[Channel] = "Use VernierRotary" ; ShortName[Channel] = "DAK d"; Slope[Channel]=1; Intercept[Channel]=0; Page[Channel] = 1;; //calibration storage page CalEquationType[Channel]=1; break; case 13: Name[Channel] = "Motion Encoder Dist" ; Units[Channel] = "Use VernierRotary" ; ShortName[Channel] = "ME Dist"; Slope[Channel]=1; Intercept[Channel]=0; Page[Channel] = 1;; //calibration storage page CalEquationType[Channel]=1; break; case 14: Name[Channel] = "Digital Sensor" ; Units[Channel] = "read digital ID" ; ShortName[Channel] = "D&"; Slope[Channel]=1; Intercept[Channel]=0; Page[Channel] = 1;; //calibration storage page CalEquationType[Channel]=1; break; default: Name[Channel] = "nothing on BTD" ; SensorNumber[Channel] = 0; // Units[Channel] = "" ; ShortName[Channel] = ""; Slope[Channel]=1; Intercept[Channel]=0; Page[Channel] = 1;; //calibration storage page CalEquationType[Channel]=1; break; } // end of switch case } // end of BTD resistor check void PrintSensorInfo() {// print out information about sensor Serial.println(" "); Serial.print("BTD connector "); Serial.println(Channel-2); Serial.print("sensor ID number: "); Serial.println(SensorNumber[Channel]); Serial.print("ID voltage level: "); Serial.println(VoltageID[Channel]); Serial.print("sensor name: "); Serial.println (Name[Channel]); Serial.print("sensor short name: "); Serial.println (ShortName[Channel]); Serial.print("calibration page: "); Serial.println(Page[Channel]); Serial.print("calibration equation type: "); Serial.println(CalEquationType[Channel]); Serial.print("intercept: "); Serial.println (Intercept[Channel]); Serial.print("slope "); Serial. println(Slope[Channel]); Serial.print("Program to use: "); Serial.println (Units[Channel]); }// end of PrintSensorInfo