This tutorial is dedicated to the control of 7-segment LED indicators by means of a single Tibbit #00_1 and several shift register ICs (daisy-chained together).
* Common anode devices require a different connection scheme.
Name: gpio-indicators
Repository page: https://github.com/tibbotech/gpio-indicators
Clone URL: https://github.com/tibbotech/gpio-indicators.git
Updated At: Tue Oct 18 2016
Note: when the power is first applied the indicators may display a random pattern.
git clone https://github.com/tibbotech/gpio-indicators.git cd gpio-indicators npm install .
node rates
The code that controls 7-segment indicators can be found in /modules/indicate.js.
Comments in the code explain how it works:
const gpio = require("@tibbo-tps/gpio"); class indicator { constructor(socket, length){ this.length = length; this.digits = { 1: [0,1,0,0,1,0,0,0], 2: [0,0,1,1,1,1,0,1], 3: [0,1,1,0,1,1,0,1], 4: [0,1,0,0,1,0,1,1], 5: [0,1,1,0,0,1,1,1], 6: [0,1,1,1,0,1,1,1], 7: [0,1,0,0,1,1,0,0], 8: [0,1,1,1,1,1,1,1], 9: [0,1,1,0,1,1,1,1], 0: [0,1,1,1,1,1,1,0], N: [0,0,0,0,0,0,0,1], // Dash symbol B: [0,0,0,0,0,0,0,0] // Blank symbol }; // Sets up pins this.dataPin = gpio.init(socket+"A"); this.dataPin.setDirection("output"); this.dataPin.setValue(0); this.clockPin = gpio.init(socket+"B"); this.clockPin.setDirection("output"); this.clockPin.setValue(0); this.latchPin = gpio.init(socket+"C"); this.latchPin.setDirection("output"); this.latchPin.setValue(0); } indicate(number){ var inst = this; // Converts number to the array of signals to be sent const numberToSignals = function(number){ var output =[]; number .toString() .split("") .forEach(function(current, index, array){ if(current !== "."){ var symbol = inst.digits[current]; if (symbol === undefined){ symbol = Array.from(inst.digits["N"]) }else if(array[index+1] === "."){ symbol = Array.from(symbol); symbol[0] = 1; } output.unshift(symbol); } },[]); // crops number to the first "length" digits, if needed output = output.slice(-inst.length); // pads the number with spaces if it's shorter than 4 digits while (output.length < inst.length){ output.push(inst.digits["B"]) } return output.reduce(function(prev, current){ return prev.concat(current) }); }; var signals = numberToSignals(number); // Sets ST_CP (latch) to LOW // This operation sets shift registers into "programming" mode. // When latch is LOW, shift register doesn't change output states, // but reads and "remembers" data from DS pin. inst.latchPin.setValue(0); signals.forEach(function(value){ // sets value to be pushed into the register on DS pin inst.dataPin.setValue(value); // sets SH_CP (clock) to HIGH and then to LOW // on rising edge of the clock shift register reads state from DS pin, and prepares it for setting on Q0 output. // Each of the previously SET values will be shifted to the next pin. inst.clockPin.setValue(1); inst.clockPin.setValue(0); }); // then all signals are sent, sets ST_CP (latch) to HIGH // If latch is HIGH, all the read values will be simultaneously set to the outputs. inst.latchPin.setValue(1); }; } module.exports = indicator;
The web interface files can be found in the -/static folder.