TM1628 + DS 1302 и time.blinktime
- Войдите на сайт для отправки комментариев
Чт, 18/04/2019 - 00:46
Уважаемые груру этого форума! Мне опять таки нужна ваша помощь! По написанному примеру Уважаемого Евгения П, из темы по TM1668 мне удалось запустить свой экран. Так-же на борту находится микросхема DS1302 с которой удалось вывести время на экран. Установка времени осуществляется с помощью 3-х кнопок по IR протоколу. Библиотека для часов iarduino_RTC.h. Часы и установка времени работают, а вот команда time.blinktime должна мигать выбранным элементом но это не происходит. Подскажите пожайлуста, как заставить работать данную команду?
#include <boarddefs.h>
#include <IRremote.h>
#include <IRremoteInt.h>
#include <ir_Lego_PF_BitStreamEncoder.h>
#include <iarduino_RTC.h>
// Подключение пинов
//
// GND 5V CLK DIO STB OUT-IR
//
#define PIN_CLK 8
#define PIN_DIO 9
#define PIN_STB 7
#define PIN_IR 2
/////////////////////////////////////////////////////////////
///////////// ТИПА "библиотека" ////////////
/////////////////////////////////////////////////////////////
//
//
// достаточно может быть 14 байтов на светодиоды и 2 на кнопки
//
#define LED_DATA_LENGTH 14
#define KEY_DATA_LENGTH 2
#define INIT_7x11 7 //7 семи сегментных индикатора
//
// Маски нажатых кнопок
//
#define POWER 0x51DA01F8
#define TIME_SETTING 0x1F72CFA1
#define TEMPERATURE 0xA83B8E71
#define HEATING 0x974D2F31
#define VACUUM 0xCE53E021
#define TIMING 0x1B4F8AC1
#define PLUS 0x8876C5E1
#define MINUS 0xD080A1B1
//
// Подключено 7 "цифр".
//
// 1-4 - собственно цифры слева направо.
// В цифрах задействовано 7 битов под сегменты (с 0-го по 6-ой)
// и 7-ой бит под доплнительный символ (питание, конверт и т.п.)
//
// _A__
#define SEG_A 0x01 // цифры с 1 по 6 F| |B
#define SEG_B 0x02 // цифры с 1 по 6 |_G__|
#define SEG_C 0x04 // цифры с 1 по 6 E| |C
#define SEG_D 0x08 // цифры с 1 по 6 |_D__|
#define SEG_E 0x10 // цифры с 1 по 6
#define SEG_F 0x20 // цифры с 1 по 6
#define SEG_G 0x80 // цифры с 1 по 6
#define SEG_H0 0x40 // Знак F (фаренгейт)
#define SEG_H1 0x100 // Знак нагрева нижний тен
#define SEG_H2 0x200 // Знак нагрева верхний тен
#define SEG_H3 0x340 // Знак TEMPERAYURE
#define SEG_H4 0x40 // Знак DATE
#define SEG_H5 0x100 // Знак С (Цельсий)
#define SEG_H6 0x340 // Знак VACUUM
#define SEG_H7 0x40 // Знак TIME_SETTING_первая половина
#define SEG_H8 0x100 // Знак Часы
#define SEG_H9 0x300 // Знак TAME_SETTING_вторая половина
//#define TIME_SETTING (SEG_H7 | SEG_H9) // таймсетинг
#define SEG_H 0x200 // Знак MIN
#define SEG_DT 0x200 // Двоеточие
//
// Символы (цифры / буквы, можно ещё добавить всяких)
//
#define SYMBOL_0 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F)
#define SYMBOL_1 (SEG_B | SEG_C)
#define SYMBOL_2 (SEG_A | SEG_B | SEG_D | SEG_E | SEG_G)
#define SYMBOL_3 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_G)
#define SYMBOL_4 (SEG_B | SEG_C | SEG_F | SEG_G)
#define SYMBOL_5 (SEG_A | SEG_C | SEG_D | SEG_F | SEG_G)
#define SYMBOL_6 (SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define SYMBOL_7 (SEG_A | SEG_B | SEG_C)
#define SYMBOL_8 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define SYMBOL_9 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G)
#define SYMBOL_MINUS (SEG_G)
#define SYMBOL_A (SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G)
#define SYMBOL_C (SEG_A | SEG_E | SEG_F | SEG_D)
#define SYMBOL_E (SEG_A | SEG_D | SEG_E | SEG_F | SEG_G)
#define SYMBOL_H (SEG_B | SEG_C | SEG_E | SEG_F | SEG_G)
#define SYMBOL_P (SEG_A | SEG_B | SEG_E | SEG_F | SEG_G)
#define SYMBOL_G (SEG_A | SEG_E | SEG_F)
#define SYMBOL_L (SEG_D | SEG_E | SEG_F)
#define SYMBOL_F (SEG_A | SEG_E | SEG_F | SEG_G)
#define SYMBOL_d (SEG_B | SEG_C | SEG_D | SEG_E | SEG_G)
#define SYMBOL_b (SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define SYMBOL_rP (SEG_A | SEG_B | SEG_C | SEG_E | SEG_F)
//
// Глобальные переменные
//
static uint16_t ledGRID[LED_DATA_LENGTH / 2]; // текущее состояние экрана
static uint8_t currentBrightness = 5; // текущая яркость
static uint8_t digits[] = { SYMBOL_0, SYMBOL_1, SYMBOL_2, SYMBOL_3, SYMBOL_4, SYMBOL_5, SYMBOL_6, SYMBOL_7, SYMBOL_8, SYMBOL_9 };
//
//
// Запись одиночной команды
//
void writeSingleCommand(const uint8_t command) {
digitalWrite(PIN_STB, LOW);
shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, command);
digitalWrite(PIN_STB, HIGH);
delayMicroseconds(1); // Пауза до следующей команды
}
//
// Запись состояния дисплея
//
void updateDisplay(void) {
writeSingleCommand(0x40); // запись данных, автоматический адрес
digitalWrite(PIN_STB, LOW);
shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, 0xC0); // Установка адреса в 0
uint8_t * p = (uint8_t *) ledGRID;
for (int8_t i = 0; i < LED_DATA_LENGTH; i++, p++) shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, *p); // запись данных
digitalWrite(PIN_STB, HIGH);
delayMicroseconds(1); // Пауза до следующей команды
}
//
//
// Установить яркость от 0 (выключено) до 8
// (возвращает старую яркость)
//
static inline uint8_t setBrightness(const uint8_t newBrighness) {
const uint8_t res = currentBrightness;
currentBrightness = (newBrighness > 8) ? 8 : newBrighness;
if (currentBrightness == 0) writeSingleCommand(0x80); // Выключить дисплей
else writeSingleCommand(0x88 + (currentBrightness - 1)); // Установить яркость
return res;
}
//
// Увеличить яркость на 1 (возвращает старую яркость)
//
static inline uint8_t increaseBrightness(void) {
const uint8_t res = currentBrightness;
if (currentBrightness < 8) setBrightness(currentBrightness + 1);
return res;
}
//
// Уменьшить яркость на 1 (возвращает старую яркость)
//
static inline uint8_t decreaseBrightness(void) {
const uint8_t res = currentBrightness;
if (currentBrightness > 0) setBrightness(currentBrightness - 1);
return res;
}
// Показать/скрыть/инвертировать дополнительный символ
//
static inline void F_LED_ON(void) { ledGRID[0] |= SEG_H0; }
static inline void F_LED_OFF(void) { ledGRID[0] &= ~SEG_H0; }
static inline void invert_F(void) { ledGRID[0] ^= SEG_H0; }
static inline void TEN1_LED_ON(void) { ledGRID[0] |= SEG_H1; }
static inline void TEN1_LED_OFF(void) { ledGRID[0] &= ~SEG_H1; }
static inline void invert_TEN1(void) { ledGRID[0] ^= SEG_H1; }
static inline void TEN2_LED_ON(void) { ledGRID[0] |= SEG_H2; }
static inline void TEN2_LED_OFF(void) { ledGRID[0] &= ~SEG_H2; }
static inline void invert_TEN2(void) { ledGRID[0] ^= SEG_H2; }
static inline void TEMP_LED_ON(void) { ledGRID[1] |= SEG_H3; }
static inline void TEMP_LED_OFF(void) { ledGRID[1] &= ~SEG_H3; }
static inline void invert_TEMP(void) { ledGRID[1] ^= SEG_H3; }
static inline void DATE_LED_ON(void) { ledGRID[2] |= SEG_H4; }
static inline void DATE_LED_OFF(void) { ledGRID[2] &= ~SEG_H4; }
static inline void invert_DATE(void) { ledGRID[2] ^= SEG_H4; }
static inline void C_LED_ON(void) { ledGRID[2] |= SEG_H5; }
static inline void C_LED_OFF(void) { ledGRID[2] &= ~SEG_H5; }
static inline void invert_C(void) { ledGRID[2] ^= SEG_H5; }
static inline void VACUUM_LED_ON(void) { ledGRID[3] |= SEG_H6; }
static inline void VACUUM_LED_OFF(void) { ledGRID[3] &= ~SEG_H6; }
static inline void invert_VACUUM(void) { ledGRID[3] ^= SEG_H6; }
static inline void CHASIKI_LED_ON(void) { ledGRID[4] |= SEG_H8; }
static inline void CHASIKI_LED_OFF(void) { ledGRID[4] &= ~SEG_H8; }
static inline void invert_CHASIKI(void) { ledGRID[4] ^= SEG_H8; }
static inline void TIMESET_LED_ON(void) { (ledGRID[4] |= SEG_H7),( ledGRID[5] |= SEG_H9); }
static inline void TIMESET_LED_OFF(void) {(ledGRID[4] &= ~SEG_H7),( ledGRID[5] &= ~SEG_H9); }
static inline void invert_TIMESET(void) { (ledGRID[4] ^= SEG_H7),( ledGRID[5] ^= SEG_H9); }
static inline void MIN_LED_ON(void) { ledGRID[6] |= SEG_H; }
static inline void MIN_LED_OFF(void) { ledGRID[6] &= ~SEG_H; }
static inline void invert_MIN(void) { ledGRID[6] ^= SEG_H; }
//
// Показать/скрыть/инвертировать двоеточие
//
static inline void POINT_LED_ON(void) { ledGRID[4] |= SEG_DT; }
static inline void POINT_LED_OFF(void) { ledGRID[4] &= ~SEG_DT; }
static inline void invert_POINT(void) { ledGRID[4] ^= SEG_DT; }
//
// Показать цифру value (0-9) в позиции digit (1-4)
// при этом, если у цифры горит дополнительный символ, сохраняем его
//
static inline void setDigit(const int8_t digit, const uint8_t value) {
if (digit < 0 || digit > 6) return; // цифры у нас с 1-ой по 4-ую слева направо
ledGRID[digit] = value | (ledGRID[digit] & SEG_H ) | (ledGRID[digit] & SEG_H6) | (ledGRID[digit] & SEG_H0) | (ledGRID[digit] & SEG_H1)
| (ledGRID[digit] & SEG_H2) | (ledGRID[digit] & SEG_H3) | (ledGRID[digit] & SEG_H4) | (ledGRID[digit] & SEG_H5)
| (ledGRID[digit] & SEG_H8) | (ledGRID[digit] & SEG_H7) | (ledGRID[digit] & SEG_H9); // не обижать дополнительный символ, если есть
}
//
// Показать число m в двух правых цифрах (типа минуты или там секунды)
//
static inline void show_Minutes (const int8_t m) {
setDigit(6, digits[m % 10]);
setDigit(5, digits[m / 10]);
}
//
// Показать число h в двух левых цифрах (типа часы или там минуты)
//
static inline void show_Hours (const int8_t h) {
setDigit (4, digits[h % 10]);
setDigit(3, digits[h / 10]);
}
// Показать дату
static inline void show_Date (const int8_t d) {
setDigit (2, digits[d % 10]);
setDigit(1, digits[d / 10]);
}
//
// Показать дату, часы и минуты
//
static inline void show_Clock(const int8_t d, const int8_t h, const int8_t m) {
show_Date (d);
show_Hours (h);
show_Minutes(m);
}
/////////////////////////////////////////////////////////////
//////////// КОНЕЦ "библиотеки" ////////////
/////////////////////////////////////////////////////////////
iarduino_RTC time(RTC_DS1302, 11, 12, 13);
int RECEIVE_PIN = 2;
IRrecv irrecv(RECEIVE_PIN);
decode_results results;
unsigned long last = millis();
int set_clock = 0;
long previousMillis = 0;
long interval = 500;
void setup(void) {
Serial.begin(9600);
delay(300); // Ждем готовности модуля отвечать на запросы
time.begin();
irrecv.enableIRIn();
// Инициализация пинов
//------------ TM1628 PIN ------------
pinMode(PIN_CLK, OUTPUT);
pinMode(PIN_DIO, OUTPUT);
pinMode(PIN_STB, OUTPUT);
digitalWrite(PIN_STB, HIGH);
digitalWrite(PIN_CLK, HIGH);
pinMode(PIN_IR, INPUT);
//
// Инициализация экрана
writeSingleCommand(0x40); // Режим отображения (1 и 2 - ничего не меняется)
setBrightness(currentBrightness);
//
// Пишем на экране слово ПОПА
setDigit(1, SYMBOL_rP);
setDigit(2, SYMBOL_0);
setDigit(3, SYMBOL_rP);
setDigit(4, SYMBOL_A);
updateDisplay();
//
// Даём 5 секунд полюбоваться
delay(5000);
//Высвечиваем все элементы экрана
TEN1_LED_ON();
TEN2_LED_ON();
F_LED_ON();
TEMP_LED_ON();
DATE_LED_ON();
C_LED_ON();
VACUUM_LED_ON();
TIMESET_LED_ON();
CHASIKI_LED_ON();
MIN_LED_ON();
}
void loop(void) {
Serial.println(time.gettime("d-m-Y, H:i:s, D"));
//
// Выводим часы на экран
//
int d = time.day, h = time.Hours, m = time.minutes;
time.gettime();
show_Clock(d, h, m); //Показываем дни, часы, минуты
//Мигаем двоиточием
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
invert_POINT();
}
//-----------------------Блок установки времени----------------------------------------
if ((irrecv.decode(&results)) && (results.value==TIME_SETTING) ) {
if (millis() - last > 250) {
set_clock ++;
if(set_clock>3){set_clock = 0;}
}
last = millis();
irrecv.resume();
}
if(set_clock==0){ //Выходим из установки времени
TIMESET_LED_OFF();
time.blinktime(0); //Ни какой элемент не мигает
}
if(set_clock==1){ //Установка даты
TIMESET_LED_ON();
time.blinktime(4, 1); // Должны мигать датой но не мигает.
if ((irrecv.decode(&results)) && (results.value==PLUS) ){
if (millis() - last > 250) {
time.day ++; // прибавляем единицу в днях
if (time.day > 31) {time.day = 0;} // если вылезли за границы присваеваем 0
time.settime(-1, -1, -1, time.day); // установит дату, а секунды и минуты, оставит без изменений.
}
last = millis();
irrecv.resume();
}
if ((irrecv.decode(&results)) && (results.value==MINUS) ){
if (millis() - last > 250) {
time.day --; // убовляем единицу в днях
if (time.day > 31) time.day = 0; // если вылезли за границы присваеваем 0
time.settime(-1, -1, -1,time.day); // установит дату, а секунды и минуты, оставит без изменений.
}
last = millis();
irrecv.resume();
}
}
if(set_clock==2){ //Установка часов
TIMESET_LED_ON();
time.blinktime(3, 1); //Должны мигать часами но не мигает
if ((irrecv.decode(&results)) && (results.value==PLUS) ){
if (millis() - last > 250) {
time.Hours ++; // прибавляем единицу в часах
if (time.Hours > 23) time.Hours = 0; // если вылезли за границы присваеваем 0
time.settime(-1, -1, time.Hours, -1); // установит часы, а секунды, минуты и дату, оставит без изменений.
}
last = millis();
irrecv.resume();
}
if ((irrecv.decode(&results)) && (results.value==MINUS) ){
if (millis() - last > 250) {
time.Hours --; // убовляем единицу в часах
if (time.Hours > 23) time.Hours = 0; // если вылезли за границы присваеваем 0
time.settime(-1, -1, time.Hours, -1); // установит часы, а секунды, минуты и дату, оставит без изменений.
}
last = millis();
irrecv.resume();
}
}
if(set_clock==3){ //Установка минут
TIMESET_LED_ON();
time.blinktime(2, 1); //Должны мигать минутами но не мигает
if ((irrecv.decode(&results)) && (results.value==PLUS) ){
if (millis() - last > 250) {
time.minutes ++; // прибавляем единицу в минутах
if (time.minutes > 59) time.minutes = 0; // если вылезли за границы присваеваем 0
time.settime(0, time.minutes, -1, -1); // установит минуты, секунды сбросит на 0, минуты и дату, оставит без изменений.
}
last = millis();
irrecv.resume();
}
if ((irrecv.decode(&results)) && (results.value==MINUS) ){
if (millis() - last > 250) {
time.minutes --; // убовляем единицу в минутах
if (time.minutes > 59) time.minutes = 0; // если вылезли за границы присваеваем 0
time.settime(0, time.minutes, -1, -1); // установит минуты, секунды сбросит на 0, минуты и дату, оставит без изменений.
}
last = millis();
irrecv.resume();
}
}
updateDisplay();
}

Вопрос такой я по вашему коду сделал свой для работы с микросхемой TM1628 го дисплей у меня не стандартный от увлажнителя. Так вот вопрос в том что, символ SEG_H всегда горит и после перезаписи с помощью функции Digit не тухнет. Увидел такую у вас вещь:
static inline void setDigit(const int8_t digit, const uint8_t value) { if (digit < 1 || digit > 7) return; ledGRID[digit] = value | (ledGRID[digit] & SEG_H);}ЗАчем там в конце SEG_H думаю что по
тмоу причине он именно этот сегмент не гасит. Как поправить не скажите?