Keypad linked to specially formated serial output.

Ok.. So I am new to arduino... BUT I have dated experience with IC, and electronics... Read that as I was a digital/analog tech in the Marines working on Radars with everything from ICs to transistors and sealed circuits to high-power cross field amplifiers and travelling wave tubes... anyway....

I've decided to delve into an old project...

Here is my goal.... Using an existing ISY994i home controller I would like to be able to do multiple control changes using 3 to 5 digit codes that upload via serial interface to the controller.

as I see it, I can get a 3x4 matrix keyboard, connect that to an arduino and then output to the serial INSTEON modem. on the surface that looks very straight forward.. the challenge comes in where I want to format the serial output such that the serial communications will send the data from the keypad as a user bit in the INSTEON Message format.. Pass the entire keyboard string to the serial output such that a # is the terminating input. so if I enter 341134456774# it sends all that or if I enter 323# it sends only that

So Is that as simple as I think? The format of the serial message is just programmed on the arduino? or should I look for another solution?

likely I would do this: Code starts with a number and ends with a #... then the number in the middle is the IF statement that starts a Macro on the ISY controller....

The possibilities are endless...




Try playing with this library:

It appears to have most of the functionality you are looking for. Here is a sample that plays with those non-numerics:

/* @file EventSerialKeypad.pde
|| @version 1.0
|| @author Alexander Brevig
|| @contact
|| @description
|| | Demonstrates using the KeypadEvent.
|| #
#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
byte rowPins[ROWS] = {5, 4, 3, 2}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {8, 7, 6}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
byte ledPin = 13; 

boolean blink = false;

void setup(){
  pinMode(ledPin, OUTPUT);      // sets the digital pin as output
  digitalWrite(ledPin, HIGH);   // sets the LED on
  keypad.addEventListener(keypadEvent); //add an event listener for this keypad

void loop(){
  char key = keypad.getKey();

  if (key) {
  if (blink){

//take care of some special events
void keypadEvent(KeypadEvent key){
  switch (keypad.getState()){
    case PRESSED:
      switch (key){
        case '#': digitalWrite(ledPin,!digitalRead(ledPin)); break;
        case '*': 
    case RELEASED:
      switch (key){
        case '*': 
          blink = false;
    case HOLD:
      switch (key){
        case '*': blink = true; break;