The Sensor class constructs objects that represent a single analog sensor component attached to the physical board. This class is intentionally generic and will work well with many types of sensors, including (but not limited to):

  • Linear Potentiometer
  • Rotary Potentiometer
  • Flex Sensitive Resistor
  • Pressure Sensitive Resistor
  • Force Sensitive Resistor
  • Hall Sensor
  • Tilt Sensor
  • Photoresistor/Light Dependent Resistor

...And more, see examples

Parameters

  • pin A Number or String address for the Sensor pin (analog).

  • options An object of property parameters.

    PropertyTypeValue/DescriptionDefaultRequired
    pinNumber, StringAnalog Pin. The Number or String address of the pin the sensor is attached to, ie. “A0” or “I1”yes
    freqNumberMilliseconds. The frequency in ms of data events.25msno
    thresholdNumberAny. The change threshold (+/- value).1no

  • options (experimental) These options can be used with the Sensor class, but are considered experimental.

    PropertyTypeValue/DescriptionDefaultRequired
    typeString"digital", "analog". Specify that this is a sensor attached to a digital pin. Allows using a digital pin as the value of the pin optionno

Shape

Property NameDescriptionRead Only
idA user definable id value. Defaults to a generated uidNo
pinThe pin address that the Sensor is attached toNo
thresholdThe change threshold (+/- value). Defaults to 1No
booleanADC value scaled to a boolean.Yes
rawADC value (0-1023).Yes
analogADC reading scaled to 8 bit values (0-255).Yes
constrainedADC reading constrained to 8 bit values (0-255).Yes
valueADC reading, scaled.Yes

Component Initialization

Analog Sensor (Most common case)

new five.Sensor("A0");

Digital Sensor (Less common, but supported experimentally)

new five.Sensor({
  pin: 2, 
  type: "digital"
});

// Can also be written as: 
new five.Sensor.Digital(2);

Common Options

//   - attached to pin "A0"
//   - emits data events every 250ms
//   - emits change events when the ADC value has changed by +5/-5
//
var temp = new five.Sensor({
  pin: "A0", 
  freq: 250, 
  threshold: 5
});

Usage

Analog Sensor

var five = require("johnny-five");
var board = new five.Board();

board.on("ready", function() {
  var sensor = new five.Sensor("A0");
  
  // Scale the sensor's data from 0-1023 to 0-10 and log changes
  sensor.on("change", function() {
    console.log(this.scaleTo(0, 10));
  });
});

Digital Sensor

var five = require("johnny-five");
var board = new five.Board();

board.on("ready", function() {

  var sensor = new five.Sensor.Digital(2);

  sensor.on("change", function() {
    console.log(this.value);
  });
});

If you prefer arrow functions...

var five = require("johnny-five");
var board = new five.Board();

board.on("ready", () => {
  var sensor = new five.Sensor("A0");
  
  // Scale the sensor's data from 0-1023 to 0-10 and log changes
  sensor.on("change", () => {
    console.log(sensor.scaleTo(0, 10));
  });
});

Digital Sensor

var five = require("johnny-five");
var board = new five.Board();

board.on("ready", () => {

  var sensor = new five.Sensor.Digital(2);

  sensor.on("change", () => {
    console.log(sensor.value);
  });
});

API

  • scaleTo(low, high) (integer) Return the sensor's present value, scaled to a new value within the specified low/high range.

  • fscaleTo(low, high) (float) Return the sensor's present value, scaled to a new value within the specified low/high range.

    var sensor = new five.Sensor("A0");
    
    sensor.on("change", function() {
      // this.value will reflect a scaling from 0-1023 to 0-180
      console.log(this.scaleTo(0, 180)); // integer
      console.log(this.fscaleTo(0, 180)); // float
    });
    
    var sensor = new five.Sensor("A0");
    
    sensor.on("change", () => {
      // this.value will reflect a scaling from 0-1023 to 0-180
      console.log(sensor.scaleTo(0, 180)); // integer
      console.log(sensor.fscaleTo(0, 180)); // float
    });
    
  • scaleTo([low, high]) (integer) Return the sensor's present value, scaled to a new value within the specified low/high range.

  • fscaleTo([low, high]) (float) Return the sensor's present value, scaled to a new value within the specified low/high range.

    var sensor = new five.Sensor("A0");
    
    sensor.on("change", function() {
      // this.value will reflect a scaling from 0-1023 to 0-180
      console.log(this.scaleTo([0, 180])); // integer
      console.log(this.fscaleTo([0, 180])); // float
    });
    
    var sensor = new five.Sensor("A0");
    
    sensor.on("change", () => {
      // this.value will reflect a scaling from 0-1023 to 0-180
      console.log(sensor.scaleTo([0, 180])); // integer
      console.log(sensor.fscaleTo([0, 180])); // float
    });
    
  • scale(low, high) Scale the sensor's value to a new value within a specified range. scale(...) is deprecated, use scaleTo(...)

  • scale([low, high]) Same as scale(low, high). scale(...) is deprecated, use scaleTo(...)

  • booleanAt(barrier) Set a midpoint barrier value used to calculate returned value of the .boolean property. The barrier is based on the scaled value, not the raw value. Defaults to 50% (512 when unscaled).

    var sensor = new five.Sensor("A0");
    
    // ADC readings less than 100 will result 
    //  in the value of the `boolean` property being false.
    // 
    // ADC readings greater than 100 will result 
    //  in the value of the `boolean` property being true.
    // 
    sensor.booleanAt(100);
    
    
  • within(range, handler) When value is within the provided range, execute callback.

    var sensor = new five.Sensor("A0");
    
    sensor.within([ 100, 200 ], function() {
      
      // This is called when the sensor's value property falls within 100-200
    
    });
    

Events

  • change The "change" event is emitted whenever the value of the sensor changes more than the threshold value allows.
  • data The "data" event is fired as frequently as the user defined freq will allow in milliseconds. ("data" replaced the deprecated "read" event)

Collection

Sensor supports a Sensors collection class, which allows multiple Sensor instances to be controlled via a single instance object. Events emitted by instances of the Sensor class are forwarded through instances of the Sensors class. The handler receives the instance that emitted the event as the first parameter.

new five.Sensors([ 2, 3, 4, 5 ]);
new five.Sensors([ { pin: 2 }, { pin: 3 }, { pin: 4 }, { pin: 5 } ]);
new five.Sensors([ sensor1, sensor2, sensor3 ]);

Examples

Hi! The Johnny-Five community is building new projects every day. We made this newsletter to tell you about what's new, what's good, and what's next for Open Source robotics. Join us in exploring what we can make together.

Fork me on GitHub