Node.js implementation of the Arduino Firmata protocol for controlling Arduino boards from JavaScript applications
Digital pin control for reading and writing binary states with support for input/output mode configuration and real-time change monitoring.
Configure Arduino pins for input or output operations.
/**
* Set pin mode for digital I/O operations
* Must be called before using digitalRead() or digitalWrite()
* @param pin - Pin number (0-13 for most Arduino boards)
* @param mode - Pin mode: ArduinoFirmata.INPUT (0) or ArduinoFirmata.OUTPUT (1), or boolean true/false
* @param callback - Optional callback function called when mode is set
*/
pinMode(pin: number, mode: number|boolean, callback?: Function): void;Mode Values:
ArduinoFirmata.INPUT (0) or false - Configure pin as inputArduinoFirmata.OUTPUT (1) or true - Configure pin as outputUsage Examples:
// Set pin as output using constant
arduino.pinMode(13, ArduinoFirmata.OUTPUT);
// Set pin as input using constant
arduino.pinMode(7, ArduinoFirmata.INPUT);
// Using boolean values
arduino.pinMode(13, true); // Output
arduino.pinMode(7, false); // Input
// With callback
arduino.pinMode(13, ArduinoFirmata.OUTPUT, function() {
console.log('Pin 13 configured as output');
});Write binary values to Arduino output pins.
/**
* Write digital value to an output pin
* Automatically sets pin mode to OUTPUT if not already configured
* @param pin - Pin number to write to
* @param value - Digital value: true/ArduinoFirmata.HIGH (1) or false/ArduinoFirmata.LOW (0)
* @param callback - Optional callback function called when value is written
*/
digitalWrite(pin: number, value: boolean|number, callback?: Function): void;Value Options:
true or ArduinoFirmata.HIGH (1) - Set pin to high/onfalse or ArduinoFirmata.LOW (0) - Set pin to low/offUsage Examples:
// Turn on LED on pin 13
arduino.digitalWrite(13, true);
// Turn off LED on pin 13
arduino.digitalWrite(13, false);
// Using constants
arduino.digitalWrite(13, ArduinoFirmata.HIGH);
arduino.digitalWrite(13, ArduinoFirmata.LOW);
// With callback
arduino.digitalWrite(13, true, function() {
console.log('LED turned on');
});
// Blinking LED example
let ledState = true;
setInterval(function() {
arduino.digitalWrite(13, ledState);
ledState = !ledState;
}, 500);Read binary values from Arduino input pins.
/**
* Read current digital value from an input pin
* Pin must be configured as INPUT before reading
* @param pin - Pin number to read from
* @returns Current pin state: true (HIGH) or false (LOW)
*/
digitalRead(pin: number): boolean;Usage Examples:
// Configure pin 7 as input and read its value
arduino.pinMode(7, ArduinoFirmata.INPUT);
const buttonState = arduino.digitalRead(7);
if (buttonState) {
console.log('Button is pressed (HIGH)');
} else {
console.log('Button is not pressed (LOW)');
}
// Read multiple pins
for (let pin = 2; pin <= 7; pin++) {
arduino.pinMode(pin, ArduinoFirmata.INPUT);
const state = arduino.digitalRead(pin);
console.log(`Pin ${pin}: ${state ? 'HIGH' : 'LOW'}`);
}Monitor digital pin state changes in real-time using events.
// Event: digitalChange
// Fired when a digital pin state changes
// Event object properties:
interface DigitalChangeEvent {
pin: number; // Pin number that changed
value: boolean; // New pin value (true = HIGH, false = LOW)
old_value: boolean; // Previous pin value
}Usage Example:
// Configure pins as inputs for monitoring
arduino.pinMode(7, ArduinoFirmata.INPUT);
arduino.pinMode(8, ArduinoFirmata.INPUT);
// Listen for digital pin changes
arduino.on('digitalChange', function(event) {
console.log(`Pin ${event.pin} changed from ${event.old_value ? 'HIGH' : 'LOW'} to ${event.value ? 'HIGH' : 'LOW'}`);
// Example: Respond to button press on pin 7
if (event.pin === 7 && event.value === true) {
console.log('Button on pin 7 was pressed!');
arduino.digitalWrite(13, true); // Turn on LED
}
// Example: Respond to button release on pin 7
if (event.pin === 7 && event.value === false) {
console.log('Button on pin 7 was released!');
arduino.digitalWrite(13, false); // Turn off LED
}
});const ArduinoFirmata = require('arduino-firmata');
const arduino = new ArduinoFirmata();
arduino.connect();
arduino.on('connect', function() {
console.log('Arduino connected');
// Setup: Configure pins
arduino.pinMode(13, ArduinoFirmata.OUTPUT); // LED output
arduino.pinMode(7, ArduinoFirmata.INPUT); // Button input
// Monitor button state changes
arduino.on('digitalChange', function(event) {
if (event.pin === 7) {
// Mirror button state to LED
arduino.digitalWrite(13, event.value);
console.log(`Button ${event.value ? 'pressed' : 'released'}, LED turned ${event.value ? 'on' : 'off'}`);
}
});
// Initial LED blink to show connection
setTimeout(() => {
arduino.digitalWrite(13, true);
setTimeout(() => arduino.digitalWrite(13, false), 500);
}, 100);
});// Pin modes for digital I/O
ArduinoFirmata.INPUT = 0; // Configure pin as input
ArduinoFirmata.OUTPUT = 1; // Configure pin as output
// Digital values
ArduinoFirmata.LOW = 0; // Digital low/off state
ArduinoFirmata.HIGH = 1; // Digital high/on stateDigital pins are typically numbered from 0 to 13 on most Arduino boards:
Each digital pin can be configured as either input or output:
Digital I/O operations integrate with the event system for real-time monitoring. See Event System for complete event documentation including:
Install with Tessl CLI
npx tessl i tessl/npm-arduino-firmata