Дисплеев различного назначения и функционала есть немалое количество. В ранее представленных статьях были протестированы два дисплея - MAX7219 и TM1637. Это дисплеи цифровые - основанные на выводе данных для семисегментных индикаторов. В данной статье, будет рассмотрен дисплей-индикатор батарейного типа, работающий на базе драйвера TM1651

         Индикатор дисплея светодиодный, зелёного цвета, выполнен в виде батарейки(или аккумулятора, это кому как удобно), поделён на 10 сегментов. Подключать его конечно же будем к плате Arduino, пины подключения дисплея такие же, как и у его собрата, дисплея на базе драйвера TM1637. Просто сразу же точно определимся - пин CLK подключаем на 6-й пин платы Arduino, пин DIO подключаем на 5-й пин платы Arduino. Еще нам потребуется библиотека для работы с дисплеем в среде Arduino IDE, она так и называется TM1651, ссылка на скачивание. Эта библиотека поддерживает функционал и работу данного дисплея батарейной индикации.

 

 

         Ну что же, пора начинать... Когда установлена библиотека, и всё провода подключены, нужно "залить" тестовый скетч в контроллер и посмотреть результат:

/*Библиотека для работы с дисплеем TM1651*/
#include "TM1651.h"

/*Пины подключения дисплея к плате Arduino*/
#define CLK 6
#define DIO 5

/*Создаём объект batteryDisplay класса TM1651 с указанием пинов подключения*/
TM1651 batteryDisplay(CLK, DIO);

void setup()
{
  /*Инициализация дисплея*/
  batteryDisplay.init();
  /*Устанавливаем яркость свечения сегментов*/
  /*BRIGHT_TYPICAL = 2, усреднённая яркость*/
  /*BRIGHT_DARKEST = 0, слишком тёмный*/
  /*BRIGHTEST = 7, слишком яркий*/
  batteryDisplay.set(BRIGHT_DARKEST);
}


void loop()
{
  /*Постепенно наращиваем индикацию "зарядки"*/
  for(uint8_t level = 0; level < 8; level ++)
  {
    batteryDisplay.displayLevel(level);
    delay(500);
  }
}

           Резутьтат работы дисплея можно видеть на фото ниже, или, если удобно можно посмотреть обзорное видео, оно как всегда идет в конце статьи. Можно увидеть, что, некоторые сегменты зажигаются сразу по два, а некоторые только по одному, но это никак не связано с ошибками в библиотеке. Причина проста, в рассматриваемом модуле, 1-й и 2-й, 6-й и 7-й, 8-й и 9-й сегменты сгруппированы по парам и подключены на один выход микросхемы TM1651. То есть, хотелось бы конечно что бы сегменты включались в порядке по одному, но увы... Китайская схемотехника, и чем они руководствовались при разработке? Но и на это вопрос, тоже есть ответ, изначально библиотека TM1651.h была написана для другого типа дисплея, тоже индикатора батарейного типа, но с меньшим количеством сегментов. Чуть позже, в отдельной статье будет выложена информация по второму типу таких дисплеев, ну а пока серия фото поочерёдного включения сегментов:

 

 


         Немного изменив скетч, можно поуправлять зажиганием сегментов вручную, по событию нажатия кнопки, для того чтобы сегменты зажигались корректно, в скетче реализован фильтр дребезга контактов для кнопки.

/*Библиотека для работы с дисплеем TM1651*/
#include "TM1651.h"

/*Пин подключения кнопки для наращивания индикации "заряда"*/
#define CHARGE_BUTTON 2

/*Пины подключения дисплея к плате Arduino*/
#define CLK 6
#define DIO 5

/*Создаём объект batteryDisplay класса TM1651 с указанием пинов подключения*/
TM1651 batteryDisplay(CLK, DIO);

/*Переменные необходимые для обработки дребезга контактов кнопки*/
bool ChargeButtonCurr = false;
bool ChargeButtonPrev = false;

/*Текущий уровень зарядки*/
short level = 0;

void setup()
{
  pinMode(CHARGE_BUTTON, INPUT);

  /*Инициализация дисплея*/
  batteryDisplay.init();
  /*Устанавливаем яркость свечения сегментов*/
  /*BRIGHT_TYPICAL = 2, усреднённая яркость*/
  /*BRIGHT_DARKEST = 0, слишком тёмный*/
  /*BRIGHTEST = 7, слишком яркий*/
  batteryDisplay.set(BRIGHTEST);
}


void loop()
{
  //Проверка кнопки наращивания "заряда" - нажатие и обработка "Антидребезг"
  ChargeButtonCurr = DebounceButton(CHARGE_BUTTON, ChargeButtonPrev);
  if(ChargeButtonPrev == false && ChargeButtonCurr == true)
  {
    /*Если все сегменты заполнены - то погасить*/
    if(level > 6)
      level = 0;
    /*Если заполнение не достигло предела - то добавлять*/
    else
      level ++;
  }
  ChargeButtonPrev = ChargeButtonCurr;

  /*Индицирование уровня заряда на дисплей*/
  batteryDisplay.displayLevel(level);
}

/*Функция подавления дребезга контакта кнопки*/
boolean DebounceButton(int ScanPort, boolean last)
{
  boolean current = digitalRead(ScanPort);
  if(current != last)
  {
    delay(10);
    current = digitalRead(ScanPort);
  }
  return current;
}

         В конце статьи, как и было обещано, обзорное видео, всем приятного просмотра !!!