This is simple sketch showing how AutoID can be used with Vernier digital (BTD) sensors. Most Vernier BTD sensors have a fixed resistor which is used to identify the type of sensor. After the sensor is identified the sketch displays the sensor name.
This sketch works with the SparkFun Vernier Interface Shield. To use this sketch with a system you wire yourself with one BTD adapter on a on a breadboard, the AutoID pin of the BTD adapter (pin 3) needs to be connected to pin A5 of the Arduino.
AutoID with multiple sensors: To make the AutoID system work for more than one adapter requires more complex electronics. The SparkFun Vernier Interface Shield contains a multiplexer and it can handle autoID on two BTA and two BTD sensors in one sketch.
This is simple sketch showing how AutoID can be used with Vernier digital (BTD) sensors. Most Vernier BTD sensors have a fixed resistor which is used to identify the type of sensor. After the sensor is identified the sketch displays the sensor name.
This sketch works with the SparkFun Vernier Interface Shield or a BTD socket wired via a breadboard.
AutoID with multiple sensors will work with the SparkFun Vernier Interface Shield, but to make the AutoID system work for more than one BTD connector, using one sketch, requires added electronics.
/* VernierDigitalAutoID (v 2014.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 / 1023.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.70) 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