I like the way this setup works with only one problem that I can't seem to figure out. When you press A, the menu works great along with its submenu. When you press B everything works great along with its submenu. BUT.. if you start with A, then exit and try B, that is where everything goes down the tubes.
I am sure there is some logic that I am missing. Something is not synchronized. I have two more (C & D) with more submenu items to add but want to get this logic figured out first. Here is what I have so far:
#include <Servo.h>
Servo ServoPan; int servoPin1 = 18; /* to hard code these: ex. int servoPin1 = 8 */
Servo ServoTilt; int servoPin2 = 19; /* to hard code these: ex. int servoPin1 = 9 */
int panLowLimit = 0; /* Set this variable for your Pan Servo's Low Limit */
int panHighLimit = 175; /* Set this variable for your Pan Servo's High Limit */
int tiltLowLimit = 0; /* Set this variable for your Tilt Servo's Low Limit */
int tiltHighLimit = 176; /* Set this variable for your Tilt Servo's High Limit */
char topMenu;
char subMenuA;
char subMenuB;
char subMenuC;
char subMenuD;
bool exitA = true;
bool exitB = true;
bool exitC = true;
bool exitD = true;
bool runOnceMain = true;
bool runOnceA = true;
bool runOnceB = true;
bool runOnceC;
bool runOnceD;
int setPosAngle;
int servoDelay = 25;
int posPan;
int posTilt;
int countCycles;
void setup() {
Serial.begin (115200);
pinMode (servoPin1, OUTPUT); pinMode (servoPin2, OUTPUT);
pinMode (analogPin1, INPUT); pinMode (analogPin2, INPUT);
/* Attach, Write and Center both Servos on Startup */
ServoPan.attach(servoPin1); ServoPan.write((panHighLimit - panLowLimit) / 2);
ServoTilt.attach(servoPin2); ServoTilt.write((tiltHighLimit - tiltLowLimit) / 2);
}
void mainMenu() {
Serial.println("\n -- Super ServoMaster Top Menu --");
Serial.println(" A) Calibrate B) Auto-Sweep C) Pot Control D) Self Center\n");
}
void subAMenu() {
if (runOnceA == true) {
Serial.println("\n -- Super ServoMaster Calibration Menu A --");
Serial.println(" 1) Set PanServo 2) Set TiltServo 3) Exit to Main Menu\n");
runOnceA = false;
}
}
void subBMenu() {
if (runOnceB == true) {
Serial.println("\n -- Super ServoMaster Auto-Sweep Menu B --");
Serial.println(" 1)Start PanServo 2)Start TiltServo 3)Start Both) Q)Exit to Main Menu\n");
runOnceB = false;
}
}
void subMenuA1() {
runOnceA = true;
while (subMenuA == '1') {
if (runOnceA == true) {
Serial.println(" Where would you like the Pan Servo? Q to Quit\n");
runOnceA = false;
}
if (Serial.available() > 0) {
setPosAngle = Serial.parseFloat();
ServoPan.write(setPosAngle);
Serial.print(" Pan Servo Position Angle in Degrees (0-180): ");
Serial.print("[ ");
Serial.print(setPosAngle);
Serial.println(" ] Degrees");
}
while (Serial.available() == 0) {}
if (Serial.peek() == 'q' || Serial.peek() == 'Q') {
Serial.println("\n Exiting . . .");
runOnceA = true;
exitA = true;
topCaseA();
break;
}
}
}
void subMenuA2() {
runOnceA = true;
while (subMenuA == '2') {
if (runOnceA == true) {
Serial.println(" Where would you like the Tilt Servo? Q to Quit\n");
runOnceA = false;
}
if (Serial.available() > 0) {
setPosAngle = Serial.parseFloat();
ServoTilt.write(setPosAngle);
Serial.print(" Tilt Servo Position Angle in Degrees (0-180): ");
Serial.print("[ ");
Serial.print(setPosAngle);
Serial.println(" ] Degrees");
}
while (Serial.available() == 0) {}
if (Serial.peek() == 'q' || Serial.peek() == 'Q') {
Serial.println("\n Exiting . . .");
runOnceA = true;
exitA = true;
topCaseA();
break;
}
}
}
void subMenuA3() {
runOnceA = true;
runOnceMain = true;
exitA = false; // <----------------
Serial.print(" Exiting to Main Menu and Centering Servo's . . .\n");
ServoPan.write((panHighLimit - panLowLimit) / 2);
ServoTilt.write((tiltHighLimit - tiltLowLimit) / 2);
return;
}
void topCaseA() {
exitA = false;
subAMenu();
}
void topCaseB() {
exitB = false;
subBMenu();
}
void subMenuB1() {
runOnceB = true;
Serial.print(subMenuB);
while (subMenuB == '1') {
while (runOnceB == true) {
Serial.println(" Pan Servo Activated (Q Exits)");
runOnceB = false;
}
for (int posPan = panLowLimit; posPan <= panHighLimit; posPan ++) {
ServoPan.write(posPan);
delay(servoDelay);
}
for (int posPan = panHighLimit; posPan >= panLowLimit; posPan --) {
ServoPan.write(posPan);
delay(servoDelay);
}
countCycles; countCycles ++;
Serial.print(" Pan Servo Cycle Number ");
Serial.println(countCycles);
if (Serial.peek() == 'Q' || Serial.peek() == 'q') {
while (Serial.available() == 0) {}
Serial.println("\n Exiting . . .\n");
countCycles = 0;
exitB = false;
topCaseB();
runOnceB = true;
break;
}
}
}
void loop() {
if (runOnceMain == true) {
mainMenu();
runOnceMain = false;
}
if (Serial.available() > 0 ) {
if (exitA == true && exitB == true) {
topMenu = Serial.read();
}
if (exitA == false && exitB == true) {
subMenuA = Serial.read();
}
else if (exitA == true && exitB == false) {
subMenuB = Serial.read();
}
switch (topMenu) {
case 'A' : case 'a' : {
topCaseA();
switch (subMenuA) {
case '1' : {
subMenuA1();
break;
}
case '2' : {
subMenuA2();
break;
}
case '3' : {
subMenuA3(); // <-- has a return statement!
break;
}
default :
if (subMenuA >= '4' && subMenuA != 'q' && subMenuA == ' ') {
Serial.println(" Please Choose Options 1 - 3");
}
break;
} /* End subMenu Switch */
break;
} /* End Case A */
case 'B' : case 'b' : {
topCaseB();
switch (subMenuB) {
case '1' : {
subMenuB1();
break;
}
case '2' : {
// subMenuB2();
break;
}
case '3' : {
// subMenuB3();
break;
}
case '4' : {
// subMenuB4();
break;
}
default :
if (subMenuB >= '5' && subMenuB != 'q' && subMenuB == ' ') {
Serial.println(" Please Choose Options 1 - 3");
}
break;
} /* End subMenu Switch */
break;
}/* End Case B */
default :
if (topMenu != 'A' && topMenu != 'B' && topMenu != 'C' && topMenu != 'D' && topMenu == ' ') {
Serial.println(" Please Choose Options A - D");
}
} /* End topMenu Switch */
} /* End Serial.available */
} /* End Void Loop */
Thanks! I wouldn't be this far without this forum and the generosity of the volunteers.