суббота, 8 августа 2020 г.

Подключение дисплея на HBS588 к Arduino

       В данной статье описано подключение платы управления от спутникового тюнера на базе HBS588 к Arduino. Плата управления на базе этой микросхемы очень часто используется в спутниковых и DVB-T2 тюнерах и содержит дисплей, клавиатуру и HBS588 для управления всем этим:


     Для работы платы необходимо 4 вывода: +5В, GND, CLK и DIO. После прозвонки было выяснено, что вывод 1 разъема это выход инфракрасного приемника, его работа с Arduino уже достаточно описана, например здесь и останавливаться на нем мы не будем. Выводы 2,3,4,5 разъема в моем случае соответствуют выводам Vcc (5В), DIO, GND, CLK микросхемы HBS588:

 

     Схема подключения модуля к Arduino:

 

       Функционально микросхема HBS588 похожа на TM1637. Они обе поддерживают вывод информации на дисплей и ввод с клавиатуры. Поэтому для работы будем использовать библиотеку ErriezTM1637. Установить ее можно с официального гитхаба автора или с моего облака (устанавливается в Arduino через Скетч/Подключить библиотеку/Добавить .ZIP библиотеку). На текущий момент она единственная, которая поддерживает кроме вывода на дисплей еще и ввод с клавиатуры.

     После установки библиотеки ее необходимо выполнить ее инициализацию командой:

tm1637.begin();

      Далее для управления используются следующие команды:

tm1637.displayOn() – Включает дисплей. На дисплее засвечиваются сегменты, заданные ранее командой (командами) tm1637.writeData(а, b)  

tm1637.displayOff() – Выключает дисплей. Все сегменты гаснут.

tm1637.writeData(а, b)  - вывод одной цифры (знака) на дисплей, где 

а – порядковый номер разряда на (от 0 до 3), куда будет выведена цифра или знак

b – число указывающее какие сегменты засветить в данном разряде (в двоичной системе исчисления):

 

       Как видно с рисунка чтоб засветилась на дисплее цифра «3» число b должно быть 0b01001111 (оно же 79 в десятичной или же 0x4F в шестнадцатеричной системе исчисления). Пример числа b для разных цифр:

                0b00111111, //цифра 0

                0b00000110, //цифра 1

                0b01011011, //цифра 2

                0b01001111, //цифра 3

                0b01100110, //цифра 4

                0b01101101, //цифра 5

                0b01111101, //цифра 6

                0b00000111, //цифра 7

                0b01111111, //цифра 8

                0b01101111, //цифра 9

       Чтобы засветить двоеточие (D1, D2), необходимо чтобы в числе b,  8й разряд был 1 (в двоичной системе исчисления). Например, 0b01001111  высветит «3», а 0b11001111 – «3:»

tm1637.getKeys() – выполняет опрос клавиатуры, результатом является код нажатой клавиши в шестнадцатеричной системе.

       Далее приведу проверочный скетч, который выводит на экран заданное четырехзначное число. Также производится опрос кнопок. При нажатии первой кнопки – включается-отключается свечение дисплея, второй кнопки -  загорается-гаснет двоеточие. Третья кнопка увеличивает значение числа на 1:


/*************************************************************
 *            Управление с контроллером hbs588 
 *       с 7-ми сегментным индикатором и клавиатурой
 *                  при помощи Arduino.
 *  Сайт автора: http://mynobook.blogspot.com/
 *  Библиотека отсюда:  https://github.com/Erriez/ErriezTM1637
 *************************************************************/

#include <ErriezTM1637.h>
// Выводы Arduino к которым подключен HBS588
#define HBS588_CLK_PIN      2
#define HBS588_DIO_PIN      3

TM1637 tm1637(HBS588_CLK_PIN, HBS588_DIO_PIN);

static uint8_t keysLast = 0;

// Создаем знакогенератор
int num[10] = { 0b00111111, //цифра 0
                0b00000110, //цифра 1
                0b01011011, //цифра 2
                0b01001111, //цифра 3
                0b01100110, //цифра 4
                0b01101101, //цифра 5
                0b01111101, //цифра 6
                0b00000111, //цифра 7
                0b01111111, //цифра 8
                0b01101111, //цифра 9
              }; 

int OnDisplay = 1; // Состояние диплея (1-вкл. 0-выкл)
int OnColon = 0;   // Состояние двоеточия (1-вкл. 0-выкл)
int DataD = 1234; //Число выводимое на экран
int DataDm[4];  //Массив для числа выводимого на экран по цифрам
int tempData;

void setup() {
Serial.begin(115200);

    // Инициализация дисплея HBS588
    tm1637.begin();
    // Включение дисплея
    tm1637.displayOn();

}

void loop() {
//  Опрос клавиатуры
    uint8_t keys;

    // Read 8-bit keys
    keys = tm1637.getKeys();

    // Проверка нажатия кнопок
    if (keysLast != keys) {
        keysLast = keys;
    // При нажатии кнопки 0x4 включить - выключить дисплей    
     if (keys == 0x4) {
            if (OnDisplay == 1) {
                       tm1637.displayOff();
                       OnDisplay = 0;}
            else {
                       tm1637.displayOn();
                       OnDisplay = 1;}
                                 }
    // При нажатии кнопки 0x2 включить - выключить двоеточие    
     if (keys == 0x2) 
            if (OnColon == 1) OnColon = 0;
            else OnColon = 1;

     // При нажатии кнопки 0x5 увеличить число на 1
      if (keys == 0x5) DataD++; //DataD++, то же, что и DataD=DataD+1;
      
     // Вывод кода нажакой кнопки в порт
    Serial.print(F("Keys: 0x"));
        Serial.println(keys, HEX);                  
     
     } 
                     
   // Разбивание числа на цифры и запись в массив
   tempData = DataD;
   for (int i = 3; i >= 0; i--) {
    DataDm[i] = tempData % 10;
    tempData = tempData / 10;
    }
    
   // Вывод информации
for (int i=0; i<=3; i++) {
             if (OnColon == 0) {tm1637.writeData(i, num[DataDm[i]]);} 
             else  {if (i == 1) tm1637.writeData(i, num[DataDm[i]]+128); 
                   else tm1637.writeData(i, num[DataDm[i]]);}  
              }  

   
}

            

1 комментарий:

  1. Спасибо. искал библиотеку на HBS588.Тоже достался индикатор с микросхемой от DVBT тюнера. Все работает и свои символы можно сделать.

    ОтветитьУдалить