I have a sketch that throws servo turnouts and powers the track on an HO train layout. It successfully works with keypad presses 0-9. I would like to know how to be able to do the same thing using more than single digit key presses so I can control more than 10 turnouts. I guess I would have to use the pound or star key as an enter key and stop the process until enter is pushed after the second digit. any help would be greatly appreciated.
PRH3
/*Relay-St Louis Staging Yard
Sets switches to selected track
Turns on a relay in a cascade configuration.
modified Jan 2, 2017
by Carl Schoeneberg
*/
//Libraries and required code
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
#include <Keypad.h>
const byte ROWS = 4;
const byte COLS = 3;
char keys[ROWS][COLS] =
{{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}};
byte rowPins[ROWS] = {10,11,12,13};
byte colPins[COLS] = {7,8,9};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
//end of required code
// the setup function runs once when you press reset or power the board
void setup()
{
Serial.begin (9600);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT);
pwm.begin();
pwm.setPWMFreq(60);
Serial.begin(9600);
Serial.println("16 channel Servo Test");
yield();
//int S1S = 250;
//int S1L = 300;
pwm.setPWM(1, 0, 250);
delay(100);
pwm.setPWM(3, 0, 245);
delay(100);
//pwm.setPWM(5, 0, 400);
//delay(100);
//pwm.setPWM(8, 0, 400);
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(A0, HIGH);
digitalWrite(A1, HIGH);
digitalWrite(A2, HIGH);
digitalWrite(A3, HIGH);
}
// the loop function runs over and over again forever
void loop()
{
char key = keypad.getKey(); //Press a keypad key
Serial.print(key);
switch(key) //switch-case looks for numerals 1-9, other are ignored
{
//the selected case positions switches with pwm.set
//and then the required relay will be tripped to power a single track
case '1':
pwm.setPWM(1, 0, 250);
delay(100);
pwm.setPWM(3, 0, 245);
delay(100);
//pwm.setPWM(5, 0, 400);
//delay(100);
//pwm.setPWM(8, 0, 400);
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(A0, HIGH);
digitalWrite(A1, HIGH);
digitalWrite(A2, HIGH);
digitalWrite(A3, HIGH);
break;
case '2':
pwm.setPWM(1, 0, 250);
delay(100);
pwm.setPWM(3, 0, 290);
delay(100);
//pwm.setPWM(5, 0, 400);
//delay(100);
//pwm.setPWM(8, 0, 175);
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(A0, HIGH);
digitalWrite(A1, HIGH);
digitalWrite(A2, HIGH);
digitalWrite(A3, HIGH);
break;
case '3':
pwm.setPWM(1, 0, 300);
delay(100);
pwm.setPWM(2, 0, 285);
delay(100);
pwm.setPWM(4, 0, 310);
delay(100);
//pwm.setPWM(7, 0, 400);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
digitalWrite(A0, HIGH);
digitalWrite(A1, HIGH);
digitalWrite(A2, HIGH);
digitalWrite(A3, HIGH);
break;
case '4':
pwm.setPWM(1, 0, 300);
delay(100);
pwm.setPWM(2, 0, 290);
delay(100);
pwm.setPWM(4, 0, 370);
delay(100);
//pwm.setPWM(7, 0, 175);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
digitalWrite(A0, HIGH);
digitalWrite(A1, HIGH);
digitalWrite(A2, HIGH);
digitalWrite(A3, HIGH);
break;
case '5':
pwm.setPWM(1, 0, 300);
delay(100);
pwm.setPWM(2, 0, 350);
delay(100);
pwm.setPWM(5, 0, 210);
delay(100);
pwm.setPWM(6, 0, 320);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(A0, LOW);
digitalWrite(A1, HIGH);
digitalWrite(A2, HIGH);
digitalWrite(A3, HIGH);
break;
case '6':
pwm.setPWM(1, 0, 300);
delay(100);
pwm.setPWM(2, 0, 350);
delay(100);
pwm.setPWM(5, 0, 210);
delay(100);
pwm.setPWM(6, 0, 275);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(A0, HIGH);
digitalWrite(A1, LOW);
digitalWrite(A2, HIGH);
digitalWrite(A3, HIGH);
break;
case '7':
pwm.setPWM(1, 0, 300);
delay(100);
pwm.setPWM(2, 0, 350);
delay(100);
pwm.setPWM(5, 0, 270);
delay(100);
pwm.setPWM(7, 0, 240);
//delay(100);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(A0, HIGH);
digitalWrite(A1, HIGH);
digitalWrite(A2, LOW);
digitalWrite(A3, HIGH);
break;
case '8':
pwm.setPWM(1, 0, 300);
delay(100);
pwm.setPWM(2, 0, 350);
delay(100);
pwm.setPWM(5, 0, 270);
delay(100);
pwm.setPWM(7, 0, 330);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(A0, HIGH);
digitalWrite(A1, HIGH);
digitalWrite(A2, HIGH);
digitalWrite(A3, LOW);
break;
}
}