Это программируемое на Tibbo BASIC/C устройство, функциональность которого определяет загруженное приложение.
Мы предлагаем различные готовые к использованию приложения, например, Serial-over-IP (SoI), Modbus Gateway и Sensor Hub.
GPIO: отображение обменного курса на 7-сегментных индикаторах

GPIO: отображение обменного курса на 7-сегментных индикаторах

О приложении

Мы продемонстрируем, как осуществляется управление 7-сегментными LED-индикаторами при помощи одного Тиббита №00_1 и нескольких сдвиговых регистров IC (в гирляндной цепи).

  • 7-сегментные индикаторы (на самом деле, у большинства современных индикаторов восемь сегментов) — это дешёвые и надежные LED-устройства, которые могут отображать десятичные цифры (и некоторые другие символы). Каждый сегмент такого индикатора управляется через некоммутируемый вход, поэтому для управления всеми выводами с платформы LPTS требуется множество перемычек (32 линии для 4-разрядного дисплея). Более практично использовать сдвиговые регистры.

  • Вкратце, сдвиговый регистр — это конвертер между последовательным и параллельным интерфейсами. В нашем случае мы используем популярный 8-битный сдвиговый регистр 74HC595. IC контролируется тремя линиями (clock, data и latch) и имеет восемь выводов; этого количества достаточно для одного индикатора. Сдвиговые регистры легко организуются в гирляндную цепь для увеличения количества выводов. Для работы такой цепи требуется лишь три управляющие линии.

  • В данном проекте используются четыре сдвиговых регистра, подключённых к четырем 7-сегментным индикаторам, отображающим обменный курс от fixer.io JSON API.

  • Отличительное свойство приложения — простой web-интерфейс для отображения валюты.

Вам потребуется:

Аппаратное обеспечение

  • 1 x материнская плата LTPS3 (Linux TPS3), опционально в корпусе TBP3;
  • 1 x Тиббит №00_1 (4 линии ввода-вывода);
  • 1 x Тиббит №10 (питание средней мощности);
  • 1 x Тиббит №18 (разъём питания);
  • 4 x 7-сегментных индикатора с общим катодом (например, BL-S56A-12UY)*;
  • 4 x сдвиговых регистра 74HC595;
  • 32 x резистора на 220 Ом;
  • макетная плата и перемычки для макетных плат.

* Устройствам с общим катодом требуется разная схема подключения.

Программное обеспечение

  • Node.js V6.x.x (уже установлено)

Внешние сервисы

Аппаратные средства

  • Настройте платформу LTPS, как показано на схеме расположения Тиббитов (см. ниже).

  • Организуйте цепь сдвиговых регистров и 7-сегментных индикаторов согласно схеме соединений (см. ниже). Перемычки для 2-го, 3-го и 4-го блоков сборки резисторов с соответствующими индикаторами на схеме не отображены.

Обратите внимание: когда питание подается впервые, индикаторы могут отобразить случайный набор данных.

Приложение Node.js

  • Приложение использует Модуль Request для получения данных из fixer.io, модуль Express — для обслуживания статических файлов и socket.io — для обеспечения связи между расположенным на плате приложением и web-интерфейсом.
  • Приложение запрашивает обменный курс доллара (USD) к остальным валютам. Запрос производится каждые десять минут. Fixer.io обновляет данные по курсу ежедневно, около 16:00 (CET).
  • На индикаторах по умолчанию отображается курс USD/EUR.
  • Web-сервер приложения прослушивает порт 3000.

Настройка и установка

  • Задайте требуемую конфигурацию в web-интерфейсе LTPS;
  • Войдите на LTPP3 при помощи SSH-клиента.
  • Установите необходимые инструментальные средства NPM и др.
  • Установите приложение:
git clone https://github.com/tibbotech/gpio-indicators.git
cd gpio-indicators
npm install .
  • Запустите:
node rates

Управление сдвиговыми регистрами

Программа, управляющая 7-сегментными индикаторами, находится в папке /modules/indicate.js.

Комментарии в программе показывают, как это работает:

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;

Web-интерфейс

Файлы web-интерфейса находятся в папке -/static.

  • Приложение web-интерфейса запрашивает данные из fixer.io независимо от загруженного на плату приложения.
  • Для отображения таблицы с курсом валют и обеспечения интерактивности используется Набор инструментальных средств Angular.
  • Для определения статуса материнской платы и отправки на нее данных об обменном курсе используется библиотека Socket.IO (таблица скрыта, если плата выключена).
GPIO: отображение обменного курса на 7-сегментных индикаторах