F I S H B O W L

p r o j e c t 1 :: w e e k 4 FINAL PROJECT SETUP PICTURES
 Pictures of final apparatus setup and fish swimming over light sensors embedded under tank.
FINAL VERSION OF CODE **************************************************************** '* Name : Fish Bowl Project 1.0 * '* Author : Alysse * '* Date : 10/6/2004 * '* Version : 1.0 * '* Notes : 1.Includes serial output to monitor data from '* optical sensor. '* 2. At begining session : 2 sets of sensors * '* labeled red and yellow find initial base * '* reading for each sensor * '* 3. sensors are at either end of tank (in '* real setup they would correspond to different '* sounding chimes) '* 4. if any of four sensors representing a color '* goes below a shadow level - the chime is hit '* 5. long chime - if just a shadow '* short chime - if shadow is extremely dark ( '* i.e. fish directly over sensor) '**************************************************************** DEFINE OSC 4 DEFINE ADC_BITS 10 ' Set number of bits in result DEFINE ADC_CLOCK 3 ' Set clock source (3=rc) DEFINE ADC_SAMPLEUS 50 ' Set sampling time in uS PORTB = %00000000 ' Set PORTC to all output PORTC = %00000000 ' Set PORTD to all output TRISA = %11111111 ' Set PORTA to all input TRISE = %11111111 ' set port E to all input (40-pin PICs) ADCON1 = %10000010 ' Set PORTA analog and right justify redSensors VAR WORD[4] ylSensors VAR WORD[4] meanRed VAR WORD[4] meanYl Var Word[4] minRed VAR WORD[4] maxRed Var WORD[4] minYl VAR WORD[4] maxYl VAR WORD[4] varRed VAR WORD[4] varYl VAR WORD[4] ylLED VAR PORTB.7 txPin VAR PORTC.6 servo_1 VAR PORTC.3 pulseWidth VAR WORD i VAR BYTE j VAR BYTE ' set up constants with the minimum and maximum pulsewidths minPulse CON 10 maxPulse CON 110 refreshPeriod CON 20 PAUSE 500 GOSUB blink GOSUB init main: '''''''''''''''''''''''''''''''''''''''' ' Read in row of sensor values... '''''''''''''''''''''''''''''''''''''''' for i = 0 TO 3 STEP 1 ADCIN i, redSensors[i] Next i FOR i = 4 TO 7 STEP 1 ADCIN i, ylSensors[i - 4] NEXT i ''''''''''''''''''''''''''''''''''''''''''''''''''' ' shadow level :: if any of the four sensors is ' below the shadow level - pulse the motor 360 degrees ' ''''''''''''''''''''''''''''''''''''''''''''''''''' for i = 0 To 3 if redSensors[i] < (meanRed[i] - 2 * varRed[i] - 10) THEN serout2 txPin, 16468, ["red sensor = ", DEC redSensors[0]," ", DEC redSensors[1], " ", DEC redSensors[2], " ", DECredSensors[3]," ", 13, 10] ' if shadow is very dark run shortChime if (redSensors[i] < (meanRed[i] - 50)) THEN SEROUT2 txPin, 16468, ["short chime start...", 13, 10] GOSUB shortChime ELSE ' run longChime SEROUT2 txPin, 16468, ["long chime start...", 13, 10] GOSUB longChime ENDIF ENDIF IF ylSensors[i] < (meanYl[i] - 2 * varYl[i] - 5) THEN serout2 txPin, 16468, ["yellow sensor = ", DEC ylSensors[0], " ", DEC ylSensors[1], " ", DEC ylSensors[2], " ", DEC ylSensors[3]," ", 13, 10] if (ylSensors[i] < (meanYl[i] - 50)) THEN SEROUT2 txPin, 16468, ["short chime start...", 13, 10] GOSUB shortChime ELSE ' run longChime SEROUT2 txPin, 16468, ["long chime start...", 13, 10] GOSUB longChime ENDIF ENDIF NEXT I GoTo main '''''''''''''''''''''''''''''''''''''''''' ' init : set base line levels for the sensors '''''''''''''''''''''''''''''''''''''''''' init: for i = 0 TO 3 STEP 1 ADCIN i, redSensors[i] minRed[i] = redSensors[i] maxRed[i] = minRed[i] meanRed[i] = maxRed[i] Next i FOR i = 4 TO 7 STEP 1 ADCIN i, ylSensors[i - 4] minYl[i - 4] = ylSensors[i - 4] maxYl[i -4] = minYl[i -4] meanYl[i - 4] = maxYl[i -4] NEXT i for j = 1 TO 99 for i = 0 TO 3 STEP 1 ADCIN i, redSensors[i] if (redSensors[i]> maxRed[i]) THEN maxRed[i] = redSensors[i] ENDIF IF (redSensors[i] < minREd[i]) THEN minRed[i] = redSensors[i] ENDIF 'meanRed[i] = redSensors[i] + meanRed[i] Next i 'PAUSE 100 for i = 4 TO 7 STEP 1 ADCIN i, ylSensors[i - 4] if (ylSensors[i-4]> maxYl[i-4]) THEN maxYl[i-4] = ylSensors[i-4] ENDIF IF (ylSensors[i-4] < minYl[i-4]) THEN minYl[i-4] = ylSensors[i-4] ENDIF 'meanRed[i] = redSensors[i] + meanRed[i] Next i PAUSE 100 NEXT j for i = 0 to 3 meanREd[i] = (maxREd[i] + minRed[i])/2; 'meanRed[i] / 100 varREd[i] = maxREd[i] - minRed[i]; NEXT I FOR i = 4 TO 7 meanYl[i - 4] = (maxYl[i - 4] + minYl[i -4])/2; varYl[i-4] = maxYl[i-4] - minYl[i-4]; NEXT i serout2 txPin, 16468, ["mean RED = ", DEC meanRed[0], " ", DEC meanRed[1], " ", DEC meanREd[2], " ", DEC meanRed[3]," ", 13, 10] serout2 txPin, 16468, ["min RED = ", DEC minRed[0], " ", DEC minRed[1], " ", DEC minREd[2], " ", DEC minRed[3]," ", 13, 10] serout2 txPin, 16468, ["max RED = ", DEC maxRed[0], " ", DEC maxRed[1], " ", DEC maxREd[2], " ", DEC maxRed[3]," ", 13, 10] serout2 txPin, 16468, ["var RED = ", DEC varRed[0], " ", DEC varRed[1], " ", DEC varREd[2], " ", DEC varRed[3]," ", 13, 10] serout2 txPin, 16468, ["mean Yellow = ", DEC meanYl[0], " ", DEC meanYl[1], " ", DEC meanYl[2], " ", DEC meanYl[3]," ", 13, 10] serout2 txPin, 16468, ["min Yellow = ", DEC minYl[0], " ", DEC minYl[1], " ", DEC minYl[2], " ", DEC minYl[3]," ", 13, 10] serout2 txPin, 16468, ["max Yellow = ", DEC maxYl[0], " ", DEC maxYl[1], " ", DEC maxYl[2], " ", DEC maxYl[3]," ", 13, 10] serout2 txPin, 16468, ["var Yellow = ", DEC varYl[0], " ", DEC varYl[1], " ", DEC varYl[2], " ", DEC varYl[3]," ", 13, 10] RETURN ''''''''''''''''''''''''''''''''''''' ' SUB Routines : shortChime and Long Chime ' '''''''''''''''''''''''''''''''''''' shortCHIME: for j = minPulse to maxPulse STEP 20 LOW servo_1 PULSOUT servo_1, j PAUSE refreshPeriod NEXT j for j = maxPulse to minPulse STEP -20 LOW servo_1 PULSOUT servo_1, j PAUSE refreshPeriod NEXT j PAUSE 500 ' PAUSE AFTER chime is hit RETURN longCHIME: for j = minPulse to maxPulse STEP 5 LOW servo_1 PULSOUT servo_1, j PAUSE refreshPeriod NEXT j for j = maxPulse to minPulse STEP -5 LOW servo_1 PULSOUT servo_1, j PAUSE refreshPeriod NEXT j PAUSE 500 ' pause after chime is hit RETURN ''''''''''''''''''''''''''''''''''''''''''' ' blink : subroutine for starting computer '''''''''''''''''''''''''''''''''''''''''' blink: SEROUT2 txPin,16468, ["Blinking", 13, 10] HIGH ylLED PAUSE 800 LOW ylLED PAUSE 800 HIGH ylLED PAUSE 800 LOW ylLED PAUSE 800 HIGH ylLED PAUSE 800 LOW ylLED PAUSE 800 HIGH ylLEd return