/TM1637

биб-ка для китайского светодиодного модуля на 4 цифры

Primary LanguageC++

  
Небольшая библиотека для китайских четырехзначных светодиодных модулей на TM1637. Типа такого 
https://ru.aliexpress.com/item/32797695630.html  с десятичными точками или такого 
https://ru.aliexpress.com/item/32797703570.html  с двоеточием. 

На первом удобно делать всякие вольтметры, а на втором - погодные станции с часами :)  

Тип дисплея описан как 

enum class enTM1637Type : bool { Number = false, Time = true };	// перечисление: тип дисплея числа/время


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

TM1637 Display(ClockPin, DataPin, DisplayType);

Например, 

TM1637 Display(11, 10, enTM1637Type::Number);  для индикатора с точками
TM1637 Display(11, 10, enTM1637Type::Time);    для индикатора с двоеточием

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

TM1637 Display(11, 10);    подключен индикатор с двоеточием


Библиотека умеет выводить строки функцией Print с параметром const char *. Естесственно, если строка длинная, из неё выводятся только первые 4 символа, остальные отбрасываются. Но иногда и 4 символа могут оказаться полезными

Display.Print("Err5");

когда, например надо сигнализировать об ошибке, а под рукой нету других экранчиков

символы, которые может вывести библиотека описаны в массиве, хранящимся в PROGMEM, чтоб не занимать драгоценное  ОЗУ

static const T1637SegmentData SegmentsData[]  PROGMEM {
	{ '0',0x3F },
	{ '1',0x06 },
	{ '2',0x5B },
	{ '3',0x4F },
	{ '4',0x66 },
	{ '5',0x6D },
	{ '6',0x7D },
	{ '7',0x07 },
	{ '8',0x7F },
	{ '9',0x6F },
	{ 'A',0x77 },
	{ 'b',0x7c },
	{ 'C',0x39 },
	{ 'd',0x5E },
	{ 'E',0x79 },
	{ 'F',0x71 },
	{ ' ',0x00 },
	{ '-',0x40 }, 
	{ '*',0x63 },  // значок градуса, т.е пишем -25* выведется -25 и значок градуса
	{ '_',0x08 },
	{ 'r',0x50 },
	{ 'H',0x76 },
	{ 'I',0x06 },
	{ 'h',0x74 },
	{ 'L',0x38 },
	{ 'n',0x54 },
	{ 'o',0x5C },
	{ 't',0x78 },
	{ 'O',0x3F },
	{ 'P',0x73 },
	{ 'S',0x6D },
	{ 'U',0x3E },
	{ 'u',0x1C },
	{ 'Y',0x6E }

};
Таблицу можно самому изменять/дополнять своими экзотическими буквами инопланетных словарей, больше нигде ничего править не нужно, только изменить/добавить строчку в массив по аналогии с имеющимися парой "символ"-"его матрица" в проекции на сегменты.

Можно вывести знаковое двухбайтное целое функцией Print(Num);

Display.Print(-50); или 

int val = analogRead(A0);
Display.Print(val);

естественно, если число больше 4 знаков, оно обрежется, т.е 32767 вывести не получится, выведется 3276


Еще функцией Print() можно вывести число с плавающей точкой, но, естественно, тоже с ограничением в первых 4 цифры.  Если тип дисплея - числовой, то запятая выведется в правильном месте, если дисплей для времени, то точек в нем нет, поэтому на него нецелые числа выводить бессмысленно. 

Display(PI);  выведет 3.141
Display(1.5); выведет 1.5

Числа по умолчанию выравниваются по правому краю дисплея, а строки - по левому

Функцией PrintTime(часы,минуты)  можно вывести время с ведущими нулями и по правильным сторонам от двоеточия

Display.PrintTime(Clock.GetHours(), Clock.GetMinutes());  или 
Display.PrintTime(9,6);  выведет 09:06


Функцией PrintDeg(int8_t Temperature); можно быстро вывести температуру со значком градуса на конце

Display.PrintDeg(-15);  выведет -15* 


 печать одного символа в определенном месте экрана
 APosition - в какой позиции печатать 0..NUM_DIGITS-1
 ASymbol - символ, который надо напечатать
 символ сразу же перекодируется и выводится
 ничего больше вызывать не надо
 
void PrintAt(const uint8_t APosition, const char ASymbol);



Функцией ToggleColon() удобно пользоваться когда делаешь часы, она переключает двоеточие с вкл на выкл и обратно, можно самому не запоминать нужно ли сейчас гасить или зажигать двоеточию, функция сама разберется, главное её вызвать вовремя.

Display.ToggleColon();

Точку/двоеточие можно включить/выключить вручную, функцией ShowPoint() с параметром true/false.

Display.ShowPoint(true);  включить точку
Display.ShowPoint(false);  выключить точку



Яркость свечения устанавливается функцией 

Display.SetBrightness(0..7);  c параметром в виде числа от 0 (минимальная яркость) до 7 (макс. яркость)

Ну и для очистки - есть функция Clear(), вызываешь и дисплей становится тёмный и страшный, как моя жызнь. 

Display.Clear();



Список публичных функций, которые можно вызывать снаружи, внимательно читаем описания к ним

// канструктор. Принимает 2 пина (обязательно) и тип дисплея (необязательно)
// AClockPin - номер пина для тактирования (вывод CLK на дисплейчике)
// ADataPin  - номер пина для данных (вывод DAT на дисплейчике)
// ADisplayType - тип дисплея, для чисел или для времени (с точками/двоеточием)
// по умолчанию - выбран дисплей с двоеточием (для времени)
//
	TM1637(uint8_t AClockPin, uint8_t ADataPin, enTM1637Type ADisplayType = enTM1637Type::Time);


// печатает первые NUM_DIGITS символов переданной строки
// с выравниванием. По умолчанию, выравнивание - влево
//
	void Print(const char *AString, const enTM1637Align AAlign = enTM1637Align::Left);

// печатает двухбайтовое целое число со знаком
// по основанию ARadix (по умолчанию 10)
// число выравнивается вправо
// печатается не более NUM_DIGITS начальных цыфр числа, включая знак
//
	void Print(const int ANumber, const uint8_t ARadix = 10);

// печать дробных чисел со знаком.
// c точностью APrecision знаков после запятой, по умолчанию - 2 
// Если число длинное - печатаются первые NUM_DIGITS символов
// Если индекс точки находится в пределах 0 - NUM_DIGITS то она тоже печатается
//
	void Print(const double AValue, const uint8_t APrecision = 2);

// для удобства печати времени, передаёшь часы/минуты, печатает 
// на своих местах, слева и справа от двоеточия
//
	void PrintTime(const uint8_t AHours, const uint8_t AMinutes);

// для удобства. Передаешь число (со знаком) - печатает его и символ градуса за ним
//
	void PrintDeg(const int8_t ADegrees);

// очистка дисплея
//
	void Clear(void);

// устанавливает яркость дисплея от 0 до 7. 7 - самый яркий.
//
	void SetBrightness(const uint8_t AValue);

// включает/выключает показ десятичной точки
//
	void ShowPoint(const bool APointVisible);

// переключает точку. если была включена - выключает и наоборот
// удобно мигать двоеточием в часах, не надо самому запоминать состояние
//
	void ToggleColon(void);

// печать символа в определенном месте экрана
// APosition - в какой позиции печатать 0..NUM_DIGITS-1
// ASymbol - символ, который надо напечатать
// символ сразу же перекодируется и выводится
// ничего больше вызывать не надо
// 
	void PrintAt(const uint8_t APosition, const char ASymbol);

// аналогично Print(const char *AString)
// только оператором, чтоб можно было писать 
// tm1637<<"Err2";
//
	const TM1637 &operator <<(const char *AString) {
		OutString(AString);
		return *this;
}

}; - можно спокойно выкинуть из кода