Program glitches after adding idle show

We are using Arduino Uno to control an animatronic. It does not have servos, only air-powered cylinders, LED lights and sound. The program was working fine until we added an idle show (movements that happen without a trigger). The sketch now glitches frequently. It will either freeze, rapid fire during the show, the main will partially go off, or the main will go off when there is no trigger. (All relating to the main show that originally worked just fine).
We have verified power requirements are correct.
We have debugged.
It did the entire show without a trigger once (printed this)
We are unsure what is happening in the code. Attaching the code we are currently using. Any help would be awesome!

[code]

/* 2022.02.02-v1 */

int PIN_TRIGGER = 3;

int SOUND_OUTPUT = 2;

int MAIN_OUTPUT = 13;
int EYES_OUTPUT = 12;
int LARMUP_OUTPUT = 11;
int RARMUP_OUTPUT = 10;
int LELBOWUP_OUTPUT = 9;
int RELBOWUP_OUTPUT = 8;
int LARMTURN_OUTPUT = 7;
int RARMTURN_OUTPUT = 6;
int MOUTH_OUTPUT = 5;
int HEADTURN_OUTPUT = 4;

void setup()
{
  Serial.begin(9600);
  
  Serial.println("setup(): start");

  pinMode(PIN_TRIGGER, INPUT);

  pinMode(MAIN_OUTPUT, OUTPUT);
  digitalWrite(MAIN_OUTPUT, HIGH);
  
  pinMode(EYES_OUTPUT, OUTPUT);
  digitalWrite(EYES_OUTPUT, HIGH);
  
  pinMode(LARMUP_OUTPUT, OUTPUT);
  digitalWrite(LARMUP_OUTPUT, HIGH);
  
  pinMode(RARMUP_OUTPUT, OUTPUT);
  digitalWrite(RARMUP_OUTPUT, HIGH);
  
  pinMode(LELBOWUP_OUTPUT, OUTPUT);
  digitalWrite(LELBOWUP_OUTPUT, HIGH);
  
  pinMode(RELBOWUP_OUTPUT, OUTPUT);
  digitalWrite(RELBOWUP_OUTPUT, HIGH);
  
  pinMode(LARMTURN_OUTPUT, OUTPUT);
  digitalWrite(LARMTURN_OUTPUT, HIGH);
  
  pinMode(RARMTURN_OUTPUT, OUTPUT);
  digitalWrite(RARMTURN_OUTPUT, HIGH);
  
  pinMode(MOUTH_OUTPUT, OUTPUT);
  digitalWrite(MOUTH_OUTPUT, HIGH);
  
  pinMode(HEADTURN_OUTPUT, OUTPUT);
  digitalWrite(HEADTURN_OUTPUT, HIGH);
  
  pinMode(SOUND_OUTPUT, OUTPUT);
  digitalWrite(SOUND_OUTPUT, HIGH);

  Serial.println("setup(): settle ...");

  delay(2000);
  
  Serial.println("setup(): done");
}

void prop_reset() 
{
  Serial.println("prop_reset(): start");
  
  digitalWrite(MAIN_OUTPUT, HIGH);
  digitalWrite(EYES_OUTPUT, HIGH);
  digitalWrite(LARMUP_OUTPUT, HIGH);
  digitalWrite(RARMUP_OUTPUT, HIGH);
  digitalWrite(LELBOWUP_OUTPUT, HIGH);
  digitalWrite(RELBOWUP_OUTPUT, HIGH);
  digitalWrite(LARMTURN_OUTPUT, HIGH);
  digitalWrite(RARMTURN_OUTPUT, HIGH);
  digitalWrite(MOUTH_OUTPUT, HIGH);
  digitalWrite(HEADTURN_OUTPUT, HIGH);
  digitalWrite(SOUND_OUTPUT, HIGH);

  Serial.println("prop_reset(): settle ...");
  
  delay(500);

  Serial.println("prop_reset(): done");
}

int LOOP_DELAY = 50;

bool delay_trigger(int sleep) 
{
  
  int countdown = sleep;

  Serial.print("delay_trigger(");
  Serial.print(sleep);
  Serial.println("): start");
  
  do {

    delay(LOOP_DELAY);
    
    if (digitalRead(PIN_TRIGGER) == HIGH) { 
      Serial.println("delay_trigger(): end (triggered)");

      return true;
    }
    
    countdown -= LOOP_DELAY;

  } while (countdown > 0);

  Serial.println("delay_trigger(): end (timeout)");
  
  return false;
}

void prop_idle() 
{
  Serial.println("prop_idle(): start");

  while ( true ) {
    digitalWrite(EYES_OUTPUT,LOW); //ON
    if (delay_trigger(150)) {
      break; 
    }
    
    digitalWrite(HEADTURN_OUTPUT,LOW); //ON
    if (delay_trigger(4500)) {
      break;
    }
    
    digitalWrite(EYES_OUTPUT,HIGH); //OFF
    if (delay_trigger(3000)) { 
      break; 
    }
    
    digitalWrite(EYES_OUTPUT,LOW); //ON
    if (delay_trigger(150)) { 
      break; 
    }
    
    digitalWrite(HEADTURN_OUTPUT,HIGH); //OFF
    if (delay_trigger(4500)) { 
      break; 
    }
    
    digitalWrite(EYES_OUTPUT,HIGH); //OFF
    if (delay_trigger(3000)) { 
      break; 
    }
  }
  
  Serial.println("prop_idle(): reset");

  prop_reset();

  Serial.println("prop_idle(): end");
}

void prop_show() 
{
  Serial.println("prop_show(): start");

  digitalWrite(MAIN_OUTPUT, LOW);   //ON
  digitalWrite(MOUTH_OUTPUT, LOW);   //ON
  digitalWrite(SOUND_OUTPUT, LOW);   //ON
  delay(1000);
  digitalWrite(EYES_OUTPUT, LOW);   //ON
  delay(500);                                           //1500
  digitalWrite(LARMUP_OUTPUT, LOW); //ON
  digitalWrite(SOUND_OUTPUT, HIGH);   //OFF
  delay(500);                                 //2000
  digitalWrite(RARMUP_OUTPUT, LOW);  //ON
  delay(650);
  digitalWrite(EYES_OUTPUT, HIGH);   //OFF               //2650
  digitalWrite(LARMTURN_OUTPUT, LOW);  //ON
  digitalWrite(LELBOWUP_OUTPUT, LOW);  //ON
  delay(250);                                             
  digitalWrite(EYES_OUTPUT, LOW);   //ON
  delay(250);                                    //3150
  digitalWrite(RARMTURN_OUTPUT,LOW);    //ON
  digitalWrite(HEADTURN_OUTPUT, LOW);  //ON
  delay(500);                                  
  digitalWrite(EYES_OUTPUT, HIGH);   //OFF  
  delay(250);                                    
  digitalWrite(EYES_OUTPUT, LOW);   //ON  
  delay(250);                                    //4150
  digitalWrite(MAIN_OUTPUT, HIGH);      //OFF
  
  digitalWrite(RELBOWUP_OUTPUT,LOW);    //ON
  digitalWrite(LELBOWUP_OUTPUT,HIGH);   //OFF
  delay(600);                                  //4750
  digitalWrite(MOUTH_OUTPUT, HIGH);   //OFF
  digitalWrite(LARMTURN_OUTPUT,HIGH);  //OFF
  digitalWrite(HEADTURN_OUTPUT,HIGH);  //OFF
  delay(250);
  digitalWrite(MAIN_OUTPUT, LOW);      //ON
  delay(250);                                  //5250
  digitalWrite(RELBOWUP_OUTPUT,HIGH);    //OFF
  digitalWrite(MOUTH_OUTPUT, LOW);   //ON
  digitalWrite(RARMTURN_OUTPUT,HIGH);   //OFF
  delay(750);                                  //6000
  digitalWrite(LELBOWUP_OUTPUT, LOW);  //ON
  delay(300);  
  digitalWrite(EYES_OUTPUT, HIGH);   //OFF     
  delay(300);                                    //6600
  digitalWrite(EYES_OUTPUT, LOW);   //ON
  digitalWrite(HEADTURN_OUTPUT,LOW);   //ON     
 
  digitalWrite(LARMTURN_OUTPUT,LOW);  //ON
  digitalWrite(RARMUP_OUTPUT, HIGH);  //OFF
  delay(750);                                   //7350
  digitalWrite(MOUTH_OUTPUT, HIGH);   //OFF
  digitalWrite(LARMUP_OUTPUT, HIGH); //OFF
  delay(400);                                   //7750
  digitalWrite(MOUTH_OUTPUT, LOW); //ON
  digitalWrite(RARMUP_OUTPUT, LOW);  //ON
  
  delay(500);                                   //8250
  digitalWrite(LARMUP_OUTPUT, LOW); //ON
  delay(500);                                    //8750
  digitalWrite(HEADTURN_OUTPUT,HIGH);   //OFF 
  digitalWrite(LARMTURN_OUTPUT,HIGH);   //OFF
  digitalWrite(RARMTURN_OUTPUT,LOW);    //ON
  delay(1000);                                     //9750
  digitalWrite(HEADTURN_OUTPUT,LOW);//ON
  digitalWrite(RELBOWUP_OUTPUT,LOW);    //ON
  delay(250);
  digitalWrite(EYES_OUTPUT, HIGH);   //OFF
  delay(250);                                  //10250
  digitalWrite(MAIN_OUTPUT, HIGH);      //OFF 
  digitalWrite(EYES_OUTPUT, LOW);   //ON
  digitalWrite(RARMUP_OUTPUT, HIGH);   //OFF
  delay(350);                                      //10600
  digitalWrite(LARMTURN_OUTPUT,LOW);   //ON
  
  digitalWrite(LARMUP_OUTPUT, HIGH);    //OFF
  digitalWrite(RARMTURN_OUTPUT,HIGH);    //OFF
  delay(650);                                       //11250
  digitalWrite(MAIN_OUTPUT, LOW);      //ON
  digitalWrite(HEADTURN_OUTPUT,HIGH);   //OFF
  digitalWrite(MOUTH_OUTPUT, HIGH);   //OFF
  
  delay(500);                                      //11750
   
  digitalWrite(MOUTH_OUTPUT, LOW);      //ON   
  delay(750);                                       
  digitalWrite(EYES_OUTPUT, HIGH);   //OFF  
  delay(250);                                       //12750
  digitalWrite(EYES_OUTPUT, LOW);   //ON
  digitalWrite(RARMUP_OUTPUT, LOW);    //ON
  delay(500);                                        //13250
  digitalWrite(LARMUP_OUTPUT, LOW);     //ON
  delay(500);                                        //13750
  digitalWrite(LARMTURN_OUTPUT,HIGH);   //OFF
  digitalWrite(RARMTURN_OUTPUT,LOW);    //ON
  digitalWrite(HEADTURN_OUTPUT,LOW);   //ON
  delay(750);                                        //14500
  digitalWrite(HEADTURN_OUTPUT,HIGH);   //OFF
  digitalWrite(LARMUP_OUTPUT, HIGH);     //OFF
  digitalWrite(RARMTURN_OUTPUT,HIGH);    //OFF
  digitalWrite(RARMUP_OUTPUT, HIGH);    //OFF
  delay(500);                                        //15000
  digitalWrite(MOUTH_OUTPUT, HIGH);      //OFF
  digitalWrite(MAIN_OUTPUT, HIGH);      //OFF 
  digitalWrite(RELBOWUP_OUTPUT, HIGH);   //OFF
  digitalWrite(LELBOWUP_OUTPUT, HIGH);   //OFF
  digitalWrite(EYES_OUTPUT, HIGH);   //OFF  

  Serial.println("prop_show(): reset");

  prop_reset();

  Serial.println("prop_show(): done");
}

void loop() 
{
  Serial.println("loop(): start");
  
  prop_idle();
  
  prop_show();

  Serial.println("loop(): done");
}
[/code]

I see nothing obviously wrong with the code, which leaves power glitches or other electrical issues.

How are the air powered cylinders controlled? Please post a link to the controller, and a wiring diagram of the entire setup (hand drawn is much preferred over Fritzing).

how did you wire the the button on PIN_TRIGGER? do you have an external pull down?

in order to avoid delay which is blocking, you could rewrite your delay_trigger() function like this:

const unsigned long baseDelay = 50;
bool delay_trigger(unsigned long delayCount) {
  unsigned long totalDelay = delayCount * baseDelay;
  unsigned long startTime = millis();
  while (millis() - startTime <= totalDelay)
    if (digitalRead(PIN_TRIGGER) == HIGH) return true;
  return false;
}

PIN_TRIGGER is wired with a resistor to ground, and the trigger (PIR) brings power to the other side of the resistor, which goes to pin 3.

How does millis work to achieve all of the action listed in the delay blocking that is currently written?

I've a bug in the code I proposed as I had read it too quickly, you just have to wait for the duration of the parameter. So it's just:

bool delay_trigger(unsigned long totalDelay) {
  unsigned long startTime = millis();
  while (millis() - startTime <= totalDelay)
    if (digitalRead(PIN_TRIGGER) == HIGH) return true;
  return false;
}

your current function repeats multiple time a delay of LOOP_DELAY ms and then checks if the PIN_TRIGGER is HIGH. this is repeated until the sleep time has elapsed.

my function note the current time when you call and until the delay has elapsed it keeps checking the pin state. So you check more often the status of the pin.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.