CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/npm-arduino-firmata

Node.js implementation of the Arduino Firmata protocol for controlling Arduino boards from JavaScript applications

Overview
Eval results
Files

digital-io.mddocs/

Digital I/O Operations

Digital pin control for reading and writing binary states with support for input/output mode configuration and real-time change monitoring.

Capabilities

Pin Mode Configuration

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 input
  • ArduinoFirmata.OUTPUT (1) or true - Configure pin as output

Usage 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');
});

Digital 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/on
  • false or ArduinoFirmata.LOW (0) - Set pin to low/off

Usage 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);

Digital Input

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'}`);
}

Real-time Digital Change Monitoring

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
  }
});

Complete Digital I/O Example

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);
});

Constants

// 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 state

Pin Numbering

Digital pins are typically numbered from 0 to 13 on most Arduino boards:

  • Pins 0-1: Usually reserved for serial communication (RX/TX)
  • Pins 2-12: General purpose digital I/O pins
  • Pin 13: Often has a built-in LED, commonly used for status indication
  • Pins 14-19 (A0-A5): Analog pins that can also be used as digital pins

Digital Pin Capabilities

Each digital pin can be configured as either input or output:

  • Input mode: Pin reads digital signals (0V = LOW/false, 5V = HIGH/true)
  • Output mode: Pin can drive digital signals (LOW = 0V, HIGH = 5V)
  • Pull-up resistors: Internal pull-up resistors are handled by the Arduino firmware

Event System Integration

Digital I/O operations integrate with the event system for real-time monitoring. See Event System for complete event documentation including:

  • Setup requirements for event monitoring
  • Event handler registration
  • Digital change event details

Install with Tessl CLI

npx tessl i tessl/npm-arduino-firmata

docs

analog-io.md

connection.md

digital-io.md

events.md

index.md

servo.md

sysex.md

tile.json