Project

General

Profile

Statistics
| Branch: | Revision:

root / arduino-1.0 / libraries / Firmata / examples / SimpleDigitalFirmata / SimpleDigitalFirmata.ino @ 58d82c77

History | View | Annotate | Download (1.84 KB)

1 58d82c77 Tom Mullins
/*
2
 * Firmata is a generic protocol for communicating with microcontrollers
3
 * from software on a host computer. It is intended to work with
4
 * any host computer software package.
5
 *
6
 * To download a host software package, please clink on the following link
7
 * to open the download page in your default browser.
8
 *
9
 * http://firmata.org/wiki/Download
10
 */
11
12
/* Supports as many digital inputs and outputs as possible.
13
 *
14
 * This example code is in the public domain.
15
 */
16
#include <Firmata.h>
17
18
byte previousPIN[TOTAL_PORTS];  // PIN means PORT for input
19
byte previousPORT[TOTAL_PORTS]; 
20
21
void outputPort(byte portNumber, byte portValue)
22
{
23
    // only send the data when it changes, otherwise you get too many messages!
24
    if (previousPIN[portNumber] != portValue) {
25
        Firmata.sendDigitalPort(portNumber, portValue); 
26
        previousPIN[portNumber] = portValue;
27
    }
28
}
29
30
void setPinModeCallback(byte pin, int mode) {
31
    if (IS_PIN_DIGITAL(pin)) {
32
        pinMode(PIN_TO_DIGITAL(pin), mode);
33
    }
34
}
35
36
void digitalWriteCallback(byte port, int value)
37
{
38
    byte i;
39
    byte currentPinValue, previousPinValue;
40
41
    if (port < TOTAL_PORTS && value != previousPORT[port]) {
42
        for(i=0; i<8; i++) {
43
            currentPinValue = (byte) value & (1 << i);
44
            previousPinValue = previousPORT[port] & (1 << i);
45
            if(currentPinValue != previousPinValue) {
46
                digitalWrite(i + (port*8), currentPinValue);
47
            }
48
        }
49
        previousPORT[port] = value;
50
    }
51
}
52
53
void setup()
54
{
55
    Firmata.setFirmwareVersion(0, 1);
56
    Firmata.attach(DIGITAL_MESSAGE, digitalWriteCallback);
57
    Firmata.attach(SET_PIN_MODE, setPinModeCallback);
58
    Firmata.begin(57600);
59
}
60
61
void loop()
62
{
63
    byte i;
64
65
    for (i=0; i<TOTAL_PORTS; i++) {
66
        outputPort(i, readPort(i, 0xff));
67
    }
68
69
    while(Firmata.available()) {
70
        Firmata.processInput();
71
    }
72
}