' ========================================================================= ' File...... GP2D12 Demo.bs2 ' Purpose... Demonstrate GP2D12 ' Author.... Parallax, Inc. ' E-mail.... support@parallax.com ' {$STAMP BS2} ' {$PBASIC 2.5} ' ========================================================================= ' -----[ Program Description ]--------------------------------------------- ' This program demonstrates reading the distance in centimeters from the ' Sharp GP2D12 Analog Distance Sensor. ' -----[ I/O Definitions ]------------------------------------------------- Adc0831 PIN 0 ' ADC0831 Chip Select (ADC0831.1) AdcClock PIN 1 ' ADC0831 Clock (ADC0831.7) AdcData PIN 2 ' ADC0831 Data (ADC0831.6) ' -----[ Constants ]------------------------------------------------------- span CON 5 ' 5 cm Per Data Point ' -----[ Variables ]------------------------------------------------------- result VAR Byte ' ADC8031 Result volts VAR Word ' Volts (0.01 Increments) cm VAR Byte ' centimeters index VAR Nib test1 VAR Byte ' Values For test2 VAR Byte ' Interpolation slope VAR Word ' mV/cm between test points ' -----[ EEPROM Data ]----------------------------------------------------- Vout DATA 251, 179, 139, 114, 97 DATA 85, 76, 67, 62, 57 DATA 53, 50, 48, 46, 43 DATA 0 ' -----[ Initialization ]-------------------------------------------------- HIGH Adc0831 ' Disable ADC0831 ' -----[ Program Code ]---------------------------------------------------- DO GOSUB Read_GP2D12 ' Read Sensor Value GOSUB Calculate_Distance ' Convert Value To cm DEBUG HOME, "Distance = ", DEC cm, " cm " PAUSE 100 LOOP END ' -----[ Subroutines ]----------------------------------------------------- Read_GP2D12: volts = 0 ' Reset Sensor Value FOR index = 0 TO 2 ' Read 3 Times LOW Adc0831 ' Enable ADC0831 SHIFTIN AdcData, AdcClock, MSBPOST, [result\9] ' Read The Voltage HIGH Adc0831 ' Disable ADC0831 volts = volts + result ' Add The Values PAUSE 30 NEXT volts = volts / 3 ' Average The Readings RETURN Calculate_Distance: FOR index = 0 TO 15 ' Search DATA Table For Value READ (Vout + index), test2 ' Get Value From DATA Table IF (test2 <= volts) THEN EXIT ' Found Value NEXT SELECT index CASE 0 cm = 10 ' Set To Minimum Distance CASE 1 TO 14 ' Calculate Distance cm = 10 + (5 * index) IF (test2 < volts) THEN ' Estimate Using Interpolation READ (Vout + index - 1), test1 slope = (test1 - test2) * 10 / span ' Calculate Slope cm = cm - ((volts - test2) * 10 / slope) ENDIF CASE 15 cm = 80 ' Set To Maximum Distance ENDSELECT RETURN