Basically it runs to either Action 4 or 5 and then loops back to the beginning. I dont see any obvious reasons for it. I am running an older Nano using the old bootloader. Could it be the Arduino is bad? I appreciate any help. I am documenting the entire thing and including printable files to throw a kit together for charity (with the orginal coder's appoval). The code is my last obstacle. Thank you very much for your help!
Image of the schematic
Video of the action
#include <Servo.h>
Servo lidservo;
Servo armservo;
Servo flag;
int switchpin = 5;
int ledpin = 13;
int action = 1;
int pos = 0;
// Servo positions
const int lidOpen = 20;
const int lidHalf = 50;
const int lidClosed = 90;
const int armDown = 15;
const int armSwitch = 155;
const int armNoSwitch = 15;
const int flagDown = 0;
const int flagUp = 125;
const int flagLow = 75;
void setup() {
pinMode(switchpin, INPUT);
lidservo.attach(2);
armservo.attach(3);
flag.attach(4);
// Servo Default Starting Position
armservo.write(armDown);
flag.write(flagDown);
lidservo.write(lidClosed);
// debug led
pinMode(ledpin, OUTPUT);
digitalWrite(ledpin, LOW);
}
void loop() {
// Action Selection starting with 1
if (digitalRead(switchpin) == HIGH)
{
digitalWrite(ledpin, HIGH); // debug tell us we are doing an action
if (action > 8) {
action = 1;
}
switch (action) {
case 1:
action1();
break;
case 2:
action2();
break;
case 3:
action3();
break;
case 4:
action4();
break;
case 5:
action5();
break;
case 6:
action6();
break;
case 7:
action7();
break;
}
digitalWrite(ledpin, LOW); // debug tell us action has finished
action += 1;
}
}
//The Following are actions that are chosen chronologically
void action1() { // classic open lid and turn off switch
lidservo.write(lidOpen); // open lid
delay(1000);
armservo.write(armSwitch); // turn off switch
delay(500);
armservo.write(armDown); // retract arm
delay(1000);
lidservo.write(lidClosed); // close lid
delay(1000);
}
void action2() { // partly open lid and quickly turn off switch
lidservo.write(lidHalf); // lid 1/2 way open
delay(100);
armservo.write(armSwitch); // turn off switch
delay(250);
armservo.write(armDown); // return arm
delay(100);
lidservo.write(lidClosed); // close lid
}
void action3() { // slowly open lid turn off switch
for (pos = lidClosed; pos > lidOpen; pos -= 1)
{
lidservo.write(pos); // slowly open lid
delay(50);
}
armservo.write(armSwitch); // turn off switch
delay(250);
armservo.write(armDown); // return arm
delay(100);
lidservo.write(lidClosed); // close lid
}
void action4() { // wait, then open lid, turn off switch and slowly return arm
delay(250); // wait
lidservo.write(lidHalf); // open lid
delay(100);
armservo.write(armSwitch); // quickly turn off switch
delay(2500); // wait wait wait
for (pos = armSwitch; pos > lidClosed; pos -= 1) // slowly return arm
{
armservo.write(pos);
delay(50);
}
armservo.write(armDown);
delay(100);
lidservo.write(lidClosed);
}
void action5() { // open and close lid three times and then turn off switch
for (int x = 0; x < 3; x++) {
lidservo.write(lidHalf);
delay(500);
lidservo.write(lidClosed);
delay(500);
}
delay(2500);
lidservo.write(lidHalf);
delay(100);
armservo.write(armSwitch);
delay(250);
armservo.write(armDown);
delay(100);
lidservo.write(lidClosed);
}
void action6() { // twice almost turn off switch, do it third time
for (int x = 0; x < 3; x++) {
lidservo.write(lidHalf);
delay(100);
armservo.write(armNoSwitch);
delay(250);
armservo.write(armDown);
delay(100);
lidservo.write(lidClosed);
delay(250);
}
lidservo.write(lidHalf);
delay(100);
armservo.write(armSwitch);
delay(250);
armservo.write(armDown);
delay(100);
lidservo.write(lidClosed);
}
void action7() {
for (pos = lidClosed; pos > lidOpen; pos -= 2)
{
lidservo.write(pos);
delay(50);
}
for (pos = armDown; pos < 145; pos += 2)
{
armservo.write(pos);
delay(100);
}
armservo.write(armSwitch);
for (pos = armSwitch; pos > armDown; pos -= 2)
{
armservo.write(pos);
delay(100);
}
for (pos = lidOpen; pos < lidClosed; pos += 2)
{
lidservo.write(pos);
delay(50);
}
lidservo.write(lidClosed);
}
void action8() {
if (digitalRead(switchpin) == HIGH)
{
delay(1000);
for (pos = lidClosed; pos > lidOpen; pos -= 2)
{
lidservo.write(pos);
delay(50);
}
for (pos = flagDown; pos < flagUp; pos += 10)
{
flag.write(pos);
delay(50);
}
//--------------------------------
delay(250);
for (int x = 0; x < 4; x++) {
for (pos = flagUp; pos > flagLow; pos -= 10)
{
flag.write(pos);
delay(50);
}
for (pos = flagLow; pos < flagUp; pos += 10)
{
flag.write(pos);
delay(50);
}
}
delay(250);
for (pos = 175; pos > armDown; pos -= 10)
{
flag.write(pos);
delay(50);
}
for (pos = lidOpen; pos < lidClosed; pos += 2)
{
lidservo.write(pos);
delay(50);
}
delay(2000);
lidservo.write(lidHalf);
delay(100);
armservo.write(armSwitch);
delay(250);
armservo.write(armDown);
delay(100);
lidservo.write(lidClosed);
}
}