SimpleDigitalFirmata \ Learning \ Wiring ALPHA 1.0
Author: Hernando Barragán
Description: Wiring is an electronic sketchbook and hardware electronics for developing ideas. It is a context for learning fundamentals of computer programming and prototyping with electronics within the context of the electronic arts.
Keywords: Wiring, Processing, Interactive Media, Electronic Arts, Programming, C, C++, Hernando Barragán

Search wiring.org.co:

This example is for Wiring version 0024+. If you have a previous version, use the examples included with your software. If you see any errors or have comments, please let us know.

Supports as many digital inputs and outputs as possible.
This example code is in the public domain.

    #include <Firmata.h>

    byte previousPIN[2];  // PIN means PORT for input
    byte previousPORT[2];

    void outputPort(byte portNumber, byte portValue)
    {
    // only send the data when it changes, otherwise you get too many messages!
        if(previousPIN[portNumber] != portValue) {
            Firmata.sendDigitalPort(portNumber, portValue);
            previousPIN[portNumber] = portValue;
            Firmata.sendDigitalPort(portNumber, portValue);
        }
    }

    void setPinModeCallback(byte pin, int mode) {
        if(pin > 1) { // don't touch RxTx pins (0,1)
            pinMode(pin, mode);
        }
    }

    void digitalWriteCallback(byte port, int value)
    {
        byte i;
        byte currentPinValue, previousPinValue;

        if(value != previousPORT[port]) {
            for(i=0; i<8; i++) {
                currentPinValue = (byte) value & (1 << i);
                previousPinValue = previousPORT[port] & (1 << i);
                if(currentPinValue != previousPinValue) {
                    digitalWrite(i + (port*8), currentPinValue);
                }
            }
            previousPORT[port] = value;
        }
    }

    void setup()
    {
        Firmata.setFirmwareVersion(0, 1);
        Firmata.attach(DIGITAL_MESSAGE, digitalWriteCallback);
        Firmata.attach(SET_PIN_MODE, setPinModeCallback);
        Firmata.begin(57600);
    }

    void loop()
    {
        outputPort(0, PIND &~ B00000011); // pins 0-7, ignoring Rx/Tx pins (0/1)
        outputPort(1, PINB); // pins 8-13
        while(Firmata.available()) {
            Firmata.processInput();
        }
    }