Hi Mowcius Sorry Yes Im still reading this I have been away and haven't had a chance to come back here.
I have been playing with the first code you gave me ( 1 Button) and I have it working fully.
Do you mind having a quick look to see if there are an obvious errors/problems.
/* Menu Code by Adapated from Mowcius Code
*/
#include <NewSoftSerial.h>
#include <EEPROM.h>
NewSoftSerial LCDserial(0, 3);
// START Menu Stuff
int menuButton = 2;
int programnumber = 1;
int menudelaycount = 0;
int menudelaycount2 = 0;
// End Menu Stuff
long ramCycle = 0;
int FRPin = 8;
int MotorPin = 7;
long fillDelay = 1000;
long holdDelay = 500;
int ramPulse = 500;
void setup() {
LCDserial.begin(9600);
Serial.begin(9600);
LCDclear();
selectLineOne();
LCDserial.print("Azzurra Bathroom");
selectLineTwo();
LCDserial.print("Testing Rig V1.0");
delay(5000);
pinMode(menuButton, INPUT);
pinMode(FRPin, OUTPUT);
pinMode(MotorPin, OUTPUT);
//Pull Ram in fully
retractRam();
mainMenu();
}
void loop(){
}
void start()
{
delay(3000);
while(digitalRead(menuButton) == LOW){
LCDclear();
//Turn on Motor then push out for ramPulse Time
selectLineOne();
LCDserial.print("Extending Ram");
digitalWrite(MotorPin, HIGH);
digitalWrite(FRPin, HIGH);
delay(ramPulse);
checkPress();
//Hold the motor for holdDelay Time (-- PUSH OUT--)
LCDclear();
selectLineOne();
LCDserial.print("Holding Ram");
digitalWrite(MotorPin, LOW);
delay(holdDelay);
checkPress();
//Turn on Motor then pull in for ramPulse Time
LCDclear();
selectLineOne();
LCDserial.print("Retracting Ram");
digitalWrite(MotorPin, HIGH);
digitalWrite(FRPin, LOW);
delay(ramPulse);
checkPress();
//Hold the motor for holdDelay Time (--PULL IN--) & Print Current Ram Count
LCDclear();
selectLineOne();
LCDserial.print("Holding Ram");
digitalWrite(MotorPin, LOW);
ramCycle++;
LCDclear();
selectLineOne();
LCDserial.print("Ram Count ");
selectLineTwo();
LCDserial.print(ramCycle);
delay(fillDelay);
checkPress();
}
}
void retractRam()
{
LCDclear();
selectLineOne();
LCDserial.print("Retracting Ram");
selectLineTwo();
LCDserial.print("to Home Position");
digitalWrite(MotorPin, HIGH);
digitalWrite(FRPin, LOW);
delay(6000);
digitalWrite(MotorPin, LOW);
}
void mainMenu()
{
LCDclear(); //clears the LCD
selectLineOne();
switch (programnumber) { //reads the program number (set as 1 in setup)
case 1: //displays the first menu item
LCDserial.print("Set Fill Delay");
break;
case 2: //displays the second menu item
LCDserial.print("Hold Delay");
break;
case 3: //displays the third menu item
LCDserial.print("Ram Pulse");
break;
case 4: //displays the first menu item
LCDserial.print("Start");
break;
case 5: //displays the third menu item
LCDserial.print("Stop");
break;
default: //if errors then it goes to default item
LCDserial.print("Fill Delay");
}
selectLineTwo();
LCDserial.print("Next >"); //next code in specific position
while(digitalRead(menuButton) == HIGH){} //while button is high do nothing: {} (helps with debounce after button has been pressed)
delay(5);
while(digitalRead(menuButton) == LOW){} //wait until button has been pressed (taken high).
menudelaycount = 0; //clear menu delay
while(menudelaycount <500){ //do this code within the 500 limit (over 500ms because of other stuff that is done and takes time)
delay(1);
menudelaycount++;
if(digitalRead(menuButton) == LOW){ //if the button goes low (button released) within this loop then it advances one menu option
programnumber++; //increase the menu option
if(programnumber > 5){
programnumber = 1;
}
mainMenu(); //then run menu code from start: the change in program number makes it change the option it is on.
}
}
switch (programnumber) { //if the button is not let go within the menu time stated above then it does not loop back and then selects the subroutine from this switch case:
case 1:
//LCDserial.print("Fill Func");
fillMenu();
break;
case 2:
// LCDserial.print("Delay Func");
delayMenu();
break;
case 3:
//LCDserial.print("Pulse Func");
pulseMenu();
break;
case 4:
LCDclear();
selectLineOne
LCDserial.print("Starting Test");
start();
break;
case 5:
LCDserial.print("Stop Func");
break;
default:
LCDserial.print("Default Start Func");
}
}
void fillMenu()
{
LCDclear();
selectLineOne();
LCDserial.print(fillDelay);
selectLineTwo();
LCDserial.print("Next >");
while(digitalRead(menuButton) == HIGH){}
delay(5);
while(digitalRead(menuButton) == LOW){}
menudelaycount = 0;
while(menudelaycount <500){
delay(1);
menudelaycount++;
if(digitalRead(menuButton) == LOW){
fillDelay = fillDelay +3000;
if(fillDelay > 120000){
fillDelay = 0;
}
fillMenu();
}
}
LCDclear();
selectLineOne();
LCDserial.print("Fill Delay set @ ");
selectLineTwo();
LCDserial.print(fillDelay);
delay(3000);
mainMenu();
}
void delayMenu()
{
LCDclear();
selectLineOne();
LCDserial.print(holdDelay);
selectLineTwo();
LCDserial.print("Next >");
while(digitalRead(menuButton) == HIGH){}
delay(5);
while(digitalRead(menuButton) == LOW){}
menudelaycount = 0;
while(menudelaycount <500){
delay(1);
menudelaycount++;
if(digitalRead(menuButton) == LOW){
holdDelay = holdDelay +500;
if(holdDelay > 60000){
holdDelay = 0;
}
delayMenu();
}
}
LCDclear();
selectLineOne();
LCDserial.print("Hold Delay set @ ");
selectLineTwo();
LCDserial.print(holdDelay);
delay(3000);
mainMenu();
}
void pulseMenu()
{
LCDclear();
selectLineOne();
LCDserial.print(ramPulse);
selectLineTwo();
LCDserial.print("Next >");
while(digitalRead(menuButton) == HIGH){}
delay(5);
while(digitalRead(menuButton) == LOW){}
menudelaycount = 0;
while(menudelaycount <500){
delay(1);
menudelaycount++;
if(digitalRead(menuButton) == LOW){
ramPulse = ramPulse +250;
if(ramPulse > 6000){
ramPulse = 0;
}
pulseMenu();
}
}
LCDclear();
selectLineOne();
LCDserial.print("Ram Pulse set @ ");
selectLineTwo();
LCDserial.print(ramPulse);
delay(3000);
mainMenu();
}
void checkPress()
{
if (digitalRead(menuButton) == HIGH)
{
retractRam();
LCDclear();
selectLineOne();
LCDserial.print("Paused");
// selectLineTwo();
// LCDserial.print("Press button to goto menu");
delay(500);
while(digitalRead(menuButton) == LOW){}
mainMenu();
}
}
void selectLineOne(){ //puts the cursor at line 0 char 0.
LCDserial.print(0xFE, BYTE); //command flag
LCDserial.print(128, BYTE); //position
}
void selectLineTwo(){ //puts the cursor at line 2 char 0.
LCDserial.print(0xFE, BYTE); //command flag
LCDserial.print(192, BYTE); //position
}
void LCDclear(){
LCDserial.print(0xFE, BYTE); //command flag
LCDserial.print(0x01, BYTE); //clear command
}
Thanks again
Ben