Are there any Arduino developers in Seattle?

I work for a model making company in Seattle and we are working on a motorized model that we are having trouble with. I am an amateur programmer and am having problems locating an error in my code or where I may have an infinite loop. Any help would be appreciated.

I have included the util/delay.h file because at one point I suspected a problem with the arduino's timer.

The actual board is a Seeduinomega

All of the movements are made by linear actuators controlled by two relays and two fets, however the boat is moved back and forth by a belt attached to a rotating motor at one end.

If interested in consulting please reply and I can forward your information to my employer

Thank you

Here is a url to a video of the model in proper action

Unless the code is proprietary, and a non-disclosure agreement is needed, post the code here. You could get it fixed for your annual membership cost.

Or note where I'm at.

Really cool video!

I dont believe the code to be under any non disclosure agreement, its quite amateur, so please be kind.

#include <util/delay.h>

#define UP             false
#define CLOSE          false
#define REVERSE        false
#define DOWN           true
#define OPEN           true
#define FORWARD        true

#define RESET          2  // 

//Define Control Panel LED Pins
#define MOVEBOATLED    4  // 
#define DRAINWATERLED  5  // 
#define GATE1LED       6  // 
#define GATE2LED       7  // 
#define RETURNBACKLED  8  //

//Define Water LED panel
#define SECTION1       9  // pmw pins for fadeing panel
#define SECTION2      10  // pmw pins for fadeing panel
#define SECTION3      11  // pmw pins for fadeing panel

//Define Control Panel Button Pins
#define MOVEBOAT      22  // 
#define DRAINWATER    23  // 
#define GATE1         24  // 
#define GATE2         25  // 
#define RETURNBACK    26  // 

//Define Limit Switch Pins
#define GATE1UP       27  //
#define GATE1DOWN     28  //
#define WATERUP       29  //
#define WATERDOWN     30  //
#define CATSTART      31  //
#define CATEND        32  //
#define BOATPOS1      33  //
#define BOATPOS2      34  //
#define BOATPOS3      35  //
#define BOATPOS4      36  //
#define GATE2AOPEN    37  //
#define GATE2ACLOSE   38  //
#define GATE2BOPEN    39  //
#define GATE2BCLOSE   40  //

#define REDLIGHT      45  //
#define GREENLIGHT    46  //
#define SIREN         47  //

//Define Control Pins
#define BOATPWR       48  //
#define BOATDIR       49  //
#define GATE1PWR      50  //
#define GATE1DIR      51  //
#define WATERPWR      52  //
#define WATERDIR      53  //
#define GATE2APWR     43  // 
#define GATE2ADIR     44  // 
#define GATE2BPWR     41  // 
#define GATE2BDIR      3  // 

unsigned long buttonPress = 0, loopStart = 0, temp = 0, temp2 = 0; //  
 
int modelState = 0, i, state;

void setup(){
  //Serial.begin(9600);

  
  //Set up Control Panel LEDs
  pinMode(MOVEBOATLED, OUTPUT);
  digitalWrite(MOVEBOATLED, LOW);
  pinMode(DRAINWATERLED, OUTPUT);
  digitalWrite(DRAINWATERLED, LOW);
  pinMode(GATE1LED, OUTPUT);
  digitalWrite(GATE1LED, LOW);
  pinMode(GATE2LED, OUTPUT);
  digitalWrite(GATE2LED, LOW);
  pinMode(RETURNBACKLED, OUTPUT);
  digitalWrite(RETURNBACKLED, LOW);
  
  //Set up Input pins for buttons on panels
  pinMode(MOVEBOAT, INPUT);
  digitalWrite(MOVEBOAT, HIGH);
  pinMode(DRAINWATER, INPUT);
  digitalWrite(DRAINWATER, HIGH);
  pinMode(GATE1, INPUT);
  digitalWrite(GATE1, HIGH);
  pinMode(GATE2, INPUT);
  digitalWrite(GATE2, HIGH);
  pinMode(RETURNBACK, INPUT);
  digitalWrite(RETURNBACK, HIGH);

  //Set up Input pins for buttons on panels
  pinMode(GATE1UP, INPUT);
  digitalWrite(GATE1UP, HIGH);
  pinMode(GATE1DOWN, INPUT);
  digitalWrite(GATE1DOWN, HIGH);
  pinMode(WATERUP, INPUT);
  digitalWrite(WATERUP, HIGH);
  pinMode(WATERDOWN, INPUT);
  digitalWrite(WATERDOWN, HIGH);
  pinMode(CATSTART, INPUT);
  digitalWrite(CATSTART, HIGH);
  pinMode(CATEND, INPUT);
  digitalWrite(CATEND, HIGH);
  pinMode(BOATPOS1, INPUT);
  digitalWrite(BOATPOS1, HIGH);
  pinMode(BOATPOS2, INPUT);
  digitalWrite(BOATPOS2, HIGH);
  pinMode(BOATPOS3, INPUT);
  digitalWrite(BOATPOS3, HIGH);
  pinMode(BOATPOS4, INPUT);
  digitalWrite(BOATPOS4, HIGH);
  pinMode(GATE2AOPEN, INPUT);
  digitalWrite(GATE2AOPEN, HIGH);
  pinMode(GATE2ACLOSE, INPUT);
  digitalWrite(GATE2ACLOSE, HIGH);
  pinMode(GATE2BOPEN, INPUT);
  digitalWrite(GATE2BOPEN, HIGH);
  pinMode(GATE2BCLOSE, INPUT);
  digitalWrite(GATE2BCLOSE, HIGH);

  //Set up LED Panels
  pinMode(SECTION1, OUTPUT);
  digitalWrite(SECTION1, LOW);
  pinMode(SECTION2, OUTPUT);
  digitalWrite(SECTION2, LOW);
  pinMode(SECTION3, OUTPUT);
  digitalWrite(SECTION3, LOW);
  
  //Set up Siren and Lights
  pinMode(REDLIGHT, OUTPUT);
  digitalWrite(REDLIGHT, LOW);
  pinMode(GREENLIGHT, OUTPUT);
  digitalWrite(GREENLIGHT, LOW);
  pinMode(SIREN, OUTPUT);
  digitalWrite(SIREN, LOW);
  
  //Set up Motor Control pins
  pinMode(BOATPWR, OUTPUT);
  digitalWrite(BOATPWR, LOW);
  pinMode(BOATDIR, OUTPUT);
  digitalWrite(BOATDIR, LOW);
  pinMode(GATE1PWR, OUTPUT);
  digitalWrite(GATE1PWR, LOW);
  pinMode(GATE1DIR, OUTPUT);
  digitalWrite(GATE1DIR, LOW);
  pinMode(WATERPWR, OUTPUT);
  digitalWrite(WATERPWR, LOW);
  pinMode(WATERDIR, OUTPUT);
  digitalWrite(WATERDIR, LOW);
  pinMode(GATE2APWR, OUTPUT);
  digitalWrite(GATE2APWR, LOW);
  pinMode(GATE2ADIR, OUTPUT);
  digitalWrite(GATE2ADIR, LOW);
  pinMode(GATE2BPWR, OUTPUT);
  digitalWrite(GATE2BPWR, LOW);
  pinMode(GATE2BDIR, OUTPUT);
  digitalWrite(GATE2BDIR, LOW);
  
  
  digitalWrite(BOATPWR, LOW);
  digitalWrite(GATE1PWR, LOW);
  digitalWrite(WATERPWR, LOW);
  digitalWrite(GATE2APWR, LOW);
  digitalWrite(GATE2BPWR, LOW);
  
  pinMode(RESET, OUTPUT);
  digitalWrite(RESET, LOW);
  
  setup_model();
  buttonPress = millis();
}

void loop(){
  modelState = modelStateFn();
  setButtons();
  _delay_ms(10);
  if(digitalReadDebounce(MOVEBOAT)==LOW && (modelState == 0 || modelState == 3 || modelState == 7)){
    MoveBoat(FORWARD);
    buttonPress = millis();
  }else if(digitalReadDebounce(DRAINWATER)==LOW && (modelState == 1 || modelState == 5)){
    if(modelState == 1){
      MoveWater(UP);
    }else if(modelState == 5){
      MoveWater(DOWN);
    }
    buttonPress = millis();
  }else if(digitalReadDebounce(GATE1)==LOW && (modelState == 2 || modelState == 4)){
    if(modelState == 2){
      MoveGate1(DOWN);
    }else if(modelState == 4){
      MoveGate1(UP);
    }
    buttonPress = millis();
  }else if(digitalReadDebounce(GATE2)==LOW && (modelState == 6 || modelState == 8)){
    if(modelState == 6){
      MoveGate2(OPEN);
    }else if(modelState == 8){
      MoveGate2(CLOSE);
    }
    buttonPress = millis();
  }else if(digitalReadDebounce(RETURNBACK)==LOW){
    buttons_off();
    temp = millis();
    while(digitalReadDebounce(RETURNBACK)==LOW){
      _delay_us(1);
      if((millis() - temp) >= 3000){
        resetModel();
        break;
      }
    }
    Back();
  }else{
    if((millis() - buttonPress) > 30000){
      if(modelState != 0){
        digitalWrite(RESET, HIGH);
      }
      buttonPress = millis();
    }
  }
}

void MoveBoat(boolean forward_reverse){
  loopStart = millis();
  if(forward_reverse){
    //Serial.print("BOAT FORWARD TO: ");
    if(modelState == 0 && digitalReadDebounce(GATE1UP) == LOW){
      //Serial.println("BOATPOS2");
      digitalWrite(GREENLIGHT, HIGH);
      while(digitalReadDebounce(BOATPOS2) == HIGH){
        _delay_us(1);
        digitalWrite(BOATDIR, HIGH);
        digitalWrite(BOATPWR, HIGH);
        digitalWrite(GATE1PWR, LOW);
        digitalWrite(WATERPWR, LOW);
        digitalWrite(GATE2APWR, LOW);
        digitalWrite(GATE2BPWR, LOW);
        if((millis() - loopStart || digitalReadDebounce(CATSTART) == LOW || digitalReadDebounce(CATEND) == LOW) > 60000){
          digitalWrite(RESET, HIGH);
        }
      }
      digitalWrite(BOATPWR, LOW);
      digitalWrite(GREENLIGHT, LOW);
      return;
    }else if(modelState == 3 && digitalReadDebounce(WATERUP) == LOW){
      //Serial.println("BOATPOS3");
      siren();
      digitalWrite(GREENLIGHT, HIGH);
      while(digitalReadDebounce(BOATPOS3) == HIGH){
        _delay_us(1);
        digitalWrite(BOATDIR, HIGH);
        digitalWrite(BOATPWR, HIGH);
        digitalWrite(GATE1PWR, LOW);
        digitalWrite(WATERPWR, LOW);
        digitalWrite(GATE2APWR, LOW);
        digitalWrite(GATE2BPWR, LOW);
        if((millis() - loopStart) > 60000 || digitalReadDebounce(CATSTART) == LOW || digitalReadDebounce(CATEND) == LOW){
          digitalWrite(RESET, HIGH);
        }
      }
      digitalWrite(BOATPWR, LOW);
      digitalWrite(GREENLIGHT, LOW);
      return;
    }else if(modelState == 7 && digitalReadDebounce(GATE2AOPEN) == LOW && digitalReadDebounce(GATE2BOPEN) == LOW){
      //Serial.println("BOATPOS4 ");
      digitalWrite(GREENLIGHT, HIGH);
      while(digitalReadDebounce(BOATPOS4) == HIGH){
        _delay_us(1);
        digitalWrite(BOATDIR, HIGH);
        digitalWrite(BOATPWR, HIGH);
        digitalWrite(GATE1PWR, LOW);
        digitalWrite(WATERPWR, LOW);
        digitalWrite(GATE2APWR, LOW);
        digitalWrite(GATE2BPWR, LOW);
        if((millis() - loopStart) > 60000 || digitalReadDebounce(CATSTART) == LOW || digitalReadDebounce(CATEND) == LOW){
          digitalWrite(RESET, HIGH);
        }
      }
      digitalWrite(BOATPWR, LOW);
      digitalWrite(GREENLIGHT, LOW);
      return;
    }
  }else{
    //Serial.print("BOAT BACK TO: ");
    if(modelState == 1){
      //Serial.println("BOATPOS1");
      digitalWrite(GREENLIGHT, HIGH);
      while(digitalReadDebounce(BOATPOS1) == HIGH){
        _delay_us(1);
        digitalWrite(BOATDIR, LOW);
        digitalWrite(BOATPWR, HIGH);
        digitalWrite(GATE1PWR, LOW);
        digitalWrite(WATERPWR, LOW);
        digitalWrite(GATE2APWR, LOW);
        digitalWrite(GATE2BPWR, LOW);
        if((millis() - loopStart) > 60000  || digitalReadDebounce(CATSTART) == LOW || digitalReadDebounce(CATEND) == LOW){
          digitalWrite(RESET, HIGH);
        }
      }
      digitalWrite(BOATPWR, LOW);
      digitalWrite(GREENLIGHT, LOW);
      return;
    }else if(modelState == 4 && digitalReadDebounce(WATERUP) == LOW && digitalReadDebounce(GATE1DOWN) == LOW){
      //Serial.println("BOATPOS2");
      digitalWrite(GREENLIGHT, HIGH);
      while(digitalReadDebounce(BOATPOS2) == HIGH){
        _delay_us(1);
        digitalWrite(BOATDIR, LOW);
        digitalWrite(BOATPWR, HIGH);
        digitalWrite(GATE1PWR, LOW);
        digitalWrite(WATERPWR, LOW);
        digitalWrite(GATE2APWR, LOW);
        digitalWrite(GATE2BPWR, LOW);
        if((millis() - loopStart) > 60000 || digitalReadDebounce(CATSTART) == LOW || digitalReadDebounce(CATEND) == LOW){
          digitalWrite(RESET, HIGH);
        }
      }
      digitalWrite(BOATPWR, LOW);
      digitalWrite(GREENLIGHT, LOW);
      return;
    }else if(modelState == 8 && digitalReadDebounce(GATE2AOPEN) == LOW && digitalReadDebounce(GATE2BOPEN) == LOW && digitalReadDebounce(WATERDOWN) == LOW){
      //Serial.println("BOATPOS3");
      siren();
      digitalWrite(GREENLIGHT, HIGH);
      while(digitalReadDebounce(BOATPOS3) == HIGH){
        _delay_us(1);
        digitalWrite(BOATDIR, LOW);
        digitalWrite(BOATPWR, HIGH);
        digitalWrite(GATE1PWR, LOW);
        digitalWrite(WATERPWR, LOW);
        digitalWrite(GATE2APWR, LOW);
        digitalWrite(GATE2BPWR, LOW);
        if((millis() - loopStart) > 60000 || digitalReadDebounce(CATSTART) == LOW || digitalReadDebounce(CATEND) == LOW){
          digitalWrite(RESET, HIGH);
        }
      }
      digitalWrite(BOATPWR, LOW);
      digitalWrite(GREENLIGHT, LOW);
      return;
    }
  }
  //Serial.println("ERR BOAT!!!");
  siren2();
  digitalWrite(RESET, HIGH);
  return;
}

void MoveWater(boolean up_down){
  loopStart = millis();
  if(up_down){
    //Serial.println("WATER DOWN");
    for(i = 0; i <= 150; i++){
      analogWrite(SECTION2, i);
      analogWrite(SECTION3, i);
      _delay_ms(2000/150);
      if((millis() - loopStart) > 60000){
        digitalWrite(RESET, HIGH);
      }
    }
    digitalWrite(WATERDIR, LOW);
    digitalWrite(WATERPWR, HIGH);
    while(digitalReadDebounce(WATERDOWN) == HIGH){
      _delay_us(1);
      digitalWrite(WATERDIR, LOW);
      digitalWrite(WATERPWR, HIGH);
      digitalWrite(BOATPWR, LOW);
      digitalWrite(GATE1PWR, LOW);
      digitalWrite(GATE2APWR, LOW);
      digitalWrite(GATE2BPWR, LOW);
        if((millis() - loopStart) > 60000){
          digitalWrite(RESET, HIGH);
        }
    }
    digitalWrite(WATERPWR, LOW);
    for(i = 150; i >= 0; i--){
      analogWrite(SECTION2, i);
      analogWrite(SECTION3, i);
      _delay_ms(2000/150);
      if((millis() - loopStart) > 60000){
        digitalWrite(RESET, HIGH);
      }
    }
    return;
  }else if(digitalReadDebounce(GATE2ACLOSE) == LOW && digitalReadDebounce(GATE2BCLOSE) == LOW){
    //Serial.println("WATER UP");
    for(i = 0; i <= 150; i++){
      analogWrite(SECTION1, i);
      analogWrite(SECTION2, i);
      _delay_ms(2000/150);
      if((millis() - loopStart) > 60000){
        digitalWrite(RESET, HIGH);
      }
    }
    while(digitalReadDebounce(WATERUP) == HIGH){
      _delay_us(1);
      digitalWrite(WATERDIR, HIGH);
      digitalWrite(WATERPWR, HIGH);
      digitalWrite(BOATPWR, LOW);
      digitalWrite(GATE1PWR, LOW);
      digitalWrite(GATE2APWR, LOW);
      digitalWrite(GATE2BPWR, LOW);
      if((millis() - loopStart) > 60000){
        digitalWrite(RESET, HIGH);
      }
    }
    _delay_ms(1000);
    digitalWrite(WATERPWR, LOW);
    for(i = 150; i >= 0; i--){
      analogWrite(SECTION1, i);
      analogWrite(SECTION2, i);
      _delay_ms(2000/150);
      if((millis() - loopStart) > 60000){
        digitalWrite(RESET, HIGH);
      }
    }
    return;
  }
  //Serial.println("ERR WATER!!!");
  siren2();
  digitalWrite(RESET, HIGH);
  return;
}

void MoveGate1(boolean up_down){
  loopStart = millis();
  if(up_down){ //Move gate down
    //Serial.println("GATE1 DOWN");
    while(digitalReadDebounce(GATE1DOWN) == HIGH){
      _delay_us(1);
      digitalWrite(GATE1DIR, LOW);
      digitalWrite(GATE1PWR, HIGH);
      digitalWrite(BOATPWR, LOW);
      digitalWrite(WATERPWR, LOW);
      digitalWrite(GATE2APWR, LOW);
      digitalWrite(GATE2BPWR, LOW);
        if((millis() - loopStart) > 60000){
          digitalWrite(RESET, HIGH);
        }
    }
    digitalWrite(GATE1PWR, LOW);
    return;
  }else{ //Move gate up
    //Serial.println("GATE1 UP");
    digitalWrite(REDLIGHT, HIGH);    
    while(digitalReadDebounce(GATE1UP) == HIGH){
      _delay_us(1);
      digitalWrite(GATE1DIR, HIGH);
      digitalWrite(GATE1PWR, HIGH);
      digitalWrite(BOATPWR, LOW);
      digitalWrite(WATERPWR, LOW);
      digitalWrite(GATE2APWR, LOW);
      digitalWrite(GATE2BPWR, LOW);
        if((millis() - loopStart) > 60000){
          digitalWrite(RESET, HIGH);
        }
    }
    _delay_ms(1000);
    digitalWrite(GATE1PWR, LOW);
    digitalWrite(REDLIGHT, LOW);
    return;
  }
  //Serial.println("ERR TAINTER!!!");
  siren2();
  digitalWrite(RESET, HIGH);
  return;
}

void MoveGate2(boolean open_close){
  loopStart = millis();
  if(open_close && digitalReadDebounce(WATERDOWN) == LOW){ //Open Gate
    //Serial.println("GATE2 OPEN");
    digitalWrite(REDLIGHT, HIGH);
    digitalWrite(GATE2ADIR, HIGH);
    digitalWrite(GATE2BDIR, HIGH);
    while(digitalReadDebounce(GATE2AOPEN) == HIGH || digitalReadDebounce(GATE2BOPEN) == HIGH ){
      _delay_us(1);
      digitalWrite(BOATPWR, LOW);
      digitalWrite(GATE1PWR, LOW);
      digitalWrite(WATERPWR, LOW);
      if(digitalReadDebounce(GATE2AOPEN) == LOW){
        digitalWrite(GATE2APWR, LOW);
      }else{
        digitalWrite(GATE2APWR, HIGH);
      }
      if(digitalReadDebounce(GATE2BOPEN) == LOW){
        digitalWrite(GATE2BPWR, LOW);
      }else{
        digitalWrite(GATE2BPWR, HIGH);
      }
      if((millis() - loopStart) > 60000){
        digitalWrite(RESET, HIGH);
      }
    }
    digitalWrite(GATE2APWR, LOW);
    digitalWrite(GATE2BPWR, LOW);
    digitalWrite(GATE2ADIR, LOW);
    digitalWrite(GATE2BDIR, LOW);
    digitalWrite(REDLIGHT, LOW);
    return;
  }else if(digitalReadDebounce(BOATPOS1) == LOW || digitalReadDebounce(BOATPOS2) == LOW || digitalReadDebounce(BOATPOS3) == LOW || digitalReadDebounce(BOATPOS4) == LOW){ //Close gate
    //Serial.println("GATE2 CLOSE");
    digitalWrite(REDLIGHT, HIGH);
    digitalWrite(GATE2ADIR, LOW);
    digitalWrite(GATE2BDIR, LOW);
    while(digitalReadDebounce(GATE2ACLOSE) == HIGH || digitalReadDebounce(GATE2BCLOSE) == HIGH ){
      _delay_us(1);
      digitalWrite(BOATPWR, LOW);
      digitalWrite(GATE1PWR, LOW);
      digitalWrite(WATERPWR, LOW);
      if(digitalReadDebounce(GATE2ACLOSE) == LOW){
        digitalWrite(GATE2APWR, LOW);
      }else{
        digitalWrite(GATE2APWR, HIGH);
      }
      if(digitalReadDebounce(GATE2BCLOSE) == LOW){
        digitalWrite(GATE2BPWR, LOW);
      }else{
        digitalWrite(GATE2BPWR, HIGH);
      }
      if((millis() - loopStart) > 60000){
        digitalWrite(RESET, HIGH);
      }
    }
    digitalWrite(GATE2APWR, LOW);
    digitalWrite(GATE2BPWR, LOW);
    digitalWrite(GATE2ADIR, LOW);
    digitalWrite(GATE2BDIR, LOW);
    digitalWrite(REDLIGHT, LOW);
    return;
  }
  //Serial.println("ERR MITER!!!");
  siren2();
  digitalWrite(RESET, HIGH);
  return;
}

void siren(){
  digitalWrite(SIREN, HIGH);
  _delay_ms(2000);
  digitalWrite(SIREN, LOW);
}

void siren2(){
  digitalWrite(SIREN, HIGH);
  _delay_ms(500);
  digitalWrite(SIREN, LOW);
  _delay_ms(500);
  digitalWrite(SIREN, HIGH);
  _delay_ms(500);
  digitalWrite(SIREN, LOW);
  _delay_ms(500);
  digitalWrite(SIREN, HIGH);
  _delay_ms(500);
  digitalWrite(SIREN, LOW);
  _delay_ms(500);
  digitalWrite(SIREN, HIGH);
  _delay_ms(500);
  digitalWrite(SIREN, LOW);
  _delay_ms(500);
  digitalWrite(SIREN, HIGH);
  _delay_ms(500);
  digitalWrite(SIREN, LOW);
}

void Back(){
  switch(modelState){
    case 0:
      //Serial.println("AT BEGINING");
      break;
    case 1:
      MoveBoat(REVERSE);
      _delay_ms(1000);
      break;
    case 2:
      MoveWater(DOWN);
      _delay_ms(1000);
      break;
    case 3:
      MoveGate1(UP);
      _delay_ms(1000);
      break;
    case 4:
      MoveBoat(REVERSE);
      _delay_ms(1000);
      break;
    case 5:
      MoveGate1(DOWN);
      _delay_ms(1000);
      break;
    case 6:
      MoveWater(UP);
      _delay_ms(1000);
      break;
    case 7:
      MoveGate2(CLOSE);
      _delay_ms(1000);
      break;
    case 8:
      MoveBoat(REVERSE);
      _delay_ms(1000);
      break;
    case 9:
      MoveGate2(OPEN);
      _delay_ms(1000);
      break;
    default:
      digitalWrite(RESET, HIGH);
      break;
  }
  return;
}

void resetModel(){
  loopStart = millis();
  buttons_off();
  modelState = modelStateFn();
  while(modelState != 0){
    Back();
    modelState = modelStateFn();
    if((millis() - loopStart) > 60000){
      digitalWrite(RESET, HIGH);
    }
  }
  digitalWrite(RESET, HIGH);
  return;
}

void setup_model(){
  if(digitalReadDebounce(BOATPOS1) == LOW){ //Boat at position 1
    if(digitalReadDebounce(GATE2ACLOSE) == HIGH || digitalReadDebounce(GATE2BCLOSE) == HIGH){
      MoveGate2(CLOSE);
    }
    if(digitalReadDebounce(GATE1UP) == HIGH){
      MoveGate1(UP);
    }
    if(digitalReadDebounce(WATERDOWN) == HIGH){
      MoveWater(DOWN);
    }
    return;
  }else if(digitalReadDebounce(BOATPOS2) == LOW){ //Boat at position 2
    if(digitalReadDebounce(GATE2ACLOSE) == HIGH || digitalReadDebounce(GATE2BCLOSE) == HIGH){
      MoveGate2(CLOSE);
    }
    if(digitalReadDebounce(GATE1UP) == HIGH){
      MoveGate1(UP);
    }
    if(digitalReadDebounce(WATERDOWN) == HIGH){
      MoveWater(DOWN);
    }
    resetModel();
    return;
  }else if(digitalReadDebounce(BOATPOS3) == LOW){ //Boat at position 3
    if(digitalReadDebounce(WATERUP) == LOW){  //Boat at position 3 and water is UP
      if(digitalReadDebounce(GATE2ACLOSE) == HIGH || digitalReadDebounce(GATE2BCLOSE) == HIGH){
        MoveGate2(CLOSE);
      }
      MoveGate1(DOWN);
      resetModel(
return;
    }else{ //Boat at position 3 and water is not up
      MoveGate2(CLOSE);
      MoveGate1(UP);
      MoveWater(UP);
      resetModel();
      return;
    }
  }else if(digitalReadDebounce(BOATPOS4) == LOW){ //Boat at position 4
    if(digitalReadDebounce(WATERDOWN) == HIGH){
      MoveWater(DOWN);
    }
    if(digitalReadDebounce(GATE2AOPEN) == HIGH || digitalReadDebounce(GATE2BOPEN) == HIGH){
      MoveGate2(OPEN);
    }
    MoveGate1(UP);
    resetModel();
    return;
  }else if(digitalReadDebounce(CATSTART) == LOW){  //Boat at against CATSTART
    digitalWrite(BOATDIR, HIGH);
    digitalWrite(BOATPWR, HIGH);
    while(digitalReadDebounce(BOATPOS1) == HIGH && digitalReadDebounce(BOATPOS2) == HIGH && digitalReadDebounce(BOATPOS3) == HIGH && digitalReadDebounce(BOATPOS4) == HIGH){
      _delay_us(1);
    }
    digitalWrite(BOATPWR, LOW);
    digitalWrite(RESET, HIGH);
    return;
  }else{ //BOAT NOT ON ANY LIMIT SWITCHES
    temp = 100;
    temp2 = 0; 
    boatnotonlimit:
    digitalWrite(BOATDIR, HIGH);
    while(digitalReadDebounce(BOATPOS1) == HIGH && digitalReadDebounce(BOATPOS2) == HIGH && digitalReadDebounce(BOATPOS3) == HIGH && digitalReadDebounce(BOATPOS4) == HIGH && digitalReadDebounce(CATSTART) == HIGH && digitalReadDebounce(CATEND) == HIGH){
      if(temp2 >= temp){
        temp = temp + 100;
        temp2 = 0;
        digitalWrite(BOATPWR, LOW);
        _delay_ms(500);
        if(digitalReadDebounce(BOATDIR) == LOW){
          digitalWrite(BOATDIR, HIGH);
        }else{
          digitalWrite(BOATDIR, LOW);
        }
      }
      digitalWrite(BOATPWR, HIGH);
      _delay_ms(10);
      temp2 = temp2 + 10;
    }
    _delay_ms(10);
    digitalWrite(BOATPWR, LOW);
    digitalWrite(RESET, HIGH);
    return;
  }
  digitalWrite(RESET, HIGH);
  return;
}

int modelStateFn(){
  if(digitalReadDebounce(BOATPOS1) == LOW){
    if(digitalReadDebounce(GATE1UP) == HIGH){
      MoveGate1(UP);
    }
    if(digitalReadDebounce(WATERDOWN) == HIGH){
      MoveWater(DOWN);
    }
    if(digitalReadDebounce(GATE2ACLOSE) == HIGH || digitalReadDebounce(GATE2BCLOSE) == HIGH){
      MoveGate2(CLOSE);
    }
    return 0;
  }else if(digitalReadDebounce(BOATPOS2) == LOW){
    if(digitalReadDebounce(WATERDOWN) == LOW){
      if(digitalReadDebounce(GATE1UP) == HIGH){
        MoveGate1(UP);
      }
      if(digitalReadDebounce(GATE2ACLOSE) == HIGH || digitalReadDebounce(GATE2BCLOSE) == HIGH){
        MoveGate2(CLOSE);
      }
      return 1;
    }else if(digitalReadDebounce(WATERUP) == LOW){
      if(digitalReadDebounce(GATE1UP) == LOW){
        return 2;
      }else if(digitalReadDebounce(GATE1DOWN) == LOW){
        return 3;
      }
    }
  }else if(digitalReadDebounce(BOATPOS3) == LOW){
    if(digitalReadDebounce(WATERUP) == LOW){
      if(digitalReadDebounce(GATE1DOWN) == LOW){
        return 4;
      }else if(digitalReadDebounce(GATE1UP) == LOW){
        return 5;
      }
    }else if(digitalReadDebounce(WATERDOWN) == LOW){
      if(digitalReadDebounce(GATE2ACLOSE) == LOW && digitalReadDebounce(GATE2BCLOSE) == LOW){
        return 6;
      }else if(digitalReadDebounce(GATE2AOPEN) == LOW && digitalReadDebounce(GATE2BOPEN) == LOW){
        return 7;
      }
    }
  }else if(digitalReadDebounce(BOATPOS4) == LOW){
    if(digitalReadDebounce(GATE2AOPEN) == LOW && digitalReadDebounce(GATE2BOPEN) == LOW){
      return 8;
    }else if(digitalReadDebounce(GATE2ACLOSE) == LOW && digitalReadDebounce(GATE2BCLOSE) == LOW){
      return 9;
    }
  }
  //Serial.println("CANT DETERMIN STATE");
  siren2();
  siren2();
  digitalWrite(RESET, HIGH);
}

void setButtons(){
  buttons_off();
  switch(modelState){
    case 0:
      digitalWrite(MOVEBOATLED, HIGH);
      break;
    case 1:
      digitalWrite(DRAINWATERLED, HIGH);
      digitalWrite(RETURNBACKLED, HIGH);
      break;
    case 2:
      digitalWrite(GATE1LED, HIGH);
      digitalWrite(RETURNBACKLED, HIGH);
      break;
    case 3:
      digitalWrite(MOVEBOATLED, HIGH);
      digitalWrite(RETURNBACKLED, HIGH);
      break;
    case 4:
      digitalWrite(GATE1LED, HIGH);
      digitalWrite(RETURNBACKLED, HIGH);
      break;
    case 5:
      digitalWrite(DRAINWATERLED, HIGH);
      digitalWrite(RETURNBACKLED, HIGH);
      break;
    case 6:
      digitalWrite(GATE2LED, HIGH);
      digitalWrite(RETURNBACKLED, HIGH);
      break;
    case 7:
      digitalWrite(MOVEBOATLED, HIGH);
      digitalWrite(RETURNBACKLED, HIGH);
      break;
    case 8:
      digitalWrite(GATE2LED, HIGH);
      digitalWrite(RETURNBACKLED, HIGH);
      break;
    case 9:
      digitalWrite(RETURNBACKLED, HIGH);
      break;
    default:
      digitalWrite(RESET, HIGH);
      break;
  }
  return;
}

void buttons_off(){
  digitalWrite(MOVEBOATLED, LOW);
  digitalWrite(DRAINWATERLED, LOW);
  digitalWrite(GATE1LED, LOW);
  digitalWrite(GATE2LED, LOW);
  digitalWrite(RETURNBACKLED, LOW);
  return;
}

boolean digitalReadDebounce(unsigned int pin){
  loopStart = millis();
  state = 0;
  for(i = 0; i < 5000; i++){
    if(digitalRead(pin) == LOW){
      state++;
    }
    _delay_us(1);
    if((millis() - loopStart) > 60000){
      digitalWrite(RESET, HIGH);
    }
  }
  if(state >= 2500){
    return false;
  }else{
    return true;
  }
}

you might want to put your code inside of code here [/ code] block (without the space after the /) to make it easier to read.

I am an amateur programmer and am having problems locating an error in my code or where I may have an infinite loop.

We've seen the video, and understand what the program is supposed to do, I think. Aside from the fact that there seems to be a lot of button pressing required to make things happen, what is the problem? What part isn't working right?

At certain times it seems to stop, or the boat will go the wrong direction and wont turn the motor off no matter what limit switches in the back are pressed.

One time the water rose while the swinging gates were open and the near one broke.

I have a hard time reading your code, spread over three posts, with all the Serial.print() statements commented out. Where in Seattle are you located?

north seattle Almost shoreline